cliutils 1.2.8 → 1.2.9

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: eb6abdf9f2796a668951e2178193ebfa1110b5bf
4
- data.tar.gz: 6216f1699daa43bbd541d5c27037278000455b16
3
+ metadata.gz: 97a26794fd111748a7122e364fd21179f7d1f082
4
+ data.tar.gz: 78a1352fde30e33340c46340164ddc88a9bf526f
5
5
  SHA512:
6
- metadata.gz: 4283a18fa302cd1c59aee7d376da17930555b5362f46fda1fe6cb8853ea62ac417e129afc0ef97776c35cc1073678b37e7f88e862d4c05c74770015a8722d62b
7
- data.tar.gz: 807478504596067deb636925a4d04a335abac239f775edd4079ac27efe784dd604412d94b24d564ae28190d35a6ba7b1cb8bf1e856fcc4ac86b43e0225d5e228
6
+ metadata.gz: c92816990f22349112121b23694c85ff0d85b04b8420999ec1047fb6727acc688073b3eb321ef68bb94082972c0a69150b1292a1d5254014c05a7cd76ad671c7
7
+ data.tar.gz: c9d7ccaaee1a0416cd24030588c936ec285f1b7ea8ed56cc89e9c2c935631b20ab035443da84139a76c426368e33b8f7f540284091eab26b9325567b74722a7f
data/HISTORY.md CHANGED
@@ -1,3 +1,11 @@
1
+ # 1.2.9 (2014-04-09)
2
+
3
+ * Added time Pref validator
4
+ * Added datetime Pref validator
5
+ * Added filepath_exists Pref validator
6
+ * Pref Validator change: numeric => number
7
+ * Pref Behavior change: local_filepath => expand_filepath
8
+
1
9
  # 1.2.8 (2014-04-08)
2
10
 
3
11
  * Global name changes
data/README.md CHANGED
@@ -122,7 +122,7 @@ messenger.warn('Hey pal, you need to be careful.')
122
122
  * `messenger.info`: used to show a formatted-blue infomational message.
123
123
  * `messenger.section`: used to show a formatted-purple sectional message.
124
124
  * `messenger.success`: used to show a formatted-green success message.
125
- * `messenger.yellow`: used to show a formatted-yellow warning message.
125
+ * `messenger.warn`: used to show a formatted-yellow warning message.
126
126
 
127
127
  Let's see an example that uses them all:
128
128
 
@@ -138,24 +138,37 @@ messenger.success('But Luke still blew up the Death Star!')
138
138
  `messenger` also includes two "block" methods that allow you to wrap program execution in messages that are "longer-term".
139
139
 
140
140
  ```Ruby
141
- messenger.info_block('Starting up...', 'Done!', multiline = false) { # do stuff here }
142
- ```
141
+ # Outputs 'Starting up...', runs the code in
142
+ # `# do stuff here`, and once complete,
143
+ # outputs 'Done!' on the same line.
144
+ messenger.info_block('Starting up...', 'Done!', multiline = false) {
145
+ # ...do stuff here...
146
+ }
143
147
 
144
- `messenger` outputs 'Starting up...', runs the code in `# do stuff here`, and once complete, outputs 'Done!' on the same line. Note that `section_block` is the same exact signature (except for the method name, of course!).
148
+ # Outputs 'MY SECTION' and then runs
149
+ # the code in `# do stuff here` before
150
+ # proceeding.
151
+ section_block('MY SECTION', multiline = true) {
152
+ # ...do stuff here...
153
+ }
154
+ ```
145
155
 
146
156
  ### Message Wrapping
147
157
 
148
158
  `PrettyIO` also gives `messenger` the ability to wrap your messages so that they don't span off into infinity. You can even control what the wrap limit (in characters) is:
149
159
 
150
160
  ```Ruby
161
+ long_string = 'This is a really long message, okay? ' \
162
+ 'It should wrap at some point. Seriously. Wrapping is nice.'
163
+
151
164
  CLIUtils::PrettyIO.wrap_char_limit = 50
152
- messenger.info('This is a really long message, okay? It should wrap at some point. Seriously. Wrapping is nice.')
165
+ messenger.info(long_string)
153
166
  puts ''
154
167
  CLIUtils::PrettyIO.wrap_char_limit = 20
155
- messenger.info('This is a really long message, okay? It should wrap at some point. Seriously. Wrapping is nice.')
168
+ messenger.info(long_string)
156
169
  puts ''
157
170
  CLIUtils::PrettyIO.wrap = false
158
- messenger.info('This is a really long message, okay? It should wrap at some point. Seriously. Wrapping is nice.')
171
+ messenger.info(long_string)
159
172
  ```
160
173
  ![alt text](https://raw.githubusercontent.com/bachya/cli-utils/master/res/readme-images/wrapping.png "Text Wrapping")
161
174
 
@@ -208,7 +221,7 @@ E, [2014-03-29T15:14:34.844553 #4497] ERROR -- : This error should appear in STD
208
221
  D, [2014-03-29T15:14:34.844609 #4497] DEBUG -- : This debug message should only appear in file.txt
209
222
  ```
