json_schema_tools 0.0.2 → 0.0.3
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.
- data/lib/schema_tools/modules/read.rb +14 -5
- data/lib/schema_tools/version.rb +1 -1
- data/spec/fixtures/address.json +1 -44
- data/spec/fixtures/contact.json +1 -1
- data/spec/fixtures/lead.json +13 -0
- data/spec/schema_tools/reader_spec.rb +13 -0
- metadata +4 -3
@@ -31,12 +31,21 @@ module SchemaTools
|
|
31
31
|
# @param [String|Symbol] schema name to be read from schema path directory
|
32
32
|
# @param [String] path
|
33
33
|
# @return[HashWithIndifferentAccess] schema as hash
|
34
|
-
def read(
|
35
|
-
|
36
|
-
return registry[
|
37
|
-
file_path = File.join(path || SchemaTools.schema_path, "#{
|
34
|
+
def read(schema_name, path=nil)
|
35
|
+
schema_name = schema_name.to_sym
|
36
|
+
return registry[schema_name] if registry[schema_name]
|
37
|
+
file_path = File.join(path || SchemaTools.schema_path, "#{schema_name}.json")
|
38
38
|
plain_data = File.open(file_path, 'r'){|f| f.read}
|
39
|
-
|
39
|
+
schema = ActiveSupport::JSON.decode(plain_data).with_indifferent_access
|
40
|
+
if schema[:extends]
|
41
|
+
extends = schema[:extends].is_a?(Array) ? schema[:extends] : [ schema[:extends] ]
|
42
|
+
extends.each do |ext_name|
|
43
|
+
ext = read(ext_name, path)
|
44
|
+
# current schema props win
|
45
|
+
schema[:properties] = ext[:properties].merge(schema[:properties])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
registry[ schema_name ] = schema
|
40
49
|
end
|
41
50
|
|
42
51
|
# Read all available schemas from a given path(folder) and return
|
data/lib/schema_tools/version.rb
CHANGED
data/spec/fixtures/address.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{ "type":"object",
|
2
2
|
"title": "address",
|
3
3
|
"name": "address",
|
4
|
-
"description":"An address
|
4
|
+
"description":"An address .. Example partially taken from SalesKing",
|
5
5
|
"properties":{
|
6
6
|
"id":{
|
7
7
|
"description":"Unique identifier - UUID",
|
@@ -22,63 +22,20 @@
|
|
22
22
|
"type":"string",
|
23
23
|
"maxLength": 100
|
24
24
|
},
|
25
|
-
"address2":{
|
26
|
-
"description": "Additional address information, like floor number",
|
27
|
-
"type":"string",
|
28
|
-
"maxLength": 100
|
29
|
-
},
|
30
|
-
"pobox":{
|
31
|
-
"description": "Post office box number",
|
32
|
-
"type":"string",
|
33
|
-
"maxLength": 10
|
34
|
-
},
|
35
25
|
"zip":{
|
36
26
|
"description": "Zip number of the city. Length must be between 4..10",
|
37
27
|
"type":"string",
|
38
28
|
"maxLength": 10
|
39
29
|
},
|
40
|
-
"state":{
|
41
|
-
"description": "Country state of address",
|
42
|
-
"type":"string",
|
43
|
-
"maxLength": 100
|
44
|
-
},
|
45
30
|
"country":{
|
46
31
|
"description": "Country of the address.",
|
47
32
|
"type":"string",
|
48
33
|
"maxLength": 100
|
49
34
|
},
|
50
|
-
"created_at":{
|
51
|
-
"description": "Date the object was created in SK. Never changes afterwards",
|
52
|
-
"format":"date-time",
|
53
|
-
"readonly":true,
|
54
|
-
"type":"string"
|
55
|
-
},
|
56
|
-
"updated_at":{
|
57
|
-
"description": "Date the object was edited in SK.",
|
58
|
-
"format":"date-time",
|
59
|
-
"readonly":true,
|
60
|
-
"type":"string"
|
61
|
-
},
|
62
35
|
"address_type":{
|
63
36
|
"description": "Type of the address, as seen by vCard definition. There can only be one type. Inside of SK you can use placeholders like client.parcel_address.city to access the first parcel adr(Same for work_ / home_). <br/>Besides the placeholder default_address, always returns the first address found. Sorting is done by the order(if set) else by date, newest first.",
|
64
37
|
"enum":["work","home", "parcel"],
|
65
38
|
"type":"string"
|
66
|
-
},
|
67
|
-
"order":{
|
68
|
-
"description": "Addresses are normally sorted by date, newest first. If you need to strongly rely on their sorting e.g. default_address (always first) or have multiple addresses of one type(3 parcel), use this field for all adrs. <br/>Single adrs are used in placeholders like: addresses.2.city, returning the second adr found(not necessarily one with order=2).",
|
69
|
-
"type":"integer"
|
70
|
-
},
|
71
|
-
"lat":{
|
72
|
-
"description": "Geo-Location latitude",
|
73
|
-
"type":"number"
|
74
|
-
},
|
75
|
-
"long":{
|
76
|
-
"description": "Geo-Location longitude",
|
77
|
-
"type":"number"
|
78
|
-
},
|
79
|
-
"_destroy":{
|
80
|
-
"description": "When set an existing address will be deleted. This switch is only used when addresses are passed-in nested inside their parent object(a contact).",
|
81
|
-
"type":"boolean"
|
82
39
|
}
|
83
40
|
},
|
84
41
|
"links":[]
|
data/spec/fixtures/contact.json
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
{ "type":"object",
|
2
|
+
"title": "Lead",
|
3
|
+
"name": "lead",
|
4
|
+
"extends": "contact",
|
5
|
+
"description": "A lead, inherits fields from contact schema",
|
6
|
+
"properties":{
|
7
|
+
"lead_source":{
|
8
|
+
"description": "Where did the person come from",
|
9
|
+
"type":"string",
|
10
|
+
"maxLength": 255
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
@@ -3,15 +3,28 @@ require 'spec_helper'
|
|
3
3
|
describe SchemaTools::Reader do
|
4
4
|
|
5
5
|
context 'class methods' do
|
6
|
+
|
6
7
|
after :each do
|
7
8
|
SchemaTools::Reader.registry_reset
|
8
9
|
end
|
10
|
+
|
9
11
|
it 'should read a single schema' do
|
10
12
|
schema = SchemaTools::Reader.read(:page)
|
11
13
|
schema[:name].should == 'page'
|
12
14
|
schema[:properties].should_not be_empty
|
13
15
|
SchemaTools::Reader.registry.should_not be_empty
|
14
16
|
end
|
17
|
+
|
18
|
+
it 'should read a schema with inheritance' do
|
19
|
+
schema = SchemaTools::Reader.read(:lead) # extends contact
|
20
|
+
|
21
|
+
SchemaTools::Reader.registry[:contact].should_not be_empty
|
22
|
+
SchemaTools::Reader.registry[:lead].should_not be_empty
|
23
|
+
|
24
|
+
schema[:properties][:first_name].should_not be_empty
|
25
|
+
schema[:properties][:lead_source].should_not be_empty
|
26
|
+
end
|
27
|
+
|
15
28
|
end
|
16
29
|
|
17
30
|
context 'instance methods' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_schema_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- spec/fixtures/address.json
|
120
120
|
- spec/fixtures/client.json
|
121
121
|
- spec/fixtures/contact.json
|
122
|
+
- spec/fixtures/lead.json
|
122
123
|
- spec/fixtures/page.json
|
123
124
|
- spec/schema_tools/cleaner_spec.rb
|
124
125
|
- spec/schema_tools/hash_spec.rb
|
@@ -139,7 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
140
|
version: '0'
|
140
141
|
segments:
|
141
142
|
- 0
|
142
|
-
hash:
|
143
|
+
hash: 1443781473730246135
|
143
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
145
|
none: false
|
145
146
|
requirements:
|
@@ -148,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
149
|
version: '0'
|
149
150
|
segments:
|
150
151
|
- 0
|
151
|
-
hash:
|
152
|
+
hash: 1443781473730246135
|
152
153
|
requirements: []
|
153
154
|
rubyforge_project:
|
154
155
|
rubygems_version: 1.8.24
|