cli_helper 0.0.4 → 0.1.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: a11b406f6718dfb39018945bf80702fcb80cf1c8
4
- data.tar.gz: 3056af86e1e54c03f0bb8f6bd48384592f60062e
3
+ metadata.gz: 2bf433b3f85f6369eda6ca70e7270c62ea73de64
4
+ data.tar.gz: 9c080c925aa6f8e106d2cd7055e8015cd9391bc4
5
5
  SHA512:
6
- metadata.gz: 81dbaebdbdb4b38801da2cd6147a3bf04a83a4b2350e56a13671ee66dab13625a8e1392a4e876f09c9b22a8e9f93f20b12f8284fa2621542c19c6e0d72cb2807
7
- data.tar.gz: cc5a251148d8812a9410654c93625ba148f4d32915c6cc9526dc9a0fb08ccab51a05a0dcc6c2f50095e5bb9f25ba84985f799e961e9bd8af425db7d7ee0a011c
6
+ metadata.gz: b4c1bf70ad6f53fd6c1a6578be150a8621c9588452cad240c233500a00aea0613fa7f4b428caf5c029fb806c5b9ba537f0c78e60aa58af727e1f83116915b65b
7
+ data.tar.gz: 86d255f5568ff8ce8ea8d1ce024f7ddf7eabb5d22f1e05cd7dfd8322de57edb241795c96ace9b20458c856ebfd8a08d6f7f4eadbece59b6b341df6a01904265f
data/README.md CHANGED
@@ -1,22 +1,233 @@
1
- # cli_helper.rb
1
+ # cli_helper
2
+
3
+ If you write lots of command-line utility programs, or
4
+ even if you don't the cli_helper gem can be a helper
5
+ to you. It integrates several common gems to give
6
+ a comprehensive configuration management experience.
7
+
8
+ Here are the gems used and what they do:
9
+
10
+ * configatron
11
+ * makes config info available
12
+ * http://github.com/markbates/configatron
13
+
14
+ * nenv
15
+ * parses ENV for friendly use
16
+ * http://github.com/e2/nenv
17
+
18
+ * parseconfig
19
+ * parses INI files
20
+ * http://github.com/datafolklabs/ruby-parseconfig
21
+
22
+ * slop
23
+ * parses ARGV
24
+ * http://github.com/leejarvis/slop
25
+
26
+
27
+ ## Convention
28
+
29
+ The convention w/r/t what value amoung concurrent sources
30
+ is the correct one to use is hierarchic
31
+ where the layer above trumps all the layers below. This is the order:
32
+
33
+ * command-line parameter
34
+ * config file value
35
+ * system environment variable
36
+ * default
37
+
38
+ This ordering says that regardless what you have set in
39
+ a config file or ENV or as a default, the value of the
40
+ command line parameter will be used.
41
+
42
+ I like to use ERB within my config files. Consider 'default.yml.erb'
43
+ below:
44
+
45
+ ```ruby
46
+ ---
47
+ host: <%= Nenv.host || 'localhost' %>
48
+ ```
49
+
50
+ Processing this file will give me either the default value for host
51
+ of 'localhost' or if defined the value of the system environment
52
+ variable HOST. I like Nenv over ENV.
53
+
54
+ Now suppose I use cli_helper within a program and execute the
55
+ program like this:
56
+
57
+ ```ruby
58
+ program.rb --host devhost --config default.yml.erb,prod.ini
59
+ ```
60
+
61
+ Because I have specifically called out the value of host on the
62
+ command line, that value will trump anything that comes from the
63
+ config file.
64
+
65
+ Did you notice that I had two files specified with the --config option?
66
+
67
+ The config files are processed in the order that they are given on the command
68
+ line. Whatever values were obtained from the first file will be over-written
69
+ by the second and any subsequent config files. Regardless of their
70
+ values for host, the command-line value trumps them all.
71
+
72
+
73
+ ## Config files
74
+
75
+ cli_helper supports multiple types of configuration files:
76
+
77
+ ```text
78
+ *.rb
79
+ *.yml
80
+ *.yml.erb
81
+ *.ini
82
+ *.txt (in the INI format)
83
+ *.ini.erb -- not currently supported
84
+ *.txt.erb -- not currenly supported
85
+ ```
86
+
87
+ All values obtained from config files and command line parameters are
88
+ held in the configatron structure.
89
+
90
+
91
+ ## Common Command-line Options
92
+
93
+ cli_helper predefines common command-line options. These
94
+ can to disabled by the program if necessary. The common options
95
+ are:
96
+
97
+ ```text
98
+ -h, --help
99
+ -d, --debug
100
+ -v, --verbose
101
+ --version
102
+ --config (optional)
103
+ ```
104
+
105
+ To enable the support for config files do this before
106
+ calling the #cli_helger() method:
107
+
108
+ ```ruby
109
+ configatron.support_config_files = true
110
+ ```
2
111
 
