Module: SchemaTools::Modules::Attributes::ClassMethods
- Defined in:
- lib/schema_tools/modules/attributes.rb
Instance Method Summary collapse
-
#from_hash(hash, obj = nil) ⇒ Object
Create a new object from a ruby hash (e.g parsed from json string).
-
#from_json(json) ⇒ Object
Create a new object from a json string or a ruby hash (already created from json string).
- #has_schema_attrs(schema_name, opts = {}) ⇒ Object
- #schema ⇒ Object
- #schema=(schema_hash) ⇒ Object
Instance Method Details
#from_hash(hash, obj = nil) ⇒ 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
attributes. e.g during an update
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/schema_tools/modules/attributes.rb', line 79 def from_hash(hash, obj=nil) # 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 field_props = self.schema['properties']["#{key}"] conv_val = if val.nil? val elsif field_props['type'] == 'string' if field_props['format'] == 'date' Date.parse(val) # or be explicit? Date.strptime('2001-02-03', '%Y-%m-%d') elsif field_props['format'] == 'date-time' Time.parse(val) # vs Time.strptime else "#{val}" end elsif field_props['type'] == 'integer' val.to_i else # rely on preceding call e.g from_json for boolean, number val end # TODO if val is a hash / array => look for nested class & cast obj.schema_attrs["#{key}"] = conv_val 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" }} )
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
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 |
#schema ⇒ Object
115 116 117 |
# File 'lib/schema_tools/modules/attributes.rb', line 115 def schema @schema end |
#schema=(schema_hash) ⇒ Object
112 113 114 |
# File 'lib/schema_tools/modules/attributes.rb', line 112 def schema= schema_hash @schema = schema_hash end |