everyday-cli-utils 1.5.2 → 1.6.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: 586fc1d3c19d2169300d7b36c6d595f9380e0479
4
- data.tar.gz: 785d25b280556ea822a7cdd789fc4032f867ca42
3
+ metadata.gz: 0681993f800f4e74b8c294475c3ab23daeaed47b
4
+ data.tar.gz: 88e392ad10471b71a496797a2dc07feb887e4a52
5
5
  SHA512:
6
- metadata.gz: c98b17a3477a80fec2e86837c4b08e5213e5c2c3ea4056cdd9403f0ce91ea9c0a6e278e3598bf08234e9244721d85ffdc58092d3d67eb681738acd8ebb485465
7
- data.tar.gz: 2dacccdba641c43fdd1e0b2f9b9992848f611cc90a6a8306f6ac2807a2128e9f290a6d425be68b561f4ce8904f949ec67354dce4c43c05f4f9835f2d9acc8772
6
+ metadata.gz: 333e611ce51e61d7299da6f573d1a8f9ff83a30c9da2a98b3bb0e9f91c73e389687522a0e1b74d602dcab6f4b43dd262c04663612426b72e13c49e013beb8d4e
7
+ data.tar.gz: 64bc0c10b336847de4ea2b87377dd62c48d611a435e693aa563d5cd1c53380a7e792f5ca789b56a4359b4c1901259cbf200b435c0a594582e0c91947dcf9f477
@@ -96,10 +96,11 @@ module EverydayCliUtils
96
96
  end
97
97
 
98
98
  class OptionDef
99
- attr_reader :value
99
+ attr_reader :value, :names
100
100
 
101
- def initialize(type, settings = {}, &block)
101
+ def initialize(type, names, settings = {}, &block)
102
102
  @type = type
103
+ @names = names
103
104
  @settings = settings
104
105
  @block = block
105
106
  @value = OptionTypes.default_value(type, settings)
@@ -129,7 +130,7 @@ module EverydayCliUtils
129
130
  def self.register(opts, options, type, opt_name, names, settings = {}, default_settings = {}, &block)
130
131
  settings = settings.clone
131
132
  default_settings.each { |v| settings[v[0]] = v[1] unless settings.has_key?(v[0]) }
132
- opt = OptionDef.new(type, settings, &block)
133
+ opt = OptionDef.new(type, names.clone, settings, &block)
133
134
  options[opt_name] = opt
134
135
  names = OptionTypes.mod_names(type, names, settings)
135
136
  opts.on(*names) { |*args|
@@ -187,6 +188,52 @@ module EverydayCliUtils
187
188
  def parse!(argv = ARGV)
188
189
  @opts.parse!(argv)
189
190
  end
191
+
192
+ def show_defaults
193
+ script_defaults = composite
194
+ global_defaults = composite(:global)
195
+ local_defaults = composite(:global, :local)
196
+ global_diff = hash_diff(global_defaults, script_defaults)
197
+ local_diff = hash_diff(local_defaults, global_defaults)
198
+ str = "Script Defaults:\n#{options_to_str(script_defaults)}\n"
199
+ str << "Script + Global Defaults:\n#{options_to_str(global_diff)}\n" unless global_diff.empty?
200
+ str << "Script + Global + Local Defaults:\n#{options_to_str(local_diff)}\n" unless local_diff.empty?
201
+ str
202
+ end
203
+
204
+ def hash_diff(hash1, hash2)
205
+ new_hash = {}
206
+ hash1.keys.each { |k| new_hash[k] = hash1[k] unless hash2.has_key?(k) && hash1[k] == hash2[k] }
207
+ new_hash
208
+ end
209
+
210
+ def options_to_str(options)
211
+ str = ''
212
+ max_name_len = @options.values.map { |v| v.names.join(', ').length }.max
213
+ options.each { |v|
214
+ opt = @options[v[0]]
215
+ val = v[1]
216
+ names_str = opt.names.join(', ')
217
+ str << "#{' ' * 4}#{names_str}#{' ' * ((max_name_len + 4) - names_str.length)}#{val_to_str(val)}\n"
218
+ }
219
+ str
220
+ end
221
+
222
+ def val_to_str(val)
223
+ if val.nil?
224
+ 'nil'
225
+ elsif val.is_a?(TrueClass)
226
+ 'true'
227
+ elsif val.is_a?(FalseClass)
228
+ 'false'
229
+ elsif val.is_a?(Enumerable)
230
+ "[#{val.map { |v| val_to_str(v) }.join(', ')}]"
231
+ elsif val.is_a?(Numeric)
232
+ val.to_s
233
+ else
234
+ "'#{val.to_s}'"
235
+ end
236
+ end
190
237
  end
191
238
 
192
239
  module OptionUtil
@@ -218,8 +265,12 @@ module EverydayCliUtils
218
265
  @options.opts.on(*names) { @set_global_defaults = true }
219
266
  end
220
267
 
221
- def show_defaults_option(layers, names, settings = {})
222
-
268
+ def show_defaults_option(names, settings = {})
269
+ @options ||= OptionList.new
270
+ @show_defaults = false
271
+ @exit_on_show_defaults = !settings.has_key?(:exit_on_show) || settings[:exit_on_show]
272
+ names << settings[:desc] if settings.has_key?(:desc)
273
+ @options.opts.on(*names) { @show_defaults = true }
223
274
  end
224
275
 
225
276
  def help_option(names, settings = {})
@@ -285,6 +336,10 @@ module EverydayCliUtils
285
336
  puts help
286
337
  exit 0 if @exit_on_print
287
338
  end
339
+ if @show_defaults
340
+ puts @options.show_defaults
341
+ exit 0 if @exit_on_show_defaults
342
+ end
288
343
  if @set_global_defaults
289
344
  IO.write(@global_defaults_file, @options.composite(:global, :arg).to_yaml)
290
345
  if @exit_on_global_save
@@ -1,3 +1,3 @@
1
1
  module EverydayCliUtils
2
- VERSION = '1.5.2'
2
+ VERSION = '1.6.0'
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require_relative '../../lib/everyday-cli-utils'
2
+ require 'rspec'
2
3
  include EverydayCliUtils
3
4
  import :format
4
5
 
@@ -185,24 +185,83 @@ describe EverydayCliUtils::OptionUtil do
185
185
  end
186
186
 
187
187
  it 'supports layers' do
188
- expected1 = { opt1: true }
189
- expected2 = { opt1: false }
190
- clean = { opt1: false }
191
- opt = Option1.new
192
- opt.default_settings toggle: true
188
+ global = { opt1: false, opt2: [], opt3: 'hi', opt4: [5] }
189
+ global_arg = { opt1: true, opt2: [], opt3: 'hi', opt4: [5] }
190
+ arg = { opt1: false, opt2: [], opt3: nil, opt4: [] }
191
+ total = { opt1: true, opt2: %w(hi bye), opt3: 'bye', opt4: [5, 4] }
192
+ global_local = { opt1: false, opt2: %w(hi bye), opt3: 'bye', opt4: [5, 4] }
193
+ local = { opt1: true, opt2: %w(hi bye), opt3: 'bye', opt4: [4] }
194
+ local_arg = { opt1: false, opt2: %w(hi bye), opt3: 'bye', opt4: [4] }
195
+ clean = { opt1: false, opt2: [], opt3: nil, opt4: [] }
196
+ clean2 = { opt1: true, opt2: [], opt3: nil, opt4: [] }
197
+ opt = Option1.new
198
+ opt.default_settings toggle: true, append: true
193
199
  opt.option :opt1, %w(-1 --opt-1)
200
+ opt.option_with_param :opt2, %w(-2 --big-opt-2)
201
+ opt.option_with_param :opt3, %w(-3 --bigger-opt-3), append: false
202
+ opt.option_with_param :opt4, %w(-4 --even-bigger-opt-4), type: Integer
194
203
  opt.options.should eq clean
195
- opt.default_options opt1: false
196
- opt.apply_options :global, opt1: true
197
- opt.options.should eq expected1
198
- opt.apply_options :local, opt1: false
199
- opt.options.should eq expected1
204
+ opt.option_list.show_defaults.should eq <<SHOW
205
+ Script Defaults:
206
+ -1, --opt-1 false
207
+ -2 PARAM, --big-opt-2 []
208
+ -3 PARAM, --bigger-opt-3 nil
209
+ -4 PARAM, --even-bigger-opt-4 []
210
+
211
+ SHOW
212
+ opt.default_options opt1: true
213
+ opt.options.should eq clean2
214
+ opt.option_list.show_defaults.should eq <<SHOW
215
+ Script Defaults:
216
+ -1, --opt-1 true
217
+ -2 PARAM, --big-opt-2 []
218
+ -3 PARAM, --bigger-opt-3 nil
219
+ -4 PARAM, --even-bigger-opt-4 []
220
+
221
+ SHOW
222
+ opt.apply_options :global, opt1: true, opt3: 'hi', opt4: [5]
223
+ opt.options.should eq global
224
+ opt.option_list.show_defaults.should eq <<SHOW
225
+ Script Defaults:
226
+ -1, --opt-1 true
227
+ -2 PARAM, --big-opt-2 []
228
+ -3 PARAM, --bigger-opt-3 nil
229
+ -4 PARAM, --even-bigger-opt-4 []
230
+
231
+ Script + Global Defaults:
232
+ -1, --opt-1 false
233
+ -3 PARAM, --bigger-opt-3 'hi'
234
+ -4 PARAM, --even-bigger-opt-4 [5]
235
+
236
+ SHOW
237
+ opt.apply_options :local, opt1: false, opt2: %w(hi bye), opt3: 'bye', opt4: [4]
238
+ opt.options.should eq global_local
239
+ opt.option_list.show_defaults.should eq <<SHOW
240
+ Script Defaults:
241
+ -1, --opt-1 true
242
+ -2 PARAM, --big-opt-2 []
243
+ -3 PARAM, --bigger-opt-3 nil
244
+ -4 PARAM, --even-bigger-opt-4 []
245
+
246
+ Script + Global Defaults:
247
+ -1, --opt-1 false
248
+ -3 PARAM, --bigger-opt-3 'hi'
249
+ -4 PARAM, --even-bigger-opt-4 [5]
250
+
251
+ Script + Global + Local Defaults:
252
+ -2 PARAM, --big-opt-2 ['hi', 'bye']
253
+ -3 PARAM, --bigger-opt-3 'bye'
254
+ -4 PARAM, --even-bigger-opt-4 [5, 4]
255
+
256
+ SHOW
200
257
  opt.apply_options :arg, opt1: true
201
- opt.options.should eq expected2
202
- opt.option_list.composite(:global, :arg).should eq expected2
203
- opt.option_list.composite(:global).should eq expected1
204
- opt.option_list.composite(:local, :arg).should eq expected1
205
- opt.option_list.composite(:arg).should eq expected1
206
- opt.option_list.composite(:global, :local, :arg).should eq expected2
258
+ opt.options.should eq total
259
+ opt.option_list.composite(:global, :arg).should eq global_arg
260
+ opt.option_list.composite(:global, :local).should eq global_local
261
+ opt.option_list.composite(:global).should eq global
262
+ opt.option_list.composite(:local).should eq local
263
+ opt.option_list.composite(:local, :arg).should eq local_arg
264
+ opt.option_list.composite(:arg).should eq arg
265
+ opt.option_list.composite(:global, :local, :arg).should eq total
207
266
  end
208
267
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: everyday-cli-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Henderson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-27 00:00:00.000000000 Z
11
+ date: 2014-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler