Object builder based on JSON-Schema.
Consider the following JSON-Schema (escaped as YAML, for better viewing):
# person.yml
person:
type: object
properties:
name:
type: string
birth:
type: object
properties:
name:
type: string
children:
type: array
required: true
items:
type: object
properties:
name:
type: string
require "json-schematized"
class Person < JSON::Schematized::Base
json_schema do # block called for each new instance
YAML.load(File.read(File.expand_path("../person.yml", __FILE__)))["person"]
end
end
person = Person.new name: "John", children: [{name: "William"}]
person.name # => "John"
person.children # => [{"name" => "William"}]
person.children.class # => Person::ChildrenCollection
person.children.first.class # => Person::Child
person.children.first.name # => "William"
Another way to use Basic Wrapper is as follows:
class Person < Hash
include JSON::Schematized
json_schema wrapper: :basic do # block called for each new instance
YAML.load(File.read(File.expand_path("../person.yml", __FILE__)))["person"]
end
end
require "json-schematized"
class Person
include JSON::Schematized
json_schema wrapper: :virtus do # block called only once
YAML.load(File.read(File.expand_path("../person.yml", __FILE__)))["person"]
end
end
person = Person.new name: "John", children: [{name: "William"}]
person.name # => "John"
person.children # => [#<Person::Child:0x007fc990906fd0 @name="William">]
person.children.class # => Person::ChildrenCollection
person.children.first.class # => Person::Child
person.children.first.name # => "William"
person = Hash.new
json_schema = YAML.load(File.read(File.expand_path("../person.yml", __FILE__)))["person"]
person.extend JSON::Schematized::BasicWrapper.modularize(json_schema)
person.children << {}
# ...