pacto 0.3.0.pre → 0.3.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.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rubocop-todo.yml +0 -27
  4. data/.rubocop.yml +9 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +4 -5
  8. data/CONTRIBUTING.md +112 -0
  9. data/Gemfile +5 -0
  10. data/Guardfile +18 -13
  11. data/README.md +157 -101
  12. data/Rakefile +3 -3
  13. data/features/configuration/strict_matchers.feature +97 -0
  14. data/features/evolve/README.md +11 -0
  15. data/features/evolve/existing_services.feature +82 -0
  16. data/features/generate/README.md +5 -0
  17. data/features/generate/generation.feature +28 -0
  18. data/features/steps/pacto_steps.rb +75 -0
  19. data/features/stub/README.md +2 -0
  20. data/features/stub/templates.feature +46 -0
  21. data/features/support/env.rb +11 -5
  22. data/features/validate/README.md +1 -0
  23. data/features/validate/body_only.feature +85 -0
  24. data/features/{journeys/validation.feature → validate/meta_validation.feature} +41 -24
  25. data/features/validate/validation.feature +36 -0
  26. data/lib/pacto.rb +61 -33
  27. data/lib/pacto/contract.rb +18 -15
  28. data/lib/pacto/contract_factory.rb +14 -11
  29. data/lib/pacto/contract_files.rb +17 -0
  30. data/lib/pacto/contract_list.rb +17 -0
  31. data/lib/pacto/contract_validator.rb +29 -0
  32. data/lib/pacto/core/configuration.rb +19 -17
  33. data/lib/pacto/core/contract_registry.rb +43 -0
  34. data/lib/pacto/core/{callback.rb → hook.rb} +3 -3
  35. data/lib/pacto/core/modes.rb +33 -0
  36. data/lib/pacto/core/validation_registry.rb +45 -0
  37. data/lib/pacto/erb_processor.rb +0 -1
  38. data/lib/pacto/extensions.rb +18 -4
  39. data/lib/pacto/generator.rb +34 -49
  40. data/lib/pacto/generator/filters.rb +41 -0
  41. data/lib/pacto/hooks/erb_hook.rb +4 -3
  42. data/lib/pacto/logger.rb +4 -2
  43. data/lib/pacto/meta_schema.rb +4 -2
  44. data/lib/pacto/rake_task.rb +28 -25
  45. data/lib/pacto/request_clause.rb +43 -0
  46. data/lib/pacto/request_pattern.rb +8 -0
  47. data/lib/pacto/response_clause.rb +15 -0
  48. data/lib/pacto/rspec.rb +102 -0
  49. data/lib/pacto/stubs/uri_pattern.rb +23 -0
  50. data/lib/pacto/stubs/webmock_adapter.rb +69 -0
  51. data/lib/pacto/stubs/webmock_helper.rb +71 -0
  52. data/lib/pacto/ui.rb +7 -0
  53. data/lib/pacto/uri.rb +9 -0
  54. data/lib/pacto/validation.rb +57 -0
  55. data/lib/pacto/validators/body_validator.rb +41 -0
  56. data/lib/pacto/validators/request_body_validator.rb +23 -0
  57. data/lib/pacto/validators/response_body_validator.rb +23 -0
  58. data/lib/pacto/validators/response_header_validator.rb +49 -0
  59. data/lib/pacto/validators/response_status_validator.rb +24 -0
  60. data/lib/pacto/version.rb +1 -1
  61. data/pacto.gemspec +33 -29
  62. data/resources/contract_schema.json +8 -176
  63. data/resources/draft-03.json +174 -0
  64. data/spec/integration/data/strict_contract.json +2 -2
  65. data/spec/integration/e2e_spec.rb +22 -31
  66. data/spec/integration/rspec_spec.rb +94 -0
  67. data/spec/integration/templating_spec.rb +9 -12
  68. data/{lib → spec}/pacto/server.rb +0 -0
  69. data/{lib → spec}/pacto/server/dummy.rb +11 -8
  70. data/{lib → spec}/pacto/server/playback_servlet.rb +1 -1
  71. data/spec/spec_helper.rb +2 -0
  72. data/spec/unit/hooks/erb_hook_spec.rb +15 -15
  73. data/spec/unit/pacto/configuration_spec.rb +2 -10
  74. data/spec/unit/pacto/contract_factory_spec.rb +16 -13
  75. data/spec/unit/pacto/contract_files_spec.rb +42 -0
  76. data/spec/unit/pacto/contract_list_spec.rb +35 -0
  77. data/spec/unit/pacto/contract_spec.rb +43 -44
  78. data/spec/unit/pacto/contract_validator_spec.rb +85 -0
  79. data/spec/unit/pacto/core/configuration_spec.rb +4 -11
  80. data/spec/unit/pacto/core/contract_registry_spec.rb +119 -0
  81. data/spec/unit/pacto/core/modes_spec.rb +18 -0
  82. data/spec/unit/pacto/core/validation_registry_spec.rb +76 -0
  83. data/spec/unit/pacto/core/validation_spec.rb +60 -0
  84. data/spec/unit/pacto/extensions_spec.rb +14 -23
  85. data/spec/unit/pacto/generator/filters_spec.rb +99 -0
  86. data/spec/unit/pacto/generator_spec.rb +34 -73
  87. data/spec/unit/pacto/meta_schema_spec.rb +46 -6
  88. data/spec/unit/pacto/pacto_spec.rb +17 -15
  89. data/spec/unit/pacto/{request_spec.rb → request_clause_spec.rb} +32 -44
  90. data/spec/unit/pacto/request_pattern_spec.rb +22 -0
  91. data/spec/unit/pacto/response_clause_spec.rb +54 -0
  92. data/spec/unit/pacto/stubs/uri_pattern_spec.rb +28 -0
  93. data/spec/unit/pacto/stubs/webmock_adapter_spec.rb +205 -0
  94. data/spec/unit/pacto/stubs/webmock_helper_spec.rb +20 -0
  95. data/spec/unit/pacto/uri_spec.rb +20 -0
  96. data/spec/unit/pacto/validators/body_validator_spec.rb +105 -0
  97. data/spec/unit/pacto/validators/response_header_validator_spec.rb +94 -0
  98. data/spec/unit/pacto/validators/response_status_validator_spec.rb +20 -0
  99. metadata +230 -146
  100. data/features/generation/generation.feature +0 -25
  101. data/lib/pacto/core/contract_repository.rb +0 -44
  102. data/lib/pacto/hash_merge_processor.rb +0 -14
  103. data/lib/pacto/request.rb +0 -57
  104. data/lib/pacto/response.rb +0 -63
  105. data/lib/pacto/response_adapter.rb +0 -24
  106. data/lib/pacto/stubs/built_in.rb +0 -57
  107. data/spec/unit/pacto/core/contract_repository_spec.rb +0 -133
  108. data/spec/unit/pacto/hash_merge_processor_spec.rb +0 -20
  109. data/spec/unit/pacto/response_adapter_spec.rb +0 -25
  110. data/spec/unit/pacto/response_spec.rb +0 -201
  111. data/spec/unit/pacto/stubs/built_in_spec.rb +0 -168
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ module Pacto
4
+ describe URI do
5
+ it 'returns the path appended to the host' do
6
+ uri = URI.for('https://localtest.me', '/bla')
7
+ expect(uri.to_s).to eq 'https://localtest.me/bla'
8
+ end
9
+
10
+ it 'uses http as the default scheme for hosts' do
11
+ uri = URI.for('localtest.me', '/bla')
12
+ expect(uri.to_s).to eq 'http://localtest.me/bla'
13
+ end
14
+
15
+ it 'shows query parameters if initialized with params' do
16
+ uri = URI.for('localtest.me', '/bla', 'param1' => 'ble')
17
+ expect(uri.to_s).to eq 'http://localtest.me/bla?param1=ble'
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,105 @@
1
+ module Pacto
2
+ module Validators
3
+ describe BodyValidator do
4
+ class MyBodyValidator < BodyValidator
5
+ def self.section_name
6
+ 'my_section'
7
+ end
8
+ end
9
+
10
+ subject(:validator) { MyBodyValidator }
11
+ let(:string_required) { true }
12
+ let(:body) { 'a simple string' }
13
+ let(:fake_interaction) { double(:fake_interaction, body: body) }
14
+
15
+ describe '#validate' do
16
+ context 'when schema is not specified' do
17
+ let(:schema) { nil }
18
+
19
+ it 'gives no errors without validating body' do
20
+ JSON::Validator.should_not_receive(:fully_validate)
21
+ expect(validator.validate(schema, fake_interaction)).to be_empty
22
+ end
23
+ end
24
+
25
+ context 'when the body is a string' do
26
+ # TODO: Apparently a schema has string as keys. Probably we could
27
+ # make convert it into a symbol based key.
28
+ let(:schema) { { 'type' => 'string', 'required' => string_required } }
29
+
30
+ it 'does not validate using JSON Schema' do
31
+ # FIXME: This seems like a design flaw. We're partially reproducing json-schema behavior
32
+ # instead of finding a way to use it.
33
+ JSON::Validator.should_not_receive(:fully_validate)
34
+ validator.validate(schema, fake_interaction)
35
+ end
36
+
37
+ context 'if required' do
38
+ it 'does not return an error when body is a string' do
39
+ expect(validator.validate(schema, fake_interaction)).to be_empty
40
+ end
41
+
42
+ it 'returns an error when body is nil' do
43
+ expect(fake_interaction).to receive(:body).and_return nil
44
+ expect(validator.validate(schema, fake_interaction).size).to eq 1
45
+ end
46
+ end
47
+
48
+ context 'if not required' do
49
+ let(:string_required) { false }
50
+
51
+ it 'does not return an error when body is a string' do
52
+ expect(validator.validate(schema, fake_interaction)).to be_empty
53
+ end
54
+
55
+ it 'does not return an error when body is nil' do
56
+ expect(fake_interaction).to receive(:body).and_return nil
57
+ expect(validator.validate(schema, fake_interaction)).to be_empty
58
+ end
59
+ end
60
+
61
+ context 'if contains pattern' do
62
+ let(:schema) do
63
+ { type: 'string', required: string_required, pattern: 'a.c' }
64
+ end
65
+
66
+ context 'body matches pattern' do
67
+ let(:body) { 'abc' } # This matches the pattern /a.c/
68
+
69
+ it 'does not return an error' do
70
+ expect(validator.validate(schema, fake_interaction)).to be_empty
71
+ end
72
+ end
73
+
74
+ context 'body does not match pattern' do
75
+ let(:body) { 'acb' } # This does not matches the pattern /a.c/
76
+
77
+ it 'returns an error' do
78
+ expect(validator.validate(schema, fake_interaction).size).to eq 1
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ context 'when the body is json' do
85
+ let(:schema) { { type: 'object' } }
86
+
87
+ context 'when body matches' do
88
+ it 'does not return any errors' do
89
+ expect(JSON::Validator).to receive(:fully_validate).and_return([])
90
+ expect(validator.validate(schema, fake_interaction)).to be_empty
91
+ end
92
+ end
93
+
94
+ context 'when body does not match' do
95
+ it 'returns a list of errors' do
96
+ errors = double 'some errors'
97
+ expect(JSON::Validator).to receive(:fully_validate).and_return(errors)
98
+ expect(validator.validate(schema, fake_interaction)).to eq(errors)
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,94 @@
1
+ module Pacto
2
+ module Validators
3
+ describe ResponseHeaderValidator do
4
+ subject(:validator) { described_class }
5
+ let(:expected_headers) do
6
+ {
7
+ 'Content-Type' => 'application/json'
8
+ }
9
+ end
10
+ describe '#validate' do
11
+ context 'when headers do not match' do
12
+ let(:actual_headers) { {'Content-Type' => 'text/html'} }
13
+
14
+ it 'indicates the exact mismatches' do
15
+ expect(validator.validate(expected_headers, actual_headers)).
16
+ to eq ['Invalid response header Content-Type: expected "application/json" but received "text/html"']
17
+ end
18
+ end
19
+
20
+ context 'when headers are missing' do
21
+ let(:actual_headers) { {} }
22
+ let(:expected_headers) do
23
+ {
24
+ 'Content-Type' => 'application/json',
25
+ 'My-Cool-Header' => 'Whiskey Pie'
26
+ }
27
+ end
28
+ it 'lists the missing headers' do
29
+ expect(validator.validate(expected_headers, actual_headers)).
30
+ to eq [
31
+ 'Missing expected response header: Content-Type',
32
+ 'Missing expected response header: My-Cool-Header'
33
+ ]
34
+ end
35
+ end
36
+
37
+ context 'when Location Header is expected' do
38
+ before(:each) do
39
+ expected_headers.merge!('Location' => 'http://www.example.com/{foo}/bar')
40
+ end
41
+
42
+ context 'and no Location header is sent' do
43
+ let(:actual_headers) { {'Content-Type' => 'application/json'} }
44
+ it 'returns a header error when no Location header is sent' do
45
+ expect(validator.validate(expected_headers, actual_headers)).to eq ['Missing expected response header: Location']
46
+ end
47
+ end
48
+
49
+ context 'but the Location header does not matches the pattern' do
50
+ let(:actual_headers) do
51
+ {
52
+ 'Content-Type' => 'application/json',
53
+ 'Location' => 'http://www.example.com/foo/bar/baz'
54
+ }
55
+ end
56
+
57
+ it 'returns a validation error' do
58
+ expect(validator.validate(expected_headers, actual_headers)).to eq ["Invalid response header Location: expected URI #{actual_headers['Location']} to match URI Template #{expected_headers['Location']}"]
59
+ end
60
+ end
61
+
62
+ context 'and the Location header matches pattern' do
63
+ let(:actual_headers) do
64
+ {
65
+ 'Content-Type' => 'application/json',
66
+ 'Location' => 'http://www.example.com/foo/bar'
67
+ }
68
+ end
69
+
70
+ it 'validates successfully' do
71
+ expect(validator.validate(expected_headers, actual_headers)).to be_empty
72
+ end
73
+ end
74
+ end
75
+
76
+ context 'when headers are a subset of expected headers' do
77
+ let(:actual_headers) { {'Content-Type' => 'application/json'} }
78
+
79
+ it 'does not return any errors' do
80
+ expect(validator.validate(expected_headers, actual_headers)).to be_empty
81
+ end
82
+ end
83
+
84
+ context 'when headers values match but keys have different case' do
85
+ let(:actual_headers) { {'content-type' => 'application/json'} }
86
+
87
+ it 'does not return any errors' do
88
+ expect(validator.validate(expected_headers, actual_headers)).to be_empty
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,20 @@
1
+ module Pacto
2
+ module Validators
3
+ describe ResponseStatusValidator do
4
+ subject(:validator) { described_class }
5
+ describe '#validate' do
6
+ context 'when status does not match' do
7
+ it 'returns a status error' do
8
+ expect(validator.validate(200, 500)).to eq ['Invalid status: expected 200 but got 500']
9
+ end
10
+ end
11
+
12
+ context 'when the status matches' do
13
+ it 'returns nil' do
14
+ expect(validator.validate(200, 200)).to be_empty
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
metadata CHANGED
@@ -1,450 +1,534 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pacto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.pre
5
- prerelease: 6
4
+ version: 0.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - ThoughtWorks & Abril
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-26 00:00:00.000000000 Z
11
+ date: 2014-02-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: webmock
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: '1.17'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '0'
26
+ version: '1.17'
27
+ - !ruby/object:Gem::Dependency
28
+ name: middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
30
41
  - !ruby/object:Gem::Dependency
