json_schema_tools 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG.md +1 -0
  3. data/README.md +21 -0
  4. data/lib/schema_tools/modules/attributes.rb +35 -6
  5. data/lib/schema_tools/version.rb +1 -1
  6. data/spec/fixtures/data/contact_nested.json +9 -0
  7. data/spec/fixtures/data/contact_plain.json +10 -0
  8. data/spec/schema_tools/circuluar_ref_spec.rb +1 -1
  9. data/spec/schema_tools/hash_spec.rb +1 -1
  10. data/spec/schema_tools/modules/attributes_spec.rb +34 -2
  11. data/spec/spec_helper.rb +1 -1
  12. data/spec/test_helpers.rb +10 -0
  13. metadata +20 -18
  14. /data/spec/fixtures/{address.json → schemata/address.json} +0 -0
  15. /data/spec/fixtures/{basic_definitions.json → schemata/basic_definitions.json} +0 -0
  16. /data/spec/fixtures/{circular_references_twice.json → schemata/circular_references_twice.json} +0 -0
  17. /data/spec/fixtures/{client.json → schemata/client.json} +0 -0
  18. /data/spec/fixtures/{contact.json → schemata/contact.json} +0 -0
  19. /data/spec/fixtures/{includes_basic_definitions.json → schemata/includes_basic_definitions.json} +0 -0
  20. /data/spec/fixtures/{includes_deep_nested_refs.json → schemata/includes_deep_nested_refs.json} +0 -0
  21. /data/spec/fixtures/{lead.json → schemata/lead.json} +0 -0
  22. /data/spec/fixtures/{nested_schemas → schemata/nested_schemas}/person.json +0 -0
  23. /data/spec/fixtures/{one_of_definition.json → schemata/one_of_definition.json} +0 -0
  24. /data/spec/fixtures/{page.json → schemata/page.json} +0 -0
  25. /data/spec/fixtures/{relative_paths → schemata/relative_paths}/includes_relative_path.json +0 -0
  26. /data/spec/{fixtures_broken → fixtures/schemata_broken}/circular_references.json +0 -0
  27. /data/spec/{fixtures_broken → fixtures/schemata_broken}/circular_references_multi.json +0 -0
  28. /data/spec/{fixtures_broken → fixtures/schemata_broken}/circular_references_multi_file_one.json +0 -0
  29. /data/spec/{fixtures_broken → fixtures/schemata_broken}/circular_references_multi_file_two.json +0 -0
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzY3ZTE3OTFiYzg5OTY5MDQ4ZmRjNTE2MjIzNmE3ZjA5MDg0MTA3YQ==
4
+ ZWI2NjlkM2IyMjgxZGYyODJkNzk5NmY0MjQxMjA0YWQ4ZTNiYTk3Nw==
5
5
  data.tar.gz: !binary |-
6
- MGQ4NjQ2MmQ3NWY0NGI1MWM3MjFjMjY0YjQxMWM1ODc1YmNiZGY2OQ==
6
+ MDhlNWEwMTY5ZjY2ZGJiYjViMjdhZWI5Nzg5NGI4MTM3ZmZmODk0OQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NjMwMGI3ZTY4YzdiZDFmMzA2NzQ2MWRjZjIzN2E4NDNjMzM1ODljZGFhNDM4
10
- NjU0MjM2YjM0NWE3NTg0MmQ5MWI2OGI1OGFhMDNjMjA2ODQ4M2I5NjIzYWZj
11
- MTUyY2Y5N2ZkOWUzZTZlNzY5MGI2MGZjNzI0YTY1YWVmNTAwMWY=
9
+ YmVlMDY3ZTBkOTJkNzA2OWExNWRiYjM3ZDhhNGNkMTJkZDE2MGQ0YWM1OTIz
10
+ Y2NiNDQwNzA0YzljODUzNTM4YmU1MGRmOWVkZDI1MGVhYzg1MWJkNWUzZDY3
11
+ ZGQ2MzA5NTBjZTZjZjJkZTRmODdjOGExOTE2NDVmY2IxZjVmOWM=
12
12
  data.tar.gz: !binary |-
13
- ZDE5YTA5NmE1NWQwNWNmOWRkN2FjNmJhODI3MGFhMWZkNDY2NzhjYzliM2E3
14
- MmVhY2FlMDg0NTczYzgzZjE2OTlmNmZjMWU3NDExYzU5M2RmMzBlY2ZlYjY4
15
- ZjQyYzk0NmM0ZmM5N2M5Y2Y1ZDI2MDFjY2M4NzM4YWM0MWQwZWQ=
13
+ NTFjZjdkMjAzNDgxOWIxYjdiYmEyYTI3ZGMxNWM2YWViMDJlZmZlNzA3Yzc2
14
+ YWEwMzNlZmVjOTIxNjQ5M2JmYzE0YTRjMjhmOGFmZmUxZThlMWQ5NWQwZDFi
15
+ ODIyMzY3NDY2Zjc1Y2NkM2JhMGE0YThlNDJiZWMyN2ViNWJiOTU=
data/CHANGELOG.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  2014-11
4
4
 
5
+ * add from_json method to attributes module, to create new objects from a json string
5
6
  * remove as_json method(alias of as_schema_json) conflicting with active_resource/active_record. Nothing stops one from using/aliasing it in his own code.
6
7
 
7
8
  2014-10
data/README.md CHANGED
@@ -186,6 +186,27 @@ Of course the low level hash method also supports all of these options:
186
186
  client_hash = SchemaTools::Hash.from_schema(peter, fields:['id', 'name'])
187
187
  #=> "client"=>{"id"=>12, "name"=> "Peter"}
188
188
  ```
189
+
190
+ ## Object from JSON
191
+
192
+ On any remote site you'll need to instantiate new objects from an incoming json
193
+ string. Let's assume a contact class which you need for incoming contact json
194
+ data. (Example taken from attributes_spec.rb)
195
+
196
+ ```ruby
197
+ SchemaTools.schema_path = '/path/to/schema-json-files-with-contact-def'
198
+ class Contact
199
+ include SchemaTools::Modules::Attributes
200
+ has_schema_attrs :contact
201
+ end
202
+
203
+ json_str = '{"id": "123456", "last_name": "Meier","first_name": "Peter"}
204
+ c = Contact.from_json(json_str)
205
+ c.id #=> 123456
206
+
207
+ ```
208
+
209
+
189
210
  ## Parameter cleaning
190
211
 
191
212
  Hate people spamming your api with wrong object fields? Use the Cleaner to
@@ -8,10 +8,10 @@ module SchemaTools
8
8
  # class Contact
9
9
  # has_schema_attrs :contact
10
10
  # end
11
- # Contact.schema_name #=> contact
12
- # Contact.as_json
13
- # Contact.as_hash
14
- # Contact.schema #=> json schema hash
11
+ # Contact.schema_name #=> contact
12
+ # Contact.as_schema_json #=> json string
13
+ # Contact.as_hash #=> ruby hash
14
+ # Contact.schema #=> json schema hash
15
15
  module Attributes
16
16
  extend ActiveSupport::Concern
17
17
  include SchemaTools::Modules::AsSchema
@@ -37,12 +37,41 @@ module SchemaTools
37
37
 
38
38
  self.schema= reader.read(schema_name, schema_location)
39
39
  self.schema_name(schema_name)
40
- # make getter / setter
40
+ # make getter / setter methods
41
41
  self.schema[:properties].each do |key, prop|
42
42
  define_method(key) { schema_attrs[key] }
43
43
  define_method("#{key}=") { |value| schema_attrs[key] = value } unless prop[:readonly]
44
44
  end
45
- #TODO parse links ?? or do it in resource module
45
+ end
46
+
47
+ # Create a new object from a json string. Auto-detects nesting by
48
+ # checking for a hash key with the same name as the schema_name:
49
+ #
50
+ # class Contact
51
+ # include SchemaTools::Modules::Attributes
52
+ # has_schema_attrs :contact
53
+ # end
54
+ # c = Contact.from_json('{ "id": "123456", "last_name": "Meier" }')
55
+ # c.id #=>123456
56
+ # c = Contact.from_json('{"contact:{ "id": "123456", "last_name": "Meier" }}')
57
+ #
58
+ # @param [String] json
59
+ def from_json(json)
60
+ hash = JSON.parse(json)
61
+ # test if hash is nested and shift up
62
+ if hash.length == 1 && hash["#{schema_name}"]
63
+ hash = hash["#{schema_name}"]
64
+ end
65
+ obj = new
66
+ hash.each do |key, val|
67
+ next unless obj.respond_to?(key)
68
+ # set values to raw schema attributes, even if there are no setters
69
+ # assuming this objects comes from a remote site
70
+ # TODO type conversion string/integer/number/date/datetime?
71
+ obj.schema_attrs[key] = val
72
+ # TODO if val is a hash / array => look for nested class
73
+ end
74
+ obj
46
75
  end
47
76
 
48
77
  # @param [Hash] schema_hash
@@ -1,3 +1,3 @@
1
1
  module SchemaTools
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
@@ -0,0 +1,9 @@
1
+ {
2
+ "contact" : {
3
+ "id": "123456",
4
+ "contact_source": "website",
5
+ "organisation": "My super-company",
6
+ "last_name": "Meier",
7
+ "first_name": "Peter"
8
+ }
9
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "id": "123456",
3
+ "contact_source": "website",
4
+ "organisation": "My super-company",
5
+ "last_name": "Meier",
6
+ "first_name": "Peter"
7
+ }
8
+
9
+
10
+
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe SchemaTools::Reader do
4
- BROKEN_SCHEMA_PATH = File.expand_path('../../fixtures_broken', __FILE__)
4
+ BROKEN_SCHEMA_PATH = File.join(fixture_path, 'schemata_broken')
5
5
  context 'circular references' do
6
6
  it 'should raise exception for circular $refs' do
7
7
  expect{
@@ -49,7 +49,7 @@ describe SchemaTools::Hash do
49
49
  end
50
50
 
51
51
  it 'should use custom schema path' do
52
- custom_path = File.expand_path('../../fixtures', __FILE__)
52
+ custom_path = File.expand_path('../../fixtures/schemata', __FILE__)
53
53
  hash = SchemaTools::Hash.from_schema(contact, path: custom_path)
54
54
  hash['last_name'].should == 'Paul'
55
55
  end
@@ -1,8 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
- class TestContact
3
+ class TestClient
4
4
  include SchemaTools::Modules::Attributes
5
5
  has_schema_attrs :client
6
+ end
7
+
8
+ class TestContact
9
+ include SchemaTools::Modules::Attributes
10
+ has_schema_attrs :contact
6
11
  end
7
12
 
8
13
  class Numbers
@@ -13,7 +18,7 @@ end
13
18
  describe SchemaTools::Modules::Attributes do
14
19
 
15
20
  context 'included' do
16
- subject { TestContact.new }
21
+ subject { TestClient.new }
17
22
 
18
23
  it 'should add getter methods' do
19
24
  subject.should respond_to(:last_name)
@@ -41,6 +46,33 @@ describe SchemaTools::Modules::Attributes do
41
46
  end
42
47
  end
43
48
 
49
+ context 'new from_json' do
50
+
51
+ it 'creates new object' do
52
+ str = load_fixture_data('contact_plain.json')
53
+ hash = JSON.parse(str)
54
+ obj = TestContact.from_json(str)
55
+ expect(obj.id).to eq hash['id']
56
+ expect(obj.organisation).to eq hash['organisation']
57
+ expect(obj.contact_source).to eq hash['contact_source']
58
+ expect(obj.first_name).to eq hash['first_name']
59
+ expect(obj.last_name).to eq hash['last_name']
60
+ end
61
+
62
+ it 'creates new object from nested response' do
63
+ str = load_fixture_data('contact_nested.json')
64
+ hash = JSON.parse(str)['contact']
65
+ obj = TestContact.from_json(str)
66
+ expect(obj.id).to eq hash['id']
67
+ expect(obj.organisation).to eq hash['organisation']
68
+ expect(obj.contact_source).to eq hash['contact_source']
69
+ expect(obj.first_name).to eq hash['first_name']
70
+ expect(obj.last_name).to eq hash['last_name']
71
+ end
72
+
73
+ end
74
+
75
+
44
76
  context 'attributes from dynamic schema' do
45
77
  subject { Numbers.new }
46
78
 
data/spec/spec_helper.rb CHANGED
@@ -18,6 +18,6 @@ end
18
18
 
19
19
  I18n.enforce_available_locales = false if I18n.respond_to?('enforce_available_locales=')
20
20
  # set global json schema path for examples
21
- SchemaTools.schema_path = File.expand_path('../fixtures', __FILE__)
21
+ SchemaTools.schema_path = File.join(fixture_path,'schemata')
22
22
 
23
23
  puts "Testing with ActiveModel Version: #{ActiveModel.version rescue ActiveModel::VERSION::STRING}"
data/spec/test_helpers.rb CHANGED
@@ -1,3 +1,13 @@
1
+ # Set global fixtures path
2
+ def fixture_path
3
+ File.expand_path('../fixtures/', __FILE__)
4
+ end
5
+ # load a json data object file returns the json string
6
+ # @return[String] file contents
7
+ def load_fixture_data(name)
8
+ File.open(File.join(fixture_path,'data', name ), 'r') { |f| f.read }
9
+ end
10
+
1
11
  def schema_as_ruby_object
2
12
  {
3
13
  "type" => "object",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Georg Leciejewski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-24 00:00:00.000000000 Z
11
+ date: 2014-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -96,22 +96,24 @@ files:
96
96
  - lib/schema_tools/ref_resolver.rb
97
97
  - lib/schema_tools/schema.rb
98
98
  - lib/schema_tools/version.rb
99
- - spec/fixtures/address.json
100
- - spec/fixtures/basic_definitions.json
101
- - spec/fixtures/circular_references_twice.json
102
- - spec/fixtures/client.json
103
- - spec/fixtures/contact.json
104
- - spec/fixtures/includes_basic_definitions.json
105
- - spec/fixtures/includes_deep_nested_refs.json
106
- - spec/fixtures/lead.json
107
- - spec/fixtures/nested_schemas/person.json
108
- - spec/fixtures/one_of_definition.json
109
- - spec/fixtures/page.json
110
- - spec/fixtures/relative_paths/includes_relative_path.json
111
- - spec/fixtures_broken/circular_references.json
112
- - spec/fixtures_broken/circular_references_multi.json
113
- - spec/fixtures_broken/circular_references_multi_file_one.json
114
- - spec/fixtures_broken/circular_references_multi_file_two.json
99
+ - spec/fixtures/data/contact_nested.json
100
+ - spec/fixtures/data/contact_plain.json
101
+ - spec/fixtures/schemata/address.json
102
+ - spec/fixtures/schemata/basic_definitions.json
103
+ - spec/fixtures/schemata/circular_references_twice.json
104
+ - spec/fixtures/schemata/client.json
105
+ - spec/fixtures/schemata/contact.json
106
+ - spec/fixtures/schemata/includes_basic_definitions.json
107
+ - spec/fixtures/schemata/includes_deep_nested_refs.json
108
+ - spec/fixtures/schemata/lead.json
109
+ - spec/fixtures/schemata/nested_schemas/person.json
110
+ - spec/fixtures/schemata/one_of_definition.json
111
+ - spec/fixtures/schemata/page.json
112
+ - spec/fixtures/schemata/relative_paths/includes_relative_path.json
113
+ - spec/fixtures/schemata_broken/circular_references.json
114
+ - spec/fixtures/schemata_broken/circular_references_multi.json
115
+ - spec/fixtures/schemata_broken/circular_references_multi_file_one.json
116
+ - spec/fixtures/schemata_broken/circular_references_multi_file_two.json
115
117
  - spec/schema_tools/circuluar_ref_spec.rb
116
118
  - spec/schema_tools/cleaner_spec.rb
117
119
  - spec/schema_tools/hash_spec.rb
File without changes
File without changes