Class: Verquest::Properties::Object

Inherits:
Base
  • Object
show all
Defined in:
lib/verquest/properties/object.rb

Overview

Object property type for structured data

Represents a complex object with nested properties in the schema. Used for defining structured data objects with multiple fields.

Examples:

Define an address object with nested properties

address = Verquest::Properties::Object.new(name: :address)
address.add(Verquest::Properties::Field.new(name: :street, type: :string))
address.add(Verquest::Properties::Field.new(name: :city, type: :string, required: true))

Instance Attribute Summary collapse

Attributes inherited from Base

#map, #name, #nullable, #required

Instance Method Summary collapse

Methods inherited from Base

#mapping_value_key, #mapping_value_prefix

Methods included from HelperMethods::RequiredProperties

#dependent_required_properties, #required_properties

Constructor Details

#initialize(name:, required: false, nullable: false, map: nil, **schema_options) ⇒ Object

Initialize a new Object property

Parameters:

  • name (String, Symbol)

    The name of the property

  • required (Boolean, Array<Symbol>) (defaults to: false)

    Whether this property is required, or array of dependency names

  • nullable (Boolean) (defaults to: false)

    Whether this property can be null

  • map (String, nil) (defaults to: nil)

    The mapping path for this property

  • schema_options (Hash)

    Additional JSON schema options for this property



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/verquest/properties/object.rb', line 22

def initialize(name:, required: false, nullable: false, map: nil, **schema_options)
  @properties = {}

  @name = name.to_s
  @required = required
  @nullable = nullable
  @map = map
  @schema_options = {
    additionalProperties: Verquest.configuration.default_additional_properties
  }.merge(schema_options)
    .delete_if { |_, v| v.nil? }
    .transform_keys(&:to_s)

  @type = if nullable
    %w[object null]
  else
    "object"
  end
end

Instance Attribute Details

#propertiesObject (readonly, private)

Returns the value of attribute properties.



96
97
98
# File 'lib/verquest/properties/object.rb', line 96

def properties
  @properties
end

#schema_optionsObject (readonly, private)

Returns the value of attribute schema_options.



96
97
98
# File 'lib/verquest/properties/object.rb', line 96

def schema_options
  @schema_options
end

#typeObject (readonly, private)

Returns the value of attribute type.



96
97
98
# File 'lib/verquest/properties/object.rb', line 96

def type
  @type
end

Instance Method Details

#add(property) ⇒ Verquest::Properties::Base

Add a child property to this object

Parameters:

Returns:



46
47
48
# File 'lib/verquest/properties/object.rb', line 46

def add(property)
  properties[property.name.to_s] = property
end

#mapping(key_prefix:, value_prefix:, mapping:, version: nil) ⇒ Hash

Create mapping for this object property and all its children

Parameters:

  • key_prefix (Array<String>)

    Prefix for the source key

  • value_prefix (Array<String>)

    Prefix for the target value

  • mapping (Hash)

    The mapping hash to be updated

  • version (String, nil) (defaults to: nil)

    The version to create mapping for

Returns:

  • (Hash)

    The updated mapping hash



88
89
90
91
92
# File 'lib/verquest/properties/object.rb', line 88

def mapping(key_prefix:, value_prefix:, mapping:, version: nil)
  properties.values.each do |property|
    property.mapping(key_prefix: key_prefix + [name], value_prefix: mapping_value_prefix(value_prefix:), mapping:, version:)
  end
end

#to_schemaHash

Generate JSON schema definition for this object property

Returns:

  • (Hash)

    The schema definition for this object property



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/verquest/properties/object.rb', line 53

def to_schema
  {
    name => {
      "type" => type,
      "required" => required_properties,
      "properties" => properties.transform_values { |property| property.to_schema[property.name] }
    }.merge(schema_options).tap do |schema|
      schema["dependentRequired"] = dependent_required_properties if dependent_required_properties.any?
    end
  }
end

#to_validation_schema(version: nil) ⇒ Hash

Generate validation schema for this object property

Parameters:

  • version (String, nil) (defaults to: nil)

    The version to generate validation schema for

Returns:

  • (Hash)

    The validation schema for this object property



69
70
71
72
73
74
75
76
77
78
79
# File 'lib/verquest/properties/object.rb', line 69

def to_validation_schema(version: nil)
  {
    name => {
      "type" => type,
      "required" => required_properties,
      "properties" => properties.transform_values { |property| property.to_validation_schema(version: version)[property.name] }
    }.merge(schema_options).tap do |schema|
      schema["dependentRequired"] = dependent_required_properties if dependent_required_properties.any?
    end
  }
end