configuration_service 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,24 +14,24 @@ module ConfigurationService
14
14
  # It keeps no domain state, because that would couple it to the
15
15
  # service implementation. By making no assumptions at all about the API
16
16
  # or data, it allows implementors to produce service implementations
17
- # that do not adhere to the anticipated ConfigurationService::Base API,
18
- # by writing their own OrchestrationProvider from scratch.
17
+ # that do not adhere to the anticipated {ConfigurationService::Base} API,
18
+ # by writing their own test orchestration provider from scratch
19
+ # instead of extending {ConfigurationService::Test::OrchestrationProvider}.
19
20
  #
20
- # However, implementors who are trying to produce ConfigurationService::Base
21
- # providers should extend OrchestrationProvider, which anticipates a
22
- # compatible provider API.
21
+ # However, implementors who are trying to produce {ConfigurationService::Base}
22
+ # providers should extend {ConfigurationService::Test::OrchestrationProvider},
23
+ # which anticipates a compatible provider API.
23
24
  #
24
- # Note that the +response+ instance variable is not domain state; it is
25
- # a test artifact (Response or similar) that orchestration providers use
26
- # to wrap responses from the service provider.
25
+ # Note that the +@response+ instance variable is not domain state; it is
26
+ # a test artifact ({ConfigurationService::Test::Response} or similar)
27
+ # that orchestration providers use to wrap responses from the configuration service.
27
28
  #
28
29
  class Orchestrator
29
30
 
30
31
  ##
31
- # Return a new orchestrator initialized with a new instance of +provider_class+.
32
32
  #
33
- # The provider is expected to use a consistent configuration +identifier+ for
34
- # all publishing and consuming operations.
33
+ # @param [Class] provider_class
34
+ # the test orchestration provider class, which should have a default/nullary constructor
35
35
  #
36
36
  def initialize(provider_class)
37
37
  @provider = provider_class.new
@@ -68,9 +68,9 @@ module ConfigurationService
68
68
  ##
69
69
  # Return a published configuration fixture
70
70
  #
71
- # E.g. as arranged by #given_existing_configuration.
71
+ # E.g. as arranged by {#given_existing_configuration}.
72
72
  #
73
- # TODO remove; step definitions expect this to be Comparable
73
+ # @todo replace with predicate: this exposes domain state
74
74
  #
75
75
  def existing_configuration
76
76
  @provider.existing_configuration
@@ -79,24 +79,25 @@ module ConfigurationService
79
79
  ##
80
80
  # Return the revision of a published configuration fixture
81
81
  #
82
- # E.g. as arranged by #given_existing_configuration.
82
+ # E.g. as arranged by {#given_existing_configuration}.
83
83
  #
84
- # TODO remove; step definitions expect this to be Comparable
84
+ # @todo replace with predicate: this exposes domain state
85
85
  #
86
86
  def existing_revision
87
87
  @provider.existing_revision
88
88
  end
89
89
 
90
90
  ##
91
- # Authorize the next consuming or publishing operation for +activity+
91
+ # Authorize the next publish or request activity
92
92
  #
93
- # Valid activities (as per ACTIVITY_ROLE_MAP in ConfigurationService::Test::OrchestrationProvider) are:
93
+ # @param [Symbol] activity
94
+ # Valid activities (as per {ConfigurationService::Test::OrchestrationProvider::ACTIVITY_ROLE_MAP}) are:
94
95
  #
95
- # * +:requesting_configurations+
96
- # * +:publishing_configurations+
97
- # * +:nothing+
96
+ # * +:requesting_configurations+
97
+ # * +:publishing_configurations+
98
+ # * +:nothing+
98
99
  #
99
- # Where possible, the orchestration provider should authorize +:nothing+
100
+ # Where possible, the test orchestration provider should authorize +:nothing+
100
101
  # by providing valid credentials that don't allow operations on the
101
102
  # configuration +identifier+ that it tests against.
102
103
  #
@@ -108,60 +109,69 @@ module ConfigurationService
108
109
  ##
109
110
  # Remove any previous authorization
110
111
  #
111
- # E.g. as arranged by #authorize.
112
+ # E.g. as arranged by {#authorize}.
112
113
  #
113
114
  def deauthorize
114
115
  @provider.deauthorize
115
116
  end
116
117
 
117
118
  ##
118
- # Perform a consuming operation against the service under test
119
+ # Request configuration from the service under test
119
120
  #
120
- # The provider is expected to wrap the response in a Response (or
121
- # simimlar) and return that.
121
+ # The test orchestration provider is expected to wrap the response in a {ConfigurationService::Test::Response}
122
+ # (or simimlar) and return that.
122
123
  #
123
124
  def request_configuration
124
125
  @response = @provider.request_configuration
125
126
  end
126
127
 
127
128
  ##
128
- # Perform a publishing operation against the service under test
129
+ # Publish configuration through the service under test
129
130
  #
130
- # The provider is expected to wrap the response in a Response (or
131
- # simimlar) and return that.
131
+ # The test orchestration provider is expected to wrap the response in a {ConfigurationService::Test::Response}
132
+ # (or simimlar) and return that.
132
133
  #
133
134
  def publish_configuration
134
135
  @response = @provider.publish_configuration
135
136
  end
136
137
 
137
138
  ##
138
- # True if the last consuming or publishing operation was allowed
139
+ # Whether the last publish or request was allowed
140
+ #
141
+ # @see ConfigurationService::Test::Response::Success#allowed?
142
+ # @see ConfigurationService::Test::Response::Failure#allowed?
139
143
  #
140
144
  def request_allowed?
141
145
  @response.allowed?
142
146
  end
143
147
 
144
148
  ##
145
- # True if the last consuming or publishing operation failed
149
+ # Whether the last publish or request was allowed but failed
146
150
  #
147
- # Operations that were not allowed (as per #request_allowed?) or
148
- # considered failed.
151
+ # @see ConfigurationService::Test::Response::Success#failed?
152
+ # @see ConfigurationService::Test::Response::Failure#failed?
149
153
  #
150
154
  def request_failed?
151
155
  @response.failed?
152
156
  end
153
157
 
154
158
  ##
155
- # True if the last consuming operation did not return data
159
+ # True if the last request not return configuration data
160
+ #
161
+ # @see ConfigurationService::Test::Response::Success#found?
162
+ # @see ConfigurationService::Test::Response::Failure#found?
156
163
  #
157
164
  def request_not_found?
158
165
  not @response.found?
159
166
  end
160
167
 
161
168
  ##
162
- # True if the last consuming operation did not return data
169
+ # True if the last request did consuming operation did not return data
163
170
  #
164
- # TODO: distinguish #request_not_matched? to mean "found data, but filtered out by metadata filter"
171
+ # @see ConfigurationService::Test::Response::Success#found?
172
+ # @see ConfigurationService::Test::Response::Failure#found?
173
+ #
174
+ # @todo distinguish {#request_not_matched?} to mean "found data, but filtered out by metadata filter"
165
175
  #
166
176
  def request_not_matched?
167
177
  not @response.found?
@@ -170,7 +180,9 @@ module ConfigurationService
170
180
  ##
171
181
  # The last published or consumed configuration data
172
182
  #
173
- # Note that this is the data itself, not a Configuration object.
183
+ # @return [Hash] configuration data (not a {ConfigurationService::Configuration} object)
184
+ #
185
+ # @todo replace with predicate: this exposes domain state
174
186
  #
175
187
  def published_configuration
176
188
  @response.data
@@ -178,7 +190,11 @@ module ConfigurationService
178
190
  alias :requested_configuration :published_configuration
179
191
 
180
192
  ##
181
- # The revision of the last published or consumed configuration
193
+ # The revision of the last published or consumed configuration metadata
194
+ #
195
+ # @return [String] metadata revision
196
+ #
197
+ # @todo replace with predicate: this exposes domain state
182
198
  #
183
199
  def published_revision
184
200
  @response.revision
@@ -187,6 +203,10 @@ module ConfigurationService
187
203
  ##
188
204
  # The last published metadata
189
205
  #
206
+ # @return [Hash] configuration metadata
207
+ #
208
+ # @todo replace with predicate: this exposes domain state
209
+ #
190
210
  def published_metadata
191
211
  @response.metadata
192
212
  end
@@ -211,7 +231,7 @@ module ConfigurationService
211
231
  # Environmental service configuration is configuration for bootstrapping
