gli 2.21.4 → 2.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/gli.gemspec +1 -1
- data/lib/gli/command_support.rb +1 -1
- data/lib/gli/commands/help_modules/command_help_format.rb +4 -12
- data/lib/gli/commands/help_modules/global_help_format.rb +1 -3
- data/lib/gli/exceptions.rb +28 -3
- data/lib/gli/gli_option_parser.rb +7 -9
- data/lib/gli/version.rb +1 -1
- data/test/integration/gli_powered_app_test.rb +1 -1
- data/test/unit/gli_test.rb +6 -10
- data/test/unit/subcommand_parsing_test.rb +9 -5
- data/test/unit/test_helper.rb +1 -0
- 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: e2423619abd7f36b8c610382c006ed96685d8cc7df37d85b69267a64287124de
|
4
|
+
data.tar.gz: f4bcf12c882dd944264b40202abc82a5f0e5c649f3f03e3934b8608cdc10e8c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee3166846a6da41489fea74cdda3e08a85982e00b480090f371606768f36086ca324c732e83704421b99bc7e474e5e5ae140d79d05f7c552525a9cb897717130
|
7
|
+
data.tar.gz: b09cf190a438d021f565adbaeebfc90d74aa110f5fc436a0fd59485882d096246ec5d11b1fbd55df3a0afa3a6a80a494bc0ead1d43c6795c4cfce8cf983b552b
|
data/gli.gemspec
CHANGED
@@ -15,7 +15,7 @@ spec = Gem::Specification.new do |s|
|
|
15
15
|
s.metadata = {
|
16
16
|
'bug_tracker_uri' => 'https://github.com/davetron5000/gli/issues',
|
17
17
|
'changelog_uri' => 'https://github.com/davetron5000/gli/releases',
|
18
|
-
'documentation_uri' => '
|
18
|
+
'documentation_uri' => 'https://davetron5000.github.io/gli/rdoc/index.html',
|
19
19
|
'homepage_uri' => 'https://davetron5000.github.com/gli/',
|
20
20
|
'source_code_uri' => 'https://github.com/davetron5000/gli/',
|
21
21
|
'wiki_url' => 'https://github.com/davetron5000/gli/wiki',
|
data/lib/gli/command_support.rb
CHANGED
@@ -31,27 +31,19 @@ module GLI
|
|
31
31
|
SYNOPSIS
|
32
32
|
<% synopses.each do |s| %>
|
33
33
|
<%= s %>
|
34
|
-
<% end %>
|
35
|
-
<% unless @command.long_description.nil? %>
|
34
|
+
<% end %><% unless @command.long_description.nil? %>
|
36
35
|
|
37
36
|
DESCRIPTION
|
38
37
|
<%= wrapper.wrap(@command.long_description) %>
|
39
|
-
<% end %>
|
40
|
-
<% if options_description.strip.length != 0 %>
|
41
|
-
|
38
|
+
<% end %><% if options_description.strip.length != 0 %>
|
42
39
|
COMMAND OPTIONS
|
43
40
|
<%= options_description %>
|
44
|
-
<% end %>
|
45
|
-
<% unless @command.commands.empty? %>
|
46
|
-
|
41
|
+
<% end %><% unless @command.commands.empty? %>
|
47
42
|
COMMANDS
|
48
43
|
<%= commands_description %>
|
49
|
-
<% end %>
|
50
|
-
<% unless @command.examples.empty? %>
|
51
|
-
|
44
|
+
<% end %><% unless @command.examples.empty? %>
|
52
45
|
<%= @command.examples.size == 1 ? 'EXAMPLE' : 'EXAMPLES' %>
|
53
46
|
|
54
|
-
|
55
47
|
<%= command_examples %>
|
56
48
|
<% end %>))
|
57
49
|
|
@@ -44,11 +44,9 @@ SYNOPSIS
|
|
44
44
|
VERSION
|
45
45
|
<%= @app.version_string %>
|
46
46
|
|
47
|
-
<% end %>
|
48
|
-
<% unless global_flags_and_switches.empty? %>
|
47
|
+
<% end %><% unless global_flags_and_switches.empty? %>
|
49
48
|
GLOBAL OPTIONS
|
50
49
|
<%= global_option_descriptions %>
|
51
|
-
|
52
50
|
<% end %>
|
53
51
|
COMMANDS
|
54
52
|
<%= commands %>))
|
data/lib/gli/exceptions.rb
CHANGED
@@ -59,17 +59,42 @@ module GLI
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
class
|
62
|
+
class BadCommandOptionsOrArguments < BadCommandLine
|
63
63
|
# The command for which the argument was unknown
|
64
64
|
attr_reader :command_in_context
|
65
|
-
# +message+:: the error message to show the user
|
66
|
-
# +command+:: the command we were using to parse command-specific options
|
67
65
|
def initialize(message,command)
|
68
66
|
super(message)
|
69
67
|
@command_in_context = command
|
70
68
|
end
|
71
69
|
end
|
72
70
|
|
71
|
+
class MissingRequiredArgumentsException < BadCommandOptionsOrArguments
|
72
|
+
attr_reader :num_arguments_received, :range_arguments_accepted
|
73
|
+
def initialize(command,num_arguments_received,range_arguments_accepted)
|
74
|
+
|
75
|
+
@num_arguments_received = num_arguments_received
|
76
|
+
@range_arguments_accepted = range_arguments_accepted
|
77
|
+
|
78
|
+
message = if @num_arguments_received < @range_arguments_accepted.min
|
79
|
+
"#{command.name} expected at least #{@range_arguments_accepted.min} arguments, but was given only #{@num_arguments_received}"
|
80
|
+
elsif @range_arguments_accepted.min == 0
|
81
|
+
"#{command.name} expected no arguments, but received #{@num_arguments_received}"
|
82
|
+
else
|
83
|
+
"#{command.name} expected only #{@range_arguments_accepted.max} arguments, but received #{@num_arguments_received}"
|
84
|
+
end
|
85
|
+
super(message,command)
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
class MissingRequiredOptionsException < BadCommandOptionsOrArguments
|
91
|
+
def initialize(command,missing_required_options)
|
92
|
+
message = "#{command.name} requires these options: "
|
93
|
+
required_options = missing_required_options.sort.map(&:name).join(", ")
|
94
|
+
super(message + required_options,command)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
73
98
|
# Indicates the bad command line was an unknown command argument
|
74
99
|
class UnknownCommandArgument < CommandException
|
75
100
|
end
|
@@ -98,12 +98,13 @@ module GLI
|
|
98
98
|
end
|
99
99
|
|
100
100
|
# Now validate the number of arguments
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
if arguments.size > max_number_of_arguments
|
105
|
-
raise MissingRequiredArgumentsException.new("Too many arguments for command", command)
|
101
|
+
num_arguments_range = min_number_of_arguments..max_number_of_arguments
|
102
|
+
if !num_arguments_range.cover?(arguments.size)
|
103
|
+
raise MissingRequiredArgumentsException.new(command,arguments.size,num_arguments_range)
|
106
104
|
end
|
105
|
+
#if arguments.size > max_number_of_arguments
|
106
|
+
# raise TooManyArgumentsException.new(command,arguments.size,max_number_of_arguments)
|
107
|
+
#end
|
107
108
|
end
|
108
109
|
|
109
110
|
def verify_required_options!(flags, command, options)
|
@@ -114,10 +115,7 @@ module GLI
|
|
114
115
|
( options[option.name].kind_of?(Array) && options[option.name].empty? )
|
115
116
|
}
|
116
117
|
unless missing_required_options.empty?
|
117
|
-
missing_required_options
|
118
|
-
raise MissingRequiredArgumentsException.new(missing_required_options.map { |option|
|
119
|
-
"#{option.name} is required"
|
120
|
-
}.join(', '), command)
|
118
|
+
raise MissingRequiredOptionsException.new(command,missing_required_options)
|
121
119
|
end
|
122
120
|
end
|
123
121
|
end
|
data/lib/gli/version.rb
CHANGED
@@ -29,7 +29,7 @@ class GLIPoweredAppTest < Minitest::Test
|
|
29
29
|
|
30
30
|
def test_missing_args_exits_nonzero
|
31
31
|
out, err, status = run_app("list", expect_failure: true, return_err_and_status: true)
|
32
|
-
assert_match /
|
32
|
+
assert_match /list requires these options: required_flag, required_flag2/,err
|
33
33
|
assert_equal 64, status.exitstatus
|
34
34
|
assert_match /COMMAND OPTIONS/, out
|
35
35
|
end
|
data/test/unit/gli_test.rb
CHANGED
@@ -71,9 +71,8 @@ class GLITest < Minitest::Test
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
assert_equal 64, @app.run(['foo']), "Expected exit status to be 64"
|
74
|
-
assert @fake_stderr.contained?(/
|
75
|
-
assert @fake_stderr.contained?(/
|
76
|
-
assert @fake_stderr.contained?(/flag is required, other_flag is required/), @fake_stderr.strings.inspect
|
74
|
+
assert @fake_stderr.contained?(/requires these options.*flag/), @fake_stderr.strings.inspect
|
75
|
+
assert @fake_stderr.contained?(/requires these options.*other_flag/), @fake_stderr.strings.inspect
|
77
76
|
assert !@called
|
78
77
|
|
79
78
|
assert_equal 0, @app.run(['foo','--flag=bar','--other_flag=blah']), "Expected exit status to be 0 #{@fake_stderr.strings.join(',')}"
|
@@ -91,8 +90,7 @@ class GLITest < Minitest::Test
|
|
91
90
|
end
|
92
91
|
end
|
93
92
|
assert_equal 64, @app.run(['foo']), "Expected exit status to be 64"
|
94
|
-
assert @fake_stderr.contained?(/
|
95
|
-
assert @fake_stderr.contained?(/flag is required/), @fake_stderr.strings.inspect
|
93
|
+
assert @fake_stderr.contained?(/requires these options.*flag/), @fake_stderr.strings.inspect
|
96
94
|
assert !@called
|
97
95
|
|
98
96
|
assert_equal 0, @app.run(['foo','--flag=bar']), "Expected exit status to be 0 #{@fake_stderr.strings.join(',')}"
|
@@ -111,9 +109,8 @@ class GLITest < Minitest::Test
|
|
111
109
|
end
|
112
110
|
end
|
113
111
|
assert_equal 64, @app.run(['foo']), "Expected exit status to be 64"
|
114
|
-
assert @fake_stderr.contained?(/
|
115
|
-
assert @fake_stderr.contained?(/
|
116
|
-
assert @fake_stderr.contained?(/flag is required, other_flag is required/), @fake_stderr.strings.inspect
|
112
|
+
assert @fake_stderr.contained?(/requires these options.*flag/), @fake_stderr.strings.inspect
|
113
|
+
assert @fake_stderr.contained?(/requires these options.*other_flag/), @fake_stderr.strings.inspect
|
117
114
|
assert !@called
|
118
115
|
|
119
116
|
assert_equal 0, @app.run(['--flag=bar','--other_flag=blah','foo']), "Expected exit status to be 0 #{@fake_stderr.strings.join(',')}"
|
@@ -131,8 +128,7 @@ class GLITest < Minitest::Test
|
|
131
128
|
end
|
132
129
|
end
|
133
130
|
assert_equal 64, @app.run(['foo']), "Expected exit status to be 64"
|
134
|
-
assert @fake_stderr.contained?(/
|
135
|
-
assert @fake_stderr.contained?(/flag is required/), @fake_stderr.strings.inspect
|
131
|
+
assert @fake_stderr.contained?(/requires these options.*flag/), @fake_stderr.strings.inspect
|
136
132
|
assert !@called
|
137
133
|
|
138
134
|
assert_equal 0, @app.run(['--flag=bar','foo']), "Expected exit status to be 0 #{@fake_stderr.strings.join(',')}"
|
@@ -78,8 +78,8 @@ class SubcommandParsingTest < Minitest::Test
|
|
78
78
|
setup_app_with_subcommand_storing_results :normal, false, :strict
|
79
79
|
@app.run(%w(-f global command -f flag -s subcomm -f subflag))
|
80
80
|
with_clue {
|
81
|
+
assert @fake_stderr.contained?(/expected no arguments, but received 3/)
|
81
82
|
assert_equal nil,@results[:command_name]
|
82
|
-
assert @fake_stderr.contained?(/error: Too many arguments for command/)
|
83
83
|
}
|
84
84
|
end
|
85
85
|
|
@@ -123,8 +123,8 @@ class SubcommandParsingTest < Minitest::Test
|
|
123
123
|
with_clue {
|
124
124
|
assert_equal number_generated, @results[:number_of_args_give_to_action]
|
125
125
|
assert_equal 0, @exit_code
|
126
|
-
assert !@fake_stderr.contained?(/
|
127
|
-
assert !@fake_stderr.contained?(/
|
126
|
+
assert !@fake_stderr.contained?(/expected at least/)
|
127
|
+
assert !@fake_stderr.contained?(/expected only/)
|
128
128
|
}
|
129
129
|
end
|
130
130
|
end
|
@@ -144,11 +144,15 @@ class SubcommandParsingTest < Minitest::Test
|
|
144
144
|
if status == :not_enough then
|
145
145
|
assert_nil @results[:number_of_args_give_to_action]
|
146
146
|
assert_equal 64, @exit_code
|
147
|
-
assert @fake_stderr.contained?(/
|
147
|
+
assert @fake_stderr.contained?(/expected at least #{number_required} arguments, but was given only #{number_generated}/)
|
148
148
|
elsif status == :too_many then
|
149
149
|
assert_nil @results[:number_of_args_give_to_action]
|
150
150
|
assert_equal 64, @exit_code
|
151
|
-
|
151
|
+
if number_required == 0
|
152
|
+
assert @fake_stderr.contained?(/expected no arguments, but received #{number_generated}/)
|
153
|
+
else
|
154
|
+
assert @fake_stderr.contained?(/expected only #{number_required + number_optional} arguments, but received #{number_generated}/)
|
155
|
+
end
|
152
156
|
else
|
153
157
|
assert false
|
154
158
|
end
|
data/test/unit/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.22.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Copeland
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -215,7 +215,7 @@ licenses:
|
|
215
215
|
metadata:
|
216
216
|
bug_tracker_uri: https://github.com/davetron5000/gli/issues
|
217
217
|
changelog_uri: https://github.com/davetron5000/gli/releases
|
218
|
-
documentation_uri:
|
218
|
+
documentation_uri: https://davetron5000.github.io/gli/rdoc/index.html
|
219
219
|
homepage_uri: https://davetron5000.github.com/gli/
|
220
220
|
source_code_uri: https://github.com/davetron5000/gli/
|
221
221
|
wiki_url: https://github.com/davetron5000/gli/wiki
|
@@ -238,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
238
238
|
- !ruby/object:Gem::Version
|
239
239
|
version: '0'
|
240
240
|
requirements: []
|
241
|
-
rubygems_version: 3.5.
|
241
|
+
rubygems_version: 3.5.22
|
242
242
|
signing_key:
|
243
243
|
specification_version: 4
|
244
244
|
summary: Build command-suite CLI apps that are awesome.
|