json_schema 0.0.13 → 0.0.14

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/bin/validate-schema CHANGED
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "json"
4
3
  require "optparse"
5
4
  require_relative "../lib/commands/validate_schema"
6
5
 
@@ -1,3 +1,5 @@
1
+ require "json"
2
+ require "yaml"
1
3
  require_relative "../json_schema"
2
4
 
3
5
  module Commands
@@ -28,8 +30,9 @@ module Commands
28
30
  return false if argv.count < 1
29
31
 
30
32
  argv.each do |data_file|
31
- return false if !check_file(data_file)
32
- data = JSON.parse(File.read(data_file))
33
+ if !(data = read_file(data_file))
34
+ return false
35
+ end
33
36
 
34
37
  if detect
35
38
  if !(schema_uri = data["$schema"])
@@ -57,15 +60,6 @@ module Commands
57
60
 
58
61
  private
59
62
 
60
- def check_file(file)
61
- if !File.exists?(file)
62
- @errors = ["#{file}: No such file or directory."]
63
- false
64
- else
65
- true
66
- end
67
- end
68
-
69
63
  def initialize_store
70
64
  @store = JsonSchema::DocumentStore.new
71
65
  extra_schemas.each do |extra_schema|
@@ -83,10 +77,12 @@ module Commands
83
77
  end
84
78
 
85
79
  def parse(file)
86
- return nil if !check_file(file)
80
+ if !(schema_data = read_file(file))
81
+ return nil
82
+ end
87
83
 
88
84
  parser = JsonSchema::Parser.new
89
- if !(schema = parser.parse(JSON.parse(File.read(file))))
85
+ if !(schema = parser.parse(schema_data))
90
86
  @errors = map_schema_errors(file, parser.errors)
91
87
  return nil
92
88
  end
@@ -99,5 +95,25 @@ module Commands
99
95
 
100
96
  schema
101
97
  end
98
+
99
+ def read_file(file)
100
+ contents = File.read(file)
101
+ if File.extname(file) == ".yaml"
102
+ YAML.load(contents)
103
+ else
104
+ JSON.load(contents)
105
+ end
106
+ rescue Errno::ENOENT
107
+ @errors = ["#{file}: No such file or directory."]
108
+ nil
109
+ rescue JSON::ParserError
110
+ # Ruby's parsing exceptions aren't too helpful, just point user to
111
+ # a better tool
112
+ @errors = ["#{file}: Invalid JSON. Try to validate using `jsonlint`."]
113
+ nil
114
+ rescue Psych::SyntaxError
115
+ @errors = ["#{file}: Invalid YAML."]
116
+ nil
117
+ end
102
118
  end
103
119
  end
@@ -170,6 +170,7 @@ module JsonSchema
170
170
  link.parent = schema
171
171
 
172
172
  link.description = l["description"]
173
+ link.enc_type = l["encType"]
173
174
  link.href = l["href"]
174
175
  link.method = l["method"] ? l["method"].downcase.to_sym : nil
175
176
  link.rel = l["rel"]
@@ -179,6 +180,11 @@ module JsonSchema
179
180
  link.schema = parse_data(l["schema"], schema, "links/#{i}/schema")
180
181
  end
181
182
 
183
+ if l["targetSchema"]
184
+ link.target_schema =
185
+ parse_data(l["schema"], schema, "links/#{i}/targetSchema")
186
+ end
187
+
182
188
  link
183
189
  }
184
190
  end
@@ -144,7 +144,6 @@ module JsonSchema
144
144
  schema.any_of.each { |s| yielder << s }
145
145
  schema.one_of.each { |s| yielder << s }
146
146
  schema.definitions.each { |_, s| yielder << s }
147
- schema.links.map { |l| l.schema }.compact.each { |s| yielder << s }
148
147
  schema.pattern_properties.each { |_, s| yielder << s }
149
148
  schema.properties.each { |_, s| yielder << s }
150
149
 
@@ -173,6 +172,12 @@ module JsonSchema
173
172
  schema.dependencies.values.
174
173
  select { |s| s.is_a?(Schema) }.
175
174
  each { |s| yielder << s }
175
+
176
+ # schemas contained inside hyper-schema links objects
177
+ schema.links.map { |l| [l.schema, l.target_schema] }.
178
+ flatten.
179
+ compact.
180
+ each { |s| yielder << s }
176
181
  end
177
182
  end
178
183
 
@@ -283,11 +283,17 @@ module JsonSchema
283
283
 
284
284
  # schema attributes
285
285
  attr_accessor :description
286
+ attr_accessor :enc_type
286
287
  attr_accessor :href
287
288
  attr_accessor :method
288
289
  attr_accessor :rel
289
290
  attr_accessor :schema
291
+ attr_accessor :target_schema
290
292
  attr_accessor :title
293
+
294
+ def enc_type
295
+ @enc_type || "application/json"
296
+ end
291
297
  end
292
298
 
293
299
  # Media type subobject for a hyperschema.
@@ -213,6 +213,9 @@ module DataScaffold
213
213
  "$ref" => "#/definitions/app/definitions/name"
214
214
  },
215
215
  }
216
+ },
217
+ "targetSchema" => {
218
+ "$ref" => "#/definitions/app"
216
219
  }
217
220
  ],
218
221
  "media" => {
@@ -148,6 +148,7 @@ describe JsonSchema::Parser do
148
148
  pointer("#/definitions/app").merge!(
149
149
  "links" => [
150
150
  "description" => "Create a new app.",
151
+ "encType" => "application/x-www-form-urlencoded",
151
152
  "href" => "/apps",
152
153
  "method" => "POST",
153
154
  "rel" => "create",
@@ -157,6 +158,9 @@ describe JsonSchema::Parser do
157
158
  "$ref" => "#/definitions/app/definitions/name"
158
159
  },
159
160
  }
161
+ },
162
+ "targetSchema" => {
163
+ "$ref" => "#/definitions/app"
160
164
  }
161
165
  ]
162
166
  )
@@ -164,6 +168,7 @@ describe JsonSchema::Parser do
164
168
  link = schema.links[0]
165
169
  assert_equal schema, link.parent
166
170
  assert_equal "Create a new app.", link.description
171
+ assert_equal "application/x-www-form-urlencoded", link.enc_type
167
172
  assert_equal "/apps", link.href
168
173
  assert_equal :post, link.method
169
174
  assert_equal "create", link.rel
@@ -116,6 +116,13 @@ describe JsonSchema::ReferenceExpander do
116
116
  assert_equal ["string"], schema.type
117
117
  end
118
118
 
119
+ it "will expand hyperschema link targetSchemas" do
120
+ expand
121
+ assert_equal [], errors
122
+ schema = @schema.properties["app"].links[0].target_schema.properties["name"]
123
+ assert_equal ["string"], schema.type
124
+ end
125
+
119
126
  it "will perform multiple passes to resolve all references" do
120
127
  pointer("#/properties").merge!(
121
128
  "app0" => { "$ref" => "#/properties/app1" },
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-22 00:00:00.000000000 Z
12
+ date: 2014-05-23 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email:
@@ -21,7 +21,6 @@ extra_rdoc_files: []
21
21
  files:
22
22
  - README.md
23
23
  - bin/validate-schema
24
- - schemas/heroku-hyper-schema.json
25
24
  - schemas/hyper-schema.json
26
25
  - schemas/schema.json
27
26
  - lib/commands/validate_schema.rb
@@ -1,96 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-04/heroku-hyper-schema#",
3
- "id": "http://json-schema.org/draft-04/heroku-hyper-schema#",
4
- "title": "Heroku JSON Hyper-Schema",
5
- "allOf": [
6
- {
7
- "$ref": "http://json-schema.org/draft-04/hyper-schema#"
8
- }
9
- ],
10
- "definitions": {
11
- "entity": {
12
- "anyOf": [
13
- {
14
- "$ref": "#/definitions/entityWithPatternProperties"
15
- },
16
- {
17
- "$ref": "#/definitions/entityWithProperties"
18
- }
19
- ]
20
- },
21
- "entityWithPatternProperties": {
22
- "required": [
23
- "definitions",
24
- "description",
25
- "id",
26
- "links",
27
- "patternProperties",
28
- "title",
29
- "type"
30
- ]
31
- },
32
- "entityWithProperties": {
33
- "properties": {
34
- "definitions": {
35
- "additionalProperties": {
36
- "$ref": "#/definitions/property"
37
- },
38
- "properties": {
39
- "identity": {
40
- "$ref": "#/definitions/identity"
41
- }
42
- },
43
- "required": ["identity"]
44
- }
45
- },
46
- "required": [
47
- "definitions",
48
- "description",
49
- "id",
50
- "links",
51
- "properties",
52
- "title",
53
- "type"
54
- ]
55
- },
56
- "identity": {
57
- "additionalProperties": false,
58
- "properties": {
59
- "anyOf": {
60
- "additionalProperties": {
61
- "$ref": "#/definitions/ref"
62
- }
63
- }
64
- },
65
- "required": ["anyOf"]
66
- },
67
- "property": {
68
- "required": ["description", "type"]
69
- },
70
- "ref": {
71
- "required": ["$ref"]
72
- }
73
- },
74
- "properties": {
75
- "definitions": {
76
- "additionalProperties": {
77
- "$ref": "#/definitions/entity"
78
- }
79
- },
80
- "properties": {
81
- "additionalProperties": {
82
- "$ref": "#/definitions/ref"
83
- }
84
- }
85
- },
86
- "required": [
87
- "$schema",
88
- "definitions",
89
- "description",
90
- "id",
91
- "links",
92
- "properties",
93
- "title",
94
- "type"
95
- ]
96
- }