json_schema_tools 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGQwMzVlNmIwYjkxYjhkY2UxNGVjMTdhMGNmMDRhMjJkNmU3MmUwZQ==
4
+ MDAyZTViOWEwMjk1YzMwNDQwZGYzYjBlODhiZDI5NzQ5OGRkOGY4YQ==
5
5
  data.tar.gz: !binary |-
6
- Yjc3N2MyM2NjMDYzOGU2YTRlM2ZlNTkyMmNmOTU4ZGI3MmYyOTU4ZQ==
6
+ MTAyYmE1MDAwYTFlZGU2MjcwZDkxZDczODQxZjU3YzM3MWIzMGM3Mg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- Zjk2ZDQwNDNiYzM5NTRkYWY2NzcyYTMwNWQzZGI3YTc4ZjkzNTQxNTJhMjAw
10
- MDA2YWQxN2QwNmU0NzZmZDJhMzI2ZDBlNzQ2ZDE4OWI1YTE4YjA2YjFlNzll
11
- OTcxNWE3NjkwYWU4ZWRjY2ZkYzQwODIxMjcxOWEzOWQwMTUyNGI=
9
+ NTRlNTI2OGVkYWExZTBkODRiNDVlZDNjMjdmMGFkNTM2MDQ3NTljYjNiM2Uw
10
+ ZDFhNjc2Yzk3OWY4NjIzODg1ZTMwOWU2ZTlkNzZiYWRlMDg2NjAyZmM0YjE2
11
+ NzZhOTYwNGRhZjI2NWI0MWFiNTkyNTA2ZjE1ODUzMTBjZDVhODI=
12
12
  data.tar.gz: !binary |-
13
- Y2Y3NmZjZmY0Y2Q4NGVmNTRmYWMyMGQ4NzMyN2E4OTBmZDUyNmE3MTllM2Q3
14
- MzUyYmIzMWQwNjI5ODk2ZjFjOWY3OWZkYjdiNmQyNWY1ZjRjMmEwNjI0Njc0
15
- N2ViNWUyMGY0YWM5YzY3YzUzYmZhZmI3NDlmYTc3YThhYjEyZTg=
13
+ ZGUzOTcxZjJiMTE0MjEwOWJjMTgzNDRlZDNkNWQyYjYxODE0OWQwYWVlNTRm
14
+ MDIzOGIyOGNkZjQwOGYwM2QxNWQ2ZjkxYjE1Y2MzZGNhMzk3MDBmOWRlYmQ5
15
+ ODU0MzgzYmE5ZTEwYjRmNTI1YmY0NzlkZWZjY2FmYzNlZTg0ZTA=
@@ -31,7 +31,7 @@ module SchemaTools
31
31
  # @param [String|Symbol] schema name to be read from schema path directory
32
32
  # @param [String|Hash] either the path to retrieve schema_name from,
33
33
  # or a Schema in Ruby hash form
34
- # @return[HashWithIndifferentAccess] schema as hash
34
+ # @return[HashWithIndifferentAccess|Nil] schema as hash, nil if schema is not an object
35
35
  def read(schema_name, path_or_schema=nil)
36
36
  schema_name = schema_name.to_sym
37
37
  return registry[schema_name] if registry[schema_name]
@@ -55,6 +55,8 @@ module SchemaTools
55
55
  plain_data ||= File.open(file_path, 'r'){|f| f.read}
56
56
 
57
57
  schema = ActiveSupport::JSON.decode(plain_data).with_indifferent_access
58
+ # only import object definitions, shared property definitions are handled separate
59
+ return unless schema[:type] == 'object'
58
60
  if schema[:extends]
59
61
  extends = schema[:extends].is_a?(Array) ? schema[:extends] : [ schema[:extends] ]
60
62
  extends.each do |ext_name|
@@ -67,18 +69,27 @@ module SchemaTools
67
69
  registry[ schema_name ] = schema
68
70
  end
69
71
 
70
- # Read all available schemas from a given path(folder) and return
71
- # them as array
72
+ # Read all available schemas from a given path(folder +subfolders) and
73
+ # return the found object definitions them as array. Also populates the
74
+ # registry
72
75
  #
73
76
  # @param [String] path to schema files
74
77
  # @return [Array<HashWithIndifferentAccess>] array of schemas as hash
75
78
  def read_all(path=nil)
76
79
  schemas = []
77
- file_path = File.join(path || SchemaTools.schema_path, '*.json')
78
- Dir.glob( file_path ).each do |file|
80
+ file_paths = if path
81
+ [File.join(path, '*.json')]
82
+ else
83
+ [ File.join( SchemaTools.schema_path, '*.json'),
84
+ File.join( SchemaTools.schema_path, '**/*', '*.json')
85
+ ]
86
+ end
87
+
88
+ Dir.glob( file_paths ).each do |file|
79
89
  schema_name = File.basename(file, '.json').to_sym
80
90
  schemas << read(schema_name, path)
81
91
  end
92
+ schemas.compact!
82
93
  schemas
83
94
  end
84
95
 
@@ -1,3 +1,3 @@
1
1
  module SchemaTools