212
232
  # a configuration service and provider.
213
233
  #
214
- # TODO This method is imperative
234
+ # @todo replace with declarative test that delegates to orchestration provider
215
235
  #
216
236
  def given_environmental_service_configuration
217
237
  sp_env = @provider.service_provider_configuration.inject({}) do |m, (k, v)|
@@ -228,11 +248,10 @@ module ConfigurationService
228
248
  ##
229
249
  # Bootstrap a configuration service environmentally
230
250
  #
231
- # Environmental service configuration (as arranged by
232
- # #given_environmental_service_configuration) is given to an
233
- # EnvironmentContext factory to create a service configuration instance.
251
+ # Environmental service configuration (as arranged by {#given_environmental_service_configuration})
252
+ # is given to an {ConfigurationService::Factory::EnvironmentContext} factory to create a service configuration instance.
234
253
  #
235
- # TODO This method is imperative
254
+ # @todo replace with declarative test that delegates to orchestration provider
236
255
  #
237
256
  def bootstrap_configuration_service_environmentally
238
257
  factory = ConfigurationService::Factory::EnvironmentContext.new(@env, "CFGSRV")
@@ -242,7 +261,7 @@ module ConfigurationService
242
261
  ##
243
262
  # Tests that a bootstrapped configuration service is functional
244
263
  #
245
- # TODO This method is imperative
264
+ # @todo replace with declarative test that delegates to orchestration provider
246
265
  #
247
266
  def bootstrapped_configuration_service_functional?
248
267
  response = begin
@@ -256,7 +275,7 @@ module ConfigurationService
256
275
  ##
257
276
  # Tests that environmental service configuration is scrubbed
258
277
  #
259
- # TODO This method is imperative
278
+ # @todo replace with declarative test that delegates to orchestration provider
260
279
  #
261
280
  def environmental_service_configuration_scrubbed?
262
281
  !@env.include?("CFGSRV_TOKEN")
@@ -3,25 +3,38 @@ module ConfigurationService
3
3
  module Test
4
4
 
5
5
  ##
6
- # Builds an Orchestrator using a provider selected from the environment
6
+ # A factory for building a test orchestrator using an orchestration provider selected from the environment
7
+ #
8
+ # @example cucumber features/support/env.rb
9
+ # require 'configuration_service/test'
10
+ #
11
+ # Before do
12
+ # begin
13
+ # @test = ConfigurationService::Test::OrchestratorEnvironmentFactory.build
14
+ # rescue
15
+ # Cucumber.wants_to_quit = true
16
+ # raise
17
+ # end
18
+ # end
7
19
  #
8
20
  module OrchestratorEnvironmentFactory
9
21
 
10
22
  ##
11
- # Looks up the provider registered to the OrchestrationProviderRegistry
12
- # with the name provided in the +TEST_ORCHESTRATION_PROVIDER+ environment
13
- # variable, and returns a new Orchestrator initialized with that
14
- # provider.
23
+ # Build a test orchestrator
24
+ #
25
+ # Looks up the test orchestration provider class registered to the {ConfigurationService::Test::OrchestrationProviderRegistry}
26
+ # with the name provided in the +TEST_ORCHESTRATION_PROVIDER+ environment variable,
27
+ # and returns a new {ConfigurationService::Test::Orchestrator} initialized with an instance of that provider class.
15
28
  #
16
- # Returns a new Orchestrator, or raises a +RuntimeError+ if the
17
- # +TEST_ORCHESTRATION_PROVIDER+ environment variable does not name a
18
- # provider known to the OrchestrationProviderRegistry.
29
+ # @return [ConfigurationService::Test::Orchestrator] the test orchestrator
30
+ # @raise [RuntimeError] if the +TEST_ORCHESTRATION_PROVIDER+ environment variable
31
+ # does not name a provider known to the {ConfigurationService::Test::OrchestrationProviderRegistry}
19
32
  #
20
33
  def self.build
21
34
  identifier = ENV["TEST_ORCHESTRATION_PROVIDER"] or raise "missing environment variable: TEST_ORCHESTRATION_PROVIDER"
22
35
  registry = ConfigurationService::Test::OrchestrationProviderRegistry.instance
23
36
  provider = registry.lookup(identifier) or raise "unknown test orchestration provider: #{identifier}"
