Class: GrapeOAS::Introspectors::EntityIntrospectorSupport::ExposureProcessor

Inherits:
Object
  • Object
show all
Includes:
ApiModelBuilders::Concerns::OasUtilities
Defined in:
lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb

Overview

Processes entity exposures and builds schemas from them.

Constant Summary

Constants included from ApiModelBuilders::Concerns::OasUtilities

ApiModelBuilders::Concerns::OasUtilities::VALID_CONSTANT_PATTERN

Instance Method Summary collapse

Methods included from ApiModelBuilders::Concerns::OasUtilities

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

Constructor Details

#initialize(entity_class, stack:, registry:) ⇒ ExposureProcessor

Returns a new instance of ExposureProcessor.



11
12
13
14
15
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 11

def initialize(entity_class, stack:, registry:)
  @entity_class = entity_class
  @stack = stack
  @registry = registry
end

Instance Method Details

#add_exposures_to_schema(schema) ⇒ Object

Adds all exposures to a schema.

Parameters:



20
21
22
23
24
25
26
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 20

def add_exposures_to_schema(schema)
  exposures.each do |exposure|
    next unless exposed?(exposure)

    add_exposure_to_schema(schema, exposure)
  end
end

#build_property_schema(exposure, doc) ⇒ ApiModel::Schema

Builds the property schema for an exposure, routing nesting exposures to the inline-object path. Wraps in array if doc is set.

Parameters:

  • exposure

    the entity exposure

  • doc (Hash)

    normalized documentation hash

Returns:



63
64
65
66
67
68
69
70
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 63

def build_property_schema(exposure, doc)
  prop_schema = if nesting_exposure?(exposure)
                  build_nesting_exposure_schema(exposure, doc)
                else
                  schema_for_exposure(exposure, doc)
                end
  wrap_in_array_if_needed(prop_schema, doc)
end

#conditional?(exposure) ⇒ Boolean

Checks if an exposure is conditional.

Parameters:

  • exposure

    the entity exposure

Returns:

  • (Boolean)

    true if conditional



84
85
86
87
88
89
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 84

def conditional?(exposure)
  conditions = exposure.instance_variable_get(:@conditions) || []
  !conditions.empty?
rescue NoMethodError
  false
end

#determine_required(doc, exposure) ⇒ Boolean

Determines whether a property should be marked required. Explicit doc takes precedence; conditional exposures default to false; unconditional exposures default to true.

Parameters:

  • doc (Hash)

    normalized documentation hash

  • exposure

    the entity exposure

Returns:

  • (Boolean)


117
118
119
120
121
122
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 117

def determine_required(doc, exposure)
  return doc[:required] unless doc[:required].nil?
  return false if conditional?(exposure)

  true
end

#exposed?(_exposure) ⇒ Boolean

Checks if an exposure should be included in the schema.

Parameters:

  • exposure

    the entity exposure

Returns:

  • (Boolean)

    true if exposed



76
77
78
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 76

def exposed?(_exposure)
  true
end

#exposure_options(exposure) ⇒ Hash

Returns the options hash for an exposure.

Parameters:

  • exposure

    the entity exposure

Returns:

  • (Hash)


106
107
108
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 106

def exposure_options(exposure)
  exposure.instance_variable_get(:@options) || {}
end

#exposuresArray

Gets the exposures defined on the entity class.

Returns:

  • (Array)

    list of entity exposures



31
32
33
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 31

def exposures
  EntityIntrospectorSupport.exposures(@entity_class)
end

#merge_exposure?(exposure, doc, opts) ⇒ Boolean

Checks if an exposure is a merge exposure.

Parameters:

  • exposure

    the entity exposure

  • doc (Hash)

    the documentation hash

  • opts (Hash)

    the options hash

Returns:

  • (Boolean)

    true if merge exposure



97
98
99
100
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 97

def merge_exposure?(exposure, doc, opts)
  merge_flag = PropertyExtractor.extract_merge_flag(exposure, doc, opts)
  merge_flag && type_resolver.resolve_entity_from_opts(exposure, doc)
end

#parent_exposures(parent_entity) ⇒ Array

Gets the exposures defined on a parent entity.

Parameters:

  • parent_entity (Class)

    the parent entity class

Returns:

  • (Array)

    list of parent exposures



39
40
41
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 39

def parent_exposures(parent_entity)
  EntityIntrospectorSupport.exposures(parent_entity)
end

#schema_for_exposure(exposure, doc) ⇒ ApiModel::Schema

Builds a schema for an exposure.

Parameters:

  • exposure

    the entity exposure

Returns:



47
48
49
50
51
52
53
54
55
# File 'lib/grape_oas/introspectors/entity_introspector_support/exposure_processor.rb', line 47

def schema_for_exposure(exposure, doc)
  opts = exposure_options(exposure)
  type = opts[:using] || doc[:type]

  schema = type_resolver.build_exposure_base_schema(type)
  schema = apply_exposure_properties(schema, doc)
  SchemaConstraints.apply(schema, doc)
  schema
end