Class: SchemaTest::Property::Object

Inherits:
SchemaTest::Property show all
Defined in:
lib/schema_test/property.rb

Constant Summary collapse

SHORTHAND_ATTRIBUTES =
{
  id: :integer,
  slug: :string,
  updated_at: :datetime,
  created_at: :datetime
}
TYPES =
{
  boolean: SchemaTest::Property::Boolean,
  integer: SchemaTest::Property::Integer,
  float: SchemaTest::Property::Float,
  string: SchemaTest::Property::String,
  datetime: SchemaTest::Property::DateTime,
  date: SchemaTest::Property::Date,
  url: SchemaTest::Property::Uri,
  html: SchemaTest::Property::String,
  null: SchemaTest::Property::Nil
}

Constants inherited from SchemaTest::Property

NULL_TYPE

Instance Attribute Summary collapse

Attributes inherited from SchemaTest::Property

#_type, #description, #name

Instance Method Summary collapse

Methods inherited from SchemaTest::Property

#json_schema_format, #json_schema_type, #lookup_object, #nullable, #nullable!, #nullable?, #optional, #optional!, #optional?, #type

Constructor Details

#initialize(name, description: nil, version: nil, from: nil, properties: nil, except: [], &block) ⇒ Object

Returns a new instance of Object.



151
152
153
154
155
156
157
158
159
# File 'lib/schema_test/property.rb', line 151

def initialize(name, description: nil, version: nil, from: nil, properties: nil, except: [], &block)
  super(name, :object, description)
  @version = version
  @specific_properties = properties
  @properties = {}
  @excluded_property_names = except
  @from = from
  instance_eval(&block) if block_given?
end

Instance Attribute Details

#excluded_property_namesObject (readonly)

Returns the value of attribute excluded_property_names.



149
150
151
# File 'lib/schema_test/property.rb', line 149

def excluded_property_names
  @excluded_property_names
end

#versionObject (readonly)

Returns the value of attribute version.



149
150
151
# File 'lib/schema_test/property.rb', line 149

def version
  @version
end

Instance Method Details

#==(other) ⇒ Object



171
172
173
174
175
# File 'lib/schema_test/property.rb', line 171

def ==(other)
  super &&
    properties.all? { |name, property| property == other.properties[name] } &&
    excluded_property_names == other.excluded_property_names
end

#array(name, of: nil, desc: nil, &block) ⇒ Object



218
219
220
# File 'lib/schema_test/property.rb', line 218

def array(name, of: nil, desc: nil, &block)
  define_property(SchemaTest::Property::Array.new(name, of, desc, &block))
end

#as_json_schema(include_root = true) ⇒ Object



239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/schema_test/property.rb', line 239

def as_json_schema(include_root=true)
  property_values = properties.values
  required_property_names = property_values.reject(&:optional?).map(&:name).map(&:to_s)
  schema = {
    'type' => json_schema_type,
    'properties' => property_values.inject({}) { |a,p| a.merge(p.as_json_schema) },
    'required' => required_property_names,
    'additionalProperties' => false
  }
  if include_root
    { name.to_s => schema }
  else
    schema
  end
end

#base_json_schema_typeObject



255
256
257
# File 'lib/schema_test/property.rb', line 255

def base_json_schema_type
  'object'
end

#based_on(name, version: self.version, except: []) ⇒ Object



166
167
168
169
# File 'lib/schema_test/property.rb', line 166

def based_on(name, version: self.version, except: [])
  @from = lookup_object(name, version)
  @excluded_property_names = except
end

#object(name, desc: nil, as: name, version: nil, except: [], &block) ⇒ Object



222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/schema_test/property.rb', line 222

def object(name, desc: nil, as: name, version: nil, except: [], &block)
  inferred_version = version || @version
  if block_given?
    define_property(SchemaTest::Property::Object.new(as, description: desc, version: inferred_version, &block))
  else
    define_property(
      SchemaTest::Property::Object.new(
        as,
        description: desc,
        version: inferred_version,
        from: lookup_object(name, inferred_version, nil),
        except: except
      )
    )
  end
end

#propertiesObject



161
162
163
164
# File 'lib/schema_test/property.rb', line 161

def properties
  resolve
  @properties.reject { |p| excluded_property_names.include?(p) }
end

#resolveObject



177
178
179
180
181
182
183
184
185
186
187
# File 'lib/schema_test/property.rb', line 177

def resolve
  if @from
    @properties = @from.properties.merge(@properties)
    @from = nil
  end
  if @specific_properties
    @specific_properties.each { |p| define_property(p) }
    @specific_properties = nil
  end
  self
end