24
- @test = ConfigurationService::Test::Orchestrator.new(provider)
37
+ ConfigurationService::Test::Orchestrator.new(provider)
25
38
  end
26
39
 
27
40
  end
@@ -5,68 +5,81 @@ module ConfigurationService
5
5
  module Test
6
6
 
7
7
  ##
8
- # Encapsulation of ConfigurationService::Base responses
8
+ # Encapsulation of configuration service responses
9
9
  #
10
- # See Success and Failure.
10
+ # Used by test orchestration providers to decouple the test orchestrator from the semantics of API responses.
11
11
  #
12
12
  module Response
13
13
 
14
14
  ##
15
- # Encapsulates a non-error ConfigurationService::Base response
15
+ # Encapsulates a non-error configuration service response
16
16
  #
17
- # This allows an OrchestrationProvider to decouple the Orchestrator
18
- # from the implementation details of the service provider's responses.
17
+ # This allows an {ConfigurationService::Test::OrchestrationProvider}
18
+ # to decouple the {ConfigurationService::Test::Orchestrator} from the semantics of the configuration service's responses.
19
19
  #
20
20
  class Success
21
21
 
22
22
  ##
23
- # Initialize a new Success with a response
24
- #
25
- # The response should be a Configuration object or +nil+ (because
26
- # the ConfigurationService::Base API communicates +not found+ as
27
- # +nil+).
23
+ # @param [ConfigurationService::Configuration, nil] response
24
+ # a configuration service response, or +nil+ if a {ConfigurationService::ConfigurationNotFoundError} was raised
28
25
  #
29
26
  def initialize(response)
30
27
  @response = response
31
28
  end
32
29
 
33
30
  ##
34
- # Always true
31
+ # Whether the request was allowed
32
+ #
33
+ # @return [true] always
35
34
  #
36
35
  def allowed?
37
36
  true
38
37
  end
39
38
 
40
39
  ##
41
- # Always false
40
+ # Whether the request was authorized but failed
41
+ #
42
+ # @return [false] always
42
43
  #
43
44
  def failed?
44
45
  false
45
46
  end
46
47
 
47
48
  ##
48
- # True if the +response+ was not +nil+
49
+ # Whether the identified configuration was found
50
+ #
51
+ # @return [true] if the +response+ was not +nil+
52
+ # @return [false] if the +response+ was +nil+
49
53
  #
50
54
  def found?
51
55
  not @response.nil?
52
56
  end
53
57
 
54
58
  ##
55
- # The configuration data dictionary of the response, or +nil+ if not #found?
59
+ # The configuration data dictionary of the response
60
+ #
61
+ # @return [Hash] if {#found?}
62
+ # @return [nil] if not {#found?}
56
63
  #
57
64
  def data
58
65
  @response and @response.data
59
66
  end
60
67
 
61
68
  ##
62
- # The revision from the response's metadata, or +nil+ if not #found?
69
+ # The configuration metadata's revision
70
+ #
71
+ # @return [String] if {#found?}
72
+ # @return [nil] if not {#found?}
63
73
  #
64
74
  def revision
65
75
  @response and @response.metadata["revision"]
66
76
  end
67
77
 
68
78
  ##
69
- # The metadata dictionary of the response, or +nil+ if not #found?
79
+ # The configuration metadata
80
+ #
81
+ # @return [Hash] if {#found?}
82
+ # @return [nil] if not {#found?}
70
83
  #
71
84
  def metadata
72
85
  @response and @response.metadata
@@ -75,58 +88,73 @@ module ConfigurationService
75
88
  end
76
89
 
77
90
  ##
78
- # Encapsulates an error ConfigurationService::Base response
91
+ # Encapsulates a configuration service error
79
92
  #
80
- # This allows an OrchestrationProvider to decouple the Orchestrator
81
- # from the implementation details of the service provider's error
82
- # handling.
93
+ # This allows a {ConfigurationService::Test::OrchestrationProvider}
94
+ # to decouple the {ConfigurationService::Test::Orchestrator}
95
+ # from the semantics of the configuration service's error handling.
83
96
  #
84
97
  class Failure
85
98
 
86
99
  ##
87
- # Initialize a new Failure with an exception
100
+ # @param [ConfigurationService::Error] exception
101
+ # a configuration service error
88
102
  #