3
- I had this code just being lazy on my computer. It might be of use
4
- to someone else; but, its just really intended to support my own
5
- quick and dirty command-line based utilities. Mostly they are one-offs
6
- but sometimes they hang around.
112
+ To disable any of the other common options do this before
113
+ involking cli_helper:
7
114
 
8
- I typically create thes cli utilities using my own code generater which
9
- resulted in lots of duplicate source blocks roll around on the deck. This
10
- little library will DRYup my code a little.
115
+ ```ruby
116
+ configatron.disable_help = true
117
+ configatron.disable_debug = true
118
+ configatron.disable_verbose = true
119
+ cpnfogatrpm/dosab;e_version = true
120
+ ```
121
+
122
+ ## Other options
123
+
124
+ The default behavior is to raise an exception if an unspecified option is
125
+ used on the command line. For example if your program just uses the common
126
+ options and someone invokes the program with --xyzzy then an exception will be
127
+ raised saying that the option is unknown.
128
+
129
+ To prevent this exception you can set the suppress_errors parameter. With
130
+ this parameter set to true an unknown option will just be added to the unprocessed
131
+ arguments array.
132
+
133
+ ```ruby
134
+ configatron.suppress_errors = true
135
+ ```
136
+
137
+ The unprocessed options can be access via the arguments array:
138
+
139
+ ```ruby
140
+ configatron.arguments
141
+ ```
142
+
143
+ The arguments array is also where you will find anything else from the
144
+ command line that was not processed by the cli_helper. For example:
145
+
146
+ ```ruby
147
+ my_program.rb -v *.txt
148
+ ```
149
+
150
+ The file names matching the '*.txt' glob will be put into the configatron.arguments
151
+ array.
152
+
153
+
154
+ ## Boolean options auto-generate methods
155
+
156
+ Any boolean command-line option specified, even the predefined common ones,
157
+ have two methods defined: query(?) and banger(!). For the help options
158
+ the methods look like this:
159
+
160
+ ```ruby
161
+ def help?
162
+ configatron.help
163
+ end
164
+
165
+ def help!
166
+ configatron.help = true
167
+ end
168
+ ```
169
+
170
+ ## Names of command-line options
171
+
172
+ If you specify a command-line option of xyzzy, then an
173
+ entry in the configatron structure will be created having the
174
+ name 'xyzzy'. If you do not use a long-form for the option
175
+ the short option name will be used. For example '-x' will
176
+ be accessed as configatron.x
177
+
178
+
179
+ ## Support methods
180
+
181
+ There are several support methods that I have included in cli_helper
182
+ that you may want to use. The first three deal with
183
+ errors and warnings and what to do with them.
184
+
185
+ * warning(a_string)
186
+ * error(a_string)
187
+ * abort_if_errors
188
+
189
+ cli_helper defines two arrays within configatron: errors and warnings. The
190
+ warning() and error() methods insert their strings into these arrays. The
191
+ abort_if_errors method first looks at the warnings array and presents all of
192
+ those strings to the user via STDOUT. It then asks the user if they want
193
+ to abort the program. The default answer is no.
194
+
195
+ After presenting the warnings to the user, the abort_if_error method presents
196
+ all of the errors to the user. Then it exits the program.
197
+
198
+ These next support methods are self explanatory:
199
+
200
+ * usage() #=> a_string
201
+ * show_usage() #=> usage string sent to STDOUT
202
+ * me() #=> The full path to the file that "require 'cli_helper"" was involked
203
+ * my_name() #=> the basename of me
204
+
205
+ But this one needs some explaining:
206
+
207
+ * get_pathnames_from(an_array, extnames=['.json', '.txt', '.docx'])
208
+
209
+ The method get_pathnames_from() returns an array of pathnames matching a specific
210
+ set of file types. The default types are txt, json and docx because that tends to
211
+ be the majority of the files in which I am interested. Might add wcml to the default list
212
+ later. Regardless you propabily ought to provide your own array of file extensions. And
213
+ don't forget the dot!
214
+
215
+ If an entry in the array is a directory then its children will be search including any sub-directories recursively.
216
+
217
+ Here is how I typically use it :)
218
+
219
+ ```ruby
220
+ get_pathnames_from(configatron.arguments, '.php').each do |f|
221
+ f.delete_without_regret!
222
+ end
223
+ ```
11
224
 
12
225
 
13
226
  ## Usage
14
227
 
15
- TODO: Write usage instructions here in case someone can't figure it out
16
- for themselves.
228
+ Take a look at http://github.com/MadBomber/cli_helper/blob/master/example/cli_stub.rb
17
229
 
18
230
 
19
231
  ## License
20
232
 
21
233
  You want it? Its yours.
22
- # cli_helper
data/cli_helper.gemspec CHANGED
@@ -4,18 +4,20 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "cli_helper"
7
- spec.version = '0.0.4'
7
+ spec.version = '0.1.0'
8
8
  spec.authors = ["Dewayne VanHoozer"]
9
9
  spec.email = ["dvanhoozer@gmail.com"]
10
10
 
11
- spec.summary = %q{An encapsulates of common junk used with Q&D CLI utilities.}
12
- spec.description = %q{An encapsulation of a convention I have been using
13
- with the slop, nenv, and other gems for quick and dirty development of
14
- command-line based utility programs. Its not pretty. It may even break
15
- your code. I wouldn't use it if I were you. You could, if you wanted,
16
- namespace this stuff within CliHelper and establish a new convention.
17
- You might even wrap not only slop but some of those other ARGV parsers.
18
- I only did this much after being shamed into it by rubycritic.}
11
+ spec.summary = %q{An encapsulation of an integration of slop, nenv, parseconfig and configatron.}
12
+ spec.description = %q{
13
+ An encapsulation of a convention I have been using
14
+ with the slop, nenv, parseconfig and configatron gems for quick and dirty
15
+ development of
16
+ command-line based utility programs. Slop parses ARGV; Nenv parses ENV;
17
+ ParseConfig parses INI; Configatron keeps it all together. YAML and ERB
18
+ preprocessing is also available. Ruby configuration files are also supported.
19
+ and you can specify multiple config files of mixed types at once.
20
+ }
19
21
  spec.homepage = "http://github.com/MadBomber/cli_helper"
20
22
  spec.license = "You want it? It's yours."
21
23
 
@@ -26,14 +28,15 @@ Gem::Specification.new do |spec|
26
28
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
27
29
  end
28
30
 
29
- spec.add_dependency 'slop', "~> 4.0"
31
+ spec.add_dependency 'configatron'
30
32
  spec.add_dependency 'nenv'
31
- spec.add_dependency 'awesome_print'
32
- spec.add_dependency 'debug_me'
33
-
33
+ spec.add_dependency 'parseconfig'
34
+ spec.add_dependency 'slop', "~> 4.0"
34
35
 
35
36
  spec.add_development_dependency "bundler", "~> 1.9"
36
37
  spec.add_development_dependency "rake", "~> 10.0"
37
- spec.add_development_dependency 'test_inline'
38
+ spec.add_development_dependency 'kick_the_tires'
39
+ spec.add_development_dependency 'awesome_print'
40
+ spec.add_development_dependency 'debug_me'
38
41
 
39
42
  end
data/example/cli_stub.rb CHANGED
@@ -7,19 +7,55 @@
7
7
  ## By: Dewayne VanHoozer (dvanhoozer@gmail.com)
8
8
  #
9
9
 
10
- require 'cli_helper'
11
-
12
- $options[:version] = '0.0.1' # the version of this utility program
10
+ require 'awesome_print'
13
11
 
14
- # HELP is extra stuff shown with usage. It is optional.
12
+ require 'cli_helper'
13
+ include CliHelper
14
+
15
+ configatron.version = '0.0.1' # the version of this utility program
16
+ configatron.support_config_files = true # default is false
17
+ configatron.disable_help = false # default is false set true to remove the option
18
+ configatron.disable_verbose = false # ditto
19
+ configatron.disable_debug = false # ditto
20
+ configatron.disable_version = false # ditto
21
+ configatron.suppress_errors = false # set to true to eat exceptions; unknown options added to arguments
22
+
23
+ # HELP is extra stuff shown with usage. It is optional. You
24
+ # can put anything you want into it. Since it is optional, it
25
+ # can be completely left out of your program. This HELP text
26
+ # will appear at the end of the usage message after the help
27
+ # text for each option (command-line parameter).
15
28
  HELP = <<EOHELP
16
29
  Important:
17
30
 
18
31
  Put important stuff here.
19
32
 
33
+ Config files also support ERB preprocessing. use
34
+ cile names like: *.uml.erb *.ini.erb *.txt.erb
35
+
36
+ Do not use *.rb.erb that's just silly.
37
+
20
38
  EOHELP
21
39
 
22
- # The description (aka banner) text is optional. The block is required.
40
+ # The description (aka banner) text is optional. The block is not required.it
41
+ # only the default options and config files are desired. The block allows for
42
+ # the definition of program-specific options.
43
+ #
44
+ # Default options for help, debug, verbose, and version are automatically inserted
45
+ # by cli_helper. If configatron.support_config_files is TRUE then a '--config' parameter
46
+ # will also be presented. '--config' takes a comma-separated list of file paths. Each
47
+ # config file is processed within cli_helper and results combined within the configatron
48
+ # structure.
49
+ #
50
+ # -h, --help will automatically show a usage message on STDOUT and exit the program
51
+ # --version will print the program's version string to STDOUT and exit
52
+ # =v, --verbose will set the verbose boolean to true.
53
+ # -d, --debug will set the debug boolean to true.
54
+ # All boolean options have '?' and '!' methods generated, For example debug? and
55
+ # verbose? are automatically generated. Any program-specific booleans specified will
56
+ # also get methods defined for them. The debug! methods sets the debug boollean to true.
57
+ # Same for verbose! etc.
58
+
23
59
  cli_helper("An example use of cli_helper") do |o|
24
60
 
25
61
  # For a complete list of stuff see Slop on github.com
@@ -33,11 +69,13 @@ cli_helper("An example use of cli_helper") do |o|
33
69
 
34
70
  o.array '-a', '--array', 'example array parameter', default: [:bob, :carol, :ted, :alice]
35
71
  o.path '-p', '--path', 'example Pathname parameter', default: Pathname.new('default/path/to/file.txt')
36
- o.paths '--paths', 'example Pathnames parameter', delimiter: ',', default: ['default/path/to/file.txt', 'file2.txt'].map{|f| Pathname.new f}
72
+ o.paths '--paths', 'example Pathnames parameter', delimiter: ',', default: ['default/path/to/file.txt',
73
+ 'file2.txt'].map{|f| Pathname.new f}
37
74
 
38
75
  # FIXME: Issue with Slop; default is not passed to the block. When no parameter is
39
76
  # given, an exception is raised. Using the suppress_errors: true option silents
40
77
  # the exception BUT still the default value is not passed to the block.
78
+ # This issue has been raised with the Slop author and a fix is in the works.
41
79
  o.string '-n', '--name', 'print Hello <name>', default: 'World!', suppress_errors: true do |a_string|
42
80
  a_string = 'world' if a_string.empty?
43
81
  puts "Hello #{a_string}"
@@ -46,7 +84,7 @@ cli_helper("An example use of cli_helper") do |o|
46
84
  end
47
85
 
48
86
  # ARGV is not touched. However all command line parameters that are not consummed
49
- # are available in $options[:arguments]
87
+ # are available in configatron.arguments
50
88
 
51
89
  # Display the usage info
52
90
  if ARGV.empty?
@@ -57,14 +95,29 @@ end
57
95
 
58
96
  # Error check your stuff; use error('some message') and warning('some message')
59
97
 
60
- unless $options[:arguments].empty?
61
- warning "These items were not processed #{$options[:arguments]}"
98
+ unless configatron.arguments.empty?
99
+ warning "These items were not processed #{configatron.arguments}"
62
100
  end
63
101
 
64
- if $options[:arguments].include?('error')
102
+ if configatron.arguments.include?('error')
65
103
  error "You wanted an error, so you got one."
66
104
  end
67
105
 
106
+ if configatron.arguments.include?('warning')
107
+ warning "You wanted a warning, so you got one."
108
+ end
109
+
110
+ =begin
111
+
112
+ rescue
113
+ configatron.errors and configatron.warnings are of type Array.
114
+ All warnings will be presented to the user. The user will
115
+ be asked wither the program should be aborted.
116
+ =end
117
+
118
+ # present all warnings and all errors to the user
119
+ # if there are errors, the program will exit after
120
+ # displaying the error messages.
68
121
  abort_if_errors
69
122
 
70
123
 
@@ -81,7 +134,7 @@ at_exit do
81
134
  puts
82
135
  end
83
136
 
84
- ap $options if verbose? || debug?
137
+ ap configatron.to_h if verbose? || debug?
85
138
 
86
139
  stub = <<EOS
87
140