gli 2.9.0 → 2.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +28 -0
- data/.gitignore +3 -3
- data/.tool-versions +1 -0
- data/Gemfile +0 -2
- data/README.rdoc +29 -18
- data/Rakefile +15 -37
- data/bin/ci +29 -0
- data/bin/gli +24 -54
- data/bin/rake +29 -0
- data/bin/setup +5 -0
- data/exe/gli +68 -0
- data/gli.gemspec +20 -24
- data/gli.rdoc +9 -9
- data/lib/gli/app.rb +42 -8
- data/lib/gli/app_support.rb +17 -5
- data/lib/gli/argument.rb +20 -0
- data/lib/gli/command.rb +27 -2
- data/lib/gli/command_finder.rb +42 -25
- data/lib/gli/command_support.rb +13 -7
- data/lib/gli/commands/doc.rb +9 -3
- data/lib/gli/commands/help.rb +2 -1
- data/lib/gli/commands/help_modules/arg_name_formatter.rb +29 -2
- data/lib/gli/commands/help_modules/command_help_format.rb +19 -1
- data/lib/gli/commands/help_modules/full_synopsis_formatter.rb +5 -4
- data/lib/gli/commands/help_modules/global_help_format.rb +1 -1
- data/lib/gli/commands/help_modules/options_formatter.rb +4 -6
- data/lib/gli/commands/initconfig.rb +3 -6
- data/lib/gli/commands/rdoc_document_listener.rb +2 -1
- data/lib/gli/commands/scaffold.rb +71 -142
- data/lib/gli/dsl.rb +25 -1
- data/lib/gli/exceptions.rb +26 -0
- data/lib/gli/flag.rb +23 -2
- data/lib/gli/gli_option_parser.rb +73 -21
- data/lib/gli/option_parser_factory.rb +10 -3
- data/lib/gli/options.rb +2 -2
- data/lib/gli/switch.rb +4 -0
- data/lib/gli/terminal.rb +6 -2
- data/lib/gli/version.rb +1 -1
- data/lib/gli.rb +2 -0
- 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 +16 -6
- data/test/apps/todo/lib/todo/commands/create.rb +48 -18
- data/test/apps/todo/lib/todo/commands/list.rb +48 -35
- data/test/apps/todo/lib/todo/commands/ls.rb +25 -24
- data/test/apps/todo/lib/todo/commands/make.rb +42 -39
- data/test/apps/todo/todo.gemspec +1 -2
- data/test/apps/todo_legacy/todo.gemspec +1 -2
- data/test/apps/todo_plugins/commands/third.rb +2 -0
- 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/unit/command_finder_test.rb +54 -0
- data/test/{tc_command.rb → unit/command_test.rb} +20 -7
- 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} +92 -49
- data/test/{tc_help.rb → unit/help_test.rb} +54 -113
- 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} +1 -0
- data/test/unit/switch_test.rb +49 -0
- data/test/{tc_terminal.rb → unit/terminal_test.rb} +28 -3
- data/test/unit/test_helper.rb +13 -0
- data/test/unit/verbatim_wrapper_test.rb +24 -0
- metadata +86 -141
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -12
- 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 -232
- 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 -96
- data/features/support/env.rb +0 -54
- data/features/todo.feature +0 -449
- data/features/todo_legacy.feature +0 -128
- data/test/option_test_helper.rb +0 -13
- data/test/tc_compound_command.rb +0 -22
- data/test/tc_subcommand_parsing.rb +0 -104
- 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 -20
@@ -1,18 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# and compatibility
|
4
|
-
unless File.respond_to? :realpath
|
5
|
-
class File
|
6
|
-
def self.realpath path
|
7
|
-
return realpath(File.readlink(path)) if symlink?(path)
|
8
|
-
path
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
require_relative "test_helper"
|
2
|
+
require_relative "support/fake_std_out"
|
12
3
|
|
13
|
-
|
14
|
-
|
15
|
-
class TC_testGLI < Clean::Test::TestCase
|
4
|
+
class GLITest < MiniTest::Test
|
16
5
|
include TestHelper
|
17
6
|
|
18
7
|
def setup
|
@@ -24,7 +13,7 @@ class TC_testGLI < Clean::Test::TestCase
|
|
24
13
|
$stderr = @fake_stderr
|
25
14
|
@app = CLIApp.new
|
26
15
|
|
27
|
-
@config_file = File.expand_path(File.dirname(File.realpath(__FILE__)) + '/new_config.
|
16
|
+
@config_file = File.expand_path(File.dirname(File.realpath(__FILE__)) + '/support/new_config.yml')
|
28
17
|
@gli_debug = ENV['GLI_DEBUG']
|
29
18
|
@app.error_device=@fake_stderr
|
30
19
|
ENV.delete('GLI_DEBUG')
|
@@ -84,6 +73,7 @@ class TC_testGLI < Clean::Test::TestCase
|
|
84
73
|
assert_equal 64, @app.run(['foo']), "Expected exit status to be 64"
|
85
74
|
assert @fake_stderr.contained?(/flag is required/), @fake_stderr.strings.inspect
|
86
75
|
assert @fake_stderr.contained?(/other_flag is required/), @fake_stderr.strings.inspect
|
76
|
+
assert @fake_stderr.contained?(/flag is required, other_flag is required/), @fake_stderr.strings.inspect
|
87
77
|
assert !@called
|
88
78
|
|
89
79
|
assert_equal 0, @app.run(['foo','--flag=bar','--other_flag=blah']), "Expected exit status to be 0 #{@fake_stderr.strings.join(',')}"
|
@@ -104,6 +94,7 @@ class TC_testGLI < Clean::Test::TestCase
|
|
104
94
|
assert_equal 64, @app.run(['foo']), "Expected exit status to be 64"
|
105
95
|
assert @fake_stderr.contained?(/flag is required/), @fake_stderr.strings.inspect
|
106
96
|
assert @fake_stderr.contained?(/other_flag is required/), @fake_stderr.strings.inspect
|
97
|
+
assert @fake_stderr.contained?(/flag is required, other_flag is required/), @fake_stderr.strings.inspect
|
107
98
|
assert !@called
|
108
99
|
|
109
100
|
assert_equal 0, @app.run(['--flag=bar','--other_flag=blah','foo']), "Expected exit status to be 0 #{@fake_stderr.strings.join(',')}"
|
@@ -139,10 +130,12 @@ class TC_testGLI < Clean::Test::TestCase
|
|
139
130
|
def test_init_from_config
|
140
131
|
failure = nil
|
141
132
|
@app.reset
|
142
|
-
@app.config_file(File.expand_path(File.dirname(File.realpath(__FILE__)) + '/
|
133
|
+
@app.config_file(File.expand_path(File.dirname(File.realpath(__FILE__)) + '/support/gli_test_config.yml'))
|
143
134
|
@app.flag :f
|
144
135
|
@app.switch :s
|
145
136
|
@app.flag :g
|
137
|
+
@app.default_value true
|
138
|
+
@app.switch :t
|
146
139
|
called = false
|
147
140
|
@app.command :command do |c|
|
148
141
|
c.flag :f
|
@@ -157,6 +150,7 @@ class TC_testGLI < Clean::Test::TestCase
|
|
157
150
|
assert !o[:f]
|
158
151
|
assert !g[:s]
|
159
152
|
assert o[:s]
|
153
|
+
assert !g[:t]
|
160
154
|
rescue Exception => ex
|
161
155
|
failure = ex
|
162
156
|
end
|
@@ -170,7 +164,7 @@ class TC_testGLI < Clean::Test::TestCase
|
|
170
164
|
def test_command_line_overrides_config
|
171
165
|
failure = nil
|
172
166
|
@app.reset
|
173
|
-
@app.config_file(File.expand_path(File.dirname(File.realpath(__FILE__)) + '/
|
167
|
+
@app.config_file(File.expand_path(File.dirname(File.realpath(__FILE__)) + '/support/gli_test_config.yml'))
|
174
168
|
@app.flag :f
|
175
169
|
@app.switch :s
|
176
170
|
@app.flag :g
|
@@ -202,7 +196,7 @@ class TC_testGLI < Clean::Test::TestCase
|
|
202
196
|
end
|
203
197
|
|
204
198
|
def test_no_overwrite_config
|
205
|
-
config_file = File.expand_path(File.dirname(File.realpath(__FILE__)) + '/
|
199
|
+
config_file = File.expand_path(File.dirname(File.realpath(__FILE__)) + '/support/gli_test_config.yml')
|
206
200
|
config_file_contents = File.read(config_file)
|
207
201
|
@app.reset
|
208
202
|
@app.config_file(config_file)
|
@@ -227,9 +221,9 @@ class TC_testGLI < Clean::Test::TestCase
|
|
227
221
|
@app.reset
|
228
222
|
@app.config_file(@config_file)
|
229
223
|
@app.flag :f
|
230
|
-
@app.switch :s
|
224
|
+
@app.switch :s, :salias
|
231
225
|
@app.switch :w
|
232
|
-
@app.flag :bigflag
|
226
|
+
@app.flag :bigflag, :bigalias
|
233
227
|
@app.flag :biggestflag
|
234
228
|
@app.command :foo do |c|
|
235
229
|
end
|
@@ -247,7 +241,9 @@ class TC_testGLI < Clean::Test::TestCase
|
|
247
241
|
|
248
242
|
assert_equal 'foo',written_config[:f]
|
249
243
|
assert_equal 'bleorgh',written_config[:bigflag]
|
244
|
+
assert !written_config[:bigalias]
|
250
245
|
assert written_config[:s]
|
246
|
+
assert !written_config[:salias]
|
251
247
|
assert !written_config[:w]
|
252
248
|
assert_nil written_config[:biggestflag]
|
253
249
|
assert written_config[GLI::InitConfig::COMMANDS_KEY]
|
@@ -513,7 +509,7 @@ class TC_testGLI < Clean::Test::TestCase
|
|
513
509
|
end
|
514
510
|
@switch_value = nil
|
515
511
|
|
516
|
-
assert_raises(RuntimeError) do
|
512
|
+
assert_raises(RuntimeError) do
|
517
513
|
@app.command [:foo] do |c|
|
518
514
|
c.switch :switch, :default_value => true, :negatable => false
|
519
515
|
end
|
@@ -663,6 +659,23 @@ class TC_testGLI < Clean::Test::TestCase
|
|
663
659
|
assert_raises(GLI::CustomExit) { @app.run(['foo']) }
|
664
660
|
end
|
665
661
|
|
662
|
+
def test_gli_help_does_not_raise_on_debug
|
663
|
+
ENV['GLI_DEBUG'] = 'true'
|
664
|
+
|
665
|
+
@app.reset
|
666
|
+
@app.command(:multiply) do |c|
|
667
|
+
c.action do |g,o,a|
|
668
|
+
# Nothing
|
669
|
+
end
|
670
|
+
end
|
671
|
+
|
672
|
+
begin
|
673
|
+
@app.run(['multiply', '--help'])
|
674
|
+
rescue GLI::CustomExit
|
675
|
+
assert false, "Expected no exception"
|
676
|
+
end
|
677
|
+
end
|
678
|
+
|
666
679
|
class ConvertMe
|
667
680
|
attr_reader :value
|
668
681
|
def initialize(value)
|
@@ -697,6 +710,48 @@ class TC_testGLI < Clean::Test::TestCase
|
|
697
710
|
assert_equal 'crud',@baz.value
|
698
711
|
end
|
699
712
|
|
713
|
+
def test_that_flags_can_be_used_multiple_times
|
714
|
+
@app.reset
|
715
|
+
@app.flag :flag, :multiple => true
|
716
|
+
@app.command :foo do |c|
|
717
|
+
c.action do |options, _, _|
|
718
|
+
@flag = options[:flag]
|
719
|
+
end
|
720
|
+
end
|
721
|
+
|
722
|
+
assert_equal 0,@app.run(%w(--flag 1 --flag=2 --flag 3 foo)),@fake_stderr.to_s
|
723
|
+
|
724
|
+
assert_equal ['1','2','3'],@flag
|
725
|
+
end
|
726
|
+
|
727
|
+
def test_that_multiple_use_flags_are_empty_arrays_by_default
|
728
|
+
@app.reset
|
729
|
+
@app.flag :flag, :multiple => true
|
730
|
+
@app.command :foo do |c|
|
731
|
+
c.action do |options, _, _|
|
732
|
+
@flag = options[:flag]
|
733
|
+
end
|
734
|
+
end
|
735
|
+
|
736
|
+
assert_equal 0,@app.run(['foo']),@fake_stderr.to_s
|
737
|
+
|
738
|
+
assert_equal [],@flag
|
739
|
+
end
|
740
|
+
|
741
|
+
def test_that_multiple_use_flags_can_take_other_defaults
|
742
|
+
@app.reset
|
743
|
+
@app.flag :flag, :multiple => true, :default_value => ['1']
|
744
|
+
@app.command :foo do |c|
|
745
|
+
c.action do |options, _, _|
|
746
|
+
@flag = options[:flag]
|
747
|
+
end
|
748
|
+
end
|
749
|
+
|
750
|
+
assert_equal 0,@app.run(['foo']),@fake_stderr.to_s
|
751
|
+
|
752
|
+
assert_equal ['1'],@flag
|
753
|
+
end
|
754
|
+
|
700
755
|
def test_that_we_mutate_ARGV_by_default
|
701
756
|
@app.reset
|
702
757
|
@app.flag :f
|
@@ -748,38 +803,26 @@ class TC_testGLI < Clean::Test::TestCase
|
|
748
803
|
do_test_switch_create_compact(object)
|
749
804
|
end
|
750
805
|
|
751
|
-
def some_descriptions
|
752
|
-
lambda {
|
753
|
-
@description = 'this is a description'
|
754
|
-
@long_description = 'this is a very long description'
|
755
|
-
}
|
756
|
-
end
|
757
|
-
|
758
|
-
def assert_switch_was_made(object,switch)
|
759
|
-
lambda {
|
760
|
-
assert object.switches[switch]
|
761
|
-
assert_equal @description,object.switches[switch].description,"For switch #{switch}"
|
762
|
-
assert_equal @long_description,object.switches[switch].long_description,"For switch #{switch}"
|
763
|
-
assert(object.usage != nil) if object.respond_to? :usage
|
764
|
-
}
|
765
|
-
end
|
766
|
-
|
767
806
|
def do_test_switch_create_classic(object)
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
807
|
+
@description = 'this is a description'
|
808
|
+
@long_description = 'this is a very long description'
|
809
|
+
object.desc @description
|
810
|
+
object.long_desc @long_description
|
811
|
+
object.switch :f
|
812
|
+
assert object.switches[:f]
|
813
|
+
assert_equal @description,object.switches[:f].description,"For switch #{:f}"
|
814
|
+
assert_equal @long_description,object.switches[:f].long_description,"For switch #{:f}"
|
815
|
+
assert(object.usage != nil) if object.respond_to? :usage
|
775
816
|
end
|
776
817
|
|
777
818
|
def do_test_switch_create_compact(object)
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
819
|
+
@description = 'this is a description'
|
820
|
+
@long_description = 'this is a very long description'
|
821
|
+
object.switch :g, :desc => @description, :long_desc => @long_description
|
822
|
+
assert object.switches[:g]
|
823
|
+
assert_equal @description,object.switches[:g].description,"For switch #{:g}"
|
824
|
+
assert_equal @long_description,object.switches[:g].long_description,"For switch #{:g}"
|
825
|
+
assert(object.usage != nil) if object.respond_to? :usage
|
783
826
|
end
|
784
827
|
|
785
828
|
def do_test_switch_create_twice(object)
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative "test_helper"
|
2
2
|
|
3
|
-
class
|
3
|
+
class HelpTest < MiniTest::Test
|
4
4
|
include TestHelper
|
5
5
|
|
6
6
|
def setup
|
@@ -24,86 +24,61 @@ class TC_testHelp < Clean::Test::TestCase
|
|
24
24
|
include GLI::App
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
assert @command.skips_pre
|
40
|
-
assert @command.skips_post
|
41
|
-
assert @command.skips_around
|
42
|
-
}
|
27
|
+
def test_help_command_configured_properly_when_created
|
28
|
+
app = TestApp.new
|
29
|
+
app.subcommand_option_handling :normal
|
30
|
+
@command = GLI::Commands::Help.new(app,@output,@error)
|
31
|
+
assert_equal 'help',@command.name.to_s
|
32
|
+
assert_nil @command.aliases
|
33
|
+
assert_equal 'command',@command.arguments_description
|
34
|
+
refute_nil @command.description
|
35
|
+
refute_nil @command.long_description
|
36
|
+
assert @command.skips_pre
|
37
|
+
assert @command.skips_post
|
38
|
+
assert @command.skips_around
|
43
39
|
end
|
44
40
|
|
45
|
-
|
46
|
-
Given {
|
41
|
+
def test_the_help_command_can_be_configured_to_skip_things_declaratively
|
47
42
|
app = TestApp.new
|
48
43
|
app.subcommand_option_handling :normal
|
49
44
|
@command = GLI::Commands::Help.new(app,@output,@error)
|
50
45
|
GLI::Commands::Help.skips_pre = false
|
51
46
|
GLI::Commands::Help.skips_post = false
|
52
47
|
GLI::Commands::Help.skips_around = false
|
53
|
-
}
|
54
|
-
Then {
|
55
48
|
assert !@command.skips_pre
|
56
49
|
assert !@command.skips_post
|
57
50
|
assert !@command.skips_around
|
58
|
-
}
|
59
51
|
end
|
60
52
|
|
61
|
-
|
62
|
-
Given {
|
53
|
+
def test_the_help_command_can_be_configured_to_skip_things_declaratively_regardless_of_when_the_object_was_created
|
63
54
|
GLI::Commands::Help.skips_pre = false
|
64
55
|
GLI::Commands::Help.skips_post = false
|
65
56
|
GLI::Commands::Help.skips_around = false
|
66
57
|
app = TestApp.new
|
67
58
|
app.subcommand_option_handling :normal
|
68
59
|
@command = GLI::Commands::Help.new(app,@output,@error)
|
69
|
-
}
|
70
|
-
Then {
|
71
60
|
assert !@command.skips_pre
|
72
61
|
assert !@command.skips_post
|
73
62
|
assert !@command.skips_around
|
74
|
-
}
|
75
63
|
end
|
76
64
|
|
77
|
-
|
78
|
-
|
79
|
-
And {
|
65
|
+
def test_invoking_help_with_no_arguments_results_in_listing_all_commands_and_global_options
|
66
|
+
setup_GLI_app
|
80
67
|
@command = GLI::Commands::Help.new(@app,@output,@error)
|
81
|
-
}
|
82
|
-
When {
|
83
68
|
@command.execute({},{},[])
|
84
|
-
}
|
85
|
-
Then {
|
86
69
|
assert_top_level_help_output
|
87
|
-
}
|
88
70
|
end
|
89
71
|
|
90
|
-
|
91
|
-
|
92
|
-
And {
|
72
|
+
def test_invoking_help_with_a_command_that_doesnt_exist_shows_an_error
|
73
|
+
setup_GLI_app
|
93
74
|
@command = GLI::Commands::Help.new(@app,@output,@error)
|
94
75
|
@unknown_command_name = any_command_name
|
95
|
-
}
|
96
|
-
When {
|
97
76
|
@command.execute({},{},[@unknown_command_name])
|
98
|
-
}
|
99
|
-
Then {
|
100
77
|
assert_error_contained(/error: Unknown command '#{@unknown_command_name}'./)
|
101
|
-
}
|
102
78
|
end
|
103
79
|
|
104
|
-
|
105
|
-
|
106
|
-
And {
|
80
|
+
def test_invoking_help_with_a_known_command_shows_help_for_that_command
|
81
|
+
setup_GLI_app
|
107
82
|
@command_name = cm = any_command_name
|
108
83
|
@desc = d = any_desc
|
109
84
|
@long_desc = ld = any_desc
|
@@ -127,11 +102,7 @@ class TC_testHelp < Clean::Test::TestCase
|
|
127
102
|
end
|
128
103
|
end
|
129
104
|
@command = GLI::Commands::Help.new(@app,@output,@error)
|
130
|
-
}
|
131
|
-
When {
|
132
105
|
@command.execute({},{},[@command_name])
|
133
|
-
}
|
134
|
-
Then {
|
135
106
|
assert_output_contained(@command_name,"Name of the command")
|
136
107
|
assert_output_contained(@desc,"Short description")
|
137
108
|
assert_output_contained(@long_desc,"Long description")
|
@@ -139,27 +110,19 @@ class TC_testHelp < Clean::Test::TestCase
|
|
139
110
|
assert_output_contained(@switch_desc,"switch description")
|
140
111
|
assert_output_contained("-" + @flag,"command flag")
|
141
112
|
assert_output_contained(@flag_desc,"flag description")
|
142
|
-
}
|
143
113
|
end
|
144
114
|
|
145
|
-
|
146
|
-
|
147
|
-
And {
|
115
|
+
def test_invoking_help_with_no_global_options_omits_the_global_options_placeholder_from_usage
|
116
|
+
setup_GLI_app(:no_options)
|
148
117
|
@command = GLI::Commands::Help.new(@app,@output,@error)
|
149
|
-
}
|
150
|
-
When {
|
151
118
|
@command.execute({},{},[])
|
152
|
-
}
|
153
|
-
Then {
|
154
119
|
refute_output_contained(/\[global options\] command \[command options\] \[arguments\.\.\.\]/)
|
155
120
|
refute_output_contained('GLOBAL OPTIONS')
|
156
121
|
assert_output_contained(/command \[command options\] \[arguments\.\.\.\]/)
|
157
|
-
}
|
158
122
|
end
|
159
123
|
|
160
|
-
|
161
|
-
|
162
|
-
And {
|
124
|
+
def test_invoking_help_with_a_known_command_when_no_global_options_are_present_omits_placeholder_from_the_usage_string
|
125
|
+
setup_GLI_app(:no_options)
|
163
126
|
@command_name = cm = any_command_name
|
164
127
|
@desc = d = any_desc
|
165
128
|
@long_desc = ld = any_desc
|
@@ -183,20 +146,14 @@ class TC_testHelp < Clean::Test::TestCase
|
|
183
146
|
end
|
184
147
|
end
|
185
148
|
@command = GLI::Commands::Help.new(@app,@output,@error)
|
186
|
-
}
|
187
|
-
When {
|
188
149
|
@command.execute({},{},[@command_name])
|
189
|
-
}
|
190
|
-
Then {
|
191
150
|
refute_output_contained(/\[global options\]/)
|
192
151
|
assert_output_contained(/\[command options\]/)
|
193
152
|
assert_output_contained('COMMAND OPTIONS')
|
194
|
-
}
|
195
153
|
end
|
196
154
|
|
197
|
-
|
198
|
-
|
199
|
-
And {
|
155
|
+
def test_omits_both_placeholders_when_no_options_present
|
156
|
+
setup_GLI_app(:no_options)
|
200
157
|
@command_name = cm = any_command_name
|
201
158
|
@desc = d = any_desc
|
202
159
|
@long_desc = ld = any_desc
|
@@ -209,20 +166,14 @@ class TC_testHelp < Clean::Test::TestCase
|
|
209
166
|
end
|
210
167
|
end
|
211
168
|
@command = GLI::Commands::Help.new(@app,@output,@error)
|
212
|
-
}
|
213
|
-
When {
|
214
169
|
@command.execute({},{},[@command_name])
|
215
|
-
}
|
216
|
-
Then {
|
217
170
|
refute_output_contained(/\[global options\]/)
|
218
171
|
refute_output_contained(/\[command options\]/)
|
219
172
|
refute_output_contained('COMMAND OPTIONS')
|
220
|
-
}
|
221
173
|
end
|
222
174
|
|
223
|
-
|
224
|
-
|
225
|
-
And {
|
175
|
+
def test_no_command_options_omits_command_options_placeholder
|
176
|
+
setup_GLI_app
|
226
177
|
@command_name = cm = any_command_name
|
227
178
|
@desc = d = any_desc
|
228
179
|
@long_desc = ld = any_desc
|
@@ -235,19 +186,13 @@ class TC_testHelp < Clean::Test::TestCase
|
|
235
186
|
end
|
236
187
|
end
|
237
188
|
@command = GLI::Commands::Help.new(@app,@output,@error)
|
238
|
-
}
|
239
|
-
When {
|
240
189
|
@command.execute({},{},[@command_name])
|
241
|
-
}
|
242
|
-
Then {
|
243
190
|
assert_output_contained(/\[global options\]/)
|
244
191
|
refute_output_contained(/\[command options\]/)
|
245
192
|
refute_output_contained('COMMAND OPTIONS')
|
246
|
-
}
|
247
193
|
end
|
248
194
|
|
249
|
-
|
250
|
-
Given {
|
195
|
+
def test_omitting_default_description_doesnt_blow_up
|
251
196
|
app = TestApp.new
|
252
197
|
app.instance_eval do
|
253
198
|
subcommand_option_handling :normal
|
@@ -266,23 +211,20 @@ class TC_testHelp < Clean::Test::TestCase
|
|
266
211
|
end
|
267
212
|
end
|
268
213
|
@command = GLI::Commands::Help.new(app,@output,@error)
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
assert_nothing_raised(&@code)
|
275
|
-
}
|
214
|
+
begin
|
215
|
+
@command.execute({},{},['top'])
|
216
|
+
rescue => ex
|
217
|
+
assert false, "Expected no exception, got: #{ex.message}"
|
218
|
+
end
|
276
219
|
end
|
277
220
|
|
278
221
|
private
|
279
222
|
|
280
|
-
def
|
281
|
-
lambda {
|
223
|
+
def setup_GLI_app(omit_options=false)
|
282
224
|
@program_description = program_description = any_desc
|
283
225
|
@flags = flags = [
|
284
|
-
[any_desc.strip,
|
285
|
-
[any_desc.strip,
|
226
|
+
[any_desc.strip,:foo,[any_option]],
|
227
|
+
[any_desc.strip,:bar,[any_option,any_long_option]],
|
286
228
|
]
|
287
229
|
@switches = switches = [
|
288
230
|
[any_desc.strip,[any_option]],
|
@@ -302,24 +244,23 @@ private
|
|
302
244
|
unless omit_options
|
303
245
|
flags.each do |(description,arg,flag_names)|
|
304
246
|
desc description
|
305
|
-
|
306
|
-
|
247
|
+
arg_name arg
|
248
|
+
flag flag_names
|
307
249
|
end
|
308
250
|
|
309
251
|
switches.each do |(description,switch_names)|
|
310
252
|
desc description
|
311
|
-
|
253
|
+
switch switch_names
|
312
254
|
end
|
313
255
|
end
|
314
256
|
|
315
257
|
commands.each do |(description,command_names)|
|
316
258
|
desc description
|
317
|
-
command command_names do |c|
|
318
|
-
c.action {}
|
259
|
+
command command_names do |c|
|
260
|
+
c.action {}
|
319
261
|
end
|
320
262
|
end
|
321
263
|
end
|
322
|
-
}
|
323
264
|
end
|
324
265
|
|
325
266
|
def assert_top_level_help_output
|
@@ -357,29 +298,29 @@ private
|
|
357
298
|
|
358
299
|
def refute_output_contained(string_or_regexp,desc='')
|
359
300
|
string_or_regexp = /#{string_or_regexp}/ if string_or_regexp.kind_of?(String)
|
360
|
-
|
301
|
+
refute_match string_or_regexp,@output.string,desc
|
361
302
|
end
|
362
303
|
|
363
304
|
def any_option
|
364
305
|
('a'..'z').to_a[@option_index].tap { @option_index += 1 }
|
365
306
|
end
|
366
|
-
|
367
|
-
def any_long_option
|
368
|
-
Faker::Lorem.words(10)[rand(10)]
|
369
|
-
end
|
370
307
|
|
371
|
-
def
|
372
|
-
|
308
|
+
def any_long_option
|
309
|
+
["foo","bar","blah"].sample
|
373
310
|
end
|
374
311
|
|
375
312
|
def any_desc
|
376
|
-
|
313
|
+
[
|
314
|
+
"This command does some stuff",
|
315
|
+
"Do things and whatnot",
|
316
|
+
"Behold the power of this command"
|
317
|
+
].sample
|
377
318
|
end
|
378
319
|
|
379
320
|
def any_command_name
|
380
|
-
command_name =
|
321
|
+
command_name = ["new","edit","delete","create","update"].sample
|
381
322
|
while @command_names_used.include?(command_name)
|
382
|
-
command_name =
|
323
|
+
command_name = ["new","edit","delete","create","update"].sample
|
383
324
|
end
|
384
325
|
@command_names_used << command_name
|
385
326
|
command_name
|
File without changes
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative "test_helper"
|
2
2
|
|
3
|
-
class
|
3
|
+
class OptiosnTest < MiniTest::Test
|
4
4
|
include TestHelper
|
5
5
|
|
6
6
|
def test_by_method
|
@@ -10,7 +10,7 @@ class TC_testOptions < Clean::Test::TestCase
|
|
10
10
|
assert_equal 'verbose', o[:name]
|
11
11
|
assert_equal 'verbose', o['name']
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def test_by_string
|
15
15
|
o = GLI::Options.new
|
16
16
|
o['name'] = 'verbose'
|
@@ -18,7 +18,7 @@ class TC_testOptions < Clean::Test::TestCase
|
|
18
18
|
assert_equal 'verbose', o[:name]
|
19
19
|
assert_equal 'verbose', o['name']
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def test_by_symbol
|
23
23
|
o = GLI::Options.new
|
24
24
|
o[:name] = 'verbose'
|