cliutils 1.2.4 → 1.2.5
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 +4 -4
- data/HISTORY.md +4 -0
- data/README.md +39 -5
- data/lib/cliutils/configuration.rb +1 -1
- data/lib/cliutils/configurator.rb +51 -0
- data/lib/cliutils/constants.rb +1 -1
- data/lib/cliutils/ext/hash_extensions.rb +27 -0
- data/lib/cliutils/prefs/pref_validation.rb +2 -0
- data/lib/cliutils/prefs.rb +1 -1
- data/test/configurator_test.rb +12 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00fd89b1aa359ab732d3a436b51aa26d515f0ef3
|
4
|
+
data.tar.gz: 1aa1aa258ca1a09fe55e8fdf9c2d336e54b8ba9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 607089b0e6bce175030d6304b411c4e58947c3573653b90f55247d54a6f6353c2896946fa99fe844cb8e87afd8aecc00e540c392d50b5a17df5c72a34ea10544
|
7
|
+
data.tar.gz: e763d764171825dc2391413c7f7a822ccfbe8af1ef219401539aa6313bc70c3a321667640163386b281f6d3e04e829425ca227b73267fbb4511fabd2d053ceb7
|
data/HISTORY.md
CHANGED
data/README.md
CHANGED
@@ -220,14 +220,14 @@ include CLIUtils::Configuration
|
|
220
220
|
### Loading a Configuration File
|
221
221
|
|
222
222
|
```Ruby
|
223
|
-
|
223
|
+
load_configuration('~/.my-app-config')
|
224
224
|
```
|
225
225
|
|
226
|
-
If there's data in there, it will be consumed into `
|
226
|
+
If there's data in there, it will be consumed into the `configurator`'s `data` property.
|
227
227
|
|
228
228
|
### Adding/Removing Sections
|
229
229
|
|
230
|
-
Sections are top levels of the configuration file and are managed via the `
|
230
|
+
Sections are top levels of the configuration file and are managed via the `configurator` object:
|
231
231
|
|
232
232
|
```Ruby
|
233
233
|
configuration.add_section(:user_data)
|
@@ -237,7 +237,7 @@ configuration.delete_section(:program_data)
|
|
237
237
|
|
238
238
|
### Adding Data to Sections
|
239
239
|
|
240
|
-
There are two ways data can be managed in `
|
240
|
+
There are two ways data can be managed in `configurator`: via its `@data` property or via some magic methods; your call:
|
241
241
|
|
242
242
|
```Ruby
|
243
243
|
configuration.data[:user_data].merge!(username: 'bob')
|
@@ -261,6 +261,33 @@ user_data:
|
|
261
261
|
username: bob
|
262
262
|
```
|
263
263
|
|
264
|
+
### Checking Configuration Versions
|
265
|
+
|
266
|
+
Often, you'll want to check the user's current version of your app against the last version that required some sort of configuration change. `configurator` allows for this via its `compare_version` method:
|
267
|
+
|
268
|
+
```Ruby
|
269
|
+
# Tell your configurator the name of the key that
|
270
|
+
# stores the app's version in its configuration file.
|
271
|
+
configuration.cur_version_key = :APP_VERSION
|
272
|
+
|
273
|
+
# Tell your configurator the name of the key that
|
274
|
+
# stores the last version that needed a configuration
|
275
|
+
# change.
|
276
|
+
configuration.last_version_key = :NEWEST_CONFIG_VERSION
|
277
|
+
|
278
|
+
# Run the check and use a block to get
|
279
|
+
# the current and "last-needing-changes"
|
280
|
+
# versions (and do something about it).
|
281
|
+
configuration.compare_version do |c, l|
|
282
|
+
if c < l
|
283
|
+
puts "You need to update your app; here's how:"
|
284
|
+
# ...do stuff...
|
285
|
+
else
|
286
|
+
puts "No need to update your app's config file!"
|
287
|
+
end
|
288
|
+
end
|
289
|
+
```
|
290
|
+
|
264
291
|
## Prefs
|
265
292
|
|
266
293
|
Many times, CLI apps need to ask their users some questions, collect the feedback, validate it, and store it. CLIUtils makes this a breeze via the `Prefs` class.
|
@@ -419,7 +446,7 @@ prompts:
|
|
419
446
|
- local_filepath
|
420
447
|
```
|
421
448
|
|
422
|
-
|
449
|
+
The `local_filepath` behavior will expand the user's answer as a filepath (e.g., `~/.ssh` will get saved as `/Users/bachya/.ssh/`).
|
423
450
|
|
424
451
|
`Prefs` currently supports these behaviors:
|
425
452
|
|
@@ -430,7 +457,11 @@ This will expand the user's answer as a filepath (e.g., `~/.ssh` will get saved
|
|
430
457
|
Once the user has answered all the preference prompts, you can fold those answers back into a Configurator using the `ingest` method:
|
431
458
|
|
432
459
|
```Ruby
|
460
|
+
# Ingest the Prefs answers into our
|
461
|
+
# Configurator.
|
433
462
|
configuration.ingest_prefs(prefs)
|
463
|
+
|
464
|
+
# Save it to the filesystem.
|
434
465
|
configuration.save
|
435
466
|
```
|
436
467
|
|
@@ -439,6 +470,9 @@ configuration.save
|
|
439
470
|
Note that you can also initialize a `Prefs` object with a Configurator:
|
440
471
|
|
441
472
|
```Ruby
|
473
|
+
# Scans my_configurator for values to the
|
474
|
+
# questions posed by prefs; if found, use
|
475
|
+
# them as defaults.
|
442
476
|
prefs = CLIUtils::Prefs.new('path/to/yaml/file', my_configurator)
|
443
477
|
```
|
444
478
|
|
@@ -5,6 +5,17 @@ module CLIUtils
|
|
5
5
|
# Manages any configuration values and the flat YAML file
|
6
6
|
# into which they get stored.
|
7
7
|
class Configurator
|
8
|
+
# Stores the Configurator key that refers
|
9
|
+
# to the current configuration version.
|
10
|
+
# @return [Symbol]
|
11
|
+
attr_accessor :cur_version_key
|
12
|
+
|
13
|
+
# Stores the Configurator key that refers
|
14
|
+
# to the value at which the app last changed
|
15
|
+
# config versions.
|
16
|
+
# @return [Symbol]
|
17
|
+
attr_accessor :last_version_key
|
18
|
+
|
8
19
|
# Stores the path to the configuration file.
|
9
20
|
# @return [String]
|
10
21
|
attr_reader :config_path
|
@@ -13,6 +24,11 @@ module CLIUtils
|
|
13
24
|
# @return [Hash]
|
14
25
|
attr_reader :data
|
15
26
|
|
27
|
+
# Stores the section that contains the version
|
28
|
+
# keys.
|
29
|
+
# @return [Symbol]
|
30
|
+
attr_accessor :version_section
|
31
|
+
|
16
32
|
# Initializes configuration from a flat file.
|
17
33
|
# @param [String] path The filepath to the config YAML
|
18
34
|
# @return [void]
|
@@ -39,6 +55,41 @@ module CLIUtils
|
|
39
55
|
end
|
40
56
|
end
|
41
57
|
|
58
|
+
# Checks to see whether the passed key (and a
|
59
|
+
# non-nil value) exist in the @data Hash.
|
60
|
+
# @param [Symbol] key The key to search for
|
61
|
+
# @return [Boolean]
|
62
|
+
def check_key_and_value(key)
|
63
|
+
!@data.recursive_find_by_key(key).nil? &&
|
64
|
+
!@data.recursive_find_by_key(key).empty?
|
65
|
+
end
|
66
|
+
|
67
|
+
# Compares the current version (if it exists) to
|
68
|
+
# the last version that needed a configuration
|
69
|
+
# change (if it exists). Assuming they exist and
|
70
|
+
# that the current version is behind the "last-config"
|
71
|
+
# version, execute a passed block.
|
72
|
+
# @return [void]
|
73
|
+
def compare_version
|
74
|
+
unless check_key_and_value(@cur_version_key)
|
75
|
+
fail 'Cannot check version; no current version found'
|
76
|
+
end
|
77
|
+
|
78
|
+
unless check_key_and_value(@last_version_key)
|
79
|
+
fail 'Cannot check version; no previous version found'
|
80
|
+
end
|
81
|
+
|
82
|
+
c_version = @data.recursive_find_by_key(@cur_version_key)
|
83
|
+
c_version_gem = Gem::Version.new(c_version)
|
84
|
+
|
85
|
+
l_version = @data.recursive_find_by_key(@last_version_key)
|
86
|
+
l_version_gem = Gem::Version.new(l_version)
|
87
|
+
|
88
|
+
if c_version_gem < l_version_gem
|
89
|
+
yield c_version, l_version
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
42
93
|
# Removes a section to the config file (if it exists).
|
43
94
|
# @param [String] section_name The section to remove
|
44
95
|
# @return [void]
|
data/lib/cliutils/constants.rb
CHANGED
@@ -62,6 +62,33 @@ class Hash
|
|
62
62
|
_deep_transform_keys_in_object!(self, &block)
|
63
63
|
end
|
64
64
|
|
65
|
+
# Recursively searches a hash for the passed
|
66
|
+
# key and returns the value (if there is one).
|
67
|
+
# http://stackoverflow.com/a/2239847/327179
|
68
|
+
# @param [<Symbol, String>] key The key to search for
|
69
|
+
# @return [Multiple]
|
70
|
+
def recursive_find_by_key(key)
|
71
|
+
# Create a stack of hashes to search through for the needle which
|
72
|
+
# is initially this hash
|
73
|
+
stack = [ self ]
|
74
|
+
|
75
|
+
# So long as there are more haystacks to search...
|
76
|
+
while (to_search = stack.pop)
|
77
|
+
# ...keep searching for this particular key...
|
78
|
+
to_search.each do |k, v|
|
79
|
+
# ...and return the corresponding value if it is found.
|
80
|
+
return v if (k == key)
|
81
|
+
|
82
|
+
# If this value can be recursively searched...
|
83
|
+
if (v.respond_to?(:recursive_find_by_key))
|
84
|
+
# ...push that on to the list of places to search.
|
85
|
+
stack << v
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
yield if block_given?
|
90
|
+
end
|
91
|
+
|
65
92
|
private
|
66
93
|
|
67
94
|
# Modification to deep_transform_keys that allows for
|
@@ -4,6 +4,8 @@ module CLIUtils
|
|
4
4
|
# PrefValidation Module
|
5
5
|
# Validation rules that can be applied to a Pref.
|
6
6
|
module PrefValidation
|
7
|
+
# Struct to contain a validation result
|
8
|
+
# and a result message.
|
7
9
|
Validator = Struct.new(:code, :message)
|
8
10
|
|
9
11
|
# Validates that a value is only letters.
|
data/lib/cliutils/prefs.rb
CHANGED
@@ -96,7 +96,7 @@ module CLIUtils
|
|
96
96
|
|
97
97
|
# Generates an Array of Prefs based on passed
|
98
98
|
# in data.
|
99
|
-
# @param [Hash]
|
99
|
+
# @param [Hash] pref_data_hash Loaded pref data
|
100
100
|
# @return [Array]
|
101
101
|
def _generate_prefs(pref_data_hash)
|
102
102
|
pref_data_hash[:prompts].map { |p| CLIUtils::Pref.new(p) }
|
data/test/configurator_test.rb
CHANGED
@@ -48,4 +48,16 @@ class TestConfigurator < Test::Unit::TestCase
|
|
48
48
|
assert_output("---\nsection1:\n a: test\n b: test\n") { puts f.read }
|
49
49
|
end
|
50
50
|
end
|
51
|
+
|
52
|
+
def test_compare_version
|
53
|
+
@config.add_section(:app_data)
|
54
|
+
@config.app_data.merge!({ VERSION: '1.0.0', NEWEST_CONFIG_VERSION: '1.8.8' })
|
55
|
+
|
56
|
+
@config.cur_version_key = :VERSION
|
57
|
+
@config.last_version_key = :NEWEST_CONFIG_VERSION
|
58
|
+
|
59
|
+
@config.compare_version do |c, l|
|
60
|
+
assert_output('true') { print c < l }
|
61
|
+
end
|
62
|
+
end
|
51
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cliutils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Bach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|