31
42
  name: multi_json
32
43
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
44
  requirements:
35
- - - ! '>='
45
+ - - "~>"
36
46
  - !ruby/object:Gem::Version
37
- version: '0'
47
+ version: '1.8'
38
48
  type: :runtime
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
- - - ! '>='
52
+ - - "~>"
44
53
  - !ruby/object:Gem::Version
45
- version: '0'
54
+ version: '1.8'
46
55
  - !ruby/object:Gem::Dependency
47
56
  name: json-schema
48
57
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
58
  requirements:
51
- - - ~>
59
+ - - "~>"
52
60
  - !ruby/object:Gem::Version
53
61
  version: '2.0'
54
62
  type: :runtime
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
65
  requirements:
59
- - - ~>
66
+ - - "~>"
60
67
  - !ruby/object:Gem::Version
61
68
  version: '2.0'
62
69
  - !ruby/object:Gem::Dependency
63
70
  name: json-generator
64
71
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
72
  requirements:
67
- - - ! '>='
73
+ - - ">="
68
74
  - !ruby/object:Gem::Version
69
- version: '0'
75
+ version: 0.0.5
70
76
  type: :runtime
71
77
  prerelease: false
72
78
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
79
  requirements:
75
- - - ! '>='
80
+ - - ">="
76
81
  - !ruby/object:Gem::Version
