Class: GrapeOAS::Introspectors::EntityIntrospector

Inherits:
Object
  • Object
show all
Extended by:
Base
Includes:
ApiModelBuilders::Concerns::OasUtilities, ApiModelBuilders::Concerns::TypeResolver
Defined in:
lib/grape_oas/introspectors/entity_introspector.rb

Overview

Introspector for Grape::Entity classes. Extracts schema information from entity exposures and documentation.

Constant Summary

Constants included from ApiModelBuilders::Concerns::OasUtilities

ApiModelBuilders::Concerns::OasUtilities::VALID_CONSTANT_PATTERN

Constants included from ApiModelBuilders::Concerns::TypeResolver

ApiModelBuilders::Concerns::TypeResolver::MULTI_TYPE_PATTERN, ApiModelBuilders::Concerns::TypeResolver::TYPED_ARRAY_PATTERN

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Base

handles?

Methods included from ApiModelBuilders::Concerns::OasUtilities

extract_extensions, #extract_extensions, pluralize, #pluralize, underscore, #underscore, valid_constant_name?, #valid_constant_name?

Methods included from ApiModelBuilders::Concerns::TypeResolver

#build_array_items_schema, #build_schema_for_primitive, #derive_primitive_and_member, #extract_multi_types, #extract_typed_array_member, #grape_boolean_type?, #multi_type?, #resolve_schema_type

Constructor Details

#initialize(entity_class, stack: [], registry: {}) ⇒ EntityIntrospector

Returns a new instance of EntityIntrospector.



61
62
63
64
65
# File 'lib/grape_oas/introspectors/entity_introspector.rb', line 61

def initialize(entity_class, stack: [], registry: {})
  @entity_class = entity_class
  @stack = stack
  @registry = registry
end

Class Method Details

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

Builds a schema from a Grape::Entity class.

Parameters:

  • subject (Class, String, Symbol)

    Entity class or its name

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

    Recursion stack for cycle detection

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

    Schema registry for caching

Returns:



37
38
39
40
41
42
# File 'lib/grape_oas/introspectors/entity_introspector.rb', line 37

def self.build_schema(subject, stack: [], registry: {})
  entity_class = resolve_entity_class(subject)
  return nil unless entity_class

  new(entity_class, stack: stack, registry: registry).build_schema
end

.handles?(subject) ⇒ Boolean

Checks if the subject is a Grape::Entity class.

Parameters:

  • subject (Object)

    The object to check

Returns:

  • (Boolean)

    true if subject is a Grape::Entity class



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/grape_oas/introspectors/entity_introspector.rb', line 16

def self.handles?(subject)
  return false unless defined?(Grape::Entity)
  return subject <= Grape::Entity if subject.is_a?(Class)
  return false unless subject.is_a?(String) || subject.is_a?(Symbol)

  const_name = subject.to_s
  return false unless const_name.match?(/\A[A-Z]/)
  return false unless Object.const_defined?(const_name, false)

  klass = Object.const_get(const_name, false)
  klass.is_a?(Class) && klass <= Grape::Entity
rescue NameError
  false
end

.resolve_entity_class(subject) ⇒ Class?

Resolves a subject to an entity class.

Parameters:

  • subject (Class, String, Symbol)

    Entity class or its name

Returns:

  • (Class, nil)

    The resolved entity class



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/grape_oas/introspectors/entity_introspector.rb', line 48

def self.resolve_entity_class(subject)
  return subject if subject.is_a?(Class) && defined?(Grape::Entity) && subject <= Grape::Entity
  return nil unless subject.is_a?(String) || subject.is_a?(Symbol)

  const_name = subject.to_s
  return nil unless Object.const_defined?(const_name, false)

  klass = Object.const_get(const_name, false)
  klass if klass.is_a?(Class) && defined?(Grape::Entity) && klass <= Grape::Entity
rescue NameError
  nil
end

Instance Method Details

#build_schemaObject



67
68
69
70
71
72
73
74
75
# File 'lib/grape_oas/introspectors/entity_introspector.rb', line 67

def build_schema
  return cached_schema if cached_schema_available?
  return build_inherited_schema if inherits_with_discriminator?

  schema = initialize_or_reuse_schema
  return cycle_tracker.handle_cycle(schema) if cycle_tracker.cyclic_reference?

  cycle_tracker.with_tracking { populate_schema(schema) }
end