210
223
 
211
- Since you can attach Logger objects, each can have it's own format and severity level. Cool!
224
+ Since you are attaching Logger objects, each can have it's own format and severity level. Cool!
212
225
 
213
226
  ## Configuration
214
227
 
@@ -242,9 +255,9 @@ configuration.delete_section(:program_data)
242
255
  There are two ways data can be managed in `configurator`: via its `@data` property or via some magic methods; your call:
243
256
 
244
257
  ```Ruby
245
- configuration.data[:user_data].merge!(username: 'bob')
258
+ configuration.data[:user_data].merge!({ username: 'bob', age: 45 })
246
259
  # OR
247
- configuration.user_data.merge!(username: 'bob')
260
+ configuration.user_data.merge!({ username: 'bob', age: 45 })
248
261
  ```
249
262
 
250
263
  ### Saving to a File
@@ -262,6 +275,7 @@ Note that all your keys are converted to strings before saving (and, likewise, a
262
275
  app_data:
263
276
  user_data:
264
277
  username: bob
278
+ age: 45
265
279
  ```
266
280
 
267
281
  ### Checking Configuration Versions
@@ -292,8 +306,7 @@ app_data:
292
306
  configuration.cur_version_key = :APP_VERSION
293
307
 
294
308
  # Tell your configurator the name of the key that
295
- # stores the last version that needed a configuration
296
- # change.
309
+ # stores the last version that needed a configuration change.
297
310
  # NOTE that you don't have to specify the section.
298
311
  configuration.last_version_key = :NEWEST_CONFIG_VERSION
299
312
 
@@ -316,7 +329,7 @@ Many times, CLI apps need to ask their users some questions, collect the feedbac
316
329
 
317
330
  ### Basic Schema
318
331
 
319
- `Prefs` can load preferences information from either a YAML file (via a filepath) or from an array of preferences. In either case, the schema is the same; each prompt includes the following:
332
+ `Prefs` can load preferences information from either a YAML file (via a filepath) or from an Array of preferences. In either case, the schema is the same; each prompt includes the following:
320
333
 
321
334
  * `prompt` (**required**): the string to prompt your user with
322
335
  * `default` (*optional*): an optional default to offer
@@ -347,7 +360,7 @@ Assuming the above, `Prefs` is instantiated like so:
347
360
  prefs = CLIUtils::Prefs.new('path/to/yaml/file')
348
361
  ```
349
362
 
350
- `Prefs` can also be instantiated via a Hash or an array of prompts; the overall schema remains the same:
363
+ `Prefs` can also be instantiated via a Hash or an Array of prompts; the overall schema remains the same:
351
364
 
352
365
  ```Ruby
353
366
  # Instantiation through a Hash
@@ -375,9 +388,9 @@ h = {
375
388
  }
376
389
 
377
390
  prefs = CLIUtils::Prefs.new(h)
378
-
391
+ ```
392
+ ```Ruby
379
393
  # Instantiation through an Array
380
-
381
394
  a = [
382
395
  {
383
396
  prompt: 'What is your name?',
@@ -502,12 +515,15 @@ prefs.ask
502
515
 
503
516
  ```YAML
504
517
  validators:
505
- - alphabetic # Must be made up of letters and spaces
506
- - alphanumeric # Must be made up of letters, numbers, and spaces
507
- - date # Must be a parsable date (e.g., 2014-04-03)
508
- - non_nil # Must be a non-nil value
509
- - numeric # Must be made up of numbers
510
- - url # Must be a fully-qualified URL
518
+ - alphabetic # Must be made up of letters and spaces
519
+ - alphanumeric # Must be made up of letters, numbers, and spaces
520
+ - date # Must be a parsable date (e.g., 2014-04-03)
521
+ - datetime # Must be a parsable datetime (e.g., 2014-04-03 9:34am)
522
+ - non_nil # Must be a non-nil value
523
+ - number # Must be made up of numbers
524
+ - filepath_exists # Must be a local filepath that exists (e.g., `/tmp/`)
525
+ - time # Must be a parsable time (e.g., 12:45pm or 21:08)
526
+ - url # Must be a fully-qualified URL
511
527
  ```
512
528
 
513
529
  An example:
@@ -523,7 +539,7 @@ prompts:
523
539
  config_key: age
524
540
  config_section: personal_info
525
541
  validators:
526
- - numeric
542
+ - number
527
543
  ```
528
544
 
529
545
  ```Ruby
@@ -540,7 +556,7 @@ Finally, a common desire might be to modify the user's answer in some way before
540
556
  ```YAML
541
557
  validators:
542
558
  - capitalize # Turns "answer" into "Answer"
543
- - local_filepath # Runs File.expand_path on the answer
559
+ - expand_filepath # Runs File.expand_path on the answer
544
560
  - lowercase # Turns "AnSwEr" into "answer"
545
561
  - prefix: 'test ' # Prepends 'test ' to the answer
546
562
  - suffix: 'test ' # Appends 'test ' to the answer
@@ -568,7 +584,7 @@ prefs.ask
568
584
  ```
569
585
  ![alt text](https://raw.githubusercontent.com/bachya/cli-utils/master/res/readme-images/prefs-ask-behaviors.png "Behaviors")
570
586
 
571
- Note that behaviors are executed in order, which might give you different results than you're expecting. In the example above, for example, placing the `uppercase` behavior last in the list will uppercase *the entire string* (including prefix and suffix).
587
+ Note that behaviors are executed in order, which might give you different results than you're expecting. Using the YAML above, for example, placing the `uppercase` behavior last in the list will uppercase *the entire string* (including prefix and suffix).
572
588
 
573
589
  ### Adding Pref Responses to a Configurator
574
590
 
@@ -1,5 +1,5 @@
1
1
  # Stores constants to use.
2
2
  module CLIUtils
3
3
  # The current version of the gem
4
- VERSION = '1.2.8'
4
+ VERSION = '1.2.9'
5
5
  end
@@ -16,7 +16,7 @@ module CLIUtils
16
16
  end
17
17
 
18
18
  # Attaches a new target to delegate to.
19
- # @param [Logger] target The targets to delegate to
19
+ # @param [Hash] target A hash describing a reference key and a Logger
20
20
  # @return [void]
21
21
  def attach(target)
22
22
  fail "Cannot add invalid target: #{ target }" unless target.is_a?(Hash)
@@ -14,7 +14,7 @@ module CLIUtils
14
14
  # is a filepath).
15
15
  # @param [String] args[0] The text to evaluate
16
16
  # @return [String]
17
- def self.local_filepath(*args)
17
+ def self.expand_filepath(*args)
18
18
  File.expand_path(args[0])
19
19
  end
20
20
 
@@ -8,7 +8,8 @@ module CLIUtils
8
8
  # and a result message.
9
9
  Validator = Struct.new(:code, :message)
10
10
 
11
- # Validates that a value is only letters.
11
+ # Validates that a value is only letters
12
+ # and spaces.
12
13
  # @param [String] text The text to inspect
13
14
  # @return [Boolean]
14
15
  def self.alphabetic(text)
@@ -17,7 +18,8 @@ module CLIUtils
17
18
  Validator.new(c, m)
18
19
  end
19
20
 
20
- # Validates that a value is only letters and numbers.
21
+ # Validates that a value is only letters, numbers
22
+ # and spaces.
21
23
  # @param [String] text The text to inspect
22
24
  # @return [Boolean]
23
25
  def self.alphanumeric(text)
@@ -35,6 +37,15 @@ module CLIUtils
35
37
  Validator.new(c, m)
36
38
  end
37
39
 
40
+ # Validates that a value is a datetime.
41
+ # @param [String] text The text to inspect
42
+ # @return [Boolean]
43
+ def self.datetime(text)
44
+ m = "Response is not a datetime: #{ text }"
45
+ c = !(DateTime.parse(text) rescue nil).nil?
46
+ Validator.new(c, m)
47
+ end
48
+
38
49
  # Validates that a value is passed and is not
39
50
  # empty.
40
51
  # @param [String] text The text to inspect
@@ -48,12 +59,31 @@ module CLIUtils
48
59
  # Validates that a value is some sort of number.
49
60
  # @param [String] text The text to inspect
50
61
  # @return [Boolean]
51
- def self.numeric(text)
62
+ def self.number(text)
52
63
  m = "Response is not a number: #{ text }"
53
64
  c = text.to_s =~ /\A[-+]?\d*\.?\d+\z/
54
65
  Validator.new(c, m)
55
66
  end
56
67
 
68
+ # Validates that a filepath exists on the
69
+ # local filesystem.
70
+ # @param [String] text The text to inspect
71
+ # @return [Boolean]
72
+ def self.filepath_exists(text)
73
+ m = "Path does not exist locally: #{ text }"
74
+ c = Pathname.new(text).exist?
75
+ Validator.new(c, m)
76
+ end
77
+
78
+ # Validates that a value is a time.
79
+ # @param [String] text The text to inspect
80
+ # @return [Boolean]
81
+ def self.time(text)
82
+ m = "Response is not a time: #{ text }"
83
+ c = !(Time.parse(text) rescue nil).nil?
84
+ Validator.new(c, m)
85
+ end
86
+
57
87
  # Validates that passed value is a URL.
58
88
  # @param [String] text The text to inspect
59
89
  # @return [Boolean]
@@ -7,4 +7,4 @@ prompts:
7
7
  behaviors:
8
8
  - uppercase
9
9
  - prefix: 'My favorite food: '
10
- - suffix: ' (Italian food FTW!)'
10
+ - suffix: ' (soooo good!)'
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.8
4
+ version: 1.2.9
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-08 00:00:00.000000000 Z
11
+ date: 2014-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -82,7 +82,6 @@ files:
82
82
  - README.md
83
83
  - Rakefile
84
84
  - cliutils.gemspec
85
- - lib/.DS_Store
86
85
  - lib/cliutils.rb
87
86
  - lib/cliutils/configuration.rb
88
87
  - lib/cliutils/configurator.rb
data/lib/.DS_Store DELETED
Binary file