77
- version: '0'
82
+ version: 0.0.5
78
83
  - !ruby/object:Gem::Dependency
79
84
  name: hash-deep-merge
80
85
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
86
  requirements:
83
- - - ! '>='
87
+ - - "~>"
84
88
  - !ruby/object:Gem::Version
85
- version: '0'
89
+ version: '0.1'
86
90
  type: :runtime
87
91
  prerelease: false
88
92
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
93
  requirements:
91
- - - ! '>='
94
+ - - "~>"
92
95
  - !ruby/object:Gem::Version
93
- version: '0'
96
+ version: '0.1'
94
97
  - !ruby/object:Gem::Dependency
95
- name: httparty
98
+ name: faraday
96
99
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
100
  requirements:
99
- - - ! '>='
101
+ - - "~>"
100
102
  - !ruby/object:Gem::Version
101
- version: '0'
103
+ version: '0.9'
102
104
  type: :runtime
103
105
  prerelease: false
104
106
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
107
  requirements:
107
- - - ! '>='
108
+ - - "~>"
108
109
  - !ruby/object:Gem::Version
109
- version: '0'
110
+ version: '0.9'
110
111
  - !ruby/object:Gem::Dependency
111
112
  name: addressable
112
113
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
114
  requirements:
115
- - - ! '>='
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '2.3'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
121
  requirements:
