mini-cli 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mini-cli/run.rb +11 -8
- data/lib/mini-cli/version.rb +1 -1
- data/lib/mini-cli.rb +37 -30
- data/samples/custom_args.rb +19 -13
- data/samples/demo.rb +15 -9
- data/test/mini-cli/exec_test.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 287658b0aa4ac5340cde3aced9e0a411ed6504713c18505706ad741c7c966a8b
|
4
|
+
data.tar.gz: 7b6c95ddc87554a011c3f28355f3e181a7be249432d906861a92092978f5b22b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2fa1fb33a71928b5fea02349709ba6191992b5375b690a8b39fe8dcb8b932932abe61f02135ca747bf729c0ed758276f7d9b3f41f42a2db1f128ee56eeda1bcb
|
7
|
+
data.tar.gz: fb7397ede3cf0f0265dbafd47ef4e070153a37e3afdf5a583b68ea95dd4482e7c54522af941bdba45680ab195e0b305b286bac1c241e27b741162bb28822fcb2
|
data/lib/mini-cli/run.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require('shellwords')
|
4
|
+
|
3
5
|
module MiniCli
|
4
6
|
def run(*cmd, stdin_data: nil, status: false, chdir: nil)
|
5
7
|
in_read, in_write = IO.pipe
|
@@ -15,8 +17,7 @@ module MiniCli
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def run_ruby(*cmd, **run_options)
|
18
|
-
|
19
|
-
run(Shellwords.join(RUBY_CMD_ + cmd), **run_options)
|
20
|
+
run(Shellwords.join(__ruby_cmd + cmd), **run_options)
|
20
21
|
end
|
21
22
|
|
22
23
|
def run_script(script, status: false, chdir: nil)
|
@@ -39,10 +40,12 @@ module MiniCli
|
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
42
|
-
|
43
|
-
|
44
|
-
RbConfig.ruby
|
45
|
-
|
46
|
-
|
47
|
-
|
43
|
+
def __ruby_cmd
|
44
|
+
[
|
45
|
+
RbConfig.ruby,
|
46
|
+
'--disable=gems',
|
47
|
+
'--disable=did_you_mean',
|
48
|
+
'--disable=rubyopt'
|
49
|
+
]
|
50
|
+
end
|
48
51
|
end
|
data/lib/mini-cli/version.rb
CHANGED
data/lib/mini-cli.rb
CHANGED
@@ -75,20 +75,22 @@ module MiniCli
|
|
75
75
|
def initialize(source)
|
76
76
|
@source = source
|
77
77
|
@name = File.basename(source, '.*')
|
78
|
-
@
|
79
|
-
@
|
78
|
+
@converter = @main_proc = nil
|
79
|
+
@parser = ArgvParser.new('', [])
|
80
|
+
@before = []
|
81
|
+
@after = []
|
80
82
|
@show_errors = true
|
81
83
|
@before_ok = false
|
82
84
|
@error_code = 0
|
83
85
|
init_main
|
84
86
|
end
|
85
87
|
|
86
|
-
def name(name
|
88
|
+
def name(name)
|
87
89
|
name ? @name = name.to_s : @name
|
88
90
|
end
|
89
91
|
|
90
|
-
def help(
|
91
|
-
@parser = ArgvParser.new(
|
92
|
+
def help(*args)
|
93
|
+
@parser = ArgvParser.new(*args)
|
92
94
|
end
|
93
95
|
|
94
96
|
def show_help
|
@@ -109,6 +111,8 @@ module MiniCli
|
|
109
111
|
|
110
112
|
private
|
111
113
|
|
114
|
+
attr_reader :parser
|
115
|
+
|
112
116
|
def init_main
|
113
117
|
at_exit do
|
114
118
|
next if $! and not ($!.kind_of?(SystemExit) and $!.success?)
|
@@ -125,25 +129,22 @@ module MiniCli
|
|
125
129
|
end
|
126
130
|
end
|
127
131
|
|
128
|
-
def parser
|
129
|
-
@parser ||= ArgvParser.new(nil, [])
|
130
|
-
end
|
131
|
-
|
132
132
|
class ArgvParser
|
133
133
|
def initialize(helptext, args)
|
134
134
|
@helptext = helptext.to_s
|
135
135
|
@args = args.flatten.map!(&:to_s).uniq
|
136
136
|
@options = nil
|
137
|
+
@show_options_text = true
|
137
138
|
end
|
138
139
|
|
139
140
|
def show_help(name)
|
140
141
|
parse_help! unless @options
|
141
142
|
print("Usage: #{name}")
|
142
|
-
print(' [
|
143
|
+
print(' [<options>]') unless @options.empty?
|
143
144
|
print(' ', @args.join(' ')) unless @args.empty?
|
144
145
|
puts
|
145
|
-
puts(nil, 'Options:')
|
146
|
-
puts(@helptext) unless @helptext.empty?
|
146
|
+
puts(nil, 'Options:') if @show_options_text
|
147
|
+
puts(@helptext.gsub('<*name*>', name)) unless @helptext.empty?
|
147
148
|
end
|
148
149
|
|
149
150
|
def parse(argv, error)
|
@@ -154,6 +155,10 @@ module MiniCli
|
|
154
155
|
|
155
156
|
private
|
156
157
|
|
158
|
+
def error(msg)
|
159
|
+
@error[1, msg]
|
160
|
+
end
|
161
|
+
|
157
162
|
def parse_argv(argv)
|
158
163
|
arguments = []
|
159
164
|
while (arg = argv.shift)
|
@@ -171,10 +176,6 @@ module MiniCli
|
|
171
176
|
arguments
|
172
177
|
end
|
173
178
|
|
174
|
-
def error(msg)
|
175
|
-
@error[1, msg]
|
176
|
-
end
|
177
|
-
|
178
179
|
def process(arguments)
|
179
180
|
@args.each do |arg|
|
180
181
|
process_arg(arg, arguments.shift) unless arg.index('..')
|
@@ -185,33 +186,38 @@ module MiniCli
|
|
185
186
|
end
|
186
187
|
|
187
188
|
def process_arg(arg, value)
|
188
|
-
if arg
|
189
|
-
|
189
|
+
if arg[0] == '[' && arg[-1] == ']'
|
190
|
+
return unless value
|
191
|
+
arg = arg[1..-2]
|
190
192
|
else
|
191
|
-
|
193
|
+
error("parameter expected - #{arg}") unless value
|
192
194
|
end
|
195
|
+
@result[(arg[0] == '<' && arg[-1] == '>') ? arg[1..-2] : arg] = value
|
193
196
|
end
|
194
197
|
|
195
|
-
def handle_option(option, argv,
|
196
|
-
key = @options[option] || error("unknown option - #{option}")
|
197
|
-
@result[key] =
|
198
|
+
def handle_option(option, argv, pref = '-')
|
199
|
+
key = @options[option] || error("unknown option - #{pref}-#{option}")
|
200
|
+
return @result[key[1..-1]] = true if key[0] == '!'
|
198
201
|
@result[key] = value = argv.shift
|
199
|
-
return unless value.nil? || value
|
200
|
-
error("parameter
|
202
|
+
return unless value.nil? || value[0] == '-'
|
203
|
+
error("parameter <#{key}> expected - #{pref}-#{option}")
|
201
204
|
end
|
202
205
|
|
203
206
|
def parse_options(options, argv)
|
204
|
-
|
205
|
-
options.each_char { |opt| handle_option(opt, argv, test) }
|
207
|
+
options.each_char { |opt| handle_option(opt, argv, nil) }
|
206
208
|
end
|
207
209
|
|
208
210
|
def parse_help!
|
209
211
|
@options = {}
|
210
212
|
@helptext.each_line do |line|
|
211
213
|
case line
|
212
|
-
when
|
214
|
+
when /Options:$/
|
215
|
+
@show_options_text = false
|
216
|
+
when /-([[:alnum:]]), --([[[:alnum:]]-]+) ([[:upper:]]+)\s+\S+/,
|
217
|
+
/-([[:alnum:]]), --([[[:alnum:]]-]+) \<([[:lower:]]+)\>\s+\S+/
|
213
218
|
option_with_argument(Regexp.last_match)
|
214
|
-
when /--([[[:alnum:]]-]+) ([[:upper:]]+)\s+\S
|
219
|
+
when /--([[[:alnum:]]-]+) ([[:upper:]]+)\s+\S+/,
|
220
|
+
/--([[[:alnum:]]-]+) \<([[:lower:]]+)\>\s+\S+/
|
215
221
|
short_option_with_argument(Regexp.last_match)
|
216
222
|
when /-([[:alnum:]]), --([[[:alnum:]]-]+)\s+\S+/
|
217
223
|
option(Regexp.last_match)
|
@@ -219,6 +225,7 @@ module MiniCli
|
|
219
225
|
short_option(Regexp.last_match)
|
220
226
|
end
|
221
227
|
end
|
228
|
+
@show_options_text &= !@options.empty?
|
222
229
|
end
|
223
230
|
|
224
231
|
def option_with_argument(match)
|
@@ -230,11 +237,11 @@ module MiniCli
|
|
230
237
|
end
|
231
238
|
|
232
239
|
def option(match)
|
233
|
-
@options[match[1]] = @options[match[2]] = match[2]
|
240
|
+
@options[match[1]] = @options[match[2]] = "!#{match[2]}"
|
234
241
|
end
|
235
242
|
|
236
243
|
def short_option(match)
|
237
|
-
@options[match[1]] = match[1]
|
244
|
+
@options[match[1]] = "!#{match[1]}"
|
238
245
|
end
|
239
246
|
end
|
240
247
|
end
|
data/samples/custom_args.rb
CHANGED
@@ -4,28 +4,34 @@ require_relative '../lib/mini-cli'
|
|
4
4
|
|
5
5
|
include MiniCli
|
6
6
|
|
7
|
-
help <<~HELP, %w[
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
help <<~HELP, %w[<target> [<source>]]
|
8
|
+
|
9
|
+
Demonstration of converting arguments to a custom argument class.
|
10
|
+
|
11
|
+
Options:
|
12
|
+
-n, --name <name> option requires <name> argument, has shortcut
|
13
|
+
--url <url> option requires <url> argument
|
14
|
+
-s, --switch option without any argument, has shortcut
|
15
|
+
--opt option without any argument
|
12
16
|
HELP
|
13
17
|
|
14
18
|
main { |cfg| cfg.each_pair { |key, value| puts("#{key}: #{value}") } }
|
15
19
|
|
16
20
|
parse_argv do |args|
|
21
|
+
# args['FILES'] is an array containing all surplus arguments
|
17
22
|
Struct
|
18
23
|
.new(:target, :sources, :name, :url, :switch, :opt)
|
19
|
-
.new
|
24
|
+
.new(
|
25
|
+
args['target'],
|
26
|
+
args['FILES'],
|
27
|
+
args['name'] || 'default_name',
|
28
|
+
args['url'] || 'www.url.test',
|
29
|
+
args.key?('switch'),
|
30
|
+
args.key?('opt')
|
31
|
+
)
|
20
32
|
.tap do |cfg|
|
21
|
-
|
22
|
-
cfg.sources = args['FILES'] # args['FILES'] is an array containing all surplus arguments
|
23
|
-
source = args['SOURCE'] || ENV['SOURCE']
|
33
|
+
source = args['source'] || ENV['SOURCE']
|
24
34
|
cfg.sources.unshift(source) if source
|
25
35
|
cfg.sources << 'STDIN' if cfg.sources.empty?
|
26
|
-
cfg.name = args['NAME'] || 'default_name'
|
27
|
-
cfg.url = args['URL'] || 'www.url.test'
|
28
|
-
cfg.switch = args.key?('switch')
|
29
|
-
cfg.opt = args.key?('opt')
|
30
36
|
end
|
31
37
|
end
|
data/samples/demo.rb
CHANGED
@@ -4,18 +4,24 @@ require_relative '../lib/mini-cli'
|
|
4
4
|
|
5
5
|
include MiniCli
|
6
6
|
|
7
|
-
help <<~HELP, %w[
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
help <<~HELP, %w[<target> [<source>]]
|
8
|
+
|
9
|
+
Demonstration of general Mini-CLI behavior.
|
10
|
+
|
11
|
+
Options:
|
12
|
+
-n, --name <name> option requires <name> argument, has shortcut
|
13
|
+
--url <url> option requires <url> argument
|
14
|
+
-s, --switch option without any argument, has shortcut
|
15
|
+
--opt option without any argument
|
16
|
+
|
17
|
+
Try to call this <*name*> command with various options and arguments.
|
12
18
|
HELP
|
13
19
|
|
14
20
|
main do |args|
|
15
|
-
puts("
|
16
|
-
puts("
|
17
|
-
puts("
|
18
|
-
puts("
|
21
|
+
puts("target: #{args['target']}")
|
22
|
+
puts("source: #{args['source']}") if args.key?('source')
|
23
|
+
puts("name: #{args['name']}") if args.key?('name')
|
24
|
+
puts("url: #{args['url']}") if args.key?('url')
|
19
25
|
puts("FILES: #{args['FILES']}") unless args['FILES'].empty?
|
20
26
|
puts('--switch was given') if args.key?('switch')
|
21
27
|
puts('--opt was given') if args.key?('opt')
|
data/test/mini-cli/exec_test.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Blumtritt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
|
-
rubygems_version: 3.2.
|
104
|
+
rubygems_version: 3.2.28
|
105
105
|
signing_key:
|
106
106
|
specification_version: 4
|
107
107
|
summary: The lean CLI framework for Ruby
|