cli_helper 0.1.6 → 0.1.8

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: 914907ac3588871959a3bcb3facdd987f0cd66db
4
- data.tar.gz: 4215cb566324eb7466a90b688f8c83cf180769e4
3
+ metadata.gz: daf61d8cbabeb65a4cca02b574eec433477be112
4
+ data.tar.gz: d7bda7e83f7f3c2f9bbabf66df68f0b398b4466f
5
5
  SHA512:
6
- metadata.gz: d5284dc8b2af8af0391465ea12e588403eea653038a26b6e4f2546261509aaa7ee95ea6ff9e45144cc626617308b9af44bdfa2d2a9fa185859bd9304834e704c
7
- data.tar.gz: 789e72bb764bd2de7989394b5a600a53403029f3e194a7ffafe4f53e0e5d7ed61d9211a487dc8357d27127976bde83e533749c17215c4f4400fd64c4cb3faf02
6
+ metadata.gz: 42014bd7d2a2718ba08ab8dc01d0b87f45116903a85634c04b3a104761cd34e48ccec049b1f51bb18b9c55c83371fe1e78adbb34a1a9b9e33d46d017bb93898d
7
+ data.tar.gz: d7bbf67ba09b13516d3e02536eb1b20a9a7a40b484aca5c468386c8e03ededb478d98acf9d66f0b27f4e3be2e4d577691315359ee9a2d688466e879639d07aa4
data/cli_helper.gemspec CHANGED
@@ -4,7 +4,7 @@ $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.1.6'
7
+ spec.version = '0.1.8'
8
8
  spec.authors = ["Dewayne VanHoozer"]
9
9
  spec.email = ["dvanhoozer@gmail.com"]
10
10
 
@@ -31,10 +31,10 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency 'configatron'
32
32
  spec.add_dependency 'nenv'
33
33
  spec.add_dependency 'inifile'
34
- spec.add_dependency 'slop', "~> 4.0"
34
+ spec.add_dependency 'slop', "~> 4.2"
35
35
 
36
- spec.add_development_dependency "bundler", "~> 1.9"
37
- spec.add_development_dependency "rake", "~> 10.0"
36
+ spec.add_development_dependency "bundler"
37
+ spec.add_development_dependency "rake"
38
38
  spec.add_development_dependency 'kick_the_tires'
39
39
  spec.add_development_dependency 'awesome_print'
40
40
  spec.add_development_dependency 'debug_me'
data/example/cli_stub.rb CHANGED
@@ -7,34 +7,40 @@
7
7
  ## By: Dewayne VanHoozer (dvanhoozer@gmail.com)
8
8
  #
9
9
 
10
+ require 'debug_me'
11
+ include DebugMe
12
+
10
13
  require 'awesome_print'
11
14
 
12
15
  require '../lib/cli_helper'
13
16
  include CliHelper
14
17
 
15
- configatron.version = '0.0.2' # the version of this utility program
16
- configatron.enable_config_files = true # default is false
18
+ configatron.version = '0.0.3' # the version of this utility program
19
+ configatron.enable_config_files = false # default is false
17
20
  configatron.disable_help = false # default is false set true to remove the option
18
21
  configatron.disable_verbose = false # ditto
19
22
  configatron.disable_debug = false # ditto
20
23
  configatron.disable_version = false # ditto
21
- configatron.suppress_errors = false # set to true to eat exceptions; unknown options added to arguments
24
+ configatron.suppress_errors = true # default is true; set to false to receive exceptions from Slop
22
25
 
23
26
 
24
27
  # Sometimes you may have a few default config files that you
25
28
  # want to apply before the command-line options. Do it like
26
- # something like this:
29
+ # this:
30
+
31
+ =begin
27
32
  %w[
28
33
  ../tests/config/sample.yml
29
34
  ../tests/config/sample.yml.erb
30
35
  ].each do |dcf|
31
36
  cli_helper_process_config_file(dcf)
32
37
  end
38
+ =end
33
39
 
34
40
  # OR just pass a directory and all of the config files in the
35
41
  # directory will be processed:
36
42
 
37
- cli_helper_process_config_file('../tests/config')
43
+ # cli_helper_process_config_file('../tests/config')
38
44
 
39
45
 
40
46
  # HELP is extra stuff shown with usage. It is optional. You
@@ -66,7 +72,7 @@ EOHELP
66
72
  #
67
73
  # -h, --help will automatically show a usage message on STDOUT and exit the program
68
74
  # --version will print the program's version string to STDOUT and exit
69
- # =v, --verbose will set the verbose boolean to true.
75
+ # -v, --verbose will set the verbose boolean to true.
70
76
  # -d, --debug will set the debug boolean to true.
71
77
  # All boolean options have '?' and '!' methods generated, For example debug? and
72
78
  # verbose? are automatically generated. Any program-specific booleans specified will
@@ -78,26 +84,55 @@ cli_helper("An example use of cli_helper") do |o|
78
84
  # For a complete list of stuff see Slop on github.com
79
85
  # https://github.com/leejarvis/slop
80
86
 
87
+ # boolean parameters will also generate the methods long-parameter? and long-parameter!
88
+ # for example this line:
89
+ o.bool '-b', '--bullstuff', default: false
90
+
91
+ # will auto generate the methods bullstuff? and bullstuff!
92
+ # where bullstuff? returns the value of configatron.bullstuff
93
+ # and bullstuff! sets the value of configatron.bullstuff to true
94
+ #
95
+ # NOTE: boolean options are special in that default: false is assumed
96
+ # when no default item is provided. This means that
97
+ # o.bool '-e', 'Example', default: false
98
+ # and o.bool '-e', 'Example'
99
+ # are treated identically. The value for the parameter will be false when the
100
+ # parameter is included on the command line.
101
+ #
102
+ # This is NOT the case for other parameter classes. For them, if no default is
103
+ # provided AND they are not present on the command line, THEN their value will be
104
+ # nil AND they will (by convention) be treated as a required parameter that has
105
+ # not been provided. This will result in a warning message being generated.
106
+
107
+
81
108
  o.string '-s', '--string', 'example string parameter', default: 'IamDefault'
82
- o.int '-i', '--int', 'example integer parameter', default: 42
109
+ o.string '-r', '--required', 'a required parameter' # I know its required because there is no default
110
+ o.bool '--xyzzy', 'a required boolean without a default', required: true
111
+
112
+ # NOTE: you can use many "flags" in defining an option. Each is valid on the command line.
113
+ # However, only the last flag can be used to retrieve the value via the configatron capability.
114
+ # To get the value entered by the user for this integer parameter you must use:
115
+ # configatron.i3 or configatron['i3'] or configatron[:i3]
83
116
 
84
- # FIXME: an issue with Slop
85
- #o.float '-f', '--float', 'example float parameter', default: (22.0 / 7.0)
117
+ o.int '-i', '--i2', '--i3', 'example integer parameter', default: 42
86
118
 
119
+
120
+ o.float '-f', '--float', 'example float parameter', default: (22.0 / 7.0)
87
121
  o.array '-a', '--array', 'example array parameter', default: [:bob, :carol, :ted, :alice]
88
122
  o.path '-p', '--path', 'example Pathname parameter', default: Pathname.new('default/path/to/file.txt')
89
- o.paths '--paths', 'example Pathnames parameter', delimiter: ',', default: ['default/path/to/file.txt',
90
- 'file2.txt'].map{|f| Pathname.new f}
123
+ o.paths '--paths', 'example Pathnames parameter', delimiter: ',',
124
+ default: ['default/path/to/file.txt', 'file2.txt'].map{|f| Pathname.new f}
91
125
 
92
- # FIXME: Issue with Slop; default is not passed to the block. When no parameter is
93
- # given, an exception is raised. Using the suppress_errors: true option silents
94
- # the exception BUT still the default value is not passed to the block.
95
- # This issue has been raised with the Slop author and a fix is in the works.
96
126
  o.string '-n', '--name', 'print Hello <name>', default: 'World!', suppress_errors: true do |a_string|
97
127
  a_string = 'world' if a_string.empty?
98
128
  puts "Hello #{a_string}"
99
129
  end
100
130
 
131
+ o.on '--quit', "print 'Take this option and do it!' and then exit" do
132
+ puts 'Take this option and do it!'
133
+ exit
134
+ end
135
+
101
136
  end
102
137
 
103
138
  # ARGV is not touched. However all command line parameters that are not consummed
@@ -125,8 +160,6 @@ if configatron.arguments.include?('warning')
125
160
  end
126
161
 
127
162
  =begin
128
-
129
- rescue
130
163
  configatron.errors and configatron.warnings are of type Array.
131
164
  All warnings will be presented to the user. The user will
132
165
  be asked wither the program should be aborted.
@@ -172,3 +205,42 @@ EOS
172
205
 
173
206
  puts stub
174
207
 
208
+ # The values of command line parameters are available anywhere via configatron as
209
+ # either methods or hash keys. The name of the method/key is the name of the
210
+ # last "flag" defined for that option. For example the name option was defined
211
+ # with the flags "-n" and "--name" so you can access that parameter like this:
212
+
213
+ puts "\n\nHello #{configatron.name}"
214
+
215
+ # or like this:
216
+
217
+ puts "Hello #{configatron['name']}"
218
+
219
+ # or like this:
220
+
221
+ puts "Hello #{configatron[:name]}\n\n"
222
+
223
+ __END__
224
+
225
+ The same thing is true if only a single letter "-z" is used.
226
+ Access the value like this:
227
+
228
+ configatron.z
229
+ configatron['z']
230
+ configatron[:z]
231
+
232
+ Regardless of how many "flags" are defined for an option, it is only the
233
+ last one in the list that is used to access its value. In the "name" example
234
+ about you CANNOT access the value via configatron.n because "--name" was the
235
+ last flag defined for the option.
236
+
237
+ When the user enters a "flag" more than once on a command line only the value of
238
+ The last entry will be kept.
239
+
240
+ Run this program with the following parameters and see what happens:
241
+
242
+ -n Tom -n Dick -n Harry
243
+
244
+ you should get a warning that there were multiple entries on the command
245
+ line. The value that is used will be the last one - "Harry"
246
+
data/lib/cli_helper.rb CHANGED
@@ -60,11 +60,11 @@ module CliHelper
60
60
  disable_debug: false,
61
61
  disable_verbose: false,
62
62
  disable_version: false,
63
- suppress_errors: false,
63
+ suppress_errors: true, # suppress the exceptions generated by Slop
64
64
  ini_comment: '#',
65
65
  ini_seperator: '=',
66
66
  ini_encoding: 'UTF-8',
67
- user_name: Nenv.user || Nenv.user_name || Nenv.logname || 'The Unknown Programmer',
67
+ user_name: Nenv.user || Nenv.user_name || Nenv.logname || 'The Unknown User',
68
68
  home_path: Pathname.new(Nenv.home),
69
69
  cli: 'a place holder for the Slop object',
70
70
  errors: [],
@@ -75,8 +75,8 @@ module CliHelper
75
75
 
76
76
  configatron.required_by_filename = caller.last.split(':').first
77
77
  configatron.me = Pathname.new(configatron.required_by_filename).realpath
78
- configatron.my_dir = Pathname.new(configatron.required_by_filename).realpath.parent
79
- configatron.my_name = Pathname.new(configatron.required_by_filename).realpath.basename.to_s
78
+ configatron.my_dir = configatron.me.parent
79
+ configatron.my_name = configatron.me.basename.to_s
80
80
 
81
81
 
82
82
  # Return full pathname of program
@@ -84,32 +84,41 @@ module CliHelper
84
84
  configatron.me
85
85
  end
86
86
 
87
+
87
88
  # Return full pathname of program
88
89
  def my_dir
89
90
  configatron.my_dir
90
91
  end
91
92
  alias :root :my_dir
92
93
 
94
+
93
95
  # Returns the basename of the program as a string
94
96
  def my_name
95
97
  configatron.my_name
96
98
  end
97
99
 
100
+
98
101
  # Returns the version of the program as a string
99
102
  def version
100
103
  configatron.version
101
104
  end
102
105
 
106
+
107
+ # Extract options and values from an ERB formatted config file
103
108
  def cli_helper_process_erb(file_contents)
104
109
  erb_contents = ERB.new(file_contents).result
105
110
  return erb_contents
106
111
  end
107
112
 
113
+
114
+ # Extract options and values from a YAML formatted config file
108
115
  def cli_helper_process_yaml(file_contents='')
109
116
  a_hash = YAML.load file_contents
110
117
  return a_hash
111
118
  end
112
119
 
120
+
121
+ # Extract options and values from an INI formated config file
113
122
  def cli_helper_process_ini(file_contents='')
114
123
  an_ini_object = IniFile.new(
115
124
  content: file_contents,
@@ -120,6 +129,8 @@ module CliHelper
120
129
  return an_ini_object.to_h
121
130
  end
122
131
 
132
+
133
+ # Obtain options and values from a config file
123
134
  def cli_helper_process_config_file(a_cf)
124
135
  cf = String == a_cf.class ? Pathname.new(a_cf) : a_cf
125
136
  if cf.directory?
@@ -184,8 +195,12 @@ module CliHelper
184
195
  # parameters provided via a block. Create '?'
185
196
  # for all boolean parameters that have a '--name' flag form.
186
197
  # Returns a Slop::Options object
187
- def cli_helper(my_banner='')
188
- param = Slop::Options.new
198
+ def cli_helper( my_banner='',
199
+ slop_options_config={}
200
+ )
201
+ default_config = { suppress_errors: configatron.suppress_errors }
202
+
203
+ param = Slop::Options.new( default_config.merge(slop_options_config) )
189
204
 
190
205
  if my_banner.empty?
191
206
  param.banner = "Usage: #{my_name} [options] ..."
@@ -233,8 +248,38 @@ module CliHelper
233
248
  end
234
249
 
235
250
  parser = Slop::Parser.new(param, suppress_errors: configatron.suppress_errors)
251
+
236
252
  configatron.cli = parser.parse(ARGV)
237
253
 
254
+ # Lets do some error checking ...
255
+ configatron.cli.options.options.each do |opt|
256
+ if opt.count > 1
257
+ warning "#{opt.desc} #{opt.flags.inspect} entered more than once; only last value is used"
258
+ end
259
+ if opt.value.nil?
260
+ if opt.config.default.nil?
261
+ # NOTE: why is this a warning and not an error?
262
+ # while it may be required, it might be set in a config file
263
+ # so we let the user decide to continue or abort.
264
+ # SMELL: see below, past the loading of the config file values.
265
+ warning "Required parameter is missing: #{opt.desc} #{opt.flags.inspect}"
266
+ end
267
+ end
268
+ end
269
+
270
+ unless configatron.cli.arguments.empty?
271
+ bad_options = configatron.cli.arguments.select {|o| o.start_with?('-')}
272
+ unless bad_options.empty?
273
+ error "Invalid parameters: #{bad_options.inspect}"
274
+ bad_options.each do |o|
275
+ x = configatron.cli.arguments.index(o)
276
+ configatron.cli.arguments[x] = nil
277
+ end
278
+ configatron.cli.arguments.compact!
279
+ end
280
+ end
281
+
282
+
238
283
  # NOTE: The config files are being process before the
239
284
  # command line options in order for the command
240
285
  # line options to over-write the values from the
@@ -245,6 +290,10 @@ module CliHelper
245
290
  end # configatron.cli.config.each do |cf|
246
291
  end # if configatron.enable_config_files
247
292
 
293
+ # SMELL: a required parameter that is not entered on the command line
294
+ # will have a value of nil. IF THAT parameter had been
295
+ # set in a config file, this will overlay the valid value
296
+ # with an invalid nil.
248
297
  configatron.configure_from_hash(configatron.cli.to_hash)
249
298
  configatron.arguments = configatron.cli.arguments
250
299
 
@@ -272,6 +321,7 @@ module CliHelper
272
321
  return param
273
322
  end # def cli_helper
274
323
 
324
+
275
325
  # Returns the usage/help information as a string
276
326
  def usage
277
327
  a_string = configatron.cli.to_s + "\n"
@@ -279,13 +329,16 @@ module CliHelper
279
329
  return a_string
280
330
  end
281
331
 
332
+
282
333
  # Prints to STDOUT the usage/help string
283
334
  def show_usage
284
335
  puts usage()
285
336
  end
286
337
 
287
338
 
288
- # Returns an array of valid files of one type
339
+ # Returns an array of valid files of valid type(s)
340
+ # Creates warnings for files not matching the valid extensions.
341
+ # Generates errors fpr files that do not exist
289
342
  def get_pathnames_from(an_array, extnames=['.json', '.txt', '.docx'])
290
343
  an_array = [an_array] unless an_array.is_a? Array
291
344
  extnames = [extnames] unless extnames.is_a? Array
@@ -300,7 +353,7 @@ module CliHelper
300
353
  if extnames.include?(pfn.extname.downcase)
301
354
  file_array << pfn
302
355
  else
303
- error "File extension is not #{extnames.join(' or ')} file: #{pfn}"
356
+ warning "File ignored because extension is not #{extnames.join(' or ')} file: #{pfn}"
304
357
  end
305
358
  else
306
359
  error "File does not exist: #{pfn}"
@@ -337,15 +390,29 @@ module CliHelper
337
390
  end
338
391
  end # def abort_if_errors
339
392
 
393
+
340
394
  # Adds a string to the global $errors array
341
395
  def error(a_string)
342
396
  configatron.errors << a_string
343
397
  end
344
398
 
399
+
400
+ # Returns an Array of errors
401
+ def errors
402
+ configatron.errors
403
+ end
404
+
405
+
345
406
  # Adds a string to the global $warnings array
346
407
  def warning(a_string)
347
408
  configatron.warnings << a_string
348
409
  end
349
410
 
411
+
412
+ # Returns an Array of warnings
413
+ def warnings
414
+ configatron.warnings
415
+ end
416
+
350
417
  end # module CliHelper
351
418
 
@@ -160,9 +160,7 @@ end
160
160
 
161
161
 
162
162
 
163
-
164
-
165
- #it '888 prints usage()' do
163
+ #it '060 prints usage()' do
166
164
  puts
167
165
  puts "="*45
168
166
  show_usage
@@ -215,6 +213,102 @@ EOS
215
213
  end
216
214
  #end
217
215
 
216
+ #it '070 warns about multiple uses of a paramager on the command line' do
217
+ ARGV = "-n Tom -n Dick -n Harry".split
218
+ configatron.warnings = []
219
+ assert configatron.warnings.empty?
220
+
221
+ cli_helper do |o|
222
+ o.string '-n', '--name', 'Hello <name>'
223
+ end
224
+
225
+ assert_equal 1, configatron.warnings.size
226
+ assert configatron.warnings.first.include?('entered more than once; only last value is used')
227
+ #end
228
+
229
+
230
+ #it '080 warns about missiong value and undefined flag' do
231
+ ARGV = "--WooWho -n".split
232
+ configatron.warnings = []
233
+ configatron.errors = []
234
+ assert configatron.warnings.empty?
235
+
236
+ cli_helper do |o|
237
+ o.string '-n', '--name', 'Hello <name>'
238
+ end
239
+
240
+ assert_equal 1, configatron.warnings.size
241
+ assert_equal 'Required parameter is missing: Hello <name> ["-n", "--name"]', configatron.warnings.first
242
+
243
+ assert_equal 1, configatron.errors.size
244
+ assert_equal 'Invalid parameters: ["--WooWho"]', configatron.errors.first
245
+ #end
246
+
247
+
248
+ #it '090 generates exception' do
249
+ # Do not recommend using exceptions to communicate errors and warnings.
250
+ # because only one exception can be generated at a time. Its better to
251
+ # alert the user to all known problems than to just detect and report
252
+ # only one problem at a time.
253
+
254
+ ARGV = "--WooWho -n".split # This string has two errors but only one will be deteched.
255
+ configatron.warnings = []
256
+ configatron.errors = []
257
+ assert configatron.warnings.empty?
258
+
259
+ configatron.suppress_errors = false
260
+
261
+ exception_text = 'there was no exception'
262
+
263
+ begin
264
+ cli_helper do |o|
265
+ o.string '-n', '--name', 'Hello <name>'
266
+ end
267
+ rescue Exception => e
268
+ exception_text = e
269
+ end
270
+
271
+ assert_equal "unknown option `--WooWho'", exception_text
272
+
273
+ assert_equal 0, configatron.warnings.size
274
+ assert_equal 0, configatron.errors.size
275
+ #end
276
+
277
+ #it '092 generates exception' do
278
+ # Do not recommend using exceptions to communicate errors and warnings.
279
+ # because only one exception can be generated at a time. Its better to
280
+ # alert the user to all known problems than to just detect and report
281
+ # only one problem at a time.
282
+
283
+ # change the order from the previous test does not change the results
284
+ # because the first this that is checked by Slop is unknown flags. Then it checks
285
+ # for missing arguments in the remaining flags. Slop will generate an exception
286
+ # on the first error it finds. There is no way to cause Slop to resume checking
287
+ # the remaining command line parameters.
288
+ ARGV = "-n".split # This string has no unknown flags.
289
+ configatron.warnings = []
290
+ configatron.errors = []
291
+ assert configatron.warnings.empty?
292
+
293
+ configatron.suppress_errors = false
294
+
295
+ exception_text = 'there was no exception'
296
+
297
+ begin
298
+ cli_helper do |o|
299
+ o.string '-n', '--name', 'Hello <name>'
300
+ end
301
+ rescue Exception => e
302
+ exception_text = e
303
+ end
304
+
305
+ assert_equal "missing argument for -n, --name", exception_text
306
+
307
+ assert_equal 0, configatron.warnings.size
308
+ assert_equal 0, configatron.errors.size
309
+ #end
310
+
311
+
218
312
  #it '999 Show the options structure' do
219
313
  puts '*'*45
220
314
  ap configatron.to_h
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cli_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dewayne VanHoozer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-02 00:00:00.000000000 Z
11
+ date: 2016-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: configatron
@@ -58,42 +58,42 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '4.0'
61
+ version: '4.2'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '4.0'
68
+ version: '4.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '1.9'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '1.9'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '10.0'
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '10.0'
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: kick_the_tires
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -201,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
201
  version: '0'
202
202
  requirements: []
203
203
  rubyforge_project:
204
- rubygems_version: 2.4.5.1
204
+ rubygems_version: 2.6.4
205
205
  signing_key:
206
206
  specification_version: 4
207
207
  summary: An encapsulation of an integration of slop, nenv, inifile and configatron.