Class: GrapeOAS::Introspectors::Registry

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/grape_oas/introspectors/registry.rb

Overview

Registry for managing introspectors that can build schemas from various sources. Allows third-party gems to register custom introspectors for new schema formats.

Examples:

Registering a custom introspector

GrapeOAS.introspectors.register(MyCustomIntrospector)

Inserting before an existing introspector

GrapeOAS.introspectors.register(HighPriorityIntrospector, before: EntityIntrospector)

Instance Method Summary collapse

Constructor Details

#initializeRegistry

Returns a new instance of Registry.



17
18
19
# File 'lib/grape_oas/introspectors/registry.rb', line 17

def initialize
  @introspectors = []
end

Instance Method Details

#build_schema(subject, stack: [], registry: {}) ⇒ ApiModel::Schema?

Builds a schema using the appropriate introspector.

Parameters:

  • subject (Object)

    The object to introspect

  • stack (Array) (defaults to: [])

    Recursion stack for cycle detection

  • registry (Hash) (defaults to: {})

    Schema registry for caching

Returns:



64
65
66
67
68
69
# File 'lib/grape_oas/introspectors/registry.rb', line 64

def build_schema(subject, stack: [], registry: {})
  introspector = find(subject)
  return nil unless introspector

  introspector.build_schema(subject, stack: stack, registry: registry)
end

#clearself

Clears all registered introspectors.

Returns:

  • (self)


96
97
98
99
# File 'lib/grape_oas/introspectors/registry.rb', line 96

def clear
  @introspectors.clear
  self
end

#each {|introspector| ... } ⇒ Object

Iterates over all registered introspectors.

Yields:

  • (introspector)

    Each registered introspector



82
83
84
# File 'lib/grape_oas/introspectors/registry.rb', line 82

def each(&)
  @introspectors.each(&)
end

#find(subject) ⇒ Class?

Finds the first introspector that can handle the given subject.

Parameters:

  • subject (Object)

    The object to introspect

Returns:

  • (Class, nil)

    The introspector class, or nil if none found



54
55
56
# File 'lib/grape_oas/introspectors/registry.rb', line 54

def find(subject)
  @introspectors.find { |introspector| introspector.handles?(subject) }
end

#handles?(subject) ⇒ Boolean

Checks if any introspector can handle the given subject.

Parameters:

  • subject (Object)

    The object to check

Returns:

  • (Boolean)


75
76
77
# File 'lib/grape_oas/introspectors/registry.rb', line 75

def handles?(subject)
  @introspectors.any? { |introspector| introspector.handles?(subject) }
end

#register(introspector, before: nil, after: nil) ⇒ self

Registers an introspector class.

Parameters:

  • introspector (Class)

    Class that extends GrapeOAS::Introspectors::Base

  • before (Class, nil) (defaults to: nil)

    Insert before this introspector

  • after (Class, nil) (defaults to: nil)

    Insert after this introspector

Returns:

  • (self)


27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/grape_oas/introspectors/registry.rb', line 27

def register(introspector, before: nil, after: nil)
  validate_introspector!(introspector)

  if before
    insert_before(introspector, before)
  elsif after
    insert_after(introspector, after)
  else
    @introspectors << introspector unless @introspectors.include?(introspector)
  end

  self
end

#sizeInteger

Returns the number of registered introspectors.

Returns:

  • (Integer)


89
90
91
# File 'lib/grape_oas/introspectors/registry.rb', line 89

def size
  @introspectors.size
end

#to_aArray<Class>

Returns a list of registered introspectors.

Returns:

  • (Array<Class>)


104
105
106
# File 'lib/grape_oas/introspectors/registry.rb', line 104

def to_a
  @introspectors.dup
end

#unregister(introspector) ⇒ self

Unregisters an introspector class.

Parameters:

  • introspector (Class)

    The introspector to remove

Returns:

  • (self)


45
46
47
48
# File 'lib/grape_oas/introspectors/registry.rb', line 45

def unregister(introspector)
  @introspectors.delete(introspector)
  self
end