2
- VERSION = '0.2.5'
2
+ VERSION = '0.2.6'
3
3
  end
@@ -0,0 +1,23 @@
1
+ { "type":"object",
2
+ "title": "Person",
3
+ "name": "person",
4
+ "description": "A simple person, nested in subfolder",
5
+ "properties":{
6
+ "id":{
7
+ "description":"Unique identifier ",
8
+ "identity":true,
9
+ "readonly":true,
10
+ "type":"number"
11
+ },
12
+ "last_name":{
13
+ "description": "Last name of a person. ",
14
+ "type":"string",
15
+ "maxLength": 50
16
+ },
17
+ "first_name":{
18
+ "description": "First name of a person.",
19
+ "type":"string",
20
+ "maxLength": 50
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "type":"object",
3
+ "title":"test_oneOf_object",
4
+ "name":"one_of_definition",
5
+ "description":"test_object parsing of nested oneOf object definition",
6
+ "properties": {
7
+ "person": {
8
+ "type" : "object",
9
+ "oneOf" : [
10
+ { "$ref" : "./client.json.json#properties"},
11
+ { "$ref" : "./contact.json.json#properties"}
12
+ ]
13
+ }
14
+ }
15
+ }
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
  # json schema is derived from it
6
6
  ################################################################################
7
7
  class Client
8
- attr_accessor :first_name, :id, :addresses, :work_address
8
+ attr_accessor :first_name, :id, :addresses, :work_address
9
9
  end
10
10
  class Address
11
11
  attr_accessor :city, :zip
@@ -13,6 +13,10 @@ end
13
13
 
14
14
  class Contact
15
15
  attr_accessor :first_name, :last_name, :addresses, :id
16
+ end
17
+
18
+ class OneOfDefinition
19
+ attr_accessor :person
16
20
  end
17
21
 
18
22
  # see fixtures/lead.json
@@ -69,12 +73,12 @@ describe SchemaTools::Hash do
69
73
  hash['_class_name'].should == 'contact'
70
74
  end
71
75
 
72
- it 'should have _links on object if exclude root' do
76
+ it 'has _links on object if exclude root' do
73
77
  hash = SchemaTools::Hash.from_schema(contact, exclude_root: true, class_name: :client)
74
78
  hash['_links'].length.should == 7
75
79
  end
76
80
 
77
- it 'should have _class_name on object if exclude root' do
81
+ it 'has _class_name on object if exclude root' do
78
82
  hash = SchemaTools::Hash.from_schema(contact, exclude_root: true, class_name: :client)
79
83
  hash['_class_name'].should == 'client'
80
84
  end
@@ -84,17 +88,17 @@ describe SchemaTools::Hash do
84
88
 
85
89
  let(:client){Client.new}
86
90
 
87
- it 'should have an empty array if values are missing' do
91
+ it 'has an empty array if values are missing' do
88
92
  hash = SchemaTools::Hash.from_schema(client)
89
93
  hash['client']['addresses'].should == []
90
94
  end
91
95
 
92
- it 'should have nil if nested object is missing' do
96
+ it 'has nil if nested object is missing' do
93
97
  hash = SchemaTools::Hash.from_schema(client)
94
98
  hash['client']['work_address'].should be_nil
95
99
  end
96
100
 
97
- it 'should have nested array values' do
101
+ it 'has nested array values' do
98
102
  a1 = Address.new
99
103
  a1.city = 'Cologne'
100
104
  a1.zip = 50733
@@ -103,7 +107,7 @@ describe SchemaTools::Hash do
103
107
  hash['client']['addresses'].should == [{"address"=>{"city"=>"Cologne", "zip"=>50733}}]
104
108
  end
105
109
 
106
- it 'should have nested array values without root' do
110
+ it 'has nested array values without root' do
107
111
  a1 = Address.new
108
112
  a1.city = 'Cologne'
109
113
  a1.zip = 50733
@@ -112,7 +116,7 @@ describe SchemaTools::Hash do
112
116
  hash['addresses'].should == [{"city"=>"Cologne", "zip"=>50733, "_class_name"=>"address"}]
113
117
  end
114
118
 
115
- it 'should have nested object value' do
119
+ it 'has nested object value' do
116
120
  a1 = Address.new
117
121
  a1.city = 'Cologne'
118
122
  a1.zip = 50733
@@ -121,7 +125,7 @@ describe SchemaTools::Hash do
121
125
  hash['client']['work_address'].should == {"address"=>{"city"=>"Cologne", "zip"=>50733}}
122
126
  end
123
127
 
124
- it 'should have nested object value without root' do
128
+ it 'has nested object value without root' do
125
129
  a1 = Address.new
126
130
  a1.city = 'Cologne'
127
131
  a1.zip = 50733
@@ -130,6 +134,18 @@ describe SchemaTools::Hash do
130
134
  hash['work_address'].should == {"city"=>"Cologne", "zip"=>50733, "_class_name"=>"address"}
131
135
  end
132
136
 
137
+ it 'has nested oneOf type object ' do
138
+ contact = Contact.new
139
+ contact.first_name = 'Pit'
140
+
141
+ i = OneOfDefinition.new
142
+ i.person = contact
143
+
144
+ hash = SchemaTools::Hash.from_schema(i, exclude_root: true)
145
+ hash['person']['first_name'].should == 'Pit'
146
+ hash['person']['_class_name'].should == 'contact'
147
+ end
148
+
133
149
  end
134
150
 
135
151
  context 'with plain nested values' do
@@ -168,7 +184,7 @@ describe SchemaTools::Hash do
168
184
  SchemaTools::Reader.registry_reset
169
185
  end
170
186
 
171
- it 'should have links' do
187
+ it 'has links' do
172
188
  hash = SchemaTools::Hash.from_schema(client)
173
189
  hash['links'].length.should == 7
174
190
  end
@@ -2,20 +2,34 @@ require 'spec_helper'
2
2
 
3
3
  describe SchemaTools::Reader do
4
4
 
5
- context 'class methods' do
5
+ context '.read_all' do
6
+ after :each do
7
+ SchemaTools::Reader.registry_reset
8
+ end
9
+
10
+ it 'reads all schemas' do
11
+ schemas = SchemaTools::Reader.read_all
12
+ schemas.length.should == SchemaTools::Reader.registry.length
13
+ person_schema = schemas.detect{|i| i['name'] = 'person'}
14
+ person_schema.should be
15
+ end
16
+
17
+ end
18
+
19
+ context '.read' do
6
20
 
7
21
  after :each do
8
22
  SchemaTools::Reader.registry_reset
9
23
  end
10
24
 
11
- it 'should read a single schema' do
25
+ it 'reads a single schema' do
12
26
  schema = SchemaTools::Reader.read(:page)
13
27
  schema[:name].should == 'page'
14
28
  schema[:properties].should_not be_empty
15
29
  SchemaTools::Reader.registry.should_not be_empty
16
30
  end
17
31
 
18
- it 'should read a schema with inheritance' do
32
+ it 'reads a schema with inheritance' do
19
33
  schema = SchemaTools::Reader.read(:lead) # extends contact
20
34
 
21
35
  SchemaTools::Reader.registry[:contact].should_not be_empty
@@ -25,7 +39,7 @@ describe SchemaTools::Reader do
25
39
  schema[:properties][:lead_source].should_not be_empty
26
40
  end
27
41
 
28
- it 'should read a schema from a Ruby Hash' do
42
+ it 'reads a schema from a Ruby Hash' do
29
43
  schema = SchemaTools::Reader.read(:numbers, schema_as_ruby_object)
30
44
 
31
45
  SchemaTools::Reader.registry[:numbers].should_not be_empty
@@ -33,7 +47,7 @@ describe SchemaTools::Reader do
33
47
  schema[:properties][:numbers].should_not be_empty
34
48
  end
35
49
 
36
- it 'should deal with referenced parameters properly' do
50
+ it 'deals with referenced parameters properly' do
37
51
  schema = SchemaTools::Reader.read(:includes_basic_definitions)
38
52
  schema[:properties].should_not be_empty
39
53
  schema[:properties].length.should eq 3
@@ -42,23 +56,28 @@ describe SchemaTools::Reader do
42
56
  schema[:properties][:id]["$ref"].should be_nil
43
57
  end
44
58
 
45
- it 'should enforce correct parameter usage' do
59
+ it 'enforces correct parameter usage' do
46
60
  expect { SchemaTools::Reader.read(:contact, []) }.to raise_error ArgumentError
47
61
  end
62
+
63
+ it 'reads from sub folder' do
64
+ schema = SchemaTools::Reader.read(:person)
65
+ schema[:name].should == 'person'
66
+ end
48
67
  end
49
68
 
50
69
  context 'instance methods' do
51
70
 
52
71
  let(:reader){ SchemaTools::Reader.new }
53
72
 
54
- it 'should read a single schema' do
73
+ it 'reads a single schema' do
55
74
  schema = reader.read(:client)
56
75
  schema[:name].should == 'client'
57
76
  schema[:properties].should_not be_empty
58
77
  reader.registry[:client].should_not be_empty
59
78
  end
60
79
 
61
- it 'should read a single schema from Ruby Hash' do
80
+ it 'reads a single schema from Ruby Hash' do
62
81
  schema = reader.read(:numbers, schema_as_ruby_object)
63
82
  schema[:name].should == 'numbers'
64
83
  schema[:properties].should_not be_empty
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.2.5
4
+ version: 0.2.6
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-09-10 00:00:00.000000000 Z
11
+ date: 2014-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -101,6 +101,8 @@ files:
101
101
  - spec/fixtures/contact.json
102
102
  - spec/fixtures/includes_basic_definitions.json
103
103
  - spec/fixtures/lead.json
104
+ - spec/fixtures/nested_schemas/person.json
105
+ - spec/fixtures/one_of_definition.json
104
106
  - spec/fixtures/page.json
105
107
  - spec/schema_tools/cleaner_spec.rb
106
108
  - spec/schema_tools/hash_spec.rb