configuration_service 4.1.1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 799ae54df3cac75e5657db7dff7dbc102049524a
4
- data.tar.gz: f1ca9d20a5cd027417b7775787b316680e7674c1
3
+ metadata.gz: a08e439b4b3ae82204b37d1220da1ad995d05724
4
+ data.tar.gz: d6cf937e29cf6f2d521eeecaf1b20a3096ebeafd
5
5
  SHA512:
6
- metadata.gz: 9d9d8bda7a9a32f5bad1af44cd56bfa5385d77ddf1d9c35a879ef9fd7e7bc73edad3aa692b8c22cc3eaaa8a2ceb0a1417fc32bbfaac6dee6069923146edec48b
7
- data.tar.gz: dcb67bfcd33459015d05b7f257b56ecf53add9f23de621b97f61c36500497513ac035b317946307e2b613c209b70483d2fc03ad2a097a3a30e35ff81c26b2209
6
+ metadata.gz: f330c463b9dd838d0f9702e29853df543070cb7b2f737274d2388d11371dc6de9f9d5233681b07118c8e5621f71b88676a2773b0f1ceb8c7c32838b24c9ebc9e
7
+ data.tar.gz: a73776f84e1b156bafbd6129b27eb8c10f29c8ec3bdeb39939a0ab71c2b1334f19fcf5493b748d4fd50066a7a8fe4a2ba936ba0d38ed0de2abc8a65f3ceb589e
@@ -1,5 +1,6 @@
1
1
  require 'configuration_service/configuration'
2
2
  require 'configuration_service/decorator_registry'
3
+ require 'configuration_service/errors'
3
4
  require 'delegate'
4
5
 
5
6
  module ConfigurationService
@@ -71,6 +72,12 @@ module ConfigurationService
71
72
  #
72
73
  class ReferenceResolver < SimpleDelegator
73
74
 
75
+ ##
76
+ #
77
+ # Configuration with a referenced identifier was not found
78
+ #
79
+ class MissingReferenceError < ConfigurationService::ConfigurationNotFoundError; end
80
+
74
81
  ##
75
82
  # The regular expression used to match configuration identifier references
76
83
  #
@@ -115,7 +122,7 @@ module ConfigurationService
115
122
  #
116
123
  def authorize_consumption(identifier, credentials)
117
124
  configuration = @provider.request_configuration(identifier, credentials)
118
- identifiers = ReferenceResolver.find_configuration_identifiers(configuration.data)
125
+ identifiers = find_configuration_identifiers(configuration.data)
119
126
  identifiers.unshift(identifier)
120
127
  @provider.authorize_consumption(identifiers, credentials)
121
128
  end
@@ -126,24 +133,56 @@ module ConfigurationService
126
133
  # @param [Hash] configuration_data
127
134
  # the data dictionary whose String values to search for configuration identifier references
128
135
  # @return [Array] list of referenced configuration identifiers found
129
- ##
130
- def self.find_configuration_identifiers(configuration_data)
131
- configuration_data.values.select { |value|
132
- value.is_a? String
133
- }.map { |value|
134
- match = value.match(PATTERN)
135
- match[1] if not match.nil?
136
- }.compact
137
- end
136
+ #
137
+ def find_configuration_identifiers(configuration_data)
138
+ enumerate_references(configuration_data).map { |_, _, reference| reference }
139
+ end
138
140
 
141
+ ##
142
+ # Provide resolved configuration data
143
+ #
144
+ # @param [Hash] configuration_data
145
+ # the data dictionary whose configuration identifier references to resolve
146
+ #
147
+ # @return [Hash] a deep copy of +configuration_data+ in which references have been replaced
148
+ # with the configuration data they reference.
149
+ #
139
150
  def resolve_configuration_data(configuration_data, credentials)
140
- configuration_data.each { |key, value|
141
- next if not value.is_a? String
142
- match = value.match(PATTERN)
143
- if not match.nil?
144
- configuration_data[key] = @provider.request_configuration(match[1], credentials).data
151
+ deep_copy(configuration_data).tap do |resolved_data|
152
+ enumerate_references(resolved_data).each do |c, k, reference|
153
+ if resolved = @provider.request_configuration(reference, credentials)
154
+ c[k] = resolved.data
155
+ else
156
+ raise MissingReferenceError.new("unresolved reference %{#{reference}}")
157
+ end
145
158
  end
146
- }
159
+ end
160
+ end
161
+
162
+ ##
163
+ # Enumerate all references in a configuration data dictionary
164
+ #
165
+ # @param [Hash] configuration_data
166
+ # the data dictionary to walk
167
+ #
168
+ # @return [Enumerator] an enumerator over all (possibly nested) references.
169
+ # The enumerator yields an array of the (sub)dictionary in which the reference
170
+ # was found, the key that mapped to the reference, and the reference.
171
+ #
172
+ def enumerate_references(configuration_data)
173
+ Enumerator.new do |enum|
174
+ configuration_data.each do |key, value|
175
+ if value.is_a?(Hash)
176
+ enumerate_references(value).each { |m| enum << m }
177
+ elsif value.to_s =~ PATTERN
178
+ enum << [configuration_data, key, $1]
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ def deep_copy(h)
185
+ Marshal.load(Marshal.dump(h))
147
186
  end
148
187
 
149
188
  end
@@ -64,6 +64,13 @@ unless defined?(ConfigurationService::Provider::StubStore)
64
64
  nil
65
65
  end
66
66
 
67
+ ##
68
+ # Delete all configuration data and metadata
69
+ #
70
+ def clear
71
+ @configurations.clear
72
+ end
73
+
67
74
  # @private
68
75
  def initialize
69
76
  @configurations = {}
@@ -1,5 +1,5 @@
1
1
  module ConfigurationService
2
2
 
3
- VERSION = "4.1.1"
3
+ VERSION = "4.2.0"
4
4
 
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configuration_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.1
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sheldon Hearn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-10-13 00:00:00.000000000 Z
11
+ date: 2017-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -160,3 +160,4 @@ signing_key:
160
160
  specification_version: 4
161
161
  summary: Configuration service
162
162
  test_files: []
163
+ has_rdoc: