secret_config 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 47df861628f00f577131640a7d0be5ba01684714e1705b9e322458d662f89eb6
4
- data.tar.gz: 0fc3d93a9a56e2796deb3db4bc5876e4b388592ce7e2afc22aa18bf4753908cf
3
+ metadata.gz: 12a8839c538b55ac74ff2db06cf2f25e1f711d005fd31f55f1308389c5224875
4
+ data.tar.gz: 630667a4ff3ad4bf2a8e61786454fc2375c575235ea78aabac5743575f00a966
5
5
  SHA512:
6
- metadata.gz: '08d5f6570918343c09031e25563ac03766225fab11ab552dc394faede32bde0c460528d7783a86920bcdd131fddc490f7dbbd9485def2e0d7beb8f0c6d53563f'
7
- data.tar.gz: e8b67724ac73e0ab8a9fcc235b514d74ba3a5c70481a7355cbddafbf97d5a5f416895c528183a95a038d71797c9ef0eb10c75dd76613ca3184eeb41c67edb4f1
6
+ metadata.gz: 43b4fe728607bb924254839bc437d2a3615b532725d6a95d78be8adb44e6edb637ca8ff7f2011f031344163b7d7f838e976dde432c37bff3aec0ce6ca7fe8ff2
7
+ data.tar.gz: 7b5e7496f1e3a78766903ab4a5cbb319c4bfb411b2d61b09c15d65720cf0f80ce68fd95146e87c68779c43f9ba468b0af3a8dae0312dfc94e57a6c1f2598e067
data/README.md CHANGED
@@ -99,6 +99,7 @@ The following types are supported:
99
99
  `:string`
100
100
  `:boolean`
101
101
  `:symbol`
102
+ `:json`
102
103
 
103
104
  ~~~ruby
104
105
  # Without type conversion:
@@ -30,6 +30,7 @@ module SecretConfig
30
30
  def_delegator :registry, :key?
31
31
  def_delegator :registry, :fetch
32
32
  def_delegator :registry, :set
33
+ def_delegator :registry, :delete
33
34
  def_delegator :registry, :refresh!
34
35
  end
35
36
 
@@ -11,6 +11,7 @@ module SecretConfig
11
11
  attr_reader :path, :region, :provider,
12
12
  :export, :no_filter,
13
13
  :import, :key_id, :key_alias, :random_size, :prune, :overwrite,
14
+ :diff_path, :import_path,
14
15
  :fetch_key, :delete_key, :set_key, :set_value, :delete_path,
15
16
  :copy_path, :diff,
16
17
  :console,
@@ -43,6 +44,8 @@ module SecretConfig
43
44
  @fetch_key = nil
44
45
  @delete_key = nil
45
46
  @delete_path = nil
47
+ @diff_path = nil
48
+ @import_path = nil
46
49
 
47
50
  if argv.empty?
48
51
  puts parser
@@ -58,15 +61,15 @@ module SecretConfig
58
61
  elsif console
59
62
  run_console
60
63
  elsif export
61
- run_export(export, filtered: !no_filter)
62
- elsif import && prune
63
- run_import_and_prune(import)
64
+ run_export(export, path, filtered: !no_filter)
64
65
  elsif import
65
- run_import(import)
66
- elsif copy_path
67
- run_copy(copy_path, path)
66
+ run_import(import, path, prune)
67
+ elsif import_path
68
+ run_import_path(import_path, path, prune)
68
69
  elsif diff
69
- run_diff(diff)
70
+ run_diff(diff, path)
71
+ elsif diff_path
72
+ run_diff_path(diff, path)
70
73
  elsif set_key
71
74
  run_set(set_key, set_value)
72
75
  elsif fetch_key
@@ -90,22 +93,26 @@ module SecretConfig
90
93
  secret_config [options]
91
94
  BANNER
92
95
 
93
- opts.on "-e", "--export [FILE_NAME]", "Export configuration to a file or stdout if no file_name supplied." do |file_name|
96
+ opts.on "-e", "--export [FILE_NAME]", "Export configuration to a file or stdout if no file_name supplied. --path SOURCE_PATH is required." do |file_name|
94
97
  @export = file_name || STDOUT
95
98
  end
96
99
 
97
- opts.on "-i", "--import [FILE_NAME]", "Import configuration from a file or stdin if no file_name supplied." do |file_name|
100
+ opts.on "-i", "--import [FILE_NAME]", "Import configuration from a file or stdin if no file_name supplied. --path TARGET_PATH is required." do |file_name|
98
101
  @import = file_name || STDIN
99
102
  end
100
103
 
101
- opts.on "--copy SOURCE_PATH", "Import configuration from a file or stdin if no file_name supplied." do |path|
102
- @copy_path = path
104
+ opts.on "--import-path SOURCE_PATH", "Import configuration from the configuration on another path. --path TARGET_PATH is required." do |path|
105
+ @import_path = path
103
106
  end
104
107
 
105
- opts.on "--diff [FILE_NAME]", "Compare configuration from a file or stdin if no file_name supplied." do |file_name|
108
+ opts.on "--diff [FILE_NAME]", "Compare configuration from a file or stdin if no file_name supplied. --path TARGET_PATH is required." do |file_name|
106
109
  @diff = file_name
107
110
  end
108
111
 
112
+ opts.on "--diff-path SOURCE_PATH", "Diff configuration with the configuration on another path. --path TARGET_PATH is required." do |path|
113
+ @diff_path = path
114
+ end
115
+
109
116
  opts.on "-s", "--set KEY=VALUE", "Set one key to value. Example: --set mysql/database=localhost" do |param|
110
117
  @set_key, @set_value = param.split("=")
111
118
  unless @set_key && @set_value
@@ -129,7 +136,7 @@ module SecretConfig
129
136
  @console = true
130
137
  end
131
138
 
132
- opts.on "-p", "--path PATH", "Path to import from / export to." do |path|
139
+ opts.on "-p", "--path PATH", "Path in central configuration to use." do |path|
133
140
  @path = path
134
141
  end
135
142
 
@@ -141,7 +148,7 @@ module SecretConfig
141
148
  @no_filter = true
142
149
  end
143
150
 
144
- opts.on "--prune", "During import delete all existing keys for which there is no key in the import file." do
151
+ opts.on "--prune", "During import delete all existing keys for which there is no key in the import file. Only applies to --import and --import-path." do
145
152
  @prune = true
146
153
  end
147
154
 
@@ -185,71 +192,57 @@ module SecretConfig
185
192
  end
186
193
  end
187
194
 
188
- def run_export(file_name, filtered: true)
195
+ def run_export(file_name, path, filtered: true)
196
+ raise(ArgumentError, "Missing required option --path") unless path
197
+
189
198
  config = fetch_config(path, filtered: filtered)
190
199
  write_config_file(file_name, config)
191
200
 
192
201
  puts("Exported #{path} from #{provider} to #{file_name}") if file_name.is_a?(String)
193
202
  end
194
203
 
195
- def run_import(file_name)
196
- config = read_config_file(file_name)
204
+ def run_import(file_name, path, prune = false)
205
+ raise(ArgumentError, "Missing required option --path") unless path
197
206
 
198
- set_config(config, path, current_values)
207
+ config = read_config_file(file_name)
208
+ import_config(config, path, prune)
199
209
 
200
- puts("Imported #{file_name} to #{provider} at #{path}") if file_name.is_a?(String)
210
+ puts("Imported #{file_name} to #{path} on provider: #{provider}") if file_name.is_a?(String)
201
211
  end
202
212
 
203
- def run_import_and_prune(file_name)
204
- config = read_config_file(file_name)
205
- delete_keys = current_values.keys - Utils.flatten(config, path).keys
213
+ def run_import_path(source_path, path, prune = false)
214
+ raise(ArgumentError, "Missing required option --path") unless path
206
215
 
207
- unless delete_keys.empty?
208
- puts "Going to delete the following keys:"
209
- delete_keys.each { |key| puts " #{key}" }
210
- sleep(5)
211
- end
212
-
213
- set_config(config, path, current_values)
214
-
215
- delete_keys.each do |key|
216
- puts "Deleting: #{key}"
217
- provider_instance.delete(key)
218
- end
219
-
220
- puts("Imported #{file_name} to #{provider} at #{path}") if file_name.is_a?(String)
221
- end
222
-
223
- def run_copy(source_path, target_path)
224
216
  config = fetch_config(source_path, filtered: false)
217
+ import_config(config, path, prune)
225
218
 
226
- set_config(config, target_path, current_values)
227
-
228
- puts "Copied #{source_path} to #{target_path} using #{provider}"
219
+ puts("Imported #{source_path} to #{path} on provider: #{provider}")
229
220
  end
230
221
 
231
- def run_diff(file_name)
222
+ def run_diff(file_name, path)
223
+ raise(ArgumentError, "Missing required option --path") unless path
224
+
232
225
  file_config = read_config_file(file_name)
