Class: Jsapi::Meta::Schema::Object

Inherits:
Base show all
Defined in:
lib/jsapi/meta/schema/object.rb

Constant Summary

Constants included from Model::Attributes

Model::Attributes::DEFAULT_ARRAY, Model::Attributes::DEFAULT_HASH

Instance Attribute Summary

Attributes inherited from Base

#validations

Instance Method Summary collapse

Methods inherited from Base

#default, #default_value, #deprecated, #description, #enum, #enum=, #examples, #existence, #external_docs, #initialize, #nullable?, #omittable?, #title, #type

Methods included from OpenAPI::Extensions

included

Methods inherited from Model::Base

#initialize, #inspect, #merge!, #reference?, #resolve

Methods included from Model::Attributes

#attribute, #attribute_names

Constructor Details

This class inherits a constructor from Jsapi::Meta::Schema::Base

Instance Method Details

#add_property(name, keywords = {}) ⇒ Object

:nodoc:



35
36
37
# File 'lib/jsapi/meta/schema/object.rb', line 35

def add_property(name, keywords = {}) # :nodoc:
  (@properties ||= {})[name.to_s] = Property.new(name, **keywords)
end

#additional_propertiesObject

:attr: additional_properties The AdditionalProperties.



10
# File 'lib/jsapi/meta/schema/object.rb', line 10

attribute :additional_properties, AdditionalProperties

#all_of_referencesObject

:attr: all_of_references



14
# File 'lib/jsapi/meta/schema/object.rb', line 14

attribute :all_of_references, [Reference]

#discriminatorObject

:attr: discriminator The Discriminator.



22
# File 'lib/jsapi/meta/schema/object.rb', line 22

attribute :discriminator, Discriminator

#modelObject

:attr: model The model class to access nested object parameters by. The default model class is Jsapi::Model::Base.



28
# File 'lib/jsapi/meta/schema/object.rb', line 28

attribute :model, Class, default: Jsapi::Model::Base

#propertiesObject

:attr: properties The properties.



33
# File 'lib/jsapi/meta/schema/object.rb', line 33

attribute :properties, { String => Property }, accessors: %i[reader writer]

#resolve_properties(definitions, context: nil) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/jsapi/meta/schema/object.rb', line 39

def resolve_properties(definitions, context: nil)
  properties = merge_properties(definitions, [])

  case context
  when :response
    properties.reject { |_k, v| v.write_only? }
  when :request
    properties.reject { |_k, v| v.read_only? }
  else
    properties
  end
end

#resolve_schema(object, definitions, context: nil) ⇒ Object

Resolves the schema within context.

Raises a RuntimeError when the schema couldn’t be resolved.

Raises:



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/jsapi/meta/schema/object.rb', line 55

def resolve_schema(object, definitions, context: nil)
  return self if discriminator.nil?

  properties = resolve_properties(definitions, context: context)

  property = properties[discriminator.property_name]
  raise InvalidValueError.new('discriminator property',
                              discriminator.property_name,
                              valid_values: properties.keys) if property.nil?

  value = property.reader.call(object)
  value = property.default_value(definitions, context: context) if value.nil?
  raise "#{discriminator.property_name} can't be nil" if value.nil?

  schema = definitions.find_schema(discriminator.mapping(value) || value)
  raise "inheriting schema couldn't be found: #{value.inspect}" if schema.nil?

  schema.resolve(definitions).resolve_schema(object, definitions, context: context)
end

#to_json_schemaObject

:nodoc:



75
76
77
78
79
80
81
82
# File 'lib/jsapi/meta/schema/object.rb', line 75

def to_json_schema # :nodoc:
  super.merge(
    allOf: all_of_references.map(&:to_json_schema).presence,
    properties: properties.transform_values(&:to_json_schema),
    additionalProperties: additional_properties&.to_json_schema,
    required: properties.values.select(&:required?).map(&:name)
  ).compact
end

#to_openapi(version) ⇒ Object

:nodoc:



84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/jsapi/meta/schema/object.rb', line 84

def to_openapi(version, *) # :nodoc:
  super.merge(
    allOf: all_of_references.map do |schema|
      schema.to_openapi(version)
    end.presence,
    discriminator: discriminator&.to_openapi(version),
    properties: properties.transform_values do |property|
      property.to_openapi(version)
    end,
    additionalProperties: additional_properties&.to_openapi(version),
    required: properties.values.select(&:required?).map(&:name)
  ).compact
end