json_spec 0.7.0 → 0.8.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.
@@ -1,10 +1,8 @@
1
1
  rvm:
2
- - 1.8.6
3
2
  - 1.8.7
4
3
  - 1.9.2
4
+ - 1.9.3
5
5
  - ruby-head
6
- - rbx
7
- - jruby
8
6
  only:
9
7
  - master
10
8
  notifications:
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
- json_spec
1
+ json_spec [![Build Status](https://secure.travis-ci.org/collectiveidea/json_spec.png)](http://travis-ci.org/collectiveidea/json_spec) [![Dependency Status](https://gemnasium.com/collectiveidea/json_spec.png)](https://gemnasium.com/collectiveidea/json_spec)
2
2
  ========
3
+
3
4
  Easily handle JSON in RSpec and Cucumber
4
5
 
5
6
  Installation
@@ -16,10 +17,6 @@ Please help write documentation!
16
17
 
17
18
  [http://rdoc.info/gems/json_spec](http://rdoc.info/gems/json_spec)
18
19
 
19
- Continuous Integration
20
- ----------------------
21
- [![Build Status](https://secure.travis-ci.org/collectiveidea/json_spec.png)](http://travis-ci.org/collectiveidea/json_spec)
22
-
23
20
  RSpec
24
21
  --------------
25
22
  json_spec defines five new RSpec matchers:
@@ -56,6 +53,20 @@ The new matchers could be used in RSpec as follows:
56
53
  end
57
54
  end
58
55
 
56
+ Also json_spec provides some useful helpers for RSpec tests:
57
+
58
+ * `parse_json`
59
+ * `normalize_json`
60
+ * `generate_normalized_json`
61
+
62
+ To start using them add include statement in your Rspec.configure at spec_helper.rb file:
63
+
64
+ RSpec.configure do |config|
65
+ config.include JsonSpec::Helpers
66
+ end
67
+
68
+ Examples of usage this methods you can find in spec/json_spec/helpers_spec.rb
69
+
59
70
  ### Exclusions
60
71
 
61
72
  json_spec ignores certain hash keys by default when comparing JSON:
@@ -18,9 +18,9 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency "multi_json", "~> 1.0.0"
21
+ s.add_dependency "multi_json", "~> 1.0"
22
22
  s.add_dependency "rspec", "~> 2.0"
23
23
 
24
24
  s.add_development_dependency "rake", "~> 0.9"
25
- s.add_development_dependency "cucumber", "~> 1.0"
25
+ s.add_development_dependency "cucumber", "~> 1.1", ">= 1.1.1"
26
26
  end
@@ -2,8 +2,8 @@ require "json_spec/version"
2
2
  require "json_spec/errors"
3
3
  require "json_spec/configuration"
4
4
  require "json_spec/exclusion"
5
- require "json_spec/matchers"
6
5
  require "json_spec/helpers"
6
+ require "json_spec/matchers"
7
7
  require "json_spec/memory"
8
8
 
9
9
  module JsonSpec
@@ -1,6 +1,6 @@
1
1
  require File.expand_path("../../json_spec", __FILE__)
2
2
 
3
- World(JsonSpec::Helpers)
3
+ World(JsonSpec::Helpers, JsonSpec::Matchers)
4
4
 
5
5
  After do
6
6
  JsonSpec.forget
@@ -47,9 +47,9 @@ Then /^the (?:JSON|json)(?: response)?(?: at "(.*)")? should have the following:
47
47
  path = [base, path].compact.join("/")
48
48
 
49
49
  if value
50
- Then %(the JSON at "#{path}" should be:), value
50
+ step %(the JSON at "#{path}" should be:), value
51
51
  else
52
- Then %(the JSON should have "#{path}")
52
+ step %(the JSON should have "#{path}")
53
53
  end
54
54
  end
55
55
  end
@@ -1,161 +1,214 @@
1
1
  require "json"
2
2
  require "rspec"
3
3
 
4
- RSpec::Matchers.define :be_json_eql do |expected_json|
5
- include JsonSpec::Helpers
6
- include JsonSpec::Exclusion
7
-
8
- diffable
9
-
10
- match do |actual_json|
11
- @actual, @expected = scrub(actual_json, @path), [scrub(expected_json)]
12
- @actual == @expected.first
13
- end
14
-
15
- chain :at_path do |path|
16
- @path = path
17
- end
18
-
19
- chain :excluding do |*keys|
20
- excluded_keys.merge(keys.map{|k| k.to_s })
21
- end
22
-
23
- chain :including do |*keys|
24
- excluded_keys.subtract(keys.map{|k| k.to_s })
25
- end
26
-
27
- failure_message_for_should do
28
- message = "Expected equivalent JSON"
29
- message << %( at path "#{@path}") if @path
30
- message
31
- end
32
-
33
- failure_message_for_should_not do
34
- message = "Expected inequivalent JSON"
35
- message << %( at path "#{@path}") if @path
36
- message
37
- end
38
-
39
- def scrub(json, path = nil)
40
- generate_normalized_json(exclude_keys(parse_json(json, path))).chomp + "\n"
41
- end
42
- end
43
-
44
- RSpec::Matchers.define :include_json do |expected_json|
45
- include JsonSpec::Helpers
46
- include JsonSpec::Exclusion
47
-
48
- match do |actual_json|
49
- actual = parse_json(actual_json, @path)
50
- expected = exclude_keys(parse_json(expected_json))
51
- case actual
52
- when Hash then actual.values.map{|v| exclude_keys(v) }.include?(expected)
53
- when Array then actual.map{|e| exclude_keys(e) }.include?(expected)
54
- else false
4
+ module JsonSpec
5
+ module Matchers
6
+ class BeJsonEql
7
+ include JsonSpec::Helpers
8
+ include JsonSpec::Exclusion
9
+
10
+ attr_reader :expected, :actual
11
+
12
+ def diffable?
13
+ true
14
+ end
15
+
16
+ def initialize(expected_json)
17
+ @expected_json = expected_json
18
+ end
19
+
20
+ def matches?(actual_json)
21
+ @actual, @expected = scrub(actual_json, @path), scrub(@expected_json)
22
+ @actual == @expected
23
+ end
24
+
25
+ def at_path(path)
26
+ @path = path
27
+ self
28
+ end
29
+
30
+ def excluding(*keys)
31
+ excluded_keys.merge(keys.map{|k| k.to_s })
32
+ self
33
+ end
34
+
35
+ def including(*keys)
36
+ excluded_keys.subtract(keys.map{|k| k.to_s })
37
+ self
38
+ end
39
+
40
+ def failure_message_for_should
41
+ message = "Expected equivalent JSON"
42
+ message << %( at path "#{@path}") if @path
43
+ message
44
+ end
45
+
46
+ def failure_message_for_should_not
47
+ message = "Expected inequivalent JSON"
48
+ message << %( at path "#{@path}") if @path
49
+ message
50
+ end
51
+
52
+ private
53
+ def scrub(json, path = nil)
54
+ generate_normalized_json(exclude_keys(parse_json(json, path))).chomp + "\n"
55
+ end
55
56
  end
56
- end
57
-
58
- chain :at_path do |path|
59
- @path = path
60
- end
61
-
62
- chain :excluding do |*keys|
63
- excluded_keys.merge(*keys.map{|k| k.to_s })
64
- end
65
-
66
- chain :including do |*keys|
67
- excluded_keys.subtract(keys.map{|k| k.to_s })
68
- end
69
-
70
- failure_message_for_should do
71
- message = "Expected included JSON"
72
- message << %( at path "#{@path}") if @path
73
- message
74
- end
75
-
76
- failure_message_for_should_not do
77
- message = "Expected excluded JSON"
78
- message << %( at path "#{@path}") if @path
79
- message
80
- end
81
- end
82
-
83
- RSpec::Matchers.define :have_json_path do |path|
84
- include JsonSpec::Helpers
85
57
 
86
- match do |json|
87
- begin
88
- parse_json(json, path)
89
- true
90
- rescue JsonSpec::MissingPathError
91
- false
58
+ class IncludeJson
59
+ include JsonSpec::Helpers
60
+ include JsonSpec::Exclusion
61
+
62
+ def initialize(expected_json)
63
+ @expected_json = expected_json
64
+ end
65
+
66
+ def matches?(actual_json)
67
+ actual = parse_json(actual_json, @path)
68
+ expected = exclude_keys(parse_json(@expected_json))
69
+ case actual
70
+ when Hash then actual.values.map{|v| exclude_keys(v) }.include?(expected)
71
+ when Array then actual.map{|e| exclude_keys(e) }.include?(expected)
72
+ else false
73
+ end
74
+ end
75
+
76
+ def at_path(path)
77
+ @path = path
78
+ self
79
+ end
80
+
81
+ def excluding(*keys)
82
+ excluded_keys.merge(keys.map{|k| k.to_s })
83
+ self
84
+ end
85
+
86
+ def including(*keys)
87
+ excluded_keys.subtract(keys.map{|k| k.to_s })
88
+ self
89
+ end
90
+
91
+ def failure_message_for_should
92
+ message = "Expected included JSON"
93
+ message << %( at path "#{@path}") if @path
94
+ message
95
+ end
96
+
97
+ def failure_message_for_should_not
98
+ message = "Expected excluded JSON"
99
+ message << %( at path "#{@path}") if @path
100
+ message
101
+ end
92
102
  end
93
- end
94
103
 
95
- failure_message_for_should do
96
- %(Expected JSON path "#{path}")
97
- end
104
+ class HaveJsonPath
105
+ include JsonSpec::Helpers
106
+
107
+ def initialize(path)
108
+ @path = path
109
+ end
110
+
111
+ def matches?(json)
112
+ begin
113
+ parse_json(json, @path)
114
+ true
115
+ rescue JsonSpec::MissingPathError
116
+ false
117
+ end
118
+ end
119
+
120
+ def failure_message_for_should
121
+ %(Expected JSON path "#{@path}")
122
+ end
123
+
124
+ def failure_message_for_should_not
125
+ %(Expected no JSON path "#{@path}")
126
+ end
127
+ end
98
128
 
99
- failure_message_for_should_not do
100
- %(Expected no JSON path "#{path}")
101
- end
102
- end
129
+ class HaveJsonType
130
+ include JsonSpec::Helpers
131
+
132
+ def initialize(klass)
133
+ @klass = klass
134
+ end
135
+
136
+ def matches?(json)
137
+ @ruby = parse_json(json, @path)
138
+ @ruby.is_a?(@klass)
139
+ end
140
+
141
+ def at_path(path)
142
+ @path = path
143
+ self
144
+ end
145
+
146
+ def failure_message_for_should
147
+ message = "Expected JSON value type to be #{@klass}, got #{@ruby.class}"
148
+ message << %( at path "#{@path}") if @path
149
+ message
150
+ end
151
+
152
+ def failure_message_for_should_not
153
+ message = "Expected JSON value type to not be #{@klass}, got #{@ruby.class}"
154
+ message << %( at path "#{@path}") if @path
155
+ message
156
+ end
157
+ end
103
158
 
104
- RSpec::Matchers.define :have_json_type do |klass|
105
- include JsonSpec::Helpers
159
+ class HaveJsonSize
160
+ include JsonSpec::Helpers
161
+
162
+ def initialize(size)
163
+ @expected = size
164
+ end
165
+
166
+ def matches?(json)
167
+ ruby = parse_json(json, @path)
168
+ @actual = ruby.is_a?(Enumerable) ? ruby.size : 1
169
+ @actual == @expected
170
+ end
171
+
172
+ def at_path(path)
173
+ @path = path
174
+ self
175
+ end
176
+
177
+ def failure_message_for_should
178
+ message = "Expected JSON value size to be #{@expected}, got #{@actual}"
179
+ message << %( at path "#{@path}") if @path
180
+ message
181
+ end
182
+
183
+ def failure_message_for_should_not
184
+ message = "Expected JSON value size to not be #{@expected}, got #{@actual}"
185
+ message << %( at path "#{@path}") if @path
186
+ message
187
+ end
188
+ end
106
189
 
107
- match do |json|
108
- @json = json
109
- actual.is_a?(klass)
110
- end
190
+ def be_json_eql(json)
191
+ JsonSpec::Matchers::BeJsonEql.new(json)
192
+ end
111
193
 
112
- chain :at_path do |path|
113
- @path = path
114
- end
194
+ def include_json(json)
195
+ JsonSpec::Matchers::IncludeJson.new(json)
196
+ end
115
197
 
116
- failure_message_for_should do
117
- message = "Expected JSON value type to be #{klass}, got #{actual.class}"
118
- message << %( at path "#{@path}") if @path
119
- message
120
- end
198
+ def have_json_path(path)
199
+ JsonSpec::Matchers::HaveJsonPath.new(path)
200
+ end
121
201
 
122
- failure_message_for_should_not do
123
- message = "Expected JSON value type to not be #{klass}, got #{actual.class}"
124
- message << %( at path "#{@path}") if @path
125
- message
126
- end
202
+ def have_json_type(klass)
203
+ JsonSpec::Matchers::HaveJsonType.new(klass)
204
+ end
127
205
 
128
- def actual
129
- parse_json(@json, @path)
206
+ def have_json_size(size)
207
+ JsonSpec::Matchers::HaveJsonSize.new(size)
208
+ end
130
209
  end
131
210
  end
132
211
 
133
- RSpec::Matchers.define :have_json_size do |expected_size|
134
- include JsonSpec::Helpers
135
-
136
- match do |json|
137
- @json = json
138
- actual_size == expected_size
139
- end
140
-
141
- chain :at_path do |path|
142
- @path = path
143
- end
144
-
145
- failure_message_for_should do
146
- message = "Expected JSON value size to be #{expected_size}, got #{actual_size}"
147
- message << %( at path "#{@path}") if @path
148
- message
149
- end
150
-
151
- failure_message_for_should_not do
152
- message = "Expected JSON value size to not be #{expected_size}, got #{actual_size}"
153
- message << %( at path "#{@path}") if @path
154
- message
155
- end
156
-
157
- def actual_size
158
- ruby = parse_json(@json, @path)
159
- ruby.is_a?(Enumerable) ? ruby.size : 1
160
- end
212
+ RSpec.configure do |config|
213
+ config.include JsonSpec::Matchers
161
214
  end
@@ -1,3 +1,3 @@
1
1
  module JsonSpec
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
metadata CHANGED
@@ -1,67 +1,100 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: json_spec
3
- version: !ruby/object:Gem::Version
4
- version: 0.7.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 63
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 8
9
+ - 0
10
+ version: 0.8.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Steve Richert
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2011-08-19 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2012-01-22 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: multi_json
16
- requirement: &70258292680600 !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
25
+ requirements:
19
26
  - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 1.0.0
27
+ - !ruby/object:Gem::Version
28
+ hash: 15
29
+ segments:
30
+ - 1
31
+ - 0
32
+ version: "1.0"
22
33
  type: :runtime
23
- prerelease: false
24
- version_requirements: *70258292680600
25
- - !ruby/object:Gem::Dependency
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
26
36
  name: rspec
27
- requirement: &70258292680100 !ruby/object:Gem::Requirement
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
28
39
  none: false
29
- requirements:
40
+ requirements:
30
41
  - - ~>
31
- - !ruby/object:Gem::Version
32
- version: '2.0'
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 2
46
+ - 0
47
+ version: "2.0"
33
48
  type: :runtime
34
- prerelease: false
35
- version_requirements: *70258292680100
36
- - !ruby/object:Gem::Dependency
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
37
51
  name: rake
38
- requirement: &70258292710600 !ruby/object:Gem::Requirement
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
39
54
  none: false
40
- requirements:
55
+ requirements:
41
56
  - - ~>
42
- - !ruby/object:Gem::Version
43
- version: '0.9'
57
+ - !ruby/object:Gem::Version
58
+ hash: 25
59
+ segments:
60
+ - 0
61
+ - 9
62
+ version: "0.9"
44
63
  type: :development
45
- prerelease: false
46
- version_requirements: *70258292710600
47
- - !ruby/object:Gem::Dependency
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
48
66
  name: cucumber
49
- requirement: &70258292710140 !ruby/object:Gem::Requirement
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
50
69
  none: false
51
- requirements:
70
+ requirements:
52
71
  - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '1.0'
72
+ - !ruby/object:Gem::Version
73
+ hash: 13
74
+ segments:
75
+ - 1
76
+ - 1
77
+ version: "1.1"
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ hash: 17
81
+ segments:
82
+ - 1
83
+ - 1
84
+ - 1
85
+ version: 1.1.1
55
86
  type: :development
56
- prerelease: false
57
- version_requirements: *70258292710140
87
+ version_requirements: *id004
58
88
  description: Easily handle JSON in RSpec and Cucumber
59
- email:
89
+ email:
60
90
  - steve.richert@gmail.com
61
91
  executables: []
92
+
62
93
  extensions: []
94
+
63
95
  extra_rdoc_files: []
64
- files:
96
+
97
+ files:
65
98
  - .gitignore
66
99
  - .travis.yml
67
100
  - Gemfile
@@ -93,29 +126,38 @@ files:
93
126
  - spec/spec_helper.rb
94
127
  homepage: https://github.com/collectiveidea/json_spec
95
128
  licenses: []
129
+
96
130
  post_install_message:
97
131
  rdoc_options: []
98
- require_paths:
132
+
133
+ require_paths:
99
134
  - lib
100
- required_ruby_version: !ruby/object:Gem::Requirement
135
+ required_ruby_version: !ruby/object:Gem::Requirement
101
136
  none: false
102
- requirements:
103
- - - ! '>='
104
- - !ruby/object:Gem::Version
105
- version: '0'
106
- required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ hash: 3
141
+ segments:
142
+ - 0
143
+ version: "0"
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
145
  none: false
108
- requirements:
109
- - - ! '>='
110
- - !ruby/object:Gem::Version
111
- version: '0'
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ hash: 3
150
+ segments:
151
+ - 0
152
+ version: "0"
112
153
  requirements: []
154
+
113
155
  rubyforge_project: json_spec
114
- rubygems_version: 1.8.8
156
+ rubygems_version: 1.8.15
115
157
  signing_key:
116
158
  specification_version: 3
117
159
  summary: Easily handle JSON in RSpec and Cucumber
118
- test_files:
160
+ test_files:
119
161
  - features/equivalence.feature
120
162
  - features/inclusion.feature
121
163
  - features/memory.feature