stub_requests 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -2
  3. data/.reek.yml +1 -0
  4. data/.rubocop.yml +33 -35
  5. data/.simplecov +14 -8
  6. data/.yardopts +1 -1
  7. data/CHANGELOG.md +4 -1
  8. data/README.md +19 -11
  9. data/Rakefile +1 -3
  10. data/bin/update_docs.sh +16 -0
  11. data/gemfiles/webmock_2.3.gemfile.lock +1 -1
  12. data/gemfiles/webmock_3.5.gemfile.lock +1 -1
  13. data/gemfiles/webmock_develop.gemfile.lock +1 -1
  14. data/lib/rspec/subject_as_lambda.rb +138 -0
  15. data/lib/stub_requests/api.rb +42 -8
  16. data/lib/stub_requests/argument_validation.rb +17 -6
  17. data/lib/stub_requests/configuration.rb +21 -0
  18. data/lib/stub_requests/core_ext/all.rb +4 -0
  19. data/lib/stub_requests/core_ext/array/extract_options.rb +32 -0
  20. data/lib/stub_requests/core_ext/class/attribute.rb +61 -0
  21. data/lib/stub_requests/core_ext/kernel/singleton_class.rb +12 -0
  22. data/lib/stub_requests/core_ext/module/redefine_method.rb +44 -0
  23. data/lib/stub_requests/core_ext/object/blank.rb +99 -155
  24. data/lib/stub_requests/endpoint.rb +28 -30
  25. data/lib/stub_requests/endpoint_registry.rb +18 -16
  26. data/lib/stub_requests/exceptions.rb +84 -0
  27. data/lib/stub_requests/hash_util.rb +2 -0
  28. data/lib/stub_requests/metrics/endpoint_stat.rb +97 -0
  29. data/lib/stub_requests/metrics/registry.rb +132 -0
  30. data/lib/stub_requests/metrics/stub_stat.rb +80 -0
  31. data/lib/stub_requests/metrics.rb +32 -0
  32. data/lib/stub_requests/property/validator.rb +136 -0
  33. data/lib/stub_requests/property.rb +99 -0
  34. data/lib/stub_requests/service.rb +12 -53
  35. data/lib/stub_requests/service_registry.rb +8 -9
  36. data/lib/stub_requests/stub_requests.rb +23 -51
  37. data/lib/stub_requests/uri/builder.rb +5 -1
  38. data/lib/stub_requests/uri/scheme.rb +3 -1
  39. data/lib/stub_requests/uri/suffix.rb +5 -0
  40. data/lib/stub_requests/uri/validator.rb +3 -1
  41. data/lib/stub_requests/uri.rb +34 -0
  42. data/lib/stub_requests/version.rb +1 -1
  43. data/lib/stub_requests/webmock/builder.rb +116 -0
  44. data/lib/stub_requests/webmock/stub_registry_extension.rb +46 -0
  45. data/lib/stub_requests.rb +21 -3
  46. metadata +19 -49
  47. data/docs/.gitkeep +0 -0
  48. data/docs/Array.html +0 -137
  49. data/docs/FalseClass.html +0 -232
  50. data/docs/Hash.html +0 -137
  51. data/docs/NilClass.html +0 -232
  52. data/docs/Numeric.html +0 -233
  53. data/docs/Object.html +0 -396
  54. data/docs/String.html +0 -298
  55. data/docs/StubRequests/API.html +0 -651
  56. data/docs/StubRequests/ArgumentValidation.html +0 -309
  57. data/docs/StubRequests/Endpoint.html +0 -1187
  58. data/docs/StubRequests/EndpointNotFound.html +0 -157
  59. data/docs/StubRequests/EndpointRegistry.html +0 -1527
  60. data/docs/StubRequests/Error.html +0 -153
  61. data/docs/StubRequests/HashUtil.html +0 -304
  62. data/docs/StubRequests/InvalidType.html +0 -252
  63. data/docs/StubRequests/InvalidUri.html +0 -252
  64. data/docs/StubRequests/Service.html +0 -1307
  65. data/docs/StubRequests/ServiceHaveEndpoints.html +0 -244
  66. data/docs/StubRequests/ServiceNotFound.html +0 -252
  67. data/docs/StubRequests/ServiceRegistry.html +0 -1031
  68. data/docs/StubRequests/URI/Builder.html +0 -1194
  69. data/docs/StubRequests/URI/Scheme.html +0 -315
  70. data/docs/StubRequests/URI/Suffix.html +0 -315
  71. data/docs/StubRequests/URI/Validator.html +0 -770
  72. data/docs/StubRequests/URI.html +0 -144
  73. data/docs/StubRequests/UriSegmentMismatch.html +0 -157
  74. data/docs/StubRequests/WebMockBuilder.html +0 -887
  75. data/docs/StubRequests.html +0 -452
  76. data/docs/Time.html +0 -232
  77. data/docs/TrueClass.html +0 -232
  78. data/docs/_config.yml +0 -1
  79. data/docs/_index.html +0 -391
  80. data/docs/class_list.html +0 -51
  81. data/docs/css/common.css +0 -1
  82. data/docs/css/full_list.css +0 -58
  83. data/docs/css/style.css +0 -496
  84. data/docs/file.README.html +0 -225
  85. data/docs/file_list.html +0 -56
  86. data/docs/frames.html +0 -17
  87. data/docs/index.html +0 -225
  88. data/docs/js/app.js +0 -292
  89. data/docs/js/full_list.js +0 -216
  90. data/docs/js/jquery.js +0 -4
  91. data/docs/method_list.html +0 -707
  92. data/docs/top-level-namespace.html +0 -112
  93. data/lib/stub_requests/webmock_builder.rb +0 -108
@@ -10,6 +10,8 @@ module StubRequests
10
10
  #
11
11
  # Provides convenience methods for hashes
12
12
  #
13
+ # @author Mikael Henriksson <mikael@zoolutions.se>
14
+ #
13
15
  module HashUtil
14
16
  #
15
17
  # Removes all entries with nil values (first level only)
@@ -0,0 +1,97 @@
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 Metrics contains logic for collecting metrics about {EndpointStat} and {StubStat}
12
+ #
13
+ # @author Mikael Henriksson <mikael@zoolutions.se>
14
+ # @since 0.1.2
15
+ #
16
+ # :reek:TooManyInstanceVariables
17
+ module Metrics
18
+ #
19
+ # Class EndpointStat provides metrics for stubbed endpoints
20
+ #
21
+ # @author Mikael Henriksson <mikael@zoolutions.se>
22
+ # @since 0.1.2
23
+ #
24
+ class EndpointStat
25
+ # includes "Enumerable"
26
+ # @!parse include Enumerable
27
+ include Enumerable
28
+
29
+ # @api private
30
+ include Property
31
+
32
+ #
33
+ # @!attribute [r] service_id
34
+ # @return [Symbol] the id of a {Service}
35
+ property :service_id, type: Symbol
36
+ #
37
+ # @!attribute [r] endpoint_id
38
+ # @return [Symbol] the id of an endpoint
39
+ property :endpoint_id, type: Symbol
40
+ #
41
+ # @!attribute [r] verb
42
+ # @return [String] the HTTP verb/method for this endpoint
43
+ property :verb, type: Symbol
44
+ #
45
+ # @!attribute [r] uri_template
46
+ # @return [String] the full URI template for the endpoint
47
+ property :uri_template, type: Symbol
48
+ #
49
+ # @!attribute [r] stats
50
+ # @return [Array] an array with recorded request_stubs
51
+ attr_reader :stats
52
+
53
+ #
54
+ # Initializes a new EndpointStat
55
+ #
56
+ # @param [Service] service a service
57
+ # @param [Endpoint] endpoint an endpoint
58
+ #
59
+ def initialize(service, endpoint)
60
+ @service_id = service.id
61
+ @endpoint_id = endpoint.id
62
+ @verb = endpoint.verb
63
+ @uri_template = [service.uri, endpoint.uri_template].join("/")
64
+ @stats = Concurrent::Array.new
65
+ end
66
+
67
+ def find_by(attribute:, value:)
68
+ find { |stat| stat.send(attribute) == value }
69
+ end
70
+
71
+ #
72
+ # Required by Enumerable
73
+ #
74
+ #
75
+ # @return [Concurrent::Map<Symbol, Service>] an map with services
76
+ #
77
+ # @yield used by Enumerable
78
+ #
79
+ def each(&block)
80
+ stats.each(&block)
81
+ end
82
+
83
+ #
84
+ # Records a WebMock::RequestStub as stubbed
85
+ #
86
+ # @param [WebMock::RequestStub] request_stub <description>
87
+ #
88
+ # @return [Record]
89
+ #
90
+ def record(request_stub)
91
+ stat = StubStat.new(self, request_stub)
92
+ stats.push(stat)
93
+ stat
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,132 @@
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 Metrics contains logic for collecting metrics about {EndpointStat} and {StubStat}
12
+ #
13
+ # @author Mikael Henriksson <mikael@zoolutions.se>
14
+ # @since 0.1.2
15
+ #
16
+ # :reek:DataClump
17
+ module Metrics
18
+ #
19
+ # Class Registry maintains a registry of stubbed endpoints.
20
+ # Also allows provides querying capabilities for said entities.
21
+ #
22
+ # @author Mikael Henriksson <mikael@zoolutions.se>
23
+ # @since 0.1.2
24
+ #
25
+ class Registry
26
+ # includes "Singleton"
27
+ # @!parse include Singleton
28
+ include Singleton
29
+ # includes "Enumerable"
30
+ # @!parse include Enumerable
31
+ include Enumerable
32
+
33
+ #
34
+ # @!attribute [rw] services
35
+ # @return [Concurrent::Array<EndpointStat>] a map with stubbed endpoints
36
+ attr_reader :stats
37
+
38
+ #
39
+ # Initialize a new registry
40
+ #
41
+ #
42
+ def initialize
43
+ @stats = Concurrent::Array.new
44
+ end
45
+
46
+ #
47
+ # Resets the map with stubbed endpoints
48
+ #
49
+ #
50
+ # @api private
51
+ def reset
52
+ stats.clear
53
+ end
54
+
55
+ #
56
+ # Required by Enumerable
57
+ #
58
+ #
59
+ # @return [Concurrent::Array<EndpointStat>] an array with stubbed endpoints
60
+ #
61
+ # @yield used by Enumerable
62
+ #
63
+ def each(&block)
64
+ stats.each(&block)
65
+ end
66
+
67
+ #
68
+ # Records metrics about stubbed endpoints
69
+ #
70
+ #
71
+ # @param [Service] service a symbolic id of the service
72
+ # @param [Endpoint] endpoint a string with a base_uri to the service
73
+ # @param [WebMock::RequestStub] request_stub the stubbed request
74
+ #
75
+ # @return [Service] the service that was just registered
76
+ #
77
+ def record(service, endpoint, request_stub)
78
+ stat = find_or_initialize_stat(service, endpoint)
79
+ stat.record(request_stub)
80
+
81
+ stats.push(stat)
82
+ stat
83
+ end
84
+
85
+ #
86
+ # Mark a {StubStat} as having responded
87
+ #
88
+ # @note Called when webmock responds successfully
89
+ #
90
+ # @param [WebMock::RequestStub] request_stub the stubbed webmock request
91
+ #
92
+ # @return [void]
93
+ #
94
+ def mark_as_responded(request_stub)
95
+ return unless (stat = find_stub_stat(request_stub))
96
+
97
+ stat.mark_as_responded
98
+ end
99
+
100
+ #
101
+ # Finds a {StubStat} amongst the endpoint stubs
102
+ #
103
+ #
104
+ # @param [WebMock::RequestStub] request_stub a stubbed webmock response
105
+ #
106
+ # @return [StubStat] the stub_stat matching the request stub
107
+ #
108
+ def find_stub_stat(request_stub)
109
+ map do |endpoint|
110
+ endpoint.find_by(attribute: :request_stub, value: request_stub)
111
+ end.compact.first
112
+ end
113
+
114
+ private
115
+
116
+ def find_or_initialize_stat(service, endpoint)
117
+ find_stat(service, endpoint) || initialize_stat(service, endpoint)
118
+ end
119
+
120
+ # :reek:UtilityFunction
121
+ # :reek:FeatureEnvy
122
+ def find_stat(service, endpoint)
123
+ find { |stat| stat.service_id == service.id && stat.endpoint_id == endpoint.id }
124
+ end
125
+
126
+ # :reek:UtilityFunction
127
+ def initialize_stat(service, endpoint)
128
+ Metrics::EndpointStat.new(service, endpoint)
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,80 @@
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 Metrics contains logic for collecting metrics about {EndpointStat} and {StubStat}
12
+ #
13
+ # @author Mikael Henriksson <mikael@zoolutions.se>
14
+ # @since 0.1.2
15
+ #
16
+ module Metrics
17
+ #
18
+ # Class StubStat tracks the WebMock::RequestStub life cycle
19
+ #
20
+ # @author Mikael Henriksson <mikael@zoolutions.se>
21
+ # @since 0.1.2
22
+ #
23
+ # :reek:TooManyInstanceVariables
24
+ class StubStat
25
+ include Property
26
+ #
27
+ # @!attribute [r] verb
28
+ # @return [Symbol] a HTTP verb/method
29
+ property :verb, type: Symbol
30
+ #
31
+ # @!attribute [r] uri
32
+ # @return [String] the full URI for this endpoint
33
+ property :uri, type: String
34
+ #
35
+ # @!attribute [r] request_stub
36
+ # @return [WebMock::RequestStub] a webmock stubbed request
37
+ property :request_stub, type: WebMock::RequestStub
38
+ #
39
+ # @!attribute [r] recorded_at
40
+ # @return [Time] the time this record was recorded
41
+ property :recorded_at, type: Time
42
+ #
43
+ # @!attribute [r] recorded_from
44
+ # @return [String] the relative path to the spec that recorded it
45
+ property :recorded_from, type: String
46
+ #
47
+ # @!attribute [r] responded_at
48
+ # @return [Time] the time this stubs response was used
49
+ property :responded_at, type: Time
50
+
51
+ #
52
+ # Initialize a new Record
53
+ #
54
+ #
55
+ # @param [EndpointStat] endpoint_stat a stubbed endpoint
56
+ # @param [WebMock::RequestStub] request_stub the stubbed webmock request
57
+ #
58
+ def initialize(endpoint_stat, request_stub)
59
+ request_pattern = request_stub.request_pattern
60
+ @endpoint_stat = endpoint_stat
61
+ @verb = request_pattern.method_pattern.to_s.to_sym
62
+ @uri = request_pattern.uri_pattern.to_s
63
+ @request_stub = request_stub
64
+ @recorded_at = Time.now
65
+ @recorded_from = RSpec.current_example.metadata[:location]
66
+ @responded_at = nil
67
+ end
68
+
69
+ #
70
+ # Marks this record as having responded
71
+ #
72
+ #
73
+ # @return [Time] the time it was marked responded
74
+ #
75
+ def mark_as_responded
76
+ @responded_at = Time.now
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,32 @@
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 Metrics contains logic for collecting metrics about {EndpointStat} and {StubStat}
12
+ #
13
+ # @author Mikael Henriksson <mikael@zoolutions.se>
14
+ # @since 0.1.2
15
+ #
16
+ module Metrics
17
+ #
18
+ # Records metrics about stubbed endpoints
19
+ #
20
+ # @param [Service] service a Service
21
+ # @param [Endpoint] endpoint an Endpoint
22
+ # @param [WebMock::RequestStub] endpoint_stub the stubbed webmock request
23
+ #
24
+ # @return [EndpointStat] the stat that was recorded
25
+ #
26
+ def self.record(service, endpoint, endpoint_stub)
27
+ return unless StubRequests.config.record_metrics?
28
+
29
+ Registry.instance.record(service, endpoint, endpoint_stub)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,136 @@
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 Property provides type checked attribute definition with default value
12
+ #
13
+ # @author Mikael Henriksson <mikael@zoolutions.se>
14
+ # @since 0.1.2
15
+ #
16
+ module Property
17
+ #
18
+ # Class Validator provides validation for adding properties
19
+ #
20
+ # @author Mikael Henriksson <mikael@zoolutions.se>
21
+ # @since 0.1.2
22
+ #
23
+ class Validator
24
+ include ArgumentValidation
25
+
26
+ #
27
+ # Validates that the property can be added to the class
28
+ #
29
+ #
30
+ # @param [Symbol] name the name of the property
31
+ # @param [Class, Module] type the type of the property
32
+ # @param [Object] default the default value of the property
33
+ # @param [Hash] properties the list of currently defined properties
34
+ #
35
+ # @raise [InvalidArgumentType] when name is not a Symbol
36
+ # @raise [InvalidArgumentType] when default does not match type
37
+ # @raise [PropertyDefined] when property has already been defined
38
+ #
39
+ # @return [void]
40
+ #
41
+ # :reek:LongParameterList
42
+ def self.call(name, type, default, properties)
43
+ new(name, type, default, properties).run_validations
44
+ end
45
+
46
+ #
47
+ # @!attribute [r] name
48
+ # @return [Symbol] the name of the property
49
+ attr_reader :name
50
+ #
51
+ # @!attribute [r] type
52
+ # @return [Class, Module] the type of the property
53
+ attr_reader :type
54
+ #
55
+ # @!attribute [r] default
56
+ # @return [Object] the default value of the property
57
+ attr_reader :default
58
+ #
59
+ # @!attribute [r] properties
60
+ # @return [Hash] the list of currently defined properties
61
+ attr_reader :properties
62
+
63
+ # Initializes a new {Validator}
64
+ #
65
+ # @param [Symbol] name the name of the property
66
+ # @param [Class, Module] type the type of the property
67
+ # @param [Object] default the default value of the property
68
+ # @param [Hash] properties the list of currently defined properties
69
+ #
70
+ # :reek:LongParameterList
71
+ def initialize(name, type, default, properties)
72
+ @name = name
73
+ @type = Array(type).flatten
74
+ @default = default
75
+ @properties = properties
76
+ end
77
+
78
+ #
79
+ # Performs all validations
80
+ #
81
+ #
82
+ # @raise [InvalidArgumentType] when name is not a Symbol
83
+ # @raise [InvalidArgumentType] when default does not match type
84
+ # @raise [PropertyDefined] when property has already been defined
85
+ #
86
+ # @return [void]
87
+ #
88
+ def run_validations
89
+ validate_undefined
90
+ validate_name
91
+ validate_default
92
+ end
93
+
94
+ private
95
+
96
+ #
97
+ # Validates that the name is of type Symbol
98
+ #
99
+ # @raise [InvalidArgumentType] when name is not a Symbol
100
+ #
101
+ # @return [void]
102
+ #
103
+ def validate_name
104
+ validate! :name, name, is_a: Symbol
105
+ end
106
+
107
+ #
108
+ # Validate that the default value matches the type
109
+ #
110
+ #
111
+ # @raise [InvalidArgumentType] when default does not match type
112
+ #
113
+ # @return [void]
114
+ #
115
+ def validate_default
116
+ return unless default || default.is_a?(FalseClass)
117
+
118
+ validate! :default, default, is_a: type
119
+ end
120
+
121
+ #
122
+ # Validate that the property has not been defined
123
+ #
124
+ #
125
+ # @raise [PropertyDefined] when property has already been defined
126
+ #
127
+ # @return [void]
128
+ #
129
+ def validate_undefined
130
+ return unless (prop = properties[name])
131
+
132
+ raise PropertyDefined, name: name, type: prop[:type], default: prop[:default]
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,99 @@
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 Property provides type checked attribute definition with default value
12
+ #
13
+ # @author Mikael Henriksson <mikael@zoolutions.se>
14
+ # @since 0.1.2
15
+ #
16
+ module Property
17
+ include ArgumentValidation
18
+
19
+ #
20
+ # Extends the base class with the ClassMethods module
21
+ #
22
+ # @param [Class,Module] base the class where this module is included
23
+ #
24
+ # @return [void]
25
+ #
26
+ def self.included(base)
27
+ base.class_attribute :properties, default: {}
28
+ base.send(:extend, ClassMethods)
29
+ end
30
+
31
+ #
32
+ # Module ClassMethods provides class methods for {Property}
33
+ #
34
+ # @author Mikael Henriksson <mikael@zoolutions.se>
35
+ #
36
+ # :reek:DataClump
37
+ module ClassMethods
38
+ #
39
+ # Define property methods for the name
40
+ #
41
+ # @param [Symbol] name the name of the property
42
+ # @param [Object] type: the expected type of the property
43
+ # @param [Hash<Symbol>] **options a hash with options
44
+ # @option options [Object] :default a default value for the property
45
+ #
46
+ # @return [Object] the whatever
47
+ #
48
+ def property(name, type:, **options)
49
+ type = normalize_type(type, options)
50
+ default = options[:default]
51
+ Property::Validator.call(name, type, default, properties)
52
+
53
+ Docile.dsl_eval(self) do
54
+ define_property(name, type, default)
55
+ end
56
+ end
57
+
58
+ def normalize_type(type, **options)
59
+ type_array = Array(type)
60
+ return type_array unless (default = options[:default])
61
+
62
+ type_array.concat([default.class]).flatten.uniq
63
+ end
64
+
65
+ def define_property(name, type, default)
66
+ property_reader(name)
67
+ property_predicate(name)
68
+ property_writer(name, type)
69
+
70
+ set_property_defined(name, type, default)
71
+ end
72
+
73
+ def property_reader(name)
74
+ silence_redefinition_of_method(name.to_s)
75
+ redefine_method(name) do
76
+ instance_variable_get("@#{name}") || properties.dig(name, :default)
77
+ end
78
+ end
79
+
80
+ def property_predicate(name)
81
+ silence_redefinition_of_method("#{name}?")
82
+ redefine_method("#{name}?") do
83
+ !!public_send(name) # rubocop:disable Style/DoubleNegation
84
+ end
85
+ end
86
+
87
+ def property_writer(name, type)
88
+ redefine_method("#{name}=") do |obj|
89
+ validate! name, obj, is_a: type
90
+ instance_variable_set("@#{name}", obj)
91
+ end
92
+ end
93
+
94
+ def set_property_defined(name, type, default)
95
+ properties[name] = { type: type, default: default }
96
+ end
97
+ end
98
+ end
99
+ end
@@ -10,21 +10,23 @@ module StubRequests
10
10
  #