123
- - - ! '>='
122
+ - - "~>"
124
123
  - !ruby/object:Gem::Version
125
- version: '0'
124
+ version: '2.3'
126
125
  - !ruby/object:Gem::Dependency
127
- name: coveralls
126
+ name: json-schema-generator
128
127
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
128
  requirements:
131
- - - ! '>='
129
+ - - ">="
132
130
  - !ruby/object:Gem::Version
133
- version: '0'
131
+ version: 0.0.7
134
132
  type: :runtime
135
133
  prerelease: false
136
134
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
135
  requirements:
139
- - - ! '>='
136
+ - - ">="
140
137
  - !ruby/object:Gem::Version
141
- version: '0'
138
+ version: 0.0.7
142
139
  - !ruby/object:Gem::Dependency
143
- name: json-schema-generator
140
+ name: term-ansicolor
144
141
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
142
  requirements:
147
- - - ! '>='
143
+ - - "~>"
148
144
  - !ruby/object:Gem::Version
149
- version: '0'
145
+ version: '1.3'
150
146
  type: :runtime
151
147
  prerelease: false
152
148
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
149
  requirements:
155
- - - ! '>='
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: coveralls
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
156
165
  - !ruby/object:Gem::Version
157
166
  version: '0'
158
167
  - !ruby/object:Gem::Dependency
159
168
  name: rake
160
169
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
170
  requirements:
163
- - - ! '>='
171
+ - - ">="
164
172
  - !ruby/object:Gem::Version
165
173
  version: '0'
166
174
  type: :development
167
175
  prerelease: false
168
176
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
177
  requirements:
171
- - - ! '>='
178
+ - - ">="
172
179
  - !ruby/object:Gem::Version
173
180
  version: '0'
174
181
  - !ruby/object:Gem::Dependency
175
- name: rspec
182
+ name: rake-notes
176
183
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
184
  requirements:
179
- - - ! '>='
185
+ - - ">="
180
186
  - !ruby/object:Gem::Version
181
187
  version: '0'
182
188
  type: :development
183
189
  prerelease: false
184
190
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
191
  requirements:
187
- - - ! '>='
192
+ - - ">="
188
193
  - !ruby/object:Gem::Version
189
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rspec
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '2.14'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '2.14'
190
209
  - !ruby/object:Gem::Dependency
191
210
  name: should_not
192
211
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
212
  requirements:
195
- - - ! '>='
213
+ - - ">="
196
214
  - !ruby/object:Gem::Version
197
215
  version: '0'
198
216
  type: :development
199
217
  prerelease: false
200
218
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
219
  requirements:
203
- - - ! '>='
220
+ - - ">="
204
221
  - !ruby/object:Gem::Version
205
222
  version: '0'
206
223
  - !ruby/object:Gem::Dependency
207
224
  name: aruba
208
225
  requirement: !ruby/object:Gem::Requirement
209
- none: false
210
226
  requirements:
211
- - - ! '>='
227
+ - - ">="
212
228
  - !ruby/object:Gem::Version
213
229
  version: '0'
214
230
  type: :development
215
231
  prerelease: false
216
232
  version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
233
  requirements:
219
- - - ! '>='
234
+ - - ">="
220
235
  - !ruby/object:Gem::Version
221
236
  version: '0'
222
237
  - !ruby/object:Gem::Dependency
223
- name: guard-rspec
238
+ name: relish
224
239
  requirement: !ruby/object:Gem::Requirement
225
- none: false
226
240
  requirements:
227
- - - ! '>='
241
+ - - ">="
228
242
  - !ruby/object:Gem::Version
229
243
  version: '0'
230
244
  type: :development
231
245
  prerelease: false
232
246
  version_requirements: !ruby/object:Gem::Requirement
233
- none: false
234
247
  requirements:
235
- - - ! '>='
248
+ - - ">="
236
249
  - !ruby/object:Gem::Version
237
250
  version: '0'
238
251
  - !ruby/object:Gem::Dependency
239
- name: rubocop
252
+ name: guard-rspec
240
253
  requirement: !ruby/object:Gem::Requirement
241
- none: false
242
254
  requirements:
243
- - - ! '>='
255
+ - - ">="
244
256
  - !ruby/object:Gem::Version
245
257
  version: '0'
246
258
  type: :development
247
259
  prerelease: false
248
260
  version_requirements: !ruby/object:Gem::Requirement
249
- none: false
250
261
  requirements:
251
- - - ! '>='
262
+ - - ">="
252
263
  - !ruby/object:Gem::Version
253
264
  version: '0'
265
+ - !ruby/object:Gem::Dependency
266
+ name: rubocop
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: 0.16.0
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: 0.16.0
254
279
  - !ruby/object:Gem::Dependency
255
280
  name: guard-rubocop
256
281
  requirement: !ruby/object:Gem::Requirement
257
- none: false
258
282
  requirements:
259
- - - ! '>='
283
+ - - ">="
260
284
  - !ruby/object:Gem::Version
261
285
  version: '0'
262
286
  type: :development
263
287
  prerelease: false
264
288
  version_requirements: !ruby/object:Gem::Requirement
265
- none: false
266
289
  requirements:
267
- - - ! '>='
290
+ - - ">="
268
291
  - !ruby/object:Gem::Version
269
292
  version: '0'
270
293
  - !ruby/object:Gem::Dependency
271
294
  name: guard-cucumber
272
295
  requirement: !ruby/object:Gem::Requirement
273
- none: false
274
296
  requirements:
275
- - - ! '>='
297
+ - - ">="
276
298
  - !ruby/object:Gem::Version
277
299
  version: '0'
278
300
  type: :development
279
301
  prerelease: false
280
302
  version_requirements: !ruby/object:Gem::Requirement
281
- none: false
282
303
  requirements:
283
- - - ! '>='
304
+ - - ">="
284
305
  - !ruby/object:Gem::Version
285
306
  version: '0'
286
307
  - !ruby/object:Gem::Dependency
287
308
  name: rb-fsevent
288
309
  requirement: !ruby/object:Gem::Requirement
289
- none: false
290
310
  requirements:
291
- - - ! '>='
311
+ - - ">="
292
312
  - !ruby/object:Gem::Version
293
313
  version: '0'
294
314
  type: :development
295
315
  prerelease: false
296
316
  version_requirements: !ruby/object:Gem::Requirement
297
- none: false
298
317
  requirements:
299
- - - ! '>='
318
+ - - ">="
300
319
  - !ruby/object:Gem::Version
301
320
  version: '0'
302
321
  - !ruby/object:Gem::Dependency
303
322
  name: terminal-notifier-guard
304
323
  requirement: !ruby/object:Gem::Requirement
305
- none: false
306
324
  requirements:
307
- - - ! '>='
325
+ - - ">="
308
326
  - !ruby/object:Gem::Version
309
327
  version: '0'
310
328
  type: :development
311
329
  prerelease: false
312
330
  version_requirements: !ruby/object:Gem::Requirement
313
- none: false
314
331
  requirements:
315
- - - ! '>='
332
+ - - ">="
316
333
  - !ruby/object:Gem::Version
317
334
  version: '0'
318
- description: Pacto is a Ruby implementation of the [Consumer-Driven Contracts](http://martinfowler.com/articles/consumerDrivenContracts.html)
319
- pattern for evolving services
335
+ description: Pacto is a judge that arbitrates contract disputes between a service
336
+ provider and one or more consumers. In other words, it is a framework for Integration
337
+ Contract Testing, and helps guide service evolution patterns like Consumer-Driven
338
+ Contracts or Documentation-Driven Contracts.
320
339
  email:
321
- - abril_vejasp_dev@thoughtworks.com
340
+ - pacto-gem@googlegroups.com
322
341
  executables: []
323
342
  extensions: []
324
343
  extra_rdoc_files: []
325
344
  files:
326
- - .gitignore
327
- - .rspec
328
- - .rubocop-todo.yml
329
- - .rubocop.yml
330
- - .travis.yml
345
+ - ".gitignore"
346
+ - ".rspec"
347
+ - ".rubocop-todo.yml"
348
+ - ".rubocop.yml"
349
+ - ".ruby-gemset"
350
+ - ".ruby-version"
351
+ - ".travis.yml"
352
+ - CONTRIBUTING.md
331
353
  - Gemfile
332
354
  - Guardfile
333
355
  - LICENSE.txt
334
356
  - README.md
335
357
  - Rakefile
336
358
  - TODO.md
337
- - features/generation/generation.feature
338
- - features/journeys/validation.feature
359
+ - features/configuration/strict_matchers.feature
360
+ - features/evolve/README.md
361
+ - features/evolve/existing_services.feature
362
+ - features/generate/README.md
363
+ - features/generate/generation.feature
364
+ - features/steps/pacto_steps.rb
365
+ - features/stub/README.md
366
+ - features/stub/templates.feature
339
367
  - features/support/env.rb
368
+ - features/validate/README.md
369
+ - features/validate/body_only.feature
370
+ - features/validate/meta_validation.feature
371
+ - features/validate/validation.feature
340
372
  - lib/pacto.rb
341
373
  - lib/pacto/contract.rb
342
374
  - lib/pacto/contract_factory.rb
343
- - lib/pacto/core/callback.rb
375
+ - lib/pacto/contract_files.rb
376
+ - lib/pacto/contract_list.rb
377
+ - lib/pacto/contract_validator.rb
344
378
  - lib/pacto/core/configuration.rb
345
- - lib/pacto/core/contract_repository.rb
379
+ - lib/pacto/core/contract_registry.rb
380
+ - lib/pacto/core/hook.rb
381
+ - lib/pacto/core/modes.rb
382
+ - lib/pacto/core/validation_registry.rb
346
383
  - lib/pacto/erb_processor.rb
347
384
  - lib/pacto/exceptions/invalid_contract.rb
348
385
  - lib/pacto/extensions.rb
349
386
  - lib/pacto/generator.rb
350
- - lib/pacto/hash_merge_processor.rb
387
+ - lib/pacto/generator/filters.rb
351
388
  - lib/pacto/hooks/erb_hook.rb
352
389
  - lib/pacto/logger.rb
353
390
  - lib/pacto/meta_schema.rb
354
391
  - lib/pacto/rake_task.rb
355
- - lib/pacto/request.rb
356
- - lib/pacto/response.rb
357
- - lib/pacto/response_adapter.rb
358
- - lib/pacto/server.rb
359
- - lib/pacto/server/dummy.rb
360
- - lib/pacto/server/playback_servlet.rb
361
- - lib/pacto/stubs/built_in.rb
392
+ - lib/pacto/request_clause.rb
393
+ - lib/pacto/request_pattern.rb
394
+ - lib/pacto/response_clause.rb
395
+ - lib/pacto/rspec.rb
396
+ - lib/pacto/stubs/uri_pattern.rb
397
+ - lib/pacto/stubs/webmock_adapter.rb
398
+ - lib/pacto/stubs/webmock_helper.rb
399
+ - lib/pacto/ui.rb
400
+ - lib/pacto/uri.rb
401
+ - lib/pacto/validation.rb
402
+ - lib/pacto/validators/body_validator.rb
403
+ - lib/pacto/validators/request_body_validator.rb
404
+ - lib/pacto/validators/response_body_validator.rb
405
+ - lib/pacto/validators/response_header_validator.rb
406
+ - lib/pacto/validators/response_status_validator.rb
362
407
  - lib/pacto/version.rb
363
408
  - pacto.gemspec
364
409
  - resources/contract_schema.json
410
+ - resources/draft-03.json
365
411
  - spec/coveralls_helper.rb
366
412
  - spec/integration/data/simple_contract.json
367
413
  - spec/integration/data/strict_contract.json
368
414
  - spec/integration/data/templating_contract.json
369
415
  - spec/integration/e2e_spec.rb
416
+ - spec/integration/rspec_spec.rb
370
417
  - spec/integration/templating_spec.rb
418
+ - spec/pacto/server.rb
419
+ - spec/pacto/server/dummy.rb
420
+ - spec/pacto/server/playback_servlet.rb
371
421
  - spec/spec_helper.rb
372
422
  - spec/unit/data/contract.json
373
423
  - spec/unit/data/simple_contract.json
374
424
  - spec/unit/hooks/erb_hook_spec.rb
375
425
  - spec/unit/pacto/configuration_spec.rb
376
426
  - spec/unit/pacto/contract_factory_spec.rb
427
+ - spec/unit/pacto/contract_files_spec.rb
428
+ - spec/unit/pacto/contract_list_spec.rb
377
429
  - spec/unit/pacto/contract_spec.rb
430
+ - spec/unit/pacto/contract_validator_spec.rb
378
431
  - spec/unit/pacto/core/configuration_spec.rb
379
- - spec/unit/pacto/core/contract_repository_spec.rb
432
+ - spec/unit/pacto/core/contract_registry_spec.rb
433
+ - spec/unit/pacto/core/modes_spec.rb
434
+ - spec/unit/pacto/core/validation_registry_spec.rb
435
+ - spec/unit/pacto/core/validation_spec.rb
380
436
  - spec/unit/pacto/erb_processor_spec.rb
381
437
  - spec/unit/pacto/extensions_spec.rb
438
+ - spec/unit/pacto/generator/filters_spec.rb
382
439
  - spec/unit/pacto/generator_spec.rb
383
- - spec/unit/pacto/hash_merge_processor_spec.rb
384
440
  - spec/unit/pacto/logger_spec.rb
385
441
  - spec/unit/pacto/meta_schema_spec.rb
386
442
  - spec/unit/pacto/pacto_spec.rb
387
- - spec/unit/pacto/request_spec.rb
388
- - spec/unit/pacto/response_adapter_spec.rb
389
- - spec/unit/pacto/response_spec.rb
443
+ - spec/unit/pacto/request_clause_spec.rb
444
+ - spec/unit/pacto/request_pattern_spec.rb
445
+ - spec/unit/pacto/response_clause_spec.rb
390
446
  - spec/unit/pacto/server/playback_servlet_spec.rb
391
- - spec/unit/pacto/stubs/built_in_spec.rb
392
- homepage: https://github.com/thoughtworks/pacto
447
+ - spec/unit/pacto/stubs/uri_pattern_spec.rb
448
+ - spec/unit/pacto/stubs/webmock_adapter_spec.rb
449
+ - spec/unit/pacto/stubs/webmock_helper_spec.rb
450
+ - spec/unit/pacto/uri_spec.rb
451
+ - spec/unit/pacto/validators/body_validator_spec.rb
452
+ - spec/unit/pacto/validators/response_header_validator_spec.rb
453
+ - spec/unit/pacto/validators/response_status_validator_spec.rb
454
+ homepage: http://thoughtworks.github.io/pacto/
393
455
  licenses:
394
456
  - MIT
457
+ metadata: {}
395
458
  post_install_message:
396
459
  rdoc_options: []
397
460
  require_paths:
398
461
  - lib
399
462
  required_ruby_version: !ruby/object:Gem::Requirement
400
- none: false
401
463
  requirements:
402
- - - ! '>='
464
+ - - ">="
403
465
  - !ruby/object:Gem::Version
404
466
  version: '0'
405
- segments:
406
- - 0
407
- hash: -1773890357225402507
408
467
  required_rubygems_version: !ruby/object:Gem::Requirement
409
- none: false
410
468
  requirements:
411
- - - ! '>'
469
+ - - ">="
412
470
  - !ruby/object:Gem::Version
413
- version: 1.3.1
471
+ version: '0'
414
472
  requirements: []
415
473
  rubyforge_project:
416
- rubygems_version: 1.8.25
474
+ rubygems_version: 2.2.0
417
475
  signing_key:
418
- specification_version: 3
419
- summary: Consumer-Driven Contracts implementation
476
+ specification_version: 4
477
+ summary: Integration Contract Testing framework
420
478
  test_files:
421
- - features/generation/generation.feature
422
- - features/journeys/validation.feature
479
+ - features/configuration/strict_matchers.feature
480
+ - features/evolve/README.md
481
+ - features/evolve/existing_services.feature
482
+ - features/generate/README.md
483
+ - features/generate/generation.feature
484
+ - features/steps/pacto_steps.rb
485
+ - features/stub/README.md
486
+ - features/stub/templates.feature
423
487
  - features/support/env.rb
488
+ - features/validate/README.md
489
+ - features/validate/body_only.feature
490
+ - features/validate/meta_validation.feature
491
+ - features/validate/validation.feature
424
492
  - spec/coveralls_helper.rb
425
493
  - spec/integration/data/simple_contract.json
426
494
  - spec/integration/data/strict_contract.json
427
495
  - spec/integration/data/templating_contract.json
428
496
  - spec/integration/e2e_spec.rb
497
+ - spec/integration/rspec_spec.rb
429
498
  - spec/integration/templating_spec.rb
499
+ - spec/pacto/server.rb
500
+ - spec/pacto/server/dummy.rb
501
+ - spec/pacto/server/playback_servlet.rb
430
502
  - spec/spec_helper.rb
431
503
  - spec/unit/data/contract.json
432
504
  - spec/unit/data/simple_contract.json
433
505
  - spec/unit/hooks/erb_hook_spec.rb
434
506
  - spec/unit/pacto/configuration_spec.rb
435
507
  - spec/unit/pacto/contract_factory_spec.rb
508
+ - spec/unit/pacto/contract_files_spec.rb
509
+ - spec/unit/pacto/contract_list_spec.rb
436
510
  - spec/unit/pacto/contract_spec.rb
511
+ - spec/unit/pacto/contract_validator_spec.rb
437
512
  - spec/unit/pacto/core/configuration_spec.rb
438
- - spec/unit/pacto/core/contract_repository_spec.rb
513
+ - spec/unit/pacto/core/contract_registry_spec.rb
514
+ - spec/unit/pacto/core/modes_spec.rb
515
+ - spec/unit/pacto/core/validation_registry_spec.rb
516
+ - spec/unit/pacto/core/validation_spec.rb
439
517
  - spec/unit/pacto/erb_processor_spec.rb
440
518
  - spec/unit/pacto/extensions_spec.rb
519
+ - spec/unit/pacto/generator/filters_spec.rb
441
520
  - spec/unit/pacto/generator_spec.rb
442
- - spec/unit/pacto/hash_merge_processor_spec.rb
443
521
  - spec/unit/pacto/logger_spec.rb
444
522
  - spec/unit/pacto/meta_schema_spec.rb
445
523
  - spec/unit/pacto/pacto_spec.rb
446
- - spec/unit/pacto/request_spec.rb
447
- - spec/unit/pacto/response_adapter_spec.rb
448
- - spec/unit/pacto/response_spec.rb
524
+ - spec/unit/pacto/request_clause_spec.rb
525
+ - spec/unit/pacto/request_pattern_spec.rb
526
+ - spec/unit/pacto/response_clause_spec.rb
449
527
  - spec/unit/pacto/server/playback_servlet_spec.rb
450
- - spec/unit/pacto/stubs/built_in_spec.rb
528
+ - spec/unit/pacto/stubs/uri_pattern_spec.rb
529
+ - spec/unit/pacto/stubs/webmock_adapter_spec.rb
530
+ - spec/unit/pacto/stubs/webmock_helper_spec.rb
531
+ - spec/unit/pacto/uri_spec.rb
532
+ - spec/unit/pacto/validators/body_validator_spec.rb
533
+ - spec/unit/pacto/validators/response_header_validator_spec.rb
534
+ - spec/unit/pacto/validators/response_status_validator_spec.rb