bogo-cli 0.2.14 → 0.2.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/bogo-cli.gemspec +17 -17
- data/lib/bogo-cli/command.rb +46 -29
- data/lib/bogo-cli/setup.rb +44 -20
- data/lib/bogo-cli/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3656ca0e9a54167aca89ef17945dcea51c9e5eddfcb5863bf961d29e607669c
|
4
|
+
data.tar.gz: '027490a1df8c80fc7b21740219710ca14a22ee6750d273f4fcd59fd410a345a1'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65be75f9b91e26d4f2e7e6367ebd005a0e85dece0090927f65de924c9e19cc362bb5d5a7d890311f5917c14e0553b7b0a67a7d73ff3eacc2e6dd68ce6dba9f59
|
7
|
+
data.tar.gz: 56fb3b1c21a3063228d96ee1145fd2546760e257d165b653ad5716efd2ea2dcd7b5ab3bda719089eb3f3bb2b12e1b84e3ce38291fa2c355e6268e02724c530ce
|
data/CHANGELOG.md
CHANGED
data/bogo-cli.gemspec
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) +
|
2
|
-
require
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) + "/lib/"
|
2
|
+
require "bogo-cli/version"
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
4
|
+
s.name = "bogo-cli"
|
5
5
|
s.version = Bogo::Cli::VERSION.version
|
6
|
-
s.summary =
|
7
|
-
s.author =
|
8
|
-
s.email =
|
9
|
-
s.homepage =
|
10
|
-
s.description =
|
11
|
-
s.require_path =
|
12
|
-
s.license =
|
13
|
-
s.add_runtime_dependency
|
14
|
-
s.add_runtime_dependency
|
15
|
-
s.add_runtime_dependency
|
16
|
-
s.add_runtime_dependency
|
17
|
-
s.add_development_dependency
|
18
|
-
s.add_development_dependency
|
19
|
-
s.files = Dir[
|
6
|
+
s.summary = "CLI Helper libraries"
|
7
|
+
s.author = "Chris Roberts"
|
8
|
+
s.email = "code@chrisroberts.org"
|
9
|
+
s.homepage = "https://github.com/spox/bogo-cli"
|
10
|
+
s.description = "CLI Helper libraries"
|
11
|
+
s.require_path = "lib"
|
12
|
+
s.license = "Apache 2.0"
|
13
|
+
s.add_runtime_dependency "bogo", ">= 0.2.14", "< 0.6"
|
14
|
+
s.add_runtime_dependency "bogo-config", ">= 0.1.15", "< 0.5"
|
15
|
+
s.add_runtime_dependency "bogo-ui"
|
16
|
+
s.add_runtime_dependency "slop", "~> 3"
|
17
|
+
s.add_development_dependency "rake", "~> 10"
|
18
|
+
s.add_development_dependency "minitest"
|
19
|
+
s.files = Dir["lib/**/*"] + %w(bogo-cli.gemspec README.md CHANGELOG.md CONTRIBUTING.md LICENSE)
|
20
20
|
end
|
data/lib/bogo-cli/command.rb
CHANGED
@@ -1,11 +1,19 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "bogo-ui"
|
2
|
+
require "bogo-config"
|
3
|
+
require "bogo-cli"
|
4
4
|
|
5
5
|
module Bogo
|
6
6
|
module Cli
|
7
7
|
# Abstract command class
|
8
8
|
class Command
|
9
|
+
# Get or set default UI
|
10
|
+
#
|
11
|
+
# @param u [Bogo::Ui]
|
12
|
+
# @return [Bogo::Ui]
|
13
|
+
def self.ui(u = nil)
|
14
|
+
@ui = u if u
|
15
|
+
@ui
|
16
|
+
end
|
9
17
|
|
10
18
|
include Bogo::Memoization
|
11
19
|
|
@@ -22,24 +30,25 @@ module Bogo
|
|
22
30
|
#
|
23
31
|
# @return [self]
|
24
32
|
def initialize(cli_opts, args)
|
25
|
-
if(cli_opts.is_a?(Slop))
|
33
|
+
if (cli_opts.is_a?(Slop))
|
26
34
|
process_cli_options(cli_opts)
|
27
35
|
else
|
28
36
|
@defaults = Smash.new
|
29
37
|
@options = cli_opts.to_hash.to_smash(:snake)
|
30
38
|
[@options, *@options.values].compact.each do |hsh|
|
31
39
|
next unless hsh.is_a?(Hash)
|
32
|
-
hsh.delete_if{|k,v| v.nil?}
|
40
|
+
hsh.delete_if { |k, v| v.nil? }
|
33
41
|
end
|
34
42
|
end
|
35
43
|
@arguments = validate_arguments!(args)
|
36
44
|
load_config!
|
37
45
|
ui_args = Smash.new(
|
38
46
|
:app_name => options.fetch(:app_name,
|
39
|
-
|
40
|
-
)
|
47
|
+
self.class.name.split("::").first),
|
41
48
|
).merge(config)
|
42
49
|
@ui = options.delete(:ui) || Ui.new(ui_args)
|
50
|
+
Bogo::Cli::Command.ui(ui)
|
51
|
+
configure_logger!
|
43
52
|
end
|
44
53
|
|
45
54
|
# Execute the command
|
@@ -51,6 +60,16 @@ module Bogo
|
|
51
60
|
|
52
61
|
protected
|
53
62
|
|
63
|
+
# Configure the default logger based on current
|
64
|
+
# command configuration options
|
65
|
+
def configure_logger!
|
66
|
+
if config[:debug] || !ENV["DEBUG"].to_s.empty?
|
67
|
+
Bogo::Logger.logger.level = :debug
|
68
|
+
else
|
69
|
+
Bogo::Logger.logger.level = config.fetch(:log, :fatal)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
54
73
|
# Provides top level options with command specific options
|
55
74
|
# merged to provide custom overrides
|
56
75
|
#
|
@@ -66,12 +85,12 @@ module Bogo
|
|
66
85
|
Smash[
|
67
86
|
options.fetch(
|
68
87
|
Bogo::Utility.snake(
|
69
|
-
self.class.name.split(
|
88
|
+
self.class.name.split("::").last
|
70
89
|
),
|
71
90
|
Hash.new
|
72
|
-
).map{|k,v|
|
73
|
-
unless(v.nil?)
|
74
|
-
[k,v]
|
91
|
+
).map { |k, v|
|
92
|
+
unless (v.nil?)
|
93
|
+
[k, v]
|
75
94
|
end
|
76
95
|
}.compact
|
77
96
|
]
|
@@ -82,16 +101,16 @@ module Bogo
|
|
82
101
|
#
|
83
102
|
# @return [Hash]
|
84
103
|
def load_config!
|
85
|
-
if(options[:config])
|
104
|
+
if (options[:config])
|
86
105
|
config_inst = Config.new(options[:config])
|
87
|
-
elsif(self.class.const_defined?(:DEFAULT_CONFIGURATION_FILES))
|
106
|
+
elsif (self.class.const_defined?(:DEFAULT_CONFIGURATION_FILES))
|
88
107
|
path = self.class.const_get(:DEFAULT_CONFIGURATION_FILES).detect do |check|
|
89
108
|
full_check = File.expand_path(check)
|
90
109
|
File.exists?(full_check)
|
91
110
|
end
|
92
111
|
config_inst = Config.new(path) if path
|
93
112
|
end
|
94
|
-
if(config_inst)
|
113
|
+
if (config_inst)
|
95
114
|
options.delete(:config)
|
96
115
|
defaults_inst = Smash[
|
97
116
|
config_class.new(
|
@@ -145,20 +164,20 @@ module Bogo
|
|
145
164
|
ui.info("#{msg}... ", :nonewline)
|
146
165
|
begin
|
147
166
|
result = yield
|
148
|
-
ui.puts ui.color(
|
149
|
-
if(result)
|
150
|
-
ui.puts
|
167
|
+
ui.puts ui.color("complete!", :green, :bold)
|
168
|
+
if (result)
|
169
|
+
ui.puts "---> Results:"
|
151
170
|
case result
|
152
171
|
when Hash
|
153
|
-
result.each do |k,v|
|
154
|
-
ui.puts
|
172
|
+
result.each do |k, v|
|
173
|
+
ui.puts " " << ui.color("#{k}: ", :bold) << v
|
155
174
|
end
|
156
175
|
else
|
157
176
|
ui.puts result
|
158
177
|
end
|
159
178
|
end
|
160
179
|
rescue => e
|
161
|
-
ui.puts ui.color(
|
180
|
+
ui.puts ui.color("error!", :red, :bold)
|
162
181
|
ui.error "Reason - #{e}"
|
163
182
|
raise
|
164
183
|
end
|
@@ -171,15 +190,15 @@ module Bogo
|
|
171
190
|
# @param cli_opts [Slop]
|
172
191
|
# @return [NilClass]
|
173
192
|
def process_cli_options(cli_opts)
|
174
|
-
unless(cli_opts.is_a?(Slop))
|
193
|
+
unless (cli_opts.is_a?(Slop))
|
175
194
|
raise TypeError.new "Expecting type `Slop` but received type `#{cli_opts.class}`"
|
176
195
|
end
|
177
196
|
@options = Smash.new
|
178
197
|
@defaults = Smash.new
|
179
198
|
cli_opts.each do |cli_opt|
|
180
|
-
unless(cli_opt.value.nil?)
|
199
|
+
unless (cli_opt.value.nil?)
|
181
200
|
opt_key = Bogo::Utility.snake(cli_opt.key)
|
182
|
-
if(cli_opt.default?)
|
201
|
+
if (cli_opt.default?)
|
183
202
|
@defaults[opt_key] = cli_opt.value
|
184
203
|
else
|
185
204
|
@options[opt_key] = cli_opt.value
|
@@ -195,20 +214,18 @@ module Bogo
|
|
195
214
|
# @return [Array<String>]
|
196
215
|
def validate_arguments!(list)
|
197
216
|
chk_idx = list.find_index do |item|
|
198
|
-
item.start_with?(
|
217
|
+
item.start_with?("-")
|
199
218
|
end
|
200
|
-
if(chk_idx)
|
219
|
+
if (chk_idx)
|
201
220
|
marker = list.find_index do |item|
|
202
|
-
item ==
|
221
|
+
item == "--"
|
203
222
|
end
|
204
|
-
if(marker.nil? || chk_idx.to_i < marker)
|
223
|
+
if (marker.nil? || chk_idx.to_i < marker)
|
205
224
|
raise ArgumentError.new "Unknown CLI option provided `#{list[chk_idx]}`"
|
206
225
|
end
|
207
226
|
end
|
208
227
|
list
|
209
228
|
end
|
210
|
-
|
211
229
|
end
|
212
|
-
|
213
230
|
end
|
214
231
|
end
|
data/lib/bogo-cli/setup.rb
CHANGED
@@ -1,32 +1,34 @@
|
|
1
1
|
# Trigger shutdown on INT or TERM signals
|
2
|
-
o_int = Signal.trap(
|
2
|
+
o_int = Signal.trap("INT") {
|
3
3
|
o_int.call if o_int.respond_to?(:call)
|
4
|
-
if(Bogo::Cli.exit_on_signal == false)
|
5
|
-
Thread.main.raise SignalException.new(
|
4
|
+
if (Bogo::Cli.exit_on_signal == false)
|
5
|
+
Thread.main.raise SignalException.new("SIGINT")
|
6
6
|
else
|
7
7
|
exit 0
|
8
8
|
end
|
9
9
|
}
|
10
10
|
|
11
|
-
o_term = Signal.trap(
|
11
|
+
o_term = Signal.trap("TERM") {
|
12
12
|
o_int.call if o_int.respond_to?(:call)
|
13
|
-
if(Bogo::Cli.exit_on_signal == false)
|
14
|
-
Thread.main.raise SignalException.new(
|
13
|
+
if (Bogo::Cli.exit_on_signal == false)
|
14
|
+
Thread.main.raise SignalException.new("SIGTERM")
|
15
15
|
else
|
16
16
|
exit 0
|
17
17
|
end
|
18
18
|
}
|
19
19
|
|
20
|
-
require
|
20
|
+
require "bogo-cli"
|
21
21
|
|
22
22
|
class Slop
|
23
23
|
def bogo_cli_run(*args, &block)
|
24
24
|
slop_run(*args, &block)
|
25
25
|
old_runner = @runner
|
26
|
-
@runner = proc{|*args| old_runner.call(*args); exit 0}
|
26
|
+
@runner = proc { |*args| old_runner.call(*args); exit 0 }
|
27
27
|
end
|
28
|
+
|
28
29
|
alias_method :slop_run, :run
|
29
30
|
alias_method :run, :bogo_cli_run
|
31
|
+
|
30
32
|
class Option
|
31
33
|
def default?
|
32
34
|
@value.nil?
|
@@ -50,23 +52,45 @@ module Bogo
|
|
50
52
|
end
|
51
53
|
puts slop_result.help
|
52
54
|
exit -1
|
53
|
-
rescue
|
54
|
-
|
55
|
-
if
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
$stderr.puts "ERROR: #{e.class}: #{e.message}"
|
55
|
+
rescue StandardError, ScriptError => err
|
56
|
+
output_error err.message
|
57
|
+
if ENV["DEBUG"]
|
58
|
+
output_debug "Stacktrace: #{err.class}: " \
|
59
|
+
"#{err.message}\n#{err.backtrace.join("\n")}"
|
60
|
+
if err.respond_to?(:original) && err.original
|
61
|
+
msg = "Original Stacktrace: #{err.original.class}: " \
|
62
|
+
"#{err.original.message}\n#{err.original.backtrace.join("\n")}"
|
63
|
+
output_debug msg
|
64
|
+
end
|
64
65
|
end
|
65
|
-
exit
|
66
|
+
exit err.respond_to?(:exit_code) ? err.exit_code : -1
|
66
67
|
end
|
67
68
|
true
|
68
69
|
end
|
69
70
|
|
71
|
+
# Write error message to UI. Uses formatted
|
72
|
+
# ui if available and falls back to stderr.
|
73
|
+
#
|
74
|
+
# @param string [String]
|
75
|
+
def output_error(string)
|
76
|
+
if Command.ui
|
77
|
+
Command.ui.error string
|
78
|
+
else
|
79
|
+
$stderr.puts "ERROR: #{string}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Write debug message to UI. Uses formatted
|
84
|
+
# ui if available and falls back to stderr.
|
85
|
+
#
|
86
|
+
# @param string [String]
|
87
|
+
def output_debug(string)
|
88
|
+
if Command.ui
|
89
|
+
Command.ui.debug string
|
90
|
+
else
|
91
|
+
$stderr.puts "DEBUG: #{string}"
|
92
|
+
end
|
93
|
+
end
|
70
94
|
end
|
71
95
|
end
|
72
96
|
end
|
data/lib/bogo-cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bogo-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Roberts
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bogo
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.2.14
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '0.6'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.
|
29
|
+
version: 0.2.14
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '0.6'
|