stub_requests 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.simplecov +1 -0
- data/CHANGELOG.md +8 -0
- data/README.md +27 -0
- data/gemfiles/webmock_2.3.gemfile.lock +1 -1
- data/gemfiles/webmock_3.5.gemfile.lock +1 -1
- data/gemfiles/webmock_develop.gemfile.lock +1 -1
- data/lib/stub_requests.rb +19 -14
- data/lib/stub_requests/api.rb +30 -16
- data/lib/stub_requests/argument_validation.rb +12 -12
- data/lib/stub_requests/endpoint.rb +12 -10
- data/lib/stub_requests/exceptions.rb +2 -6
- data/lib/stub_requests/metrics.rb +5 -4
- data/lib/stub_requests/metrics/{endpoint_stat.rb → endpoint.rb} +23 -22
- data/lib/stub_requests/metrics/registry.rb +25 -25
- data/lib/stub_requests/metrics/{stub_stat.rb → request.rb} +22 -13
- data/lib/stub_requests/observable.rb +62 -0
- data/lib/stub_requests/observable/registry.rb +152 -0
- data/lib/stub_requests/observable/subscription.rb +58 -0
- data/lib/stub_requests/property.rb +9 -3
- data/lib/stub_requests/property/validator.rb +4 -4
- data/lib/stub_requests/registration.rb +87 -0
- data/lib/stub_requests/registration/endpoint.rb +107 -0
- data/lib/stub_requests/registration/endpoints.rb +156 -0
- data/lib/stub_requests/registration/registry.rb +112 -0
- data/lib/stub_requests/registration/service.rb +85 -0
- data/lib/stub_requests/uri.rb +1 -1
- data/lib/stub_requests/version.rb +1 -1
- data/lib/tasks/changelog.rake +11 -2
- data/update_docs.sh +33 -0
- metadata +13 -8
- data/bin/update_docs.sh +0 -16
- data/lib/stub_requests/endpoint_registry.rb +0 -159
- data/lib/stub_requests/service.rb +0 -77
- data/lib/stub_requests/service_registry.rb +0 -104
@@ -0,0 +1,85 @@
|
|
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
|
+
# Module Registration provides registration of stubbed endpoints and services
|
12
|
+
#
|
13
|
+
# @author Mikael Henriksson <mikael@zoolutions.se>
|
14
|
+
# @since 0.1.3
|
15
|
+
#
|
16
|
+
module Registration
|
17
|
+
#
|
18
|
+
# Class Service provides details for a registered service
|
19
|
+
#
|
20
|
+
# @author Mikael Henriksson <mikael@zoolutions.se>
|
21
|
+
#
|
22
|
+
class Service
|
23
|
+
include Comparable
|
24
|
+
include Property
|
25
|
+
|
26
|
+
# @!attribute [rw] id
|
27
|
+
# @return [Symbol] the id of the service
|
28
|
+
property :id, type: Symbol
|
29
|
+
|
30
|
+
# @!attribute [rw] uri
|
31
|
+
# @return [String] the base uri to the service
|
32
|
+
property :uri, type: String
|
33
|
+
|
34
|
+
# @!attribute [rw] endpoints
|
35
|
+
# @return [Endpoints] a list with defined endpoints
|
36
|
+
attr_reader :endpoints
|
37
|
+
|
38
|
+
#
|
39
|
+
# Initializes a new instance of a Service
|
40
|
+
#
|
41
|
+
# @param [Symbol] service_id the id of this service
|
42
|
+
# @param [String] service_uri the base uri to reach the service
|
43
|
+
#
|
44
|
+
def initialize(service_id, service_uri)
|
45
|
+
self.id = service_id
|
46
|
+
self.uri = service_uri
|
47
|
+
@endpoints = Endpoints.new
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Check if the endpoint registry has endpoints
|
52
|
+
#
|
53
|
+
# @return [true,false]
|
54
|
+
#
|
55
|
+
def endpoints?
|
56
|
+
endpoints.any?
|
57
|
+
end
|
58
|
+
|
59
|
+
#
|
60
|
+
# Returns a nicely formatted string with this service
|
61
|
+
#
|
62
|
+
# @return [String]
|
63
|
+
#
|
64
|
+
def to_s
|
65
|
+
[
|
66
|
+
+"#<#{self.class}",
|
67
|
+
+" id=#{id}",
|
68
|
+
+" uri=#{uri}",
|
69
|
+
+" endpoints=#{endpoints.endpoints_string}",
|
70
|
+
+">",
|
71
|
+
].join("")
|
72
|
+
end
|
73
|
+
|
74
|
+
def <=>(other)
|
75
|
+
id <=> other.id
|
76
|
+
end
|
77
|
+
|
78
|
+
def hash
|
79
|
+
[id, self.class].hash
|
80
|
+
end
|
81
|
+
|
82
|
+
alias eql? ==
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
data/lib/stub_requests/uri.rb
CHANGED
@@ -24,7 +24,7 @@ module StubRequests
|
|
24
24
|
# @return [Array<Service, Endpoint, String] the service, endpoint and full URI
|
25
25
|
#
|
26
26
|
def self.for_service_endpoint(service_id, endpoint_id, replacements)
|
27
|
-
service =
|
27
|
+
service = Registration::Registry.instance.find!(service_id)
|
28
28
|
endpoint = service.endpoints.find!(endpoint_id)
|
29
29
|
uri = URI::Builder.build(service.uri, endpoint.uri_template, replacements)
|
30
30
|
|
data/lib/tasks/changelog.rake
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
desc "Generate a Changelog"
|
4
4
|
task :changelog do
|
5
5
|
# rubocop:disable Style/MutableConstant
|
6
|
-
|
6
|
+
CHANGELOG_CMD ||= %w[
|
7
7
|
github_changelog_generator
|
8
8
|
-u
|
9
9
|
mhenrixon
|
@@ -12,7 +12,16 @@ task :changelog do
|
|
12
12
|
--no-verbose
|
13
13
|
--token
|
14
14
|
]
|
15
|
+
CHECKOUT_CHANGELOG_CMD ||= "git checkout -B update-changelog"
|
16
|
+
COMMIT_CHANGELOG_CMD ||= "git add --all"
|
17
|
+
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"
|
15
20
|
# rubocop:enable Style/MutableConstant
|
16
21
|
|
17
|
-
sh(*
|
22
|
+
sh(*CHANGELOG_CMD.push(ENV["CHANGELOG_GITHUB_TOKEN"]))
|
23
|
+
sh(CHECKOUT_CHANGELOG_CMD)
|
24
|
+
sh(COMMIT_CHANGELOG_CMD)
|
25
|
+
sh(GIT_PUSH_CMD)
|
26
|
+
sh(OPEN_PR_CMD)
|
18
27
|
end
|
data/update_docs.sh
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
git checkout master
|
4
|
+
git fetch
|
5
|
+
stash_created=0
|
6
|
+
|
7
|
+
if [[ "$(git diff --stat)" != "" ]]; then
|
8
|
+
stash_created=1
|
9
|
+
git stash push -u -a -m "Before updating docs"
|
10
|
+
fi;
|
11
|
+
|
12
|
+
git reset --hard origin/master
|
13
|
+
|
14
|
+
rake yard
|
15
|
+
|
16
|
+
git checkout gh-pages
|
17
|
+
|
18
|
+
echo "Cleaning up current documentation"
|
19
|
+
find . ! -path '*/.git*' ! -path '*/doc*' ! -path '*/update_docs.sh*' ! -path '*/_config.yml*' ! -path '*/_index.html*' ! -path '.' | xargs rm -rf
|
20
|
+
|
21
|
+
echo "Copying new documentation"
|
22
|
+
mv doc/* ./
|
23
|
+
|
24
|
+
echo "Sending new documentation to github"
|
25
|
+
git add --all
|
26
|
+
git commit -a -m 'Update documentation'
|
27
|
+
git push
|
28
|
+
|
29
|
+
if [[ $stash_created == 1 ]]; then
|
30
|
+
git stash pop
|
31
|
+
fi;
|
32
|
+
|
33
|
+
git checkout master
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stub_requests
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikael Henriksson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docile
|
@@ -370,7 +370,6 @@ files:
|
|
370
370
|
- _config.yml
|
371
371
|
- bin/console
|
372
372
|
- bin/setup
|
373
|
-
- bin/update_docs.sh
|
374
373
|
- gemfiles/.bundle/config
|
375
374
|
- gemfiles/webmock_2.3.gemfile
|
376
375
|
- gemfiles/webmock_2.3.gemfile.lock
|
@@ -392,17 +391,22 @@ files:
|
|
392
391
|
- lib/stub_requests/core_ext/module/redefine_method.rb
|
393
392
|
- lib/stub_requests/core_ext/object/blank.rb
|
394
393
|
- lib/stub_requests/endpoint.rb
|
395
|
-
- lib/stub_requests/endpoint_registry.rb
|
396
394
|
- lib/stub_requests/exceptions.rb
|
397
395
|
- lib/stub_requests/hash_util.rb
|
398
396
|
- lib/stub_requests/metrics.rb
|
399
|
-
- lib/stub_requests/metrics/
|
397
|
+
- lib/stub_requests/metrics/endpoint.rb
|
400
398
|
- lib/stub_requests/metrics/registry.rb
|
401
|
-
- lib/stub_requests/metrics/
|
399
|
+
- lib/stub_requests/metrics/request.rb
|
400
|
+
- lib/stub_requests/observable.rb
|
401
|
+
- lib/stub_requests/observable/registry.rb
|
402
|
+
- lib/stub_requests/observable/subscription.rb
|
402
403
|
- lib/stub_requests/property.rb
|
403
404
|
- lib/stub_requests/property/validator.rb
|
404
|
-
- lib/stub_requests/
|
405
|
-
- lib/stub_requests/
|
405
|
+
- lib/stub_requests/registration.rb
|
406
|
+
- lib/stub_requests/registration/endpoint.rb
|
407
|
+
- lib/stub_requests/registration/endpoints.rb
|
408
|
+
- lib/stub_requests/registration/registry.rb
|
409
|
+
- lib/stub_requests/registration/service.rb
|
406
410
|
- lib/stub_requests/stub_requests.rb
|
407
411
|
- lib/stub_requests/uri.rb
|
408
412
|
- lib/stub_requests/uri/builder.rb
|
@@ -416,6 +420,7 @@ files:
|
|
416
420
|
- lib/tasks/gem.rake
|
417
421
|
- lib/tasks/git.rake
|
418
422
|
- stub_requests.gemspec
|
423
|
+
- update_docs.sh
|
419
424
|
homepage: https://mhenrixon.github.io/stub_requests/
|
420
425
|
licenses:
|
421
426
|
- MIT
|
data/bin/update_docs.sh
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
#!/usr/bin/env bash
|
2
|
-
|
3
|
-
git checkout master
|
4
|
-
git pull --rebase
|
5
|
-
|
6
|
-
rake yard
|
7
|
-
|
8
|
-
git checkout gh-pages
|
9
|
-
|
10
|
-
shopt -s extglob
|
11
|
-
rm -rf "$(echo ./!(bin|_config.yml|_index.html))"
|
12
|
-
|
13
|
-
mv doc/* ./
|
14
|
-
git commit -a -m 'Update documentation'
|
15
|
-
git push
|
16
|
-
|
@@ -1,159 +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 EndpointRegistry holds a collection of {Endpoint}
|
12
|
-
#
|
13
|
-
# @author Mikael Henriksson <mikael@zoolutions.se>
|
14
|
-
#
|
15
|
-
class EndpointRegistry
|
16
|
-
include Enumerable
|
17
|
-
|
18
|
-
#
|
19
|
-
# @!attribute [rw] endpoints
|
20
|
-
# @return [Concurrent::Map<Symbol, Endpoint>] a map with endpoints
|
21
|
-
attr_reader :endpoints
|
22
|
-
|
23
|
-
def initialize
|
24
|
-
@endpoints = Concurrent::Map.new
|
25
|
-
end
|
26
|
-
|
27
|
-
#
|
28
|
-
# Required by Enumerable
|
29
|
-
#
|
30
|
-
# @return [Concurrent::Map<Symbol, Service>] a map with endpoints
|
31
|
-
#
|
32
|
-
# @yield used by Enumerable
|
33
|
-
#
|
34
|
-
def each(&block)
|
35
|
-
endpoints.each(&block)
|
36
|
-
end
|
37
|
-
|
38
|
-
#
|
39
|
-
# Registers an endpoint in the collection
|
40
|
-
#
|
41
|
-
# @param [Symbol] endpoint_id the id of this Endpoint
|
42
|
-
# @param [Symbol] verb a HTTP verb
|
43
|
-
# @param [String] uri_template the URI to reach the endpoint
|
44
|
-
# @param [optional, Hash<Symbol>] options default options
|
45
|
-
#
|
46
|
-
# @return [Endpoint]
|
47
|
-
#
|
48
|
-
# :reek:LongParameterList { max_params: 4 }
|
49
|
-
def register(endpoint_id, verb, uri_template, options = {})
|
50
|
-
endpoint =
|
51
|
-
if (endpoint = find(endpoint_id))
|
52
|
-
StubRequests.logger.warn("Endpoint already registered: #{endpoint}")
|
53
|
-
endpoint.update(verb, uri_template, options)
|
54
|
-
else
|
55
|
-
Endpoint.new(endpoint_id, verb, uri_template, options)
|
56
|
-
end
|
57
|
-
|
58
|
-
endpoints[endpoint.id] = endpoint
|
59
|
-
endpoint
|
60
|
-
end
|
61
|
-
|
62
|
-
#
|
63
|
-
# Check if an endpoint is registered
|
64
|
-
#
|
65
|
-
# @param [Symbol] endpoint_id the id of the endpoint
|
66
|
-
#
|
67
|
-
# @return [true, false]
|
68
|
-
#
|
69
|
-
def registered?(endpoint_id)
|
70
|
-
endpoints[endpoint_id].present?
|
71
|
-
end
|
72
|
-
|
73
|
-
#
|
74
|
-
# Updates an endpoint
|
75
|
-
#
|
76
|
-
# @param [Symbol] endpoint_id the id of the endpoint
|
77
|
-
# @param [Symbol] verb a HTTP verb
|
78
|
-
# @param [String] uri_template how to reach the endpoint
|
79
|
-
# @param [optional, Hash<Symbol>] options
|
80
|
-
# @option options [optional, Hash<Symbol>] :request request options
|
81
|
-
# @option options [optional, Hash<Symbol>] :response options
|
82
|
-
# @option options [optional, Array, Exception, StandardError, String] :error to raise
|
83
|
-
# @option options [optional, TrueClass] :timeout raise a timeout error?
|
84
|
-
#
|
85
|
-
# @raise [EndpointNotFound] when the endpoint couldn't be found
|
86
|
-
#
|
87
|
-
# @return [Endpoint] returns the updated endpoint
|
88
|
-
#
|
89
|
-
# :reek:LongParameterList { max_params: 4 }
|
90
|
-
def update(endpoint_id, verb, uri_template, options)
|
91
|
-
endpoint = find!(endpoint_id)
|
92
|
-
endpoint.update(verb, uri_template, options)
|
93
|
-
end
|
94
|
-
|
95
|
-
#
|
96
|
-
# Removes an endpoint from the collection
|
97
|
-
#
|
98
|
-
# @param [Symbol] endpoint_id the id of the endpoint, `:file_service`
|
99
|
-
#
|
100
|
-
# @return [Endpoint] the endpoint that was removed
|
101
|
-
#
|
102
|
-
def remove(endpoint_id)
|
103
|
-
endpoints.delete(endpoint_id)
|
104
|
-
end
|
105
|
-
|
106
|
-
#
|
107
|
-
# Fetches an endpoint from the collection
|
108
|
-
#
|
109
|
-
# @param [<type>] endpoint_id <description>
|
110
|
-
#
|
111
|
-
# @return [Endpoint]
|
112
|
-
#
|
113
|
-
def find(endpoint_id)
|
114
|
-
endpoints[endpoint_id]
|
115
|
-
end
|
116
|
-
|
117
|
-
#
|
118
|
-
# Fetches an endpoint from the collection or raises an error
|
119
|
-
#
|
120
|
-
# @param [Symbol] endpoint_id the id of the endpoint
|
121
|
-
#
|
122
|
-
# @raise [EndpointNotFound] when an endpoint couldn't be found
|
123
|
-
#
|
124
|
-
# @return [Endpoint, nil]
|
125
|
-
#
|
126
|
-
def find!(endpoint_id)
|
127
|
-
find(endpoint_id) || raise(EndpointNotFound, "Couldn't find an endpoint with id=:#{endpoint_id}")
|
128
|
-
end
|
129
|
-
|
130
|
-
#
|
131
|
-
# Returns a descriptive string with all endpoints in the collection
|
132
|
-
#
|
133
|
-
# @return [String]
|
134
|
-
#
|
135
|
-
def to_s
|
136
|
-
[
|
137
|
-
+"#<#{self.class} endpoints=",
|
138
|
-
+endpoints_string,
|
139
|
-
+">",
|
140
|
-
].join("")
|
141
|
-
end
|
142
|
-
|
143
|
-
#
|
144
|
-
# Returns a nicely formatted string with an array of endpoints
|
145
|
-
#
|
146
|
-
#
|
147
|
-
# @return [<type>] <description>
|
148
|
-
#
|
149
|
-
def endpoints_string
|
150
|
-
"[#{endpoints_as_string}]"
|
151
|
-
end
|
152
|
-
|
153
|
-
private
|
154
|
-
|
155
|
-
def endpoints_as_string
|
156
|
-
endpoints.values.map(&:to_s).join(",") if endpoints.size.positive?
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
@@ -1,77 +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 Service provides details for a registered service
|
12
|
-
#
|
13
|
-
# @author Mikael Henriksson <mikael@zoolutions.se>
|
14
|
-
#
|
15
|
-
class Service
|
16
|
-
include Comparable
|
17
|
-
include Property
|
18
|
-
|
19
|
-
# @!attribute [rw] id
|
20
|
-
# @return [EndpointRegistry] the id of the service
|
21
|
-
property :id, type: Symbol
|
22
|
-
|
23
|
-
# @!attribute [rw] uri
|
24
|
-
# @return [EndpointRegistry] the base uri to the service
|
25
|
-
property :uri, type: String
|
26
|
-
|
27
|
-
# @!attribute [rw] endpoints
|
28
|
-
# @return [EndpointRegistry] a list with defined endpoints
|
29
|
-
attr_reader :endpoints
|
30
|
-
|
31
|
-
#
|
32
|
-
# Initializes a new instance of a Service
|
33
|
-
#
|
34
|
-
# @param [Symbol] service_id the id of this service
|
35
|
-
# @param [String] service_uri the base uri to reach the service
|
36
|
-
#
|
37
|
-
def initialize(service_id, service_uri)
|
38
|
-
self.id = service_id
|
39
|
-
self.uri = service_uri
|
40
|
-
@endpoints = EndpointRegistry.new
|
41
|
-
end
|
42
|
-
|
43
|
-
#
|
44
|
-
# Check if the endpoint registry has endpoints
|
45
|
-
#
|
46
|
-
# @return [true,false]
|
47
|
-
#
|
48
|
-
def endpoints?
|
49
|
-
endpoints.any?
|
50
|
-
end
|
51
|
-
|
52
|
-
#
|
53
|
-
# Returns a nicely formatted string with this service
|
54
|
-
#
|
55
|
-
# @return [String]
|
56
|
-
#
|
57
|
-
def to_s
|
58
|
-
[
|
59
|
-
+"#<#{self.class}",
|
60
|
-
+" id=#{id}",
|
61
|
-
+" uri=#{uri}",
|
62
|
-
+" endpoints=#{endpoints.endpoints_string}",
|
63
|
-
+">",
|
64
|
-
].join("")
|
65
|
-
end
|
66
|
-
|
67
|
-
def <=>(other)
|
68
|
-
id <=> other.id
|
69
|
-
end
|
70
|
-
|
71
|
-
def hash
|
72
|
-
[id, self.class].hash
|
73
|
-
end
|
74
|
-
|
75
|
-
alias eql? ==
|
76
|
-
end
|
77
|
-
end
|