233
226
  file = Utils.flatten(file_config, path)
234
227
 
235
228
  registry_config = fetch_config(path, filtered: false)
236
229
  registry = Utils.flatten(registry_config, path)
237
230
 
238
- (file.keys + registry.keys).sort.uniq.each do |key|
239
- if registry.key?(key)
240
- if file.key?(key)
241
- value = file[key].to_s
242
- # Ignore filtered values
243
- puts "* #{key}: #{registry[key]} => #{file[key]}" if (value != registry[key].to_s) && (value != FILTERED)
244
- else
245
- puts "- #{key}"
246
- end
247
- elsif file.key?(key)
248
- puts "+ #{key}: #{file[key]}"
249
- end
250
- end
231
+ puts("Comparing #{file_name} to #{path} on provider: #{provider}") if file_name.is_a?(String)
232
+ diff_config(file, registry)
233
+ end
234
+
235
+ def run_diff_path(source_path, path)
236
+ raise(ArgumentError, "Missing required option --path") unless path
237
+
238
+ source_config = fetch_config(source_path, filtered: false)
239
+ source = Utils.flatten(source_config, path)
240
+
241
+ target_config = fetch_config(path, filtered: false)
242
+ target = Utils.flatten(target_config, path)
251
243
 
252
- puts("Compared #{file_name} to #{provider} at #{path}") if file_name.is_a?(String)
244
+ puts("Comparing #{source_path} to #{path} on provider: #{provider}")
245
+ diff_config(source, target)
253
246
  end
254
247
 
255
248
  def run_console
@@ -309,6 +302,42 @@ module SecretConfig
309
302
  sort_hash_by_key!(config)
310
303
  end
311
304
 
305
+ # Diffs two configs and displays the results
306
+ def diff_config(source, target)
307
+ (source.keys + target.keys).sort.uniq.each do |key|
308
+ if target.key?(key)
309
+ if source.key?(key)
310
+ value = source[key].to_s
311
+ # Ignore filtered values
312
+ puts "* #{key}: #{target[key]} => #{source[key]}" if (value != target[key].to_s) && (value != FILTERED)
313
+ else
314
+ puts "- #{key}"
315
+ end
316
+ elsif source.key?(key)
317
+ puts "+ #{key}: #{source[key]}"
318
+ end
319
+ end
320
+ end
321
+
322
+ def import_config(config, path, prune = false)
323
+ raise(ArgumentError, "Missing required option --path") unless path
324
+
325
+ delete_keys = prune ? current_values.keys - Utils.flatten(config, path).keys : []
326
+
327
+ unless delete_keys.empty?
328
+ puts "Going to delete the following keys:"
329
+ delete_keys.each { |key| puts " #{key}" }
330
+ sleep(5)
331
+ end
332
+
333
+ set_config(config, path, current_values)
334
+
335
+ delete_keys.each do |key|
336
+ puts "Deleting: #{key}"
337
+ provider_instance.delete(key)
338
+ end
339
+ end
340
+
312
341
  def read_file(file_name_or_io)
313
342
  return file_name_or_io.read unless file_name_or_io.is_a?(String)
314
343
 
@@ -41,10 +41,10 @@ module SecretConfig
41
41
  end
42
42
 
43
43
  # Returns [String] configuration value for the supplied key
44
- def fetch(key, default: nil, type: :string, encoding: nil)
44
+ def fetch(key, default: :no_default_supplied, type: :string, encoding: nil)
45
45
  value = self[key]
46
46
  if value.nil?
47
- raise(MissingMandatoryKey, "Missing configuration value for #{path}/#{key}") if default.nil?
47
+ raise(MissingMandatoryKey, "Missing configuration value for #{path}/#{key}") if default == :no_default_supplied
48
48
 
49
49
  value = default.respond_to?(:call) ? default.call : default
50
50
  end
@@ -138,6 +138,10 @@ module SecretConfig
138
138
  %w[true 1 t].include?(value.to_s.downcase)
139
139
  when :symbol
140
140
  value.to_sym unless value.nil? || value.to_s.strip == ""
141
+ when :json
142
+ value.nil? ? nil : JSON.parse(value)
143
+ else
144
+ raise(ArgumentError, "Unrecognized type:#{type}")
141
145
  end
142
146
  end
143
147
 
@@ -1,3 +1,3 @@
1
1
  module SecretConfig
2
- VERSION = "0.6.1".freeze
2
+ VERSION = "0.6.2".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: secret_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-14 00:00:00.000000000 Z
11
+ date: 2019-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby