everyday-cli-utils 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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