stub_requests 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.reek.yml +5 -9
  3. data/.rubocop.yml +1 -0
  4. data/CHANGELOG.md +23 -0
  5. data/README.md +9 -9
  6. data/Rakefile +7 -5
  7. data/lib/stub_requests.rb +30 -16
  8. data/lib/stub_requests/api.rb +45 -26
  9. data/lib/stub_requests/callback.rb +3 -1
  10. data/lib/stub_requests/callback_registry.rb +9 -55
  11. data/lib/stub_requests/concerns/argument_validation.rb +47 -0
  12. data/lib/stub_requests/concerns/property.rb +114 -0
  13. data/lib/stub_requests/concerns/property/validator.rb +137 -0
  14. data/lib/stub_requests/concerns/register_verb.rb +110 -0
  15. data/lib/stub_requests/configuration.rb +19 -2
  16. data/lib/stub_requests/dsl.rb +5 -6
  17. data/lib/stub_requests/dsl/method_definition.rb +2 -8
  18. data/lib/stub_requests/endpoint.rb +22 -23
  19. data/lib/stub_requests/endpoint_registry.rb +157 -0
  20. data/lib/stub_requests/exceptions.rb +28 -10
  21. data/lib/stub_requests/request_stub.rb +29 -14
  22. data/lib/stub_requests/service.rb +55 -7
  23. data/lib/stub_requests/service_registry.rb +30 -79
  24. data/lib/stub_requests/stub_registry.rb +22 -80
  25. data/lib/stub_requests/stub_requests.rb +8 -5
  26. data/lib/stub_requests/uri.rb +0 -17
  27. data/lib/stub_requests/utils/fuzzy.rb +70 -0
  28. data/lib/stub_requests/version.rb +1 -1
  29. data/lib/stub_requests/webmock/builder.rb +9 -51
  30. data/lib/stub_requests/webmock/stub_registry_extension.rb +1 -1
  31. data/lib/tasks/changelog.rake +1 -7
  32. data/stub_requests.gemspec +1 -0
  33. data/update_docs.sh +2 -2
  34. metadata +27 -8
  35. data/lib/stub_requests/argument_validation.rb +0 -48
  36. data/lib/stub_requests/endpoint_stub.rb +0 -89
  37. data/lib/stub_requests/endpoints.rb +0 -246
  38. data/lib/stub_requests/hash_util.rb +0 -32
  39. data/lib/stub_requests/observable.rb +0 -18
  40. data/lib/stub_requests/property.rb +0 -112
  41. data/lib/stub_requests/property/validator.rb +0 -135
@@ -36,7 +36,7 @@ module StubRequests
36
36
  request_stub = request_stub_for_orig(request_signature)
37
37
  return request_stub unless request_stub
38
38
 
39
- StubRequests::StubRegistry.mark_as_responded(request_stub)
39
+ StubRequests::StubRegistry.instance.mark_as_responded(request_stub)
40
40
  request_stub
41
41
  end
42
42
  end
@@ -12,18 +12,12 @@ task :changelog do
12
12
  --no-verbose
13
13
  --token
14
14
  ]
15
- CHECKOUT_CHANGELOG_CMD ||= "git checkout -B update-changelog"
16
15
  ADD_CHANGELOG_CMD ||= "git add --all"
17
16
  COMMIT_CHANGELOG_CMD ||= "git commit -a -m 'Update changelog'"
18
- GIT_PUSH_CMD ||= "git push -u origin update-changelog"
19
- OPEN_PR_CMD ||= "hub pull-request -b master -m 'Update Changelog' -a mhenrixon -l changelog"
20
17
  # rubocop:enable Style/MutableConstant
21
18
 
19
+ sh("git checkout master")
22
20
  sh(*CHANGELOG_CMD.push(ENV["CHANGELOG_GITHUB_TOKEN"]))
23
- sh(CHECKOUT_CHANGELOG_CMD)
24
21
  sh(ADD_CHANGELOG_CMD)
25
22
  sh(COMMIT_CHANGELOG_CMD)
26
- sh(GIT_PUSH_CMD)
27
- sh(OPEN_PR_CMD)
28
- sh("git checkout master")
29
23
  end
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency "webmock", ">= 2.3", "< 4.0"
35
35
  spec.add_dependency "concurrent-ruby", "~> 1.0", "< 2"
36
36
  spec.add_dependency "public_suffix", "~> 3.0", "< 4"
37
+ spec.add_dependency "jaro_winkler", "~> 1.0", "< 2"
37
38
 
38
39
  # ===== Basics =====
39
40
  spec.add_development_dependency "bundler", ">= 2.0"
data/update_docs.sh CHANGED
@@ -9,7 +9,7 @@ if [[ "$(git diff --stat)" != "" ]]; then
9
9
  git stash push -u -a -m "Before updating docs"
10
10
  fi;
11
11
 
12
- git reset --hard origin/master
12
+ git pull --rebase
13
13
 
14
14
  rake yard
15
15
 
@@ -24,7 +24,7 @@ mv doc/* ./
24
24
  echo "Sending new documentation to github"
25
25
  git add --all
26
26
  git commit -a -m 'Update documentation'
27
- git push
27
+ git push --force
28
28
 
29
29
  if [[ $stash_created == 1 ]]; then
30
30
  git stash pop
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stub_requests
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikael Henriksson
@@ -90,6 +90,26 @@ dependencies:
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
92
  version: '4'
93
+ - !ruby/object:Gem::Dependency
94
+ name: jaro_winkler
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '1.0'
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '2'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ - - "<"
111
+ - !ruby/object:Gem::Version
112
+ version: '2'
93
113
  - !ruby/object:Gem::Dependency
94
114
  name: bundler
95
115
  requirement: !ruby/object:Gem::Requirement
@@ -392,9 +412,12 @@ files:
392
412
  - lib/rspec/subject_as_lambda.rb
393
413
  - lib/stub_requests.rb
394
414
  - lib/stub_requests/api.rb
395
- - lib/stub_requests/argument_validation.rb
396
415
  - lib/stub_requests/callback.rb
397
416
  - lib/stub_requests/callback_registry.rb
417
+ - lib/stub_requests/concerns/argument_validation.rb
418
+ - lib/stub_requests/concerns/property.rb
419
+ - lib/stub_requests/concerns/property/validator.rb
420
+ - lib/stub_requests/concerns/register_verb.rb
398
421
  - lib/stub_requests/configuration.rb
399
422
  - lib/stub_requests/core_ext.rb
400
423
  - lib/stub_requests/core_ext/all.rb
@@ -408,13 +431,8 @@ files:
408
431
  - lib/stub_requests/dsl/define_method.rb
409
432
  - lib/stub_requests/dsl/method_definition.rb
410
433
  - lib/stub_requests/endpoint.rb
411
- - lib/stub_requests/endpoint_stub.rb
412
- - lib/stub_requests/endpoints.rb
434
+ - lib/stub_requests/endpoint_registry.rb
413
435
  - lib/stub_requests/exceptions.rb
414
- - lib/stub_requests/hash_util.rb
415
- - lib/stub_requests/observable.rb
416
- - lib/stub_requests/property.rb
417
- - lib/stub_requests/property/validator.rb
418
436
  - lib/stub_requests/request_stub.rb
419
437
  - lib/stub_requests/service.rb
420
438
  - lib/stub_requests/service_registry.rb
@@ -425,6 +443,7 @@ files:
425
443
  - lib/stub_requests/uri/scheme.rb
426
444
  - lib/stub_requests/uri/suffix.rb
427
445
  - lib/stub_requests/uri/validator.rb
446
+ - lib/stub_requests/utils/fuzzy.rb
428
447
  - lib/stub_requests/version.rb
429
448
  - lib/stub_requests/webmock/builder.rb
430
449
  - lib/stub_requests/webmock/stub_registry_extension.rb
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "addressable/uri"
4
- require "public_suffix"
5
-
6
- #
7
- # Abstraction over WebMock to reduce duplication
8
- #
9
- # @author Mikael Henriksson <mikael@zoolutions.se>
10
- # @since 0.1.0
11
- #
12
- module StubRequests
13
- #
14
- # Module ArgumentValidation provides validation of method arguments
15
- #
16
- # @author Mikael Henriksson <mikael@zoolutions.se>
17
- #
18
- module ArgumentValidation
19
- extend self
20
-
21
- #
22
- # Require the value to be any of the types past in
23
- #
24
- #
25
- # @param [Symbol] name the name of the argument
26
- # @param [Object] value the actual value of the argument
27
- # @param [Array, Class, Module] type nil the expected argument value class
28
- #
29
- # @raise [InvalidArgumentType] when the value is disallowed
30
- #
31
- # @return [void]
32
- #
33
- def validate!(name:, value:, type:)
34
- validate_type!(:name, name, [Symbol, String]) unless name
35
- validate_type!(name, value, type) if type
36
- end
37
-
38
- def validate_type!(name, value, type)
39
- expected_types = Array(type).flatten
40
- return if expected_types.any? { |is_a| value.is_a?(is_a) }
41
-
42
- raise StubRequests::InvalidArgumentType,
43
- name: name,
44
- actual: value.class,
45
- expected: expected_types
46
- end
47
- end
48
- end
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Abstraction over WebMock to reduce duplication
5
- #
6
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
- # @since 0.1.0
8
- #
9
- module StubRequests
10
- #
11
- # Class Endpoint provides metrics for stubbed endpoints
12
- #
13
- # @author Mikael Henriksson <mikael@zoolutions.se>
14
- # @since 0.1.2
15
- #
16
- class EndpointStub
17
- # includes "Enumerable"
18
- # @!parse include Enumerable
19
- include Enumerable
20
- # @api private
21
- include Property
22
- # @api private
23
-
24
- #
25
- # @!attribute [r] service_id
26
- # @return [Symbol] the id of a {StubRequests::Service}
27
- property :service_id, type: Symbol
28
- #
29
- # @!attribute [r] endpoint_id
30
- # @return [Symbol] the id of an endpoint
31
- property :endpoint_id, type: Symbol
32
- #
33
- # @!attribute [r] verb
34
- # @return [String] the HTTP verb/method for this endpoint
35
- property :verb, type: Symbol
36
- #
37
- # @!attribute [r] path
38
- # @return [String] the full URI template for the endpoint
39
- property :path, type: String
40
- #
41
- # @!attribute [r] stubs
42
- # @return [Array] an array with recorded stubs
43
- attr_reader :stubs
44
-
45
- #
46
- # Initializes a new Endpoint
47
- #
48
- # @param [Service] service a service
49
- # @param [Endpoint] endpoint an endpoint
50
- #
51
- def initialize(service, endpoint)
52
- self.service_id = service.id
53
- self.endpoint_id = endpoint.id
54
- self.verb = endpoint.verb
55
- self.path = [service.uri, endpoint.path].join("/")
56
-
57
- @stubs = Concurrent::Array.new
58
- end
59
-
60
- def find_by(attribute:, value:)
61
- find { |request| request.send(attribute) == value }
62
- end
63
-
64
- #
65
- # Required by Enumerable
66
- #
67
- #
68
- # @return [Concurrent::Map<Symbol, Service>] an map with services
69
- #
70
- # @yield used by Enumerable
71
- #
72
- def each(&block)
73
- stubs.each(&block)
74
- end
75
-
76
- #
77
- # Records a WebMock::RequestStub as stubbed
78
- #
79
- # @param [WebMock::RequestStub] webmock_stub <description>
80
- #
81
- # @return [RequestStub]
82
- #
83
- def record(webmock_stub)
84
- request_stub = RequestStub.new(self, webmock_stub)
85
- stubs.push(request_stub)
86
- request_stub
87
- end
88
- end
89
- end
@@ -1,246 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Abstraction over WebMock to reduce duplication
5
- #
6
- # @author Mikael Henriksson <mikael@zoolutions.se>
7
- # @since 0.1.0
8
- #
9
- module StubRequests
10
- #
11
- # Class Endpoints manages a collection of endpoints
12
- #
13
- # @author Mikael Henriksson <mikael@zoolutions.se>
14
- #
15
- class Endpoints
16
- include Enumerable
17
-
18
- #
19
- # @!attribute [rw] service
20
- # @return [Service] the service the collection belongs to
21
- attr_reader :service
22
- #
23
- # @!attribute [rw] endpoints
24
- # @return [Concurrent::Map<Symbol, Endpoint>] a map with endpoints
25
- attr_reader :endpoints
26
-
27
- def initialize(service)
28
- @service = service
29
- @endpoints = Concurrent::Map.new
30
- end
31
-
32
- #
33
- # Required by Enumerable
34
- #
35
- # @return [Concurrent::Map<Symbol, Service>] a map with endpoints
36
- #
37
- # @yield used by Enumerable
38
- #
39
- def each(&block)
40
- endpoints.each(&block)
41
- end
42
-
43
- #
44
- # Registers an endpoint in the collection
45
- #
46
- # @param [Symbol] endpoint_id the id of this Endpoint
47
- # @param [Symbol] verb a HTTP verb
48
- # @param [String] path the URI to reach the endpoint
49
- #
50
- # @return [Endpoint]
51
- #
52
- def register(endpoint_id, verb, path)
53
- endpoint =
54
- if (endpoint = find(endpoint_id))
55
- StubRequests.logger.warn("Endpoint already registered: #{endpoint}")
56
- endpoint.update(verb, path)
57
- else
58
- Endpoint.new(service, endpoint_id, verb, path)
59
- end
60
-
61
- endpoints[endpoint.id] = endpoint
62
- endpoint
63
- end
64
-
65
- #
66
- # Convenience wrapper for register
67
- #
68
- #
69
- # @example **Register a get endpoint**
70
- # . get("documents/:id", as: :documents_show)
71
- #
72
- # @param [String] path the path to the endpoint
73
- # @param [Symbol] as the id of the endpoint
74
- #
75
- # @return [Endpoint] the registered endpoint
76
- #
77
- def any(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName
78
- register(as, __method__, path)
79
- end
80
-
81
- #
82
- # Convenience wrapper for register
83
- #
84
- #
85
- # @example **Register a get endpoint**
86
- # . get("documents/:id", as: :documents_show)
87
- #
88
- # @param [String] path the path to the endpoint
89
- # @param [Symbol] as the id of the endpoint
90
- #
91
- # @return [Endpoint] the registered endpoint
92
- #
93
- def get(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName
94
- register(as, __method__, path)
95
- end
96
-
97
- #
98
- # Register a :post endpoint
99
- #
100
- #
101
- # @example **Register a post endpoint**
102
- # . post("documents", as: :documents_create)
103
- #
104
- # @param [String] path the path to the endpoint
105
- # @param [Symbol] as the id of the endpoint
106
- #
107
- # @return [Endpoint] the registered endpoint
108
- #
109
- def post(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName
110
- register(as, __method__, path)
111
- end
112
-
113
- #
114
- # Register a :patch endpoint
115
- #
116
- #
117
- # @example **Register a patch endpoint**
118
- # . patch("documents/:id", as: :documents_update)
119
- #
120
- # @param [String] path the path to the endpoint
121
- # @param [Symbol] as the id of the endpoint
122
- #
123
- # @return [Endpoint] the registered endpoint
124
- #
125
- def patch(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName
126
- register(as, __method__, path)
127
- end
128
-
129
- #
130
- # Register a :put endpoint
131
- #
132
- #
133
- # @example **Register a put endpoint**
134
- # . put("documents/:id", as: :documents_update)
135
- #
136
- # @param [String] path the path to the endpoint
137
- # @param [Symbol] as the id of the endpoint
138
- #
139
- # @return [Endpoint] the registered endpoint
140
- #
141
- def put(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName
142
- register(as, __method__, path)
143
- end
144
-
145
- #
146
- # Register a :delete endpoint
147
- #
148
- #
149
- # @example **Register a delete endpoint**
150
- # . delete("documents/:id", as: :documents_destroy)
151
- #
152
- # @param [String] path the path to the endpoint
153
- # @param [Symbol] as the id of the endpoint
154
- #
155
- # @return [Endpoint] the registered endpoint
156
- #
157
- def delete(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName
158
- register(as, __method__, path)
159
- end
160
-
161
- #
162
- # Updates an endpoint
163
- #
164
- #
165
- # @param [Symbol] endpoint_id the id of the endpoint
166
- # @param [Symbol] verb a HTTP verb
167
- # @param [String] path the path to the endpoint
168
- #
169
- # @raise [EndpointNotFound] when the endpoint couldn't be found
170
- #
171
- # @return [Endpoint] returns the updated endpoint
172
- #
173
- def update(endpoint_id, verb, path)
174
- endpoint = find!(endpoint_id)
175
- endpoint.update(verb, path)
176
- end
177
-
178
- #
179
- # Removes an endpoint from the collection
180
- #
181
- #
182
- # @param [Symbol] endpoint_id the id of the endpoint, `:file_service`
183
- #
184
- # @return [Endpoint] the endpoint that was removed
185
- #
186
- def remove(endpoint_id)
187
- endpoints.delete(endpoint_id)
188
- end
189
-
190
- #
191
- # Fetches an endpoint from the collection
192
- #
193
- #
194
- # @param [<type>] endpoint_id <description>
195
- #
196
- # @return [Endpoint]
197
- #
198
- def find(endpoint_id)
199
- endpoints[endpoint_id]
200
- end
201
-
202
- #
203
- # Fetches an endpoint from the collection or raises an error
204
- #
205
- #
206
- # @param [Symbol] endpoint_id the id of the endpoint
207
- #
208
- # @raise [EndpointNotFound] when an endpoint couldn't be found
209
- #
210
- # @return [Endpoint, nil]
211
- #
212
- def find!(endpoint_id)
213
- find(endpoint_id) || raise(EndpointNotFound, "Couldn't find an endpoint with id=:#{endpoint_id}")
214
- end
215
-
216
- #
217
- # Returns a descriptive string with all endpoints in the collection
218
- #
219
- #
220
- # @return [String]
221
- #
222
- def to_s
223
- [
224
- +"#<#{self.class} endpoints=",
225
- +endpoints_string,
226
- +">",
227
- ].join("")
228
- end
229
-
230
- #
231
- # Returns a nicely formatted string with an array of endpoints
232
- #
233
- #
234
- # @return [<type>] <description>
235
- #
236
- def endpoints_string
237
- "[#{endpoints_as_string}]"
238
- end
239
-
240
- private
241
-
242
- def endpoints_as_string
243
- endpoints.values.map(&:to_s).join(",") if endpoints.size.positive?
244
- end
245
- end
246
- end