cli_tool 0.1.0 → 0.1.2
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.
- data/lib/cli_tool/option_parser.rb +74 -95
- data/lib/cli_tool/remote.rb +9 -1
- data/lib/cli_tool/stdin_out.rb +5 -1
- data/lib/cli_tool/version.rb +1 -1
- metadata +2 -2
@@ -8,13 +8,14 @@ module CliTool
|
|
8
8
|
# Use to add the methods below to any class
|
9
9
|
def self.included(base)
|
10
10
|
base.extend(ClassMethods)
|
11
|
+
base.__send__(:include, ::CliTool::StdinOut)
|
11
12
|
base.options({
|
12
13
|
debug: {
|
13
14
|
argument: :none,
|
14
15
|
documentation: [
|
15
16
|
"This is used to trigger debug mode in your app. It will be set to #{base}.debug.",
|
16
17
|
"In debug mode we do not respect the secure option and your secure fields will be displayed in clear text!",
|
17
|
-
[:black, :
|
18
|
+
[:black, :red_bg]
|
18
19
|
]
|
19
20
|
},
|
20
21
|
help: {
|
@@ -29,20 +30,16 @@ module CliTool
|
|
29
30
|
|
30
31
|
# Map for symbol types
|
31
32
|
GOL_MAP = {
|
32
|
-
none:
|
33
|
+
none: GetoptLong::NO_ARGUMENT,
|
33
34
|
optional: GetoptLong::OPTIONAL_ARGUMENT,
|
34
35
|
required: GetoptLong::REQUIRED_ARGUMENT
|
35
36
|
}
|
36
37
|
|
37
38
|
# Create the options array
|
38
39
|
def options(opts = nil)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
return @@options.uniq unless opts
|
43
|
-
|
44
|
-
_create_preprocess_(opts)
|
45
|
-
@@options = @@options.concat(_create_gola_(opts)).uniq
|
40
|
+
return (__get_options(:gol_options) || []).uniq unless opts
|
41
|
+
__process_options(opts)
|
42
|
+
true
|
46
43
|
end
|
47
44
|
|
48
45
|
# Ensure the right format of the options (primarily dashes and casing)
|
@@ -57,21 +54,17 @@ module CliTool
|
|
57
54
|
case retval
|
58
55
|
when :set, :setter
|
59
56
|
"#{option}="
|
57
|
+
when :dash, :hyphen, :clize
|
58
|
+
"#{option}".gsub(/=$/, '').gsub('_', '-')
|
60
59
|
when :primary
|
61
60
|
all_opts = __get_options(:all_options)
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
opt
|
70
|
-
else
|
71
|
-
nil
|
72
|
-
end
|
73
|
-
}.compact.flatten.first
|
74
|
-
end
|
61
|
+
hyphenated = optionify(option, :hyphen)
|
62
|
+
option = all_opts.has_key?(hyphenated) ? option : Proc.new {
|
63
|
+
all_opts.reduce(nil) do |result, (opt, opt_args)|
|
64
|
+
[opt].concat(opt_args[:aliases]).include?(hyphenated) ? opt : result
|
65
|
+
end
|
66
|
+
}.call
|
67
|
+
optionify(option)
|
75
68
|
else
|
76
69
|
option
|
77
70
|
end
|
@@ -121,7 +114,8 @@ module CliTool
|
|
121
114
|
|
122
115
|
# Option setter proc
|
123
116
|
option_setter = Proc.new do |option, value|
|
124
|
-
|
117
|
+
option_attr = optionify(option, :primary)
|
118
|
+
option = optionify(option_attr, :dash)
|
125
119
|
processed_options << option
|
126
120
|
|
127
121
|
# Help process values
|
@@ -146,18 +140,19 @@ module CliTool
|
|
146
140
|
end
|
147
141
|
|
148
142
|
# Show notice of the setting being set on the instance
|
149
|
-
if class_vars[:private_options].include?(option) && !
|
150
|
-
|
143
|
+
if class_vars[:private_options].include?(option) && ! object.debug
|
144
|
+
value_hidden = value.respond_to?(:length) ? ('*' * value.length).inspect : colorize('<hidden>', :italic)
|
145
|
+
m = "Setting @#{option_attr} = #{value_hidden} :: Value hidden for privacy"
|
151
146
|
max_puts_length = m.length if m.length > max_puts_length
|
152
147
|
puts m, :blue
|
153
148
|
else
|
154
|
-
m = "Setting @#{
|
149
|
+
m = "Setting @#{option_attr} = #{value.inspect}"
|
155
150
|
max_puts_length = m.length if m.length > max_puts_length
|
156
151
|
puts m, :green
|
157
152
|
end
|
158
153
|
|
159
154
|
# Do the actual set for us
|
160
|
-
object.__send__(optionify(
|
155
|
+
object.__send__(optionify(option_attr, :set), value)
|
161
156
|
end
|
162
157
|
|
163
158
|
# Actually grab the options from GetoptLong and process them
|
@@ -296,112 +291,93 @@ module CliTool
|
|
296
291
|
|
297
292
|
private
|
298
293
|
|
299
|
-
def
|
294
|
+
def __process_options(opts)
|
295
|
+
# Standardize the options input to have hash arguments and hypenated options
|
296
|
+
opts = opts.reduce({}) do |standardized_options, (options, option_args)|
|
297
|
+
option_args = option_args.is_a?(Hash) ? option_args : {argument: option_args}
|
298
|
+
option_args[:aliases] = optionify_all((option_args[:aliases] || []).concat([options]), :dash)
|
299
|
+
standardized_options.merge(option_args[:aliases].shift => option_args)
|
300
|
+
end
|
300
301
|
|
301
302
|
# Set the preprocessor for options (used primarily for formatting or changing types)
|
302
|
-
__generic_option_reducer(:preprocessors, {}, opts, only_with: :preprocess) do |pre_proc, (
|
303
|
-
pre_proc.merge(
|
303
|
+
__generic_option_reducer(:preprocessors, {}, opts, only_with: :preprocess) do |pre_proc, (option, option_args)|
|
304
|
+
pre_proc.merge(option => option_args[:preprocess])
|
304
305
|
end
|
305
306
|
|
306
307
|
# Set the required options and dependencies for the parser
|
307
|
-
__generic_option_reducer(:required_options, {}, opts, only_with: :required) do |req_opts, (
|
308
|
-
primary_name = options.shift
|
308
|
+
__generic_option_reducer(:required_options, {}, opts, only_with: :required) do |req_opts, (option, option_args)|
|
309
309
|
|
310
310
|
# Set the aliases for the required option
|
311
|
-
hash =
|
311
|
+
hash = option_args[:required].is_a?(Hash) ? option_args[:required] : {}
|
312
312
|
|
313
313
|
# Ensure that the option names are properly formatted in the alternatives and dependencies
|
314
|
-
hash[:dependencies] = optionify_all(hash[:dependencies])
|
315
|
-
hash[:alternatives] = optionify_all(hash[:alternatives])
|
314
|
+
hash[:dependencies] = optionify_all(hash[:dependencies], :dash)
|
315
|
+
hash[:alternatives] = optionify_all(hash[:alternatives], :dash)
|
316
316
|
|
317
317
|
# Merge together the options as required
|
318
318
|
if option_args[:required].is_a?(Hash)
|
319
|
-
req_opts.merge(
|
320
|
-
else
|
321
|
-
req_opts.merge(primary_name => hash.merge(force: !! option_args[:required]))
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
# Create a cache of all the options available
|
326
|
-
__generic_option_reducer(:all_options, {}, opts) do |opt_cache, (options, option_args)|
|
327
|
-
primary_name = options.shift
|
328
|
-
|
329
|
-
if option_args.is_a?(Hash)
|
330
|
-
opt_cache.merge(primary_name => option_args.merge(aliases: options))
|
319
|
+
req_opts.merge(option => hash)
|
331
320
|
else
|
332
|
-
|
321
|
+
req_opts.merge(option => hash.merge(force: !! option_args[:required]))
|
333
322
|
end
|
334
323
|
end
|
335
324
|
|
336
325
|
# Create a list of the "secure options" (hide value from client; as much as possible)
|
337
|
-
__generic_option_reducer(:private_options, [], opts, only_with: :private) do |priv_opts, (
|
338
|
-
primary_name = options.shift
|
339
|
-
|
326
|
+
__generic_option_reducer(:private_options, [], opts, only_with: :private) do |priv_opts, (option, option_args)|
|
340
327
|
if option_args[:private]
|
341
|
-
priv_opts <<
|
328
|
+
priv_opts << option
|
342
329
|
else
|
343
330
|
priv_opts
|
344
331
|
end
|
345
332
|
end
|
346
333
|
|
347
334
|
# Set the default options to be set when no values are passed
|
348
|
-
__generic_option_reducer(:default_options, {}, opts, only_with: :default) do |default_opts, (
|
349
|
-
default_opts.merge(
|
335
|
+
__generic_option_reducer(:default_options, {}, opts, only_with: :default) do |default_opts, (option, option_args)|
|
336
|
+
default_opts.merge(option => option_args[:default])
|
350
337
|
end
|
351
338
|
|
352
|
-
# Create the
|
353
|
-
|
354
|
-
options = optionify_all(options)
|
355
|
-
primary_name = options.shift
|
356
|
-
attr_accessor(primary_name)
|
357
|
-
end
|
358
|
-
end
|
339
|
+
# Create a cache of all the options available
|
340
|
+
__generic_option_reducer(:all_options, {}, opts)
|
359
341
|
|
360
|
-
|
361
|
-
|
342
|
+
# Create the Getoptlong syntax
|
343
|
+
__generic_option_reducer(:gol_options, [], opts) do |gol_options, (option, option_args)|
|
344
|
+
argument_dependency = GOL_MAP[option_args[:argument]]
|
345
|
+
aliases = option_args[:aliases] || []
|
362
346
|
|
363
|
-
|
364
|
-
|
365
|
-
opts.each do |opt, details|
|
347
|
+
# Create the attribute accessor
|
348
|
+
attr_accessor(optionify(option))
|
366
349
|
|
367
|
-
|
368
|
-
|
350
|
+
# Create the primary GOL option
|
351
|
+
gol_option =[ "--#{option}" ]
|
352
|
+
gol_option << "-#{option_args[:short]}" if option_args[:short]
|
353
|
+
gol_option << argument_dependency
|
369
354
|
|
370
|
-
#
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
end
|
355
|
+
# Get the primary setter
|
356
|
+
primary_setter = optionify(option, :set)
|
357
|
+
|
358
|
+
# Handle the aliases
|
359
|
+
gol_option_set = aliases.reduce([gol_option]) do |gol_list, ali|
|
360
|
+
alias_setter = optionify(ali, :set)
|
377
361
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
golao << GOL_MAP[dependency.to_sym]
|
382
|
-
|
383
|
-
# If the option has aliases then create
|
384
|
-
# additional GetoptLong Array options
|
385
|
-
if opt.is_a?(Array)
|
386
|
-
opt.each_with_index do |key, i|
|
387
|
-
golaot = golao.dup
|
388
|
-
golaot.shift if i > 0 # Remove Short Code
|
389
|
-
golaot.unshift("--#{key}")
|
390
|
-
gola << golaot
|
362
|
+
# Create the attribute accessor alias
|
363
|
+
define_method(alias_setter) do |value|
|
364
|
+
__send__(primary_setter, value)
|
391
365
|
end
|
392
|
-
|
393
|
-
|
394
|
-
|
366
|
+
|
367
|
+
# Create the GOL option aliases
|
368
|
+
gol_alias =[ "--#{ali}" ]
|
369
|
+
gol_alias << argument_dependency
|
370
|
+
gol_list << gol_alias
|
395
371
|
end
|
396
|
-
end
|
397
372
|
|
398
|
-
|
373
|
+
# Append to the option master list
|
374
|
+
gol_options.concat(gol_option_set)
|
375
|
+
end
|
399
376
|
end
|
400
377
|
|
401
378
|
private
|
402
379
|
|
403
380
|
def __generic_option_reducer(instance_var, default = [], opts = {}, args = {}, &block)
|
404
|
-
opts = opts.reduce({}) { |o, (k, v)| o.merge(optionify_all(k) => v) }
|
405
381
|
|
406
382
|
# Require certain keys be in the option cache. This is done to save time of the processing and make it easier to write
|
407
383
|
# the code to parse the options and set the requirements and dependencies of each option.
|
@@ -411,7 +387,10 @@ module CliTool
|
|
411
387
|
|
412
388
|
# Run the reducer and set the class variables accordingly
|
413
389
|
class_variable_set("@@__#{instance_var}", default) unless class_variable_defined?("@@__#{instance_var}")
|
414
|
-
|
390
|
+
cached_value = class_variable_get("@@__#{instance_var}") || default
|
391
|
+
|
392
|
+
# Set the value with either the reduce value or the passed value if no block was given
|
393
|
+
class_variable_set("@@__#{instance_var}", block_given? ? opts.reduce(cached_value, &block) : cached_value.merge(opts))
|
415
394
|
end
|
416
395
|
|
417
396
|
def __get_options(instance_var = nil)
|
data/lib/cli_tool/remote.rb
CHANGED
@@ -213,6 +213,10 @@ module CliTool
|
|
213
213
|
end
|
214
214
|
|
215
215
|
module ClassMethods
|
216
|
+
def script_plugin(object)
|
217
|
+
Script.__send__(:include, object)
|
218
|
+
end
|
219
|
+
|
216
220
|
def script(options = {}, &block)
|
217
221
|
script = Proc.new do
|
218
222
|
run = true
|
@@ -258,6 +262,10 @@ module CliTool
|
|
258
262
|
run(:run_suite!, *a, &b)
|
259
263
|
end
|
260
264
|
|
265
|
+
def run!(command, *a, &b)
|
266
|
+
run(command, *a, &b)
|
267
|
+
end
|
268
|
+
|
261
269
|
def custom!(*a, &b)
|
262
270
|
Proc.new { |obj| obj.instance_exec(*a, &b) }
|
263
271
|
false
|
@@ -279,7 +287,7 @@ module CliTool
|
|
279
287
|
|
280
288
|
def remote_exec!(script)
|
281
289
|
ssh_cmd =[ 'ssh -t -t' ]
|
282
|
-
ssh_cmd << "-
|
290
|
+
ssh_cmd << "-i #{@identity}" if @identity
|
283
291
|
ssh_cmd << "-p #{@port}" if @port
|
284
292
|
ssh_cmd << "#{@username}@#{@host}"
|
285
293
|
ssh_cmd << "/bin/bash -s"
|
data/lib/cli_tool/stdin_out.rb
CHANGED
@@ -142,7 +142,11 @@ module CliTool
|
|
142
142
|
ANSI_COLORS[c] ? o << "\e[#{ANSI_COLORS[c]}m" : o
|
143
143
|
end
|
144
144
|
|
145
|
-
"
|
145
|
+
suffix = "\e[0m"
|
146
|
+
|
147
|
+
# Allow color nesting
|
148
|
+
text = text.gsub(suffix, "#{suffix}#{prefix}")
|
149
|
+
"#{prefix}#{text}#{suffix}" # Add color
|
146
150
|
end
|
147
151
|
end
|
148
152
|
end
|
data/lib/cli_tool/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cli_tool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-02-
|
12
|
+
date: 2014-02-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|