89
103
  def initialize(exception)
90
104
  @exception = exception
91
105
  end
92
106
 
93
107
  ##
94
- # True unless the exception was an AuthorizationError
108
+ # Whether the request was allowed
109
+ #
110
+ # @return [true] if the request was allowed
111
+ # @return [false] if the request was a not allowed
95
112
  #
96
113
  def allowed?
97
114
  !@exception.is_a?(ConfigurationService::AuthorizationError)
98
115
  end
99
116
 
100
117
  ##
101
- # True if the exception was an Error but not an AuthorizationError
118
+ # Whether the request was authorized but failed
119
+ #
120
+ # @return [true] if the request was allowed but raised a {ConfigurationService::Error}
121
+ # @return [false] if the request was not allowed or raised an unexpected error
102
122
  #
103
123
  def failed?
104
124
  allowed? and @exception.is_a?(ConfigurationService::Error)
105
125
  end
106
126
 
107
127
  ##
108
- # Always false
128
+ # Whether the identified configuration was found
129
+ #
130
+ # @return [false] always
109
131
  #
110
132
  def found?
111
133
  false
112
134
  end
113
135
 
114
136
  ##
115
- # Raises +NotImplementedError+
137
+ # The configuration data dictionary of the response
138
+ #
139
+ # @raise [NotImplementedError] always
116
140
  #
117
141
  def data
118
142
  raise NotImplementedError, "configuration not available after #{@exception.inspect}"
119
143
  end
120
144
 
121
145
  ##
122
- # Raises +NotImplementedError+
146
+ # The configuration metadata's revision
147
+ #
148
+ # @raise [NotImplementedError] always
123
149
  #
124
150
  def revision
125
151
  raise NotImplementedError, "revision not available after #{@exception.inspect}"
126
152
  end
127
153
 
128
154
  ##
129
- # Raises +NotImplementedError+
155
+ # The configuration metadata's revision
156
+ #
157
+ # @raise [NotImplementedError] always
130
158
  #
131
159
  def metadata
132
160
  raise NotImplementedError, "metadata not available after #{@exception.inspect}"
@@ -8,59 +8,67 @@ module ConfigurationService
8
8
  module Test
9
9
 
10
10
  ##
11
- # Test Orchestrator provider for testing the Stub service provider
11
+ # Test orchestration provider for testing the {ConfigurationService::Provider::Stub} service provider
12
12
  #
13
- # Registered to the OrchestrationProviderRegistry as +stub+.
13
+ # Registered to the {ConfigurationService::Test::OrchestrationProviderRegistry} as "stub".
14
14
  #
15
15
  class StubOrchestrationProvider < OrchestrationProvider
16
16
 
17
+ ##
18
+ # The registered identifier of the service provider under test
19
+ #
20
+ # @see ConfigurationService::Test::OrchestrationProvider#service_provider_id
21
+ #
17
22
  def service_provider_id
18
23
  "stub"
19
24
  end
20
25
 
21
26
  ##
22
- # Return configuration for a Stub
27
+ # The configuration for the service provider under test
23
28
  #
24
- def service_provider_configuration # :doc:
29
+ # @see ConfigurationService::Test::OrchestrationProvider#service_provider_configuration
30
+ #
31
+ def service_provider_configuration
25
32
  {name: "Stub configuration service provider"}
26
33
  end
27
34
 
28
- private
29
-
30
- ##
31
- # Returns a new Stub
32
- #
33
- def service_provider # :doc:
34
- ConfigurationService::Provider::Stub.new(service_provider_configuration)
35
- end
35
+ ##
36
+ # The service provider under test
37
+ #
38
+ # @see ConfigurationService::Test::OrchestrationProvider#service_provider
39
+ #
40
+ def service_provider
41
+ ConfigurationService::Provider::Stub.new(service_provider_configuration)
42
+ end
36
43
 
37
- ##
38
- # Returns a new Broken
39
- #
40
- def broken_service_provider # :doc:
41
- ConfigurationService::Provider::Broken.new
42
- end
44
+ ##
45
+ # A broken service provider
46
+ #
47
+ # @see ConfigurationService::Test::OrchestrationProvider#broken_service_provider
48
+ #
49
+ def broken_service_provider
50
+ ConfigurationService::Provider::Broken.new
51
+ end
43
52
 
