bogo-cli 0.2.14 → 0.2.16
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 +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'
|