Module: SchemaTools::Modules::Attributes::ClassMethods

Defined in:
lib/schema_tools/modules/attributes.rb

Instance Method Summary collapse

Instance Method Details

#from_hash(hash) ⇒ Object

Create a new object from a ruby hash (e.g parsed from json string). Auto-detects nesting by checking for a hash key with the same name as the schema_name:

class Contact
  include SchemaTools::Modules::Attributes
  has_schema_attrs :contact
end
c = Contact.from_hash( {'contact'=>{ "id=>"123456", "last_name"=>"Meier" }} )
c.id #=>123456

Parameters:

  • json (String|Hash{String=>Mixed})

    string or hash



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/schema_tools/modules/attributes.rb', line 77

def from_hash(hash)
  # test if hash is nested and shift up
  if hash.length == 1 && hash["#{schema_name}"]
    hash = hash["#{schema_name}"]
  end
  obj = new
  hash.each do |key, val|
    next unless obj.respond_to?(key)
    # set values to raw schema attributes, even if there are no setters
    # assuming this objects comes from a remote site
    # TODO type conversion string/integer/number/date/datetime?
    obj.schema_attrs[key] = val
    # TODO if val is a hash / array => look for nested class
  end
  obj
end

#from_json(json) ⇒ Object

Create a new object from a json string or a ruby hash (already created from json string). Auto-detects nesting by checking for a hash key with the same name as the schema_name:

class Contact
  include SchemaTools::Modules::Attributes
  has_schema_attrs :contact
end
c = Contact.from_json('{ "id": "123456",  "last_name": "Meier" }')
c.id #=>123456
c = Contact.from_json( {'contact'=>{ "id=>"123456", "last_name"=>"Meier" }} )

Parameters:

  • json (String|Hash{String=>Mixed})

    string or hash



60
61
62
63
# File 'lib/schema_tools/modules/attributes.rb', line 60

def from_json(json)
  hash = JSON.parse(json)
  from_hash(hash)
end

#has_schema_attrs(schema_name, opts = {}) ⇒ Object

Parameters:

  • schema (Symbol|String)

    name

  • opts (Hash<Symbol|String>) (defaults to: {})


33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/schema_tools/modules/attributes.rb', line 33

def has_schema_attrs(schema_name, opts={})
  reader          = opts[:reader] || SchemaTools::Reader
  schema_location = opts[:path]   || opts[:schema]
  # remember schema + name on class level

  self.schema= reader.read(schema_name, schema_location)
  self.schema_name(schema_name)
  # make getter / setter methods
  self.schema[:properties].each do |key, prop|
    define_method(key) { schema_attrs[key] }
    define_method("#{key}=") { |value| schema_attrs[key] = value } unless prop[:readonly]
  end
end

#schemaObject



98
99
100
# File 'lib/schema_tools/modules/attributes.rb', line 98

def schema
  @schema
end

#schema=(schema_hash) ⇒ Object

Parameters:

  • schema_hash (Hash)


95
96
97
# File 'lib/schema_tools/modules/attributes.rb', line 95

def schema= schema_hash
  @schema = schema_hash
end