44
- ##
45
- # Returns a token for +role+
46
- #
47
- # The token is taken from +BUILTIN_TOKENS+ in Stub
48
- #
49
- def token_for(role) # :doc:
50
- ConfigurationService::Provider::Stub::BUILTIN_TOKENS[role]
51
- end
53
+ ##
54
+ # Provide a token that authorizes a role
55
+ #
56
+ # The token is taken from {ConfigurationService::Provider::Stub::BUILTIN_TOKENS}
57
+ #
58
+ # @see ConfigurationService::Test::OrchestrationProvider#token_for
59
+ #
60
+ def token_for(role)
61
+ ConfigurationService::Provider::Stub::BUILTIN_TOKENS[role]
62
+ end
52
63
 
53
- ##
54
- # Delete configuration from the StubStore
55
- #
56
- # The consistently used configuration +identifier+ is used to identify
57
- # the configuration to be deleted.
58
- #
59
- # Deleting non-existent configuration is not an error.
60
- #
61
- def delete_configuration # :doc:
62
- ConfigurationService::Provider::StubStore.instance.delete(@identifier)
63
- end
64
+ ##
65
+ # Delete configuration data
66
+ #
67
+ # @see ConfigurationService::Test::OrchestrationProvider#delete_configuration
68
+ #
69
+ def delete_configuration
70
+ ConfigurationService::Provider::StubStore.instance.delete(@identifier)
71
+ end
64
72
 
65
73
  end
66
74
 
@@ -8,15 +8,16 @@ module ConfigurationService
8
8
  # The following are used directly by the cucumber test suite, and
9
9
  # should not be of immediate interest to implementors:
10
10
  #
11
- # * Orchestrator
12
- # * OrchestratorEnvironmentFactory
13
- # * StubOrchestrationProvider
11
+ # * {ConfigurationService::Test::Orchestrator} the declarative test orchestration API
12
+ # * {ConfigurationService::Test::OrchestratorEnvironmentFactory} test orchestrator factory
13
+ # * {ConfigurationService::Test::StubOrchestrationProvider} imperative test orchestration provider
14
+ # for the {ConfigurationService::Provider::Stub Stub} configuration service provider
14
15
  #
15
16
  # The following are of interest to implementors:
16
17
  #
17
- # * OrchestrationProviderRegistry
18
- # * Response
19
- # * OrchestrationProvider
18
+ # * {ConfigurationService::Test::OrchestrationProviderRegistry} registry of imperative test orchestration providers
19
+ # * {ConfigurationService::Test::Response} configuration service response wrappers
20
+ # * {ConfigurationService::Test::OrchestrationProvider} abstract imperative test orchestration provider
20
21
  #
21
22
  module Test
22
23
 
@@ -1,5 +1,5 @@
1
1
  module ConfigurationService
2
2
 
3
- VERSION = "2.0.4"
3
+ VERSION = "2.0.5"
4
4
 
5
5
  end
@@ -6,14 +6,14 @@ require "configuration_service/provider_registry"
6
6
  require "configuration_service/version"
7
7
 
8
8
  ##
9
- # See ConfigurationService::Base.
9
+ # See {ConfigurationService::Base}.
10
10
  #
11
11
  module ConfigurationService
12
12
 
13
13
  ##
14
- # Creates a new ConfigurationService::Base for the +provider+
14
+ # Creates a new {ConfigurationService::Base}
15
15
  #
16
- # See Base.new.
16
+ # @see ConfigurationService::Base#initialize
17
17
  #
18
18
  def self.new(identifier, token, provider)
19
19
  ConfigurationService::Base.new(identifier, token, provider)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configuration_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sheldon Hearn
@@ -91,8 +91,8 @@ files:
91
91
  - .gitignore
92
92
  - .rspec
93
93
  - .travis.yml
94
+ - .yardopts
94
95
  - Gemfile
95
- - README.md
96
96
  - README.rdoc
97
97
  - Rakefile
98
98
  - features/authorization.feature
@@ -148,3 +148,4 @@ signing_key:
148
148
  specification_version: 4
149
149
  summary: Configuration service
150
150
  test_files: []
151
+ has_rdoc: