jschematic 0.0.9 → 0.1.0

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/Rakefile CHANGED
@@ -1,3 +1,6 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
1
4
  desc "Run Cukes and Specs"
2
5
  task :default => ["cukes", "spec"]
3
6
 
@@ -67,5 +67,22 @@ Feature: Core schema: default
67
67
  Then '{ "somethingElse": "foo" }' is not valid JSON
68
68
  But '{ "pi": 3.1415 }' is valid JSON
69
69
 
70
+ Scenario: does not fall back for boolean false
71
+ When the schema is:
72
+ """
73
+ {
74
+ "properties": {
75
+ "enabled": {
76
+ "type": "boolean",
77
+ "required": true,
78
+ "default": "is delicious"
79
+ }
80
+ }
81
+ }
82
+ """
83
+ Then '{ "enabled": false }' is valid JSON
84
+ But '{}' is not valid JSON
85
+
86
+
70
87
  Scenario: default for all types
71
88
  TODO: spec
@@ -24,6 +24,7 @@ Feature: Core schema: required
24
24
  }
25
25
  """
26
26
  Then '{}' is valid JSON
27
+ Then '{ "color": "red" }' is valid JSON
27
28
 
28
29
  Scenario: true
29
30
  When the schema is:
@@ -40,3 +41,19 @@ Feature: Core schema: required
40
41
  Then '{ "color": "red" }' is valid JSON
41
42
  But '{}' is not valid JSON
42
43
  And '{ "age": 24 }' is not valid JSON
44
+
45
+ Scenario: true for boolean value
46
+ When the schema is:
47
+ """
48
+ {
49
+ "properties": {
50
+ "enabled": {
51
+ "type": "boolean",
52
+ "required": true
53
+ }
54
+ }
55
+ }
56
+ """
57
+ Then '{ "enabled": false }' is valid JSON
58
+ But '{}' is not valid JSON
59
+ And '{ "age": 24 }' is not valid JSON
@@ -1,19 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/jschematic/version', __FILE__)
3
+
1
4
  Gem::Specification.new do |s|
2
5
  s.name = 'jschematic'
3
- s.version = '0.0.9'
4
- s.authors = ["Mike Sassak"]
6
+ s.version = Jschematic::VERSION
7
+ s.authors = ["Mike Sassak", "Jari Bakken"]
8
+ s.email = ["msassak@gmail.com", "jari.bakken@gmail.com"]
5
9
  s.description = "JSON Schema v3 Validator"
6
10
  s.summary = "jschematic #{s.version}"
7
- s.email = "msassak@gmail.com"
8
- s.homepage = "https://github.com/msassak/jschematic"
11
+ s.homepage = "https://github.com/jarib/jschematic"
9
12
 
10
13
  s.add_dependency 'addressable'
11
14
 
12
15
  s.add_development_dependency 'cucumber'
13
16
  s.add_development_dependency 'rspec'
14
17
  s.add_development_dependency 'yajl-ruby'
18
+ s.add_development_dependency 'rake'
15
19
 
16
- s.rubygems_version = "1.3.7"
17
20
  s.files = `git ls-files`.split("\n")
18
21
  s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
19
22
  s.extra_rdoc_files = ["LICENSE", "README.md"]
@@ -15,13 +15,15 @@ module Jschematic
15
15
  case @schema
16
16
  when String
17
17
  uri = Addressable::URI.parse(@schema)
18
- schema = Schema.schema_for(uri)
18
+ schema = schema_for(uri)
19
19
  schema.accepts?(instance)
20
20
  when Hash
21
21
  Schema.new(@schema).accepts?(instance)
22
22
  when Array
23
23
  @schema.all? do |schema|
24
- Extends.new(schema).accepts?(instance)
24
+ extends = Extends.new(schema)
25
+ extends.parent = self
26
+ extends.accepts?(instance)
25
27
  end
26
28
  end || fail_validation!(@schema, instance)
27
29
  end
@@ -22,11 +22,11 @@ module Jschematic
22
22
  value = nil
23
23
  end
24
24
 
25
- if !value and child.default
25
+ if value.nil? and child.default
26
26
  value = child.default
27
27
  end
28
28
 
29
- if !value and child.required?
29
+ if value.nil? and child.required?
30
30
  fail_validation!("#{child.name} is required", nil)
31
31
  elsif !value
32
32
  true
@@ -12,7 +12,7 @@ module Jschematic
12
12
  end
13
13
 
14
14
  def accepts?(instance)
15
- schema = Schema.schema_for(@uri) || raise(SchemaNotFoundError.new(@uri))
15
+ schema = schema_for(@uri) || raise(SchemaNotFoundError.new(@uri))
16
16
  schema.accepts?(instance)
17
17
  end
18
18
  end
@@ -21,6 +21,8 @@ module Jschematic
21
21
  def accepts?(instance)
22
22
  if @required
23
23
  instance || fail_validation!(@required, instance)
24
+ else
25
+ true
24
26
  end
25
27
  end
26
28
  end
@@ -2,6 +2,29 @@ require 'jschematic/schema'
2
2
 
3
3
  module Jschematic
4
4
  class Context
5
+ def self.schema_for(ref)
6
+ if ref.relative?
7
+ rel = ref.omit(:scheme, :host, :port)
8
+ if match = schemas.find{ |ref, _| rel == ref.omit(:scheme, :host, :port) }
9
+ match[-1]
10
+ end
11
+ else
12
+ schemas[ref]
13
+ end
14
+ end
15
+
16
+ def self.add_schema(id, schema)
17
+ schemas[id] = schema
18
+ end
19
+
20
+ def self.schemas
21
+ @schemas ||= {}
22
+ end
23
+
24
+ def self.empty
25
+ new
26
+ end
27
+
5
28
  def initialize(*raw_schemas)
6
29
  @schemas = raw_schemas.collect{ |raw_schema| Schema.new(raw_schema) }
7
30
  end
@@ -9,5 +32,13 @@ module Jschematic
9
32
  def validate!(instance, raw_schema)
10
33
  Schema.new(raw_schema).accepts?(instance)
11
34
  end
35
+
36
+ def add_schema(id, schema)
37
+ self.class.add_schema(id, schema)
38
+ end
39
+
40
+ def schema_for(ref)
41
+ self.class.schema_for(ref)
42
+ end
12
43
  end
13
44
  end
@@ -14,7 +14,7 @@ module Jschematic
14
14
  end
15
15
 
16
16
  def id
17
- if @parent
17
+ if @parent.respond_to?(:id)
18
18
  @parent.id + @id
19
19
  else
20
20
  @id
@@ -25,6 +25,10 @@ module Jschematic
25
25
  self.class.to_s
26
26
  end
27
27
 
28
+ def schema_for(ref)
29
+ parent && parent.schema_for(ref)
30
+ end
31
+
28
32
  private
29
33
 
30
34
  def fail_validation!(expected, actual)
@@ -15,32 +15,13 @@ module Jschematic
15
15
  schema
16
16
  end
17
17
 
18
- def self.schema_for(ref)
19
- if ref.relative?
20
- rel = ref.omit(:scheme, :host, :port)
21
- if match = schemas.find{ |ref, _| rel == ref.omit(:scheme, :host, :port) }
22
- match[-1]
23
- end
24
- else
25
- schemas[ref]
26
- end
27
- end
28
-
29
- def self.add_schema(id, schema)
30
- schemas[id] = schema
31
- end
32
-
33
- def self.schemas
34
- @schemas ||= {}
35
- end
36
-
37
18
  attr_reader :default, :title, :description, :schema, :unknown_attributes
38
19
 
39
20
  attr_accessor :name
40
- attr_writer :parent
41
21
 
42
- def initialize(raw_schema)
22
+ def initialize(raw_schema, parent = Context.empty)
43
23
  @raw_schema = raw_schema.dup || {}
24
+ @parent = parent
44
25
 
45
26
  @default = @raw_schema.delete("default")
46
27
  @title = @raw_schema.delete("title") || ""
@@ -50,7 +31,7 @@ module Jschematic
50
31
 
51
32
  @unknown_attributes = {}
52
33
 
53
- self.class.add_schema(@id, self) unless @id.to_s.empty?
34
+ @parent.add_schema(@id, self) unless @id.to_s.empty?
54
35
 
55
36
  @raw_schema.each_pair do |attribute, value|
56
37
  begin
@@ -71,6 +52,10 @@ module Jschematic
71
52
  children.any?{ |child| child.required? }
72
53
  end
73
54
 
55
+ def schema_for(ref)
56
+ parent.schema_for(ref)
57
+ end
58
+
74
59
  private
75
60
 
76
61
  def add_default(instance)
@@ -0,0 +1,3 @@
1
+ module Jschematic
2
+ VERSION = "0.1.0"
3
+ end
@@ -4,8 +4,7 @@ module Jschematic
4
4
  module Attributes
5
5
  describe Ref do
6
6
  describe "#accepts?" do
7
- it "fails when the references schema does not exist" do
8
- Schema.schemas.should be_empty
7
+ it "fails when the referenced schema does not exist" do
9
8
  ref = Ref.new("does_not_exist")
10
9
  expect { ref.accepts?({}) }.to raise_error(Jschematic::SchemaNotFoundError)
11
10
  end
metadata CHANGED
@@ -1,88 +1,111 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: jschematic
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 9
9
- version: 0.0.9
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Mike Sassak
9
+ - Jari Bakken
13
10
  autorequire:
14
11
  bindir: bin
15
12
  cert_chain: []
16
-
17
- date: 2011-05-04 00:00:00 -05:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
13
+ date: 2012-08-06 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
21
16
  name: addressable
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
24
18
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
31
23
  type: :runtime
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
34
- name: cucumber
35
24
  prerelease: false
36
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: cucumber
33
+ requirement: !ruby/object:Gem::Requirement
37
34
  none: false
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
- version: "0"
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
44
39
  type: :development
45
- version_requirements: *id002
46
- - !ruby/object:Gem::Dependency
47
- name: rspec
48
40
  prerelease: false
49
- requirement: &id003 !ruby/object:Gem::Requirement
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
50
  none: false
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
- version: "0"
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
57
55
  type: :development
58
- version_requirements: *id003
59
- - !ruby/object:Gem::Dependency
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
60
64
  name: yajl-ruby
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
61
72
  prerelease: false
62
- requirement: &id004 !ruby/object:Gem::Requirement
73
+ version_requirements: !ruby/object:Gem::Requirement
63
74
  none: false
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- segments:
68
- - 0
69
- version: "0"
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: rake
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
70
87
  type: :development
71
- version_requirements: *id004
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
72
95
  description: JSON Schema v3 Validator
73
- email: msassak@gmail.com
96
+ email:
97
+ - msassak@gmail.com
98
+ - jari.bakken@gmail.com
74
99
  executables: []
75
-
76
100
  extensions: []
77
-
78
- extra_rdoc_files:
101
+ extra_rdoc_files:
79
102
  - LICENSE
80
103
  - README.md
81
- files:
104
+ files:
105
+ - .gitignore
82
106
  - .rspec
83
- - .rvmrc
107
+ - .travis.yml
84
108
  - Gemfile
85
- - Gemfile.lock
86
109
  - History.txt
87
110
  - LICENSE
88
111
  - README.md
@@ -140,6 +163,7 @@ files:
140
163
  - lib/jschematic/errors.rb
141
164
  - lib/jschematic/exceptions.rb
142
165
  - lib/jschematic/schema.rb
166
+ - lib/jschematic/version.rb
143
167
  - spec/jschematic/attributes/disallow_spec.rb
144
168
  - spec/jschematic/attributes/divisible_by_spec.rb
145
169
  - spec/jschematic/attributes/enum_spec.rb
@@ -154,39 +178,32 @@ files:
154
178
  - spec/jschematic/errors_spec.rb
155
179
  - spec/jschematic/schema_spec.rb
156
180
  - spec/spec_helper.rb
157
- has_rdoc: true
158
- homepage: https://github.com/msassak/jschematic
181
+ homepage: https://github.com/jarib/jschematic
159
182
  licenses: []
160
-
161
183
  post_install_message:
162
- rdoc_options:
184
+ rdoc_options:
163
185
  - --charset=UTF-8
164
- require_paths:
186
+ require_paths:
165
187
  - lib
166
- required_ruby_version: !ruby/object:Gem::Requirement
188
+ required_ruby_version: !ruby/object:Gem::Requirement
167
189
  none: false
168
- requirements:
169
- - - ">="
170
- - !ruby/object:Gem::Version
171
- segments:
172
- - 0
173
- version: "0"
174
- required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ! '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
195
  none: false
176
- requirements:
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- segments:
180
- - 0
181
- version: "0"
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
182
200
  requirements: []
183
-
184
201
  rubyforge_project:
185
- rubygems_version: 1.3.7
202
+ rubygems_version: 1.8.24
186
203
  signing_key:
187
204
  specification_version: 3
188
- summary: jschematic 0.0.9
189
- test_files:
205
+ summary: jschematic 0.1.0
206
+ test_files:
190
207
  - features/default.feature
191
208
  - features/dependencies.feature
192
209
  - features/disallow.feature
@@ -220,3 +237,4 @@ test_files:
220
237
  - spec/jschematic/errors_spec.rb
221
238
  - spec/jschematic/schema_spec.rb
222
239
  - spec/spec_helper.rb
240
+ has_rdoc:
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm --create use 1.9.2@jschematic
@@ -1,40 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- jschematic (0.0.6)
5
- addressable
6
-
7
- GEM
8
- remote: http://rubygems.org/
9
- specs:
10
- addressable (2.2.4)
11
- builder (3.0.0)
12
- cucumber (0.10.0)
13
- builder (>= 2.1.2)
14
- diff-lcs (~> 1.1.2)
15
- gherkin (~> 2.3.2)
16
- json (~> 1.4.6)
17
- term-ansicolor (~> 1.0.5)
18
- diff-lcs (1.1.2)
19
- gherkin (2.3.3)
20
- json (~> 1.4.6)
21
- json (1.4.6)
22
- rspec (2.3.0)
23
- rspec-core (~> 2.3.0)
24
- rspec-expectations (~> 2.3.0)
25
- rspec-mocks (~> 2.3.0)
26
- rspec-core (2.3.1)
27
- rspec-expectations (2.3.0)
28
- diff-lcs (~> 1.1.2)
29
- rspec-mocks (2.3.0)
30
- term-ansicolor (1.0.5)
31
- yajl-ruby (0.7.8)
32
-
33
- PLATFORMS
34
- ruby
35
-
36
- DEPENDENCIES
37
- cucumber
38
- jschematic!
39
- rspec
40
- yajl-ruby