cliutils 1.0.3 → 1.0.4

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: ed57d1bb3f3c3248b082ff1ea8a5159a2e68052b
4
- data.tar.gz: 9fb6dc3532170cdcf2ef15239d99c199fb1ef04f
3
+ metadata.gz: e7d9fdba4ade5e475660b1e5403ba10c27b11d49
4
+ data.tar.gz: c433c12ec3c28b525a2ac4dd889592753c58473a
5
5
  SHA512:
6
- metadata.gz: da2909f0c9d6de3f3e75698b09414ea999e364894435dc7843334351568b89f5fa6292215ff7e67546b5b5918afa80083885f3b735ef303a202fc94492faf9f8
7
- data.tar.gz: efd71929d34adea0cadecd3cc6865f48a5b3cff101de2060084994369d56f50b37d57e4a1921fb49aa9c04d16d737c3bfd38307f99580f18f2e0105af9c461bc
6
+ metadata.gz: cd0495d72585e2e6176e58312bbfa9390443bbfb3e4c3906c2aa12096b735d92e058bbc853bb1410990b2b0323a922985d43e44c0a8d391e12d2ad1f78022579
7
+ data.tar.gz: a88ae22aa1b2e936ff8986714e545e9a8f3e3b9dfaabd68e1999d31ea96df64caa228c7106bd663a3e459bf5e73f6a29231e8320375d818b21d04b2c071a94b9
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
1
  .DS_Store
2
2
  doc
3
3
  pkg
4
+ .yardoc
5
+ bin
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - 2.0.0
5
+ - 1.9.3
6
+ - jruby-19mode
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cliutils (1.0.3)
4
+ cliutils (1.0.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/HISTORY.md ADDED
@@ -0,0 +1,11 @@
1
+ # 1.0.4 (2014-03-29)
2
+
3
+ * Fixed several bugs
4
+ * Fixed backwards compatibility with Ruby 1.9.2
5
+ * Added more YARDdoc
6
+ * Cleaned out old directories
7
+ * Updated gemspec to reflect new gem versions
8
+
9
+ # 1.0.3 (2014-03-29)
10
+
11
+ * Initial release of CLIUtils
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  CLIUtils
2
2
  ====
3
+ [![Build Status](https://travis-ci.org/bachya/cliutils.png?branch=master)](https://travis-ci.org/bachya/cliutils)
4
+ [![Gem Version](https://badge.fury.io/rb/cliutils.png)](http://badge.fury.io/rb/cliutils)
3
5
 
4
6
  CLIUtils is a library of functionality designed to alleviate common tasks and headaches when developing command-line (CLI) apps in Ruby.
5
7
 
@@ -51,10 +53,10 @@ Note that although this README.md is extensive, it may not cover all methods. Ch
51
53
 
52
54
  CLIUtils offers:
53
55
 
54
- * [PrettyIO](https://github.com/bachya/cli-utils#prettyio): nicer-looking CLI messages
55
- * [Messenging](https://github.com/bachya/cli-utils#messenging): a full-featured Logger
56
- * [Configuration](https://github.com/bachya/cli-utils#configuration): a app configuration manager
57
- * [Prefs](https://github.com/bachya/cli-utils#prefs): a preferences prompter and manager
56
+ * [PrettyIO](#prettyio): nicer-looking CLI messages
57
+ * [Messenging](#messenging): a full-featured Logger
58
+ * [Configuration](#configuration): a app configuration manager
59
+ * [Prefs](#prefs): a preferences prompter and manager
58
60
 
59
61
  ## PrettyIO
60
62
 
@@ -146,13 +148,13 @@ messenger.info_block('Starting up...', 'Done!', multiline = false) { # do stuff
146
148
  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:
147
149
 
148
150
  ```Ruby
149
- CLIUtils::PrettyIO::wrap_at(50)
151
+ CLIUtils::PrettyIO.wrap_char_limit = 50
150
152
  messenger.info('This is a really long message, okay? It should wrap at some point. Seriously. Wrapping is nice.')
151
153
  puts ''
152
- CLIUtils::PrettyIO::wrap_at(20)
154
+ CLIUtils::PrettyIO.wrap_char_limit = 20
153
155
  messenger.info('This is a really long message, okay? It should wrap at some point. Seriously. Wrapping is nice.')
154
156
  puts ''
155
- CLIUtils::PrettyIO::wrap(false)
157
+ CLIUtils::PrettyIO.wrap = false
156
158
  messenger.info('This is a really long message, okay? It should wrap at some point. Seriously. Wrapping is nice.')
157
159
  ```
158
160
  ![alt text](https://raw.githubusercontent.com/bachya/cli-utils/master/res/readme-images/wrapping.png "Text Wrapping")
@@ -255,6 +257,79 @@ user_data:
255
257
  username: bob
256
258
  ```
257
259
 
260
+ ## Prefs
261
+
262
+ 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.
263
+
264
+ `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:
265
+
266
+ * prompt (**required**): the string to prompt your user with
267
+ * default (*optional*): an optional default to offer
268
+ * key (**required**): the key that refers to this preference
269
+ * section (**required**): the Configuration section that this preference applies to
270
+ * options (*optional*): an optional array of values; the user's choice must be in this array
271
+ * requirements (*optional*): an optional list of key/value pairs that must exist for this preference to be displayed
272
+
273
+ Here's an example YAML preferences file.
274
+
275
+ ```YAML
276
+ prompts:
277
+ - prompt: What is the hostname of your DD-WRT router?
278
+ default: 192.168.1.1
279
+ key: hostname
280
+ section: ssh_info
281
+ - prompt: What is the SSH username of your DD-WRT router?
282
+ default: root
283
+ key: username
284
+ section: ssh_info
285
+ - prompt: What SSH port does your DD-WRT router use?
286
+ default: 22
287
+ key: port
288
+ section: ssh_info
289
+ - prompt: Do you use password or key authentication?
290
+ default: password
291
+ key: auth_method
292
+ section: ssh_info
293
+ options: ['password', 'key']
294
+ - prompt: Where is your key located?
295
+ default: ~/.ssh
296
+ key: key_location
297
+ section: ssh_info
298
+ requirements:
299
+ - key: auth_method
300
+ value: key
301
+ - prompt: What is your password?
302
+ key: password
303
+ section: ssh_info
304
+ requirements:
305
+ - key: auth_method
306
+ value: password
307
+ ```
308
+
309
+ Assuming the above, `Prefs` is instantiated like so:
310
+
311
+ ```Ruby
312
+ prefs = CLIUtils::Prefs.new('path/to/yaml/file')
313
+ ```
314
+
315
+ With valid preferences loaded, simply use `ask` to begin prompting your user:
316
+
317
+ ```Ruby
318
+ prefs.ask
319
+ ```
320
+ ![alt text](https://raw.githubusercontent.com/bachya/cli-utils/master/res/readme-images/prefs-ask.png "Prefs.ask")
321
+
322
+ Once the user has answered all the preference prompts, you can fold those answers back into a Configurator using the `ingest` method:
323
+
324
+ ```Ruby
325
+ configuration.ingest(prefs)
326
+ configuration.save
327
+ ```
328
+
329
+ ### Why a Prefs Class?
330
+
331
+ I've written apps that need to request user input at various times for multiple different things; as such, I thought it'd be easier to have those scenarios chunked up. You can always wrap `Prefs` into a module singleton if you wish.
332
+
258
333
  # Known Issues
259
334
 
260
335
  * LoggerDelegator doesn't currently know what to do with `messenger.prompt`, so you'll have to manually log a `debug` message if you want that information logged.
data/cliutils.gemspec CHANGED
@@ -10,17 +10,13 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["bachya1208@googlemail.com"]
11
11
  spec.summary = 'Sugary goodness for Ruby CLI apps.'
12
12
  spec.description = 'A library of functionality designed to alleviate common tasks and headaches when developing command-line (CLI) apps in Ruby.'
13
- spec.homepage = "https://github.com/bachya/cli-utils"
13
+ spec.homepage = "http://www.bachyaproductions.com/cliutils-ruby-library-cli-apps/"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
-
21
- spec.has_rdoc = true
22
- spec.extra_rdoc_files = ['README.md', 'doc']
23
- spec.rdoc_options << '--title' << 'CLIUtils' << '--main' << 'README.md' << '-ri'
24
20
 
25
21
  spec.add_development_dependency('bundler', '~> 1.5')
26
22
  spec.add_development_dependency('pry', '~> 0.9')
@@ -86,7 +86,7 @@ class Hash
86
86
 
87
87
  # Same as _deep_transform_keys_in_object, but
88
88
  # destructively alters the original Object.
89
- # @param [Object] The object to examine
89
+ # @param [Object] object The object to examine
90
90
  # @yield &block
91
91
  # @return [Object]
92
92
  def _deep_transform_keys_in_object!(object, &block)
@@ -1,8 +1,10 @@
1
+ require 'cliutils/pretty-io'
2
+
1
3
  module CLIUtils
2
4
  # CLIMessenger Module
3
5
  # Outputs coordinated messages to a variety of targets.
4
6
  module Messenging
5
- include CLIUtils::PrettyIO
7
+ include PrettyIO
6
8
 
7
9
  # Hook that triggers when this module is included.
8
10
  # @param [Object] k The includer object
@@ -1,3 +1,5 @@
1
+ require 'cliutils/pretty-io'
2
+
1
3
  module CLIUtils
2
4
  # Engine to derive preferences from a YAML file, deliver
3
5
  # those to a user via a prompt, and collect the results.
@@ -6,7 +8,7 @@ module CLIUtils
6
8
  attr_reader :answers, :config_path, :prompts
7
9
 
8
10
  # Reads prompt data from and stores it.
9
- # @param [<String, Array>] data Either a filepath or an array
11
+ # @param [<String, Hash, Array>] data Filepath to YAML, Hash, or Array
10
12
  # @return [void]
11
13
  def initialize(data)
12
14
  @answers = []
@@ -22,6 +24,11 @@ module CLIUtils
22
24
  else
23
25
  fail "Invalid configuration file: #{ yaml_path }"
24
26
  end
27
+ when Hash
28
+ @config_path = nil
29
+
30
+ data = {:prompts => data} unless data.keys[0] == :prompts
31
+ @prompts.deep_merge!(data).deep_symbolize_keys!
25
32
  when Array
26
33
  @config_path = nil
27
34
 
@@ -10,8 +10,14 @@ module CLIUtils
10
10
  # CLIMessenger Module
11
11
  # Outputs color-coordinated messages to a CLI
12
12
  module PrettyIO
13
- @@wrap = true
14
- @@wrap_char_limit = 40
13
+
14
+ class << self
15
+ attr_accessor :wrap
16
+ attr_accessor :wrap_char_limit
17
+ end
18
+
19
+ self.wrap = true
20
+ self.wrap_char_limit = 40
15
21
 
16
22
  # Hook that triggers when this module is included.
17
23
  # @param [Object] k The includer object
@@ -148,26 +154,6 @@ module CLIUtils
148
154
  puts _word_wrap(m, '# ').yellow
149
155
  end
150
156
 
151
- # Toggles wrapping on or off
152
- # @param [<True, False>] on
153
- # @return [void]
154
- def self.wrap(on)
155
- @@wrap = on
156
- end
157
-
158
- # Returns the current character wrap amount
159
- # @return [Integer]
160
- def self.wrap_limit
161
- @@wrap_char_limit
162
- end
163
-
164
- # Sets the number of characters at which to wrap
165
- # @param [Integer] chars The number of chars to output before wrapping
166
- # @return [void]
167
- def self.wrap_at(chars)
168
- @@wrap_char_limit = chars
169
- end
170
-
171
157
  private
172
158
 
173
159
  # Outputs a wrapped string (where each line is limited
@@ -176,9 +162,9 @@ module CLIUtils
176
162
  # @param [String] prefix_str The prefix for each line
177
163
  # @return [String]
178
164
  def _word_wrap(text, prefix_str)
179
- if @@wrap
180
- return text if @@wrap_char_limit <= 0
181
- text.gsub(/\n/, ' ').gsub(/(.{1,#{@@wrap_char_limit - prefix_str.length}})(\s+|$)/, "#{ prefix_str }\\1\n").strip
165
+ if PrettyIO.wrap
166
+ return text if PrettyIO.wrap_char_limit <= 0
167
+ text.gsub(/\n/, ' ').gsub(/(.{1,#{PrettyIO.wrap_char_limit - prefix_str.length}})(\s+|$)/, "#{ prefix_str }\\1\n").strip
182
168
  else
183
169
  text
184
170
  end
@@ -1,4 +1,4 @@
1
1
  module CLIUtils
2
2
  # The current version of the gem
3
- VERSION = "1.0.3"
3
+ VERSION = "1.0.4"
4
4
  end
data/lib/cliutils.rb CHANGED
@@ -13,5 +13,5 @@ require 'cliutils/version'
13
13
  # The CLIUtils module, which wraps everything
14
14
  # in this gem.
15
15
  module CLIUtils
16
-
16
+
17
17
  end
Binary file
@@ -1,4 +1,3 @@
1
- require 'fileutils'
2
1
  require 'logger'
3
2
  require 'test/unit'
4
3
 
@@ -27,10 +26,10 @@ class TestMessenging < Test::Unit::TestCase
27
26
  end
28
27
 
29
28
  def test_wrapping
30
- CLIUtils::PrettyIO.wrap_at(35)
29
+ CLIUtils::PrettyIO.wrap_char_limit = 35
31
30
 
32
31
  long_str = 'This is a really long string that should wrap itself at some point, okay?'
33
- expected_str = long_str.gsub(/\n/, ' ').gsub(/(.{1,#{CLIUtils::PrettyIO.wrap_limit - 2}})(\s+|$)/, "# \\1\n").strip
32
+ expected_str = long_str.gsub(/\n/, ' ').gsub(/(.{1,#{CLIUtils::PrettyIO.wrap_char_limit - 2}})(\s+|$)/, "# \\1\n").strip
34
33
  assert_output(expected_str.blue + "\n") { messenger.send(:info, long_str) }
35
34
  end
36
35
 
@@ -47,7 +46,7 @@ class TestMessenging < Test::Unit::TestCase
47
46
  messenger.send(:warn, 'Warn test')
48
47
 
49
48
  File.open(@file1path, 'r') do |f|
50
- assert_output("INFO: Info test\nERROR: Error test\n") { puts f.read.lines[1..-1].join }
49
+ assert_output("INFO: Info test\nERROR: Error test\n") { puts f.read.lines.to_a[1..-1].join }
51
50
  end
52
51
  end
53
52
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cliutils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Bach
@@ -72,23 +72,17 @@ email:
72
72
  - bachya1208@googlemail.com
73
73
  executables: []
74
74
  extensions: []
75
- extra_rdoc_files:
76
- - README.md
75
+ extra_rdoc_files: []
77
76
  files:
78
77
  - ".gitignore"
79
- - ".yardoc/checksums"
80
- - ".yardoc/object_types"
81
- - ".yardoc/objects/root.dat"
82
- - ".yardoc/proxy_types"
78
+ - ".travis.yml"
83
79
  - Gemfile
84
80
  - Gemfile.lock
81
+ - HISTORY.md
85
82
  - LICENSE.txt
86
83
  - README.md
87
84
  - Rakefile
88
85
  - cliutils.gemspec
89
- - features/cli_manager.feature
90
- - features/step_definitions/cli_manager_steps.rb
91
- - features/support/env.rb
92
86
  - lib/.DS_Store
93
87
  - lib/cliutils.rb
94
88
  - lib/cliutils/configuration.rb
@@ -104,6 +98,7 @@ files:
104
98
  - res/readme-images/messenger-types-1.png
105
99
  - res/readme-images/messenger-warn.png
106
100
  - res/readme-images/multi-logger.png
101
+ - res/readme-images/prefs-ask.png
107
102
  - res/readme-images/prettyio-color-chart.png
108
103
  - res/readme-images/prettyio-gnarly-text.png
109
104
  - res/readme-images/prettyio-red-text.png
@@ -116,17 +111,12 @@ files:
116
111
  - test/prefs_test.rb
117
112
  - test/string_extesions_test.rb
118
113
  - test/test_files/prefstest.yaml
119
- homepage: https://github.com/bachya/cli-utils
114
+ homepage: http://www.bachyaproductions.com/cliutils-ruby-library-cli-apps/
120
115
  licenses:
121
116
  - MIT
122
117
  metadata: {}
123
118
  post_install_message:
124
- rdoc_options:
125
- - "--title"
126
- - CLIUtils
127
- - "--main"
128
- - README.md
129
- - "-ri"
119
+ rdoc_options: []
130
120
  require_paths:
131
121
  - lib
132
122
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -146,9 +136,6 @@ signing_key:
146
136
  specification_version: 4
147
137
  summary: Sugary goodness for Ruby CLI apps.
148
138
  test_files:
149
- - features/cli_manager.feature
150
- - features/step_definitions/cli_manager_steps.rb
151
- - features/support/env.rb
152
139
  - test/configurator_test.rb
153
140
  - test/hash_extensions_test.rb
154
141
  - test/logger_extensions_test.rb
@@ -156,4 +143,4 @@ test_files:
156
143
  - test/prefs_test.rb
157
144
  - test/string_extesions_test.rb
158
145
  - test/test_files/prefstest.yaml
159
- has_rdoc: true
146
+ has_rdoc:
data/.yardoc/checksums DELETED
@@ -1,11 +0,0 @@
1
- lib/cliutils.rb 4f397f5444c33ebcebd8384e5b7b498186785d0d
2
- lib/cliutils/prefs.rb 66f1c006d76b5334ad4b2b427141796d35065c27
3
- lib/cliutils/version.rb 70a1622cf96c5c986b312e8b7f5751131090b30e
4
- lib/cliutils/pretty-io.rb fba4516ec1e2561d1b5e613e4f61b04f03e8abc0
5
- lib/cliutils/messenging.rb c0362bcb8e1090d83966d2b3596532c7f1576570
6
- lib/cliutils/configurator.rb c202ac417ea4891c990da586d1edf6333f0fa8d6
7
- lib/cliutils/configuration.rb 02752324c57b7c7054d9a8158f70641cd73682bc
8
- lib/cliutils/logger-delegator.rb 507b215088c1d019d42059832ef8280f746ee26b
9
- lib/cliutils/ext/Hash+Extensions.rb e51f7475afccd3ad38a4a62ddcf87216f2dcc974
10
- lib/cliutils/ext/Logger+Extensions.rb 946bf8385446f369264877a2fe6bb415f24dbcd8
11
- lib/cliutils/ext/String+Extensions.rb a0a39b16d1709e7f5c5c4eff0d6d8258e691582d
data/.yardoc/object_types DELETED
Binary file
Binary file
data/.yardoc/proxy_types DELETED
Binary file
@@ -1,13 +0,0 @@
1
- Feature: My bootstrapped app kinda works
2
- In order to get going on coding my awesome app
3
- I want to have aruba and cucumber setup
4
- So I don't have to do it myself
5
-
6
- Scenario: App just runs
7
- When I get help for "cliutils"
8
- Then the exit status should be 0
9
- And the banner should be present
10
- And the banner should document that this app takes options
11
- And the following options should be documented:
12
- |--version|
13
- And the banner should document that this app takes no arguments
@@ -1 +0,0 @@
1
- # Put your step definitions here
@@ -1,16 +0,0 @@
1
- require 'aruba/cucumber'
2
- require 'methadone/cucumber'
3
-
4
- ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
5
- LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
6
-
7
- Before do
8
- # Using "announce" causes massive warnings on 1.9.2
9
- @puts = true
10
- @original_rubylib = ENV['RUBYLIB']
11
- ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
12
- end
13
-
14
- After do
15
- ENV['RUBYLIB'] = @original_rubylib
16
- end