gli 2.19.2 → 2.20.0
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/.circleci/config.yml +28 -0
- data/.gitignore +1 -3
- data/Gemfile +0 -6
- data/README.rdoc +2 -12
- data/Rakefile +15 -37
- data/bin/ci +29 -0
- data/bin/gli +25 -64
- data/bin/rake +29 -0
- data/bin/setup +5 -0
- data/exe/gli +68 -0
- data/gli.gemspec +19 -21
- data/gli.rdoc +2 -2
- data/lib/gli/commands/help_modules/command_help_format.rb +1 -1
- data/lib/gli/commands/help_modules/global_help_format.rb +1 -1
- data/lib/gli/commands/scaffold.rb +9 -93
- data/lib/gli/options.rb +2 -2
- data/lib/gli/version.rb +1 -1
- data/object-model.dot +29 -0
- data/object-model.png +0 -0
- data/test/apps/todo/Gemfile +1 -1
- data/test/apps/todo/bin/todo +1 -1
- data/test/integration/gli_cli_test.rb +69 -0
- data/test/integration/gli_powered_app_test.rb +52 -0
- data/test/integration/scaffold_test.rb +30 -0
- data/test/integration/test_helper.rb +52 -0
- data/test/{tc_command_finder.rb → unit/command_finder_test.rb} +6 -6
- data/test/{tc_command.rb → unit/command_test.rb} +4 -4
- data/test/unit/compound_command_test.rb +17 -0
- data/test/{tc_doc.rb → unit/doc_test.rb} +38 -51
- data/test/{tc_flag.rb → unit/flag_test.rb} +19 -25
- data/test/{tc_gli.rb → unit/gli_test.rb} +28 -47
- data/test/{tc_help.rb → unit/help_test.rb} +48 -107
- data/test/{init_simplecov.rb → unit/init_simplecov.rb} +0 -0
- data/test/{tc_options.rb → unit/options_test.rb} +4 -4
- data/test/unit/subcommand_parsing_test.rb +263 -0
- data/test/unit/subcommands_test.rb +245 -0
- data/test/{fake_std_out.rb → unit/support/fake_std_out.rb} +0 -0
- data/test/{config.yaml → unit/support/gli_test_config.yml} +0 -0
- data/test/unit/switch_test.rb +49 -0
- data/test/{tc_terminal.rb → unit/terminal_test.rb} +4 -3
- data/test/unit/test_helper.rb +13 -0
- data/test/unit/verbatim_wrapper_test.rb +24 -0
- metadata +57 -124
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -11
- data/ObjectModel.graffle +0 -1191
- data/bin/report_on_rake_results +0 -10
- data/bin/test_all_rubies.sh +0 -6
- data/features/gli_executable.feature +0 -90
- data/features/gli_init.feature +0 -236
- data/features/step_definitions/gli_executable_steps.rb +0 -18
- data/features/step_definitions/gli_init_steps.rb +0 -11
- data/features/step_definitions/todo_steps.rb +0 -100
- data/features/support/env.rb +0 -54
- data/features/support/hooks.rb +0 -5
- data/features/todo.feature +0 -579
- data/features/todo_legacy.feature +0 -130
- data/test/option_test_helper.rb +0 -13
- data/test/tc_compound_command.rb +0 -22
- data/test/tc_subcommand_parsing.rb +0 -280
- data/test/tc_subcommands.rb +0 -259
- data/test/tc_switch.rb +0 -55
- data/test/tc_verbatim_wrapper.rb +0 -36
- data/test/test_helper.rb +0 -21
data/test/tc_subcommands.rb
DELETED
@@ -1,259 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TC_testSubCommand < Clean::Test::TestCase
|
4
|
-
include TestHelper
|
5
|
-
|
6
|
-
def setup
|
7
|
-
@fake_stdout = FakeStdOut.new
|
8
|
-
@fake_stderr = FakeStdOut.new
|
9
|
-
|
10
|
-
@original_stdout = $stdout
|
11
|
-
$stdout = @fake_stdout
|
12
|
-
@original_stderr = $stderr
|
13
|
-
$stderr = @fake_stderr
|
14
|
-
|
15
|
-
@app = CLIApp.new
|
16
|
-
@app.reset
|
17
|
-
@app.subcommand_option_handling :legacy
|
18
|
-
@app.error_device=@fake_stderr
|
19
|
-
ENV.delete('GLI_DEBUG')
|
20
|
-
end
|
21
|
-
|
22
|
-
def teardown
|
23
|
-
$stdout = @original_stdout
|
24
|
-
$stderr = @original_stderr
|
25
|
-
end
|
26
|
-
|
27
|
-
['add','new'].each do |name|
|
28
|
-
test_that "We run the 'add' subcommand using '#{name}'" do
|
29
|
-
Given we_have_a_command_with_two_subcommands
|
30
|
-
When run_app('remote',name,'-f','foo','bar')
|
31
|
-
Then assert_command_ran_with(:add, :command_options => {:f => true}, :args => %w(foo bar))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
test_that "with subcommands, but not using one on the command-line, we run the base action" do
|
36
|
-
Given we_have_a_command_with_two_subcommands
|
37
|
-
When run_app('remote','foo','bar')
|
38
|
-
Then assert_command_ran_with(:base, :command_options => {:f => false}, :args => %w(foo bar))
|
39
|
-
end
|
40
|
-
|
41
|
-
test_that "switches and flags defined on a subcommand are available" do
|
42
|
-
Given we_have_a_command_with_two_subcommands(:switches => [:addswitch], :flags => [:addflag])
|
43
|
-
When run_app('remote','add','--addswitch','--addflag','foo','bar')
|
44
|
-
Then assert_command_ran_with(:add,:command_options => { :addswitch => true, :addflag => 'foo', :f => false },
|
45
|
-
:args => ['bar'])
|
46
|
-
end
|
47
|
-
|
48
|
-
test_that "--help works for subcommands in :normal handling mode" do
|
49
|
-
Given { @app.subcommand_option_handling :normal }
|
50
|
-
And we_have_a_command_with_two_subcommands
|
51
|
-
When { @app.run(["remote", "add", "--help"]) rescue nil }
|
52
|
-
Then { assert_no_match /^error/, @fake_stderr.to_s, "should not output an error message" }
|
53
|
-
end
|
54
|
-
|
55
|
-
test_that "--help works for subcommands in :legacy handling mode" do
|
56
|
-
Given { @app.subcommand_option_handling :legacy }
|
57
|
-
And we_have_a_command_with_two_subcommands
|
58
|
-
When { @app.run(["remote", "add", "--help"]) rescue nil }
|
59
|
-
Then { assert_no_match /^error/, @fake_stderr.to_s, "should not output an error message" }
|
60
|
-
end
|
61
|
-
|
62
|
-
test_that "we can reopen commands to add new subcommands" do
|
63
|
-
Given {
|
64
|
-
@app.command :remote do |p|
|
65
|
-
p.command :add do |c|
|
66
|
-
c.action do |global_options,command_options,args|
|
67
|
-
@ran_command = :add
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
@app.command :remote do |p|
|
72
|
-
p.command :new do |c|
|
73
|
-
c.action do |global_options,command_options,args|
|
74
|
-
@ran_command = :new
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
}
|
79
|
-
When run_app('remote','new')
|
80
|
-
Then { assert_equal(@ran_command, :new) }
|
81
|
-
When run_app('remote', 'add')
|
82
|
-
Then { assert_equal(@ran_command, :add) }
|
83
|
-
end
|
84
|
-
|
85
|
-
test_that "reopening commands doesn't re-add them to the output" do
|
86
|
-
Given {
|
87
|
-
@app.command :remote do |p|
|
88
|
-
p.command(:add) { }
|
89
|
-
end
|
90
|
-
@app.command :remote do |p|
|
91
|
-
p.command(:new) { }
|
92
|
-
end
|
93
|
-
}
|
94
|
-
command_names = @app.instance_variable_get("@commands_declaration_order").collect { |c| c.name }
|
95
|
-
assert_equal 1, command_names.grep(:remote).size
|
96
|
-
end
|
97
|
-
|
98
|
-
|
99
|
-
test_that "we can reopen commands doesn't cause conflicts" do
|
100
|
-
Given {
|
101
|
-
@app.command :remote do |p|
|
102
|
-
p.command :add do |c|
|
103
|
-
c.action do |global_options,command_options,args|
|
104
|
-
@ran_command = :remote_add
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
@app.command :local do |p|
|
109
|
-
p.command :add do |c|
|
110
|
-
c.action do |global_options,command_options,args|
|
111
|
-
@ran_command = :local_add
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
}
|
116
|
-
When run_app('remote','add')
|
117
|
-
Then { assert_equal(@ran_command, :remote_add) }
|
118
|
-
When run_app('local', 'add')
|
119
|
-
Then { assert_equal(@ran_command, :local_add) }
|
120
|
-
end
|
121
|
-
|
122
|
-
|
123
|
-
test_that "we can nest subcommands very deep" do
|
124
|
-
Given {
|
125
|
-
@run_results = { :add => nil, :rename => nil, :base => nil }
|
126
|
-
@app.command :remote do |c|
|
127
|
-
|
128
|
-
c.switch :f
|
129
|
-
c.command :add do |add|
|
130
|
-
add.command :some do |some|
|
131
|
-
some.command :cmd do |cmd|
|
132
|
-
cmd.switch :s
|
133
|
-
cmd.action do |global_options,command_options,args|
|
134
|
-
@run_results[:cmd] = [global_options,command_options,args]
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
ENV['GLI_DEBUG'] = 'true'
|
141
|
-
}
|
142
|
-
When run_app('remote','add','some','cmd','-s','blah')
|
143
|
-
Then assert_command_ran_with(:cmd, :command_options => {:s => true, :f => false},:args => ['blah'])
|
144
|
-
end
|
145
|
-
|
146
|
-
test_that "when any command in the chain has no action, but there's still arguments, indicate we have an unknown command" do
|
147
|
-
Given a_very_deeply_nested_command_structure
|
148
|
-
Then {
|
149
|
-
assert_raises GLI::UnknownCommand do
|
150
|
-
When run_app('remote','add','some','foo')
|
151
|
-
end
|
152
|
-
assert_match /Unknown command 'foo'/,@fake_stderr.to_s
|
153
|
-
}
|
154
|
-
end
|
155
|
-
|
156
|
-
test_that "when a command in the chain has no action, but there's NO additional arguments, indicate we need a subcommand" do
|
157
|
-
Given a_very_deeply_nested_command_structure
|
158
|
-
Then {
|
159
|
-
assert_raises GLI::BadCommandLine do
|
160
|
-
When run_app('remote','add','some')
|
161
|
-
end
|
162
|
-
assert_match /Command 'some' requires a subcommand/,@fake_stderr.to_s
|
163
|
-
}
|
164
|
-
end
|
165
|
-
|
166
|
-
private
|
167
|
-
|
168
|
-
def run_app(*args)
|
169
|
-
lambda { @exit_code = @app.run(args) }
|
170
|
-
end
|
171
|
-
|
172
|
-
def a_very_deeply_nested_command_structure
|
173
|
-
lambda {
|
174
|
-
@run_results = { :add => nil, :rename => nil, :base => nil }
|
175
|
-
@app.command :remote do |c|
|
176
|
-
|
177
|
-
c.switch :f
|
178
|
-
c.command :add do |add|
|
179
|
-
add.command :some do |some|
|
180
|
-
some.command :cmd do |cmd|
|
181
|
-
cmd.switch :s
|
182
|
-
cmd.action do |global_options,command_options,args|
|
183
|
-
@run_results[:cmd] = [global_options,command_options,args]
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
ENV['GLI_DEBUG'] = 'true'
|
190
|
-
}
|
191
|
-
end
|
192
|
-
|
193
|
-
# expected_command - name of command exepcted to have been run
|
194
|
-
# options:
|
195
|
-
# - global_options => hash of expected options
|
196
|
-
# - command_options => hash of expected command options
|
197
|
-
# - args => array of expected args
|
198
|
-
def assert_command_ran_with(expected_command,options)
|
199
|
-
lambda {
|
200
|
-
global_options = options[:global_options] || { :help => false }
|
201
|
-
@run_results.each do |command,results|
|
202
|
-
if command == expected_command
|
203
|
-
assert_equal(indifferent_hash(global_options),results[0])
|
204
|
-
assert_equal(indifferent_hash(options[:command_options]),results[1])
|
205
|
-
assert_equal(options[:args],results[2])
|
206
|
-
else
|
207
|
-
assert_nil results
|
208
|
-
end
|
209
|
-
end
|
210
|
-
}
|
211
|
-
end
|
212
|
-
|
213
|
-
def indifferent_hash(possibly_nil_hash)
|
214
|
-
return {} if possibly_nil_hash.nil?
|
215
|
-
possibly_nil_hash.keys.each do |key|
|
216
|
-
if key.kind_of? Symbol
|
217
|
-
possibly_nil_hash[key.to_s] = possibly_nil_hash[key] unless possibly_nil_hash.has_key?(key.to_s)
|
218
|
-
elsif key.kind_of? String
|
219
|
-
possibly_nil_hash[key.to_sym] = possibly_nil_hash[key] unless possibly_nil_hash.has_key?(key.to_sym)
|
220
|
-
end
|
221
|
-
end
|
222
|
-
possibly_nil_hash
|
223
|
-
end
|
224
|
-
|
225
|
-
# options -
|
226
|
-
# :flags => flags to add to :add
|
227
|
-
# :switiches => switiches to add to :add
|
228
|
-
def we_have_a_command_with_two_subcommands(options = {})
|
229
|
-
lambda {
|
230
|
-
@run_results = { :add => nil, :rename => nil, :base => nil }
|
231
|
-
@app.command :remote do |c|
|
232
|
-
|
233
|
-
c.switch :f
|
234
|
-
|
235
|
-
c.desc "add a remote"
|
236
|
-
c.command [:add,:new] do |add|
|
237
|
-
|
238
|
-
Array(options[:flags]).each { |_| add.flag _ }
|
239
|
-
Array(options[:switches]).each { |_| add.switch _ }
|
240
|
-
add.action do |global_options,command_options,args|
|
241
|
-
@run_results[:add] = [global_options,command_options,args]
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
c.desc "rename a remote"
|
246
|
-
c.command :rename do |rename|
|
247
|
-
rename.action do |global_options,command_options,args|
|
248
|
-
@run_results[:rename] = [global_options,command_options,args]
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
c.action do |global_options,command_options,args|
|
253
|
-
@run_results[:base] = [global_options,command_options,args]
|
254
|
-
end
|
255
|
-
end
|
256
|
-
ENV['GLI_DEBUG'] = 'true'
|
257
|
-
}
|
258
|
-
end
|
259
|
-
end
|
data/test/tc_switch.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TC_testSwitch < Clean::Test::TestCase
|
4
|
-
include TestHelper
|
5
|
-
|
6
|
-
def test_basics_simple
|
7
|
-
Given switch_with_names(:filename)
|
8
|
-
Then attributes_should_be_set
|
9
|
-
And name_should_be(:filename)
|
10
|
-
And aliases_should_be(nil)
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_basics_kinda_complex
|
14
|
-
Given switch_with_names([:f])
|
15
|
-
Then attributes_should_be_set
|
16
|
-
And name_should_be(:f)
|
17
|
-
And aliases_should_be(nil)
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_basics_complex
|
21
|
-
Given switch_with_names([:f,:file,:filename])
|
22
|
-
Then attributes_should_be_set
|
23
|
-
And name_should_be(:f)
|
24
|
-
And aliases_should_be([:file,:filename])
|
25
|
-
And {
|
26
|
-
assert_equal ["-f","--[no-]file","--[no-]filename"],@switch.arguments_for_option_parser
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_includes_negatable
|
31
|
-
assert_equal '-a',GLI::Switch.name_as_string('a')
|
32
|
-
assert_equal '--[no-]foo',GLI::Switch.name_as_string('foo')
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def switch_with_names(names)
|
38
|
-
lambda do
|
39
|
-
@options = {
|
40
|
-
:desc => 'Filename',
|
41
|
-
:long_desc => 'The Filename',
|
42
|
-
}
|
43
|
-
@switch = GLI::Switch.new(names,@options)
|
44
|
-
@cli_option = @switch
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def attributes_should_be_set
|
49
|
-
lambda {
|
50
|
-
assert_equal(@options[:desc],@switch.description)
|
51
|
-
assert_equal(@options[:long_desc],@switch.long_description)
|
52
|
-
}
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
data/test/tc_verbatim_wrapper.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TC_testVerbatimWrapper < Clean::Test::TestCase
|
4
|
-
include TestHelper
|
5
|
-
|
6
|
-
test_that "verbatim wrapper handles nil" do
|
7
|
-
Given {
|
8
|
-
@wrapper = GLI::Commands::HelpModules::VerbatimWrapper.new(any_int,any_int)
|
9
|
-
}
|
10
|
-
When {
|
11
|
-
@result = @wrapper.wrap(nil)
|
12
|
-
}
|
13
|
-
Then {
|
14
|
-
assert_equal '',@result
|
15
|
-
}
|
16
|
-
end
|
17
|
-
|
18
|
-
test_that "verbatim wrapper doesn't touch the input" do
|
19
|
-
Given {
|
20
|
-
@wrapper = GLI::Commands::HelpModules::VerbatimWrapper.new(any_int,any_int)
|
21
|
-
@input = <<EOS
|
22
|
-
|This is|an ASCII|table|
|
23
|
-
+-------+--------+-----+
|
24
|
-
| foo | bar | baz |
|
25
|
-
+-------+--------+-----+
|
26
|
-
EOS
|
27
|
-
}
|
28
|
-
When {
|
29
|
-
@result = @wrapper.wrap(@input)
|
30
|
-
}
|
31
|
-
Then {
|
32
|
-
assert_equal @input,@result
|
33
|
-
}
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'gli.rb'
|
3
|
-
require 'test/unit'
|
4
|
-
require 'clean_test/test_case'
|
5
|
-
require 'fake_std_out'
|
6
|
-
require 'option_test_helper'
|
7
|
-
|
8
|
-
module TestHelper
|
9
|
-
include OptionTestHelper
|
10
|
-
class CLIApp
|
11
|
-
include GLI::App
|
12
|
-
|
13
|
-
def reset
|
14
|
-
super
|
15
|
-
@subcommand_option_handling_strategy = :normal
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Faker::Config.locale = :en
|
21
|
-
I18n.enforce_available_locales = false
|