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, #required

Instance Method Summary collapse

Methods inherited from Base

#mapping_value_key, #mapping_value_prefix

Constructor Details

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

Initialize a new Object property

Parameters:

  • name (String)

    The name of the property

  • required (Boolean) (defaults to: false)

    Whether this property is required

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

    The mapping path for this property

  • schema_options (Hash)

    Additional JSON schema options for this property



21
22
23
24
25
26
27
28
# File 'lib/verquest/properties/object.rb', line 21

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

  @name = name
  @required = required
  @map = map
  @schema_options = schema_options
end

Instance Attribute Details

#propertiesObject (readonly, private)

Returns the value of attribute properties.



80
81
82
# File 'lib/verquest/properties/object.rb', line 80

def properties
  @properties
end

#schema_optionsObject (readonly, private)

Returns the value of attribute schema_options.



80
81
82
# File 'lib/verquest/properties/object.rb', line 80

def schema_options
  @schema_options
end

#typeObject (readonly, private)

Returns the value of attribute type.



80
81
82
# File 'lib/verquest/properties/object.rb', line 80

def type
  @type
end

Instance Method Details

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

Add a child property to this object

Parameters:

Returns:



34
35
36
# File 'lib/verquest/properties/object.rb', line 34

def add(property)
  properties[property.name] = 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<Symbol>)

    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



72
73
74
75
76
# File 'lib/verquest/properties/object.rb', line 72

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



41
42
43
44
45
46
47
48
49
# File 'lib/verquest/properties/object.rb', line 41

def to_schema
  {
    name => {
      type: :object,
      required: properties.values.select(&:required).map(&:name),
      properties: properties.transform_values { |property| property.to_schema[property.name] }
    }.merge(schema_options)
  }
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



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

def to_validation_schema(version: nil)
  {
    name => {
      type: :object,
      required: properties.values.select(&:required).map(&:name),
      properties: properties.transform_values { |property| property.to_validation_schema(version:)[property.name] }
    }.merge(schema_options)
  }
end