11
11
  # Class Service provides details for a registered service
12
12
  #
13
+ # @author Mikael Henriksson <mikael@zoolutions.se>
14
+ #
13
15
  class Service
14
- include ArgumentValidation
15
16
  include Comparable
17
+ include Property
16
18
 
17
19
  # @!attribute [rw] id
18
20
  # @return [EndpointRegistry] the id of the service
19
- attr_reader :id
21
+ property :id, type: Symbol
20
22
 
21
23
  # @!attribute [rw] uri
22
24
  # @return [EndpointRegistry] the base uri to the service
23
- attr_reader :uri
25
+ property :uri, type: String
24
26
 
25
- # @!attribute [rw] endpoint_registry
27
+ # @!attribute [rw] endpoints
26
28
  # @return [EndpointRegistry] a list with defined endpoints
27
- attr_reader :endpoint_registry
29
+ attr_reader :endpoints
28
30
 
29
31
  #
30
32
  # Initializes a new instance of a Service
@@ -33,28 +35,9 @@ module StubRequests
33
35
  # @param [String] service_uri the base uri to reach the service
34
36
  #
35
37
  def initialize(service_id, service_uri)
36
- validate! service_id, is_a: Symbol
37
- validate! service_uri, is_a: String
38
-
39
- @id = service_id
40
- @uri = service_uri
41
- @endpoint_registry = EndpointRegistry.new
42
- end
43
-
44
- #
45
- # Registers a new endpoint or updates an existing one
46
- #
47
- #
48
- # @param [Symbol] endpoint_id the id of this Endpoint
49
- # @param [Symbol] verb a HTTP verb
50
- # @param [String] uri_template the URI to reach the endpoint
51
- # @param [optional, Hash<Symbol>] default_options default options
52
- #
53
- # @return [Endpoint] either the new endpoint or the updated one
54
- #
55
- # :reek:LongParameterList { max_params: 5 }
56
- def register_endpoint(endpoint_id, verb, uri_template, default_options = {})
57
- endpoint_registry.register(endpoint_id, verb, uri_template, default_options)
38
+ self.id = service_id
39
+ self.uri = service_uri
40
+ @endpoints = EndpointRegistry.new
58
41
  end
59
42
 
60
43
  #
@@ -63,31 +46,7 @@ module StubRequests
63
46
  # @return [true,false]
64
47
  #
65
48
  def endpoints?
66
- endpoint_registry.any?
67
- end
68
-
69
- #
70
- # Gets an endpoint from the {#endpoint_registry} collection
71
- #
72
- # @param [Symbol] endpoint_id the id of the endpoint
73
- #
74
- # @raise [EndpointNotFound] when the endpoint couldn't be found
75
- #
76
- # @return [Endpoint]
77
- #
78
- def get_endpoint!(endpoint_id)
79
- endpoint_registry.get!(endpoint_id)
80
- end
81
-
82
- #
83
- # Gets an endpoint from the {#endpoint_registry} collection
84
- #
85
- # @param [Symbol] endpoint_id the id of the endpoint
86
- #
87
- # @return [Endpoint, nil]
88
- #
89
- def get_endpoint(endpoint_id)
90
- endpoint_registry.get(endpoint_id)
49
+ endpoints.any?
91
50
  end
92
51
 
93
52
  #
@@ -100,7 +59,7 @@ module StubRequests
100
59
  +"#<#{self.class}",
101
60
  +" id=#{id}",
102
61
  +" uri=#{uri}",
103
- +" endpoints=#{endpoint_registry.endpoints_string}",
62
+ +" endpoints=#{endpoints.endpoints_string}",
104
63
  +">",
105
64
  ].join("")
106
65
  end