gli 2.6.0.rc1 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/features/gli_executable.feature +1 -1
- data/features/gli_init.feature +2 -2
- data/features/todo.feature +23 -6
- data/features/todo_legacy.feature +3 -3
- data/gli.gemspec +2 -1
- data/lib/gli/app.rb +2 -1
- data/lib/gli/app_support.rb +10 -2
- data/lib/gli/commands/doc.rb +7 -1
- data/lib/gli/commands/help.rb +6 -2
- data/lib/gli/commands/help_modules/command_finder.rb +1 -1
- data/lib/gli/commands/help_modules/command_help_format.rb +4 -2
- data/lib/gli/commands/help_modules/global_help_format.rb +2 -2
- data/lib/gli/commands/initconfig.rb +1 -0
- data/lib/gli/commands/rdoc_document_listener.rb +3 -3
- data/lib/gli/terminal.rb +7 -0
- data/lib/gli/version.rb +1 -1
- data/test/tc_command.rb +8 -0
- data/test/tc_doc.rb +1 -0
- data/test/tc_help.rb +89 -0
- data/test/tc_terminal.rb +4 -0
- metadata +25 -12
@@ -27,7 +27,7 @@ Feature: The GLI executable works as intended
|
|
27
27
|
-n - Dry run; dont change the disk
|
28
28
|
-r, --root=arg - Root dir of project (default: .)
|
29
29
|
-v - Be verbose
|
30
|
-
--version -
|
30
|
+
--version - Display the program version
|
31
31
|
|
32
32
|
COMMANDS
|
33
33
|
help - Shows a list of commands or help for one command
|
data/features/gli_init.feature
CHANGED
@@ -66,7 +66,7 @@ Feature: The scaffold GLI generates works
|
|
66
66
|
the default)
|
67
67
|
--help - Show this message
|
68
68
|
-s, --[no-]switch - Describe some switch here
|
69
|
-
--version -
|
69
|
+
--version - Display the program version
|
70
70
|
|
71
71
|
COMMANDS
|
72
72
|
add - Describe add here
|
@@ -92,7 +92,7 @@ Feature: The scaffold GLI generates works
|
|
92
92
|
the default)
|
93
93
|
--help - Show this message
|
94
94
|
-s, --[no-]switch - Describe some switch here
|
95
|
-
--version -
|
95
|
+
--version - Display the program version
|
96
96
|
|
97
97
|
COMMANDS
|
98
98
|
add - Describe add here
|
data/features/todo.feature
CHANGED
@@ -36,7 +36,7 @@ Feature: The todo app has a nice user interface
|
|
36
36
|
--help - Show this message
|
37
37
|
--[no-]otherswitch -
|
38
38
|
--[no-]switch -
|
39
|
-
--version -
|
39
|
+
--version - Display the program version
|
40
40
|
|
41
41
|
COMMANDS
|
42
42
|
chained -
|
@@ -54,7 +54,13 @@ Feature: The todo app has a nice user interface
|
|
54
54
|
Examples:
|
55
55
|
| help |
|
56
56
|
| help |
|
57
|
-
|
57
|
+
|
58
|
+
Scenario: Version display
|
59
|
+
When I successfully run `todo --version`
|
60
|
+
Then the output should contain:
|
61
|
+
"""
|
62
|
+
todo version 0.0.1
|
63
|
+
"""
|
58
64
|
|
59
65
|
Scenario: Help completion mode
|
60
66
|
When I successfully run `todo help -c`
|
@@ -121,7 +127,7 @@ Feature: The todo app has a nice user interface
|
|
121
127
|
--flag=arg - (default: none)
|
122
128
|
--[no-]switch -
|
123
129
|
--[no-]otherswitch -
|
124
|
-
--version -
|
130
|
+
--version - Display the program version
|
125
131
|
--help - Show this message
|
126
132
|
|
127
133
|
COMMANDS
|
@@ -171,6 +177,17 @@ Feature: The todo app has a nice user interface
|
|
171
177
|
| list --help |
|
172
178
|
|
173
179
|
|
180
|
+
Scenario: Getting Help for a top level command of todo with no command options
|
181
|
+
When I successfully run `todo help chained`
|
182
|
+
Then the output should contain:
|
183
|
+
"""
|
184
|
+
NAME
|
185
|
+
chained -
|
186
|
+
|
187
|
+
SYNOPSIS
|
188
|
+
todo [global options] chained
|
189
|
+
"""
|
190
|
+
|
174
191
|
Scenario: Getting Help with no wrapping
|
175
192
|
Given the todo app is coded to avoid wrapping text
|
176
193
|
When I successfully run `todo help list`
|
@@ -280,9 +297,9 @@ Feature: The todo app has a nice user interface
|
|
280
297
|
create - Create a new task or context
|
281
298
|
|
282
299
|
SYNOPSIS
|
283
|
-
todo [global options] create
|
284
|
-
todo [global options] create
|
285
|
-
todo [global options] create
|
300
|
+
todo [global options] create
|
301
|
+
todo [global options] create contexts [context_name]
|
302
|
+
todo [global options] create tasks task_name[, task_name]*
|
286
303
|
|
287
304
|
COMMANDS
|
288
305
|
<default> - Makes a new task
|
@@ -88,9 +88,9 @@ Feature: The todo app is backwards compatible with legacy subcommand parsing
|
|
88
88
|
create - Create a new task or context
|
89
89
|
|
90
90
|
SYNOPSIS
|
91
|
-
todo [global options] create
|
92
|
-
todo [global options] create
|
93
|
-
todo [global options] create
|
91
|
+
todo [global options] create
|
92
|
+
todo [global options] create contexts [context_name]
|
93
|
+
todo [global options] create tasks task_name[, task_name]*
|
94
94
|
|
95
95
|
COMMANDS
|
96
96
|
<default> - Makes a new task
|
data/gli.gemspec
CHANGED
@@ -25,7 +25,8 @@ spec = Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency('rdoc', '~> 3.11')
|
26
26
|
s.add_development_dependency('rainbow', '~> 1.1.1')
|
27
27
|
s.add_development_dependency('clean_test')
|
28
|
-
s.add_development_dependency('
|
28
|
+
s.add_development_dependency('cucumber', '1.2.3')
|
29
|
+
s.add_development_dependency('aruba', '0.5.1') # 0.5.3 randomly breaks with "LaunchError: no such file or directory" and only sometimes.
|
29
30
|
s.add_development_dependency('sdoc')
|
30
31
|
s.add_development_dependency('faker','1.0.0')
|
31
32
|
end
|
data/lib/gli/app.rb
CHANGED
@@ -104,7 +104,7 @@ module GLI
|
|
104
104
|
# the command specified will not be executed.
|
105
105
|
# The block will receive the global-options,command,options, and arguments
|
106
106
|
# If this block evaluates to true, the program will proceed; otherwise
|
107
|
-
# the program will end immediately
|
107
|
+
# the program will end immediately and exit nonzero
|
108
108
|
def pre(&a_proc)
|
109
109
|
@pre_block = a_proc
|
110
110
|
end
|
@@ -157,6 +157,7 @@ module GLI
|
|
157
157
|
# +version+:: String containing the version of your application.
|
158
158
|
def version(version)
|
159
159
|
@version = version
|
160
|
+
desc 'Display the program version'
|
160
161
|
switch :version, :negatable => false
|
161
162
|
end
|
162
163
|
|
data/lib/gli/app_support.rb
CHANGED
@@ -31,6 +31,10 @@ module GLI
|
|
31
31
|
clear_nexts
|
32
32
|
end
|
33
33
|
|
34
|
+
def exe_name
|
35
|
+
File.basename($0)
|
36
|
+
end
|
37
|
+
|
34
38
|
# Get an array of commands, ordered by when they were declared
|
35
39
|
def commands_declaration_order # :nodoc:
|
36
40
|
@commands_declaration_order
|
@@ -71,8 +75,12 @@ module GLI
|
|
71
75
|
|
72
76
|
the_command = parsing_result.command
|
73
77
|
|
74
|
-
|
75
|
-
|
78
|
+
if proceed?(parsing_result)
|
79
|
+
call_command(parsing_result)
|
80
|
+
0
|
81
|
+
else
|
82
|
+
exit_now!(nil,65)
|
83
|
+
end
|
76
84
|
rescue Exception => ex
|
77
85
|
if the_command.nil? && ex.respond_to?(:command_in_context)
|
78
86
|
the_command = ex.command_in_context
|
data/lib/gli/commands/doc.rb
CHANGED
@@ -23,7 +23,7 @@ module GLI
|
|
23
23
|
flag :format
|
24
24
|
|
25
25
|
action do |global_options,options,arguments|
|
26
|
-
self.document(format_class(options[:format]).new(global_options,options,arguments))
|
26
|
+
self.document(format_class(options[:format]).new(global_options,options,arguments,app))
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -54,6 +54,12 @@ module GLI
|
|
54
54
|
|
55
55
|
# Interface for a listener that is called during various parts of the doc process
|
56
56
|
class DocumentListener
|
57
|
+
def initialize(global_options,options,arguments,app)
|
58
|
+
@global_options = global_options
|
59
|
+
@options = options
|
60
|
+
@arguments = arguments
|
61
|
+
@app = app
|
62
|
+
end
|
57
63
|
# Called before processing begins
|
58
64
|
def beginning
|
59
65
|
abstract!
|
data/lib/gli/commands/help.rb
CHANGED
@@ -60,7 +60,11 @@ module GLI
|
|
60
60
|
switch :c
|
61
61
|
|
62
62
|
action do |global_options,options,arguments|
|
63
|
-
|
63
|
+
if global_options[:version] && !global_options[:help]
|
64
|
+
puts "#{@app.exe_name} version #{@app.version_string}"
|
65
|
+
else
|
66
|
+
show_help(global_options,options,arguments,output,error)
|
67
|
+
end
|
64
68
|
end
|
65
69
|
end
|
66
70
|
|
@@ -81,7 +85,7 @@ module GLI
|
|
81
85
|
name = arguments.shift
|
82
86
|
command = command_finder.find_command(name)
|
83
87
|
unless command.nil?
|
84
|
-
out.puts HelpModules::CommandHelpFormat.new(command,@app
|
88
|
+
out.puts HelpModules::CommandHelpFormat.new(command,@app,@app.exe_name.to_s,@sorter,@text_wrapping_class).format
|
85
89
|
end
|
86
90
|
end
|
87
91
|
end
|
@@ -47,7 +47,7 @@ module GLI
|
|
47
47
|
if command.nil?
|
48
48
|
@last_unknown_command = name
|
49
49
|
unless @squelch_stderr
|
50
|
-
error.puts "error: Unknown command '#{name}'. Use '#{
|
50
|
+
error.puts "error: Unknown command '#{name}'. Use '#{@app.exe_name} help' for a list of commands."
|
51
51
|
end
|
52
52
|
true
|
53
53
|
else
|
@@ -98,8 +98,10 @@ COMMANDS
|
|
98
98
|
|
99
99
|
def basic_usage
|
100
100
|
usage = @basic_invocation.dup
|
101
|
-
usage << " [global options]
|
102
|
-
usage << "
|
101
|
+
usage << " [global options]" unless global_flags_and_switches.empty?
|
102
|
+
usage << " #{path_to_command}"
|
103
|
+
usage << " [command options]" unless flags_and_switches(@command,@app).empty?
|
104
|
+
usage << " "
|
103
105
|
usage
|
104
106
|
end
|
105
107
|
|
@@ -35,7 +35,7 @@ module GLI
|
|
35
35
|
private
|
36
36
|
|
37
37
|
GLOBAL_HELP = ERB.new(%q(NAME
|
38
|
-
<%=
|
38
|
+
<%= @app.exe_name %> - <%= program_desc %>
|
39
39
|
<%= program_long_desc %>
|
40
40
|
SYNOPSIS
|
41
41
|
<%= usage_string %>
|
@@ -58,7 +58,7 @@ COMMANDS
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def usage_string
|
61
|
-
"#{
|
61
|
+
"#{@app.exe_name} ".tap do |string|
|
62
62
|
string << "[global options] " unless global_flags_and_switches.empty?
|
63
63
|
string << "command "
|
64
64
|
string << "[command options] [arguments...]"
|
@@ -4,8 +4,8 @@ module GLI
|
|
4
4
|
module Commands
|
5
5
|
class RdocDocumentListener
|
6
6
|
|
7
|
-
def initialize(global_options,options,arguments)
|
8
|
-
@io = File.new(
|
7
|
+
def initialize(global_options,options,arguments,app)
|
8
|
+
@io = File.new("#{app.exe_name}.rdoc",'w')
|
9
9
|
@nest = ''
|
10
10
|
@arg_name_formatter = GLI::Commands::HelpModules::ArgNameFormatter.new
|
11
11
|
end
|
@@ -20,7 +20,7 @@ module GLI
|
|
20
20
|
|
21
21
|
# Gives you the program description
|
22
22
|
def program_desc(desc)
|
23
|
-
@io.puts "== #{
|
23
|
+
@io.puts "== #{@app.exe_name} - #{desc}"
|
24
24
|
@io.puts
|
25
25
|
end
|
26
26
|
|
data/lib/gli/terminal.rb
CHANGED
@@ -59,6 +59,10 @@ module GLI
|
|
59
59
|
lambda { (jruby? || (!STDIN.tty? && ENV['TERM'])) && command_exists?('tput') },
|
60
60
|
lambda { [run_command('tput cols').to_i, run_command('tput lines').to_i] }
|
61
61
|
],
|
62
|
+
[
|
63
|
+
lambda { (solaris? && STDIN.tty? && command_exists?('stty')) },
|
64
|
+
lambda { run_command('stty').split("\n")[1].scan(/\d+/)[0..1].map { |size_element| size_element.to_i }.reverse }
|
65
|
+
],
|
62
66
|
[
|
63
67
|
lambda { STDIN.tty? && command_exists?('stty') },
|
64
68
|
lambda { run_command('stty size').scan(/\d+/).map { |size_element| size_element.to_i }.reverse }
|
@@ -90,5 +94,8 @@ module GLI
|
|
90
94
|
# True if we are JRuby; exposed to allow for testing
|
91
95
|
def self.jruby?; RUBY_PLATFORM =~ /java/; end
|
92
96
|
|
97
|
+
# True if this is running under Solaris Sparc
|
98
|
+
def self.solaris?; RUBY_PLATFORM =~ /solaris/; end
|
99
|
+
|
93
100
|
end
|
94
101
|
end
|
data/lib/gli/version.rb
CHANGED
data/test/tc_command.rb
CHANGED
@@ -351,6 +351,14 @@ class TC_testCommand < Clean::Test::TestCase
|
|
351
351
|
assert_equal [:blah], command.aliases
|
352
352
|
end
|
353
353
|
|
354
|
+
def test_pre_exiting_false_causes_nonzero_exit
|
355
|
+
@app.pre { |*| false }
|
356
|
+
|
357
|
+
assert_equal 65,@app.run(["bs"]) # BSD for "input data incorrect in some way"
|
358
|
+
assert_equal '',@fake_stderr.to_s
|
359
|
+
assert_equal '',@fake_stdout.to_s
|
360
|
+
end
|
361
|
+
|
354
362
|
private
|
355
363
|
|
356
364
|
def assert_contained(output,regexp)
|
data/test/tc_doc.rb
CHANGED
data/test/tc_help.rb
CHANGED
@@ -157,6 +157,95 @@ class TC_testHelp < Clean::Test::TestCase
|
|
157
157
|
}
|
158
158
|
end
|
159
159
|
|
160
|
+
test_that "invoking help with a known command when no global options are present omits [global options] from the usage string" do
|
161
|
+
Given a_GLI_app(:no_options)
|
162
|
+
And {
|
163
|
+
@command_name = cm = any_command_name
|
164
|
+
@desc = d = any_desc
|
165
|
+
@long_desc = ld = any_desc
|
166
|
+
@switch = s = any_option
|
167
|
+
@switch_desc = sd = any_desc
|
168
|
+
@flag = f = any_option
|
169
|
+
@flag_desc = fd = any_desc
|
170
|
+
|
171
|
+
@app.instance_eval do
|
172
|
+
desc d
|
173
|
+
long_desc ld
|
174
|
+
command cm do |c|
|
175
|
+
|
176
|
+
c.desc sd
|
177
|
+
c.switch s
|
178
|
+
|
179
|
+
c.desc fd
|
180
|
+
c.flag f
|
181
|
+
|
182
|
+
c.action {}
|
183
|
+
end
|
184
|
+
end
|
185
|
+
@command = GLI::Commands::Help.new(@app,@output,@error)
|
186
|
+
}
|
187
|
+
When {
|
188
|
+
@command.execute({},{},[@command_name])
|
189
|
+
}
|
190
|
+
Then {
|
191
|
+
refute_output_contained(/\[global options\]/)
|
192
|
+
assert_output_contained(/\[command options\]/)
|
193
|
+
assert_output_contained('COMMAND OPTIONS')
|
194
|
+
}
|
195
|
+
end
|
196
|
+
|
197
|
+
test_that "invoking help with a known command when no global options nor command options are present omits [global options] and [command options] from the usage string" do
|
198
|
+
Given a_GLI_app(:no_options)
|
199
|
+
And {
|
200
|
+
@command_name = cm = any_command_name
|
201
|
+
@desc = d = any_desc
|
202
|
+
@long_desc = ld = any_desc
|
203
|
+
|
204
|
+
@app.instance_eval do
|
205
|
+
desc d
|
206
|
+
long_desc ld
|
207
|
+
command cm do |c|
|
208
|
+
c.action {}
|
209
|
+
end
|
210
|
+
end
|
211
|
+
@command = GLI::Commands::Help.new(@app,@output,@error)
|
212
|
+
}
|
213
|
+
When {
|
214
|
+
@command.execute({},{},[@command_name])
|
215
|
+
}
|
216
|
+
Then {
|
217
|
+
refute_output_contained(/\[global options\]/)
|
218
|
+
refute_output_contained(/\[command options\]/)
|
219
|
+
refute_output_contained('COMMAND OPTIONS')
|
220
|
+
}
|
221
|
+
end
|
222
|
+
|
223
|
+
test_that "invoking help with a known command that has no command options omits [command options] from the usage string" do
|
224
|
+
Given a_GLI_app
|
225
|
+
And {
|
226
|
+
@command_name = cm = any_command_name
|
227
|
+
@desc = d = any_desc
|
228
|
+
@long_desc = ld = any_desc
|
229
|
+
|
230
|
+
@app.instance_eval do
|
231
|
+
desc d
|
232
|
+
long_desc ld
|
233
|
+
command cm do |c|
|
234
|
+
c.action {}
|
235
|
+
end
|
236
|
+
end
|
237
|
+
@command = GLI::Commands::Help.new(@app,@output,@error)
|
238
|
+
}
|
239
|
+
When {
|
240
|
+
@command.execute({},{},[@command_name])
|
241
|
+
}
|
242
|
+
Then {
|
243
|
+
assert_output_contained(/\[global options\]/)
|
244
|
+
refute_output_contained(/\[command options\]/)
|
245
|
+
refute_output_contained('COMMAND OPTIONS')
|
246
|
+
}
|
247
|
+
end
|
248
|
+
|
160
249
|
test_that "omitting default_description doesn't blow up" do
|
161
250
|
Given {
|
162
251
|
app = TestApp.new
|
data/test/tc_terminal.rb
CHANGED
@@ -60,12 +60,14 @@ class TC_testTerminal < Clean::Test::TestCase
|
|
60
60
|
return '1234' if command == 'tput lines'
|
61
61
|
else
|
62
62
|
return '1234 5678' if command == 'stty size'
|
63
|
+
return '1234 5678' if command == 'stty'
|
63
64
|
end
|
64
65
|
|
65
66
|
raise "Unexpected command called: #{command} for #{RUBY_PLATFORM}"
|
66
67
|
end
|
67
68
|
def command_exists?(command); true; end
|
68
69
|
def jruby?; false; end
|
70
|
+
def solaris?; false; end
|
69
71
|
end
|
70
72
|
ENV['COLUMNS'] = 'foo'
|
71
73
|
assert_equal [5678,1234],terminal.size
|
@@ -77,6 +79,7 @@ class TC_testTerminal < Clean::Test::TestCase
|
|
77
79
|
GLI::Terminal.instance_eval do
|
78
80
|
def command_exists?(command); false; end
|
79
81
|
def jruby?; false; end
|
82
|
+
def solaris?; false; end
|
80
83
|
end
|
81
84
|
ENV['COLUMNS'] = 'foo'
|
82
85
|
assert_equal [80,24],terminal.size
|
@@ -89,6 +92,7 @@ class TC_testTerminal < Clean::Test::TestCase
|
|
89
92
|
terminal = GLI::Terminal.new
|
90
93
|
GLI::Terminal.instance_eval do
|
91
94
|
def jruby?; raise "Problem"; end
|
95
|
+
def solaris?; false; end
|
92
96
|
end
|
93
97
|
ENV['COLUMNS'] = 'foo'
|
94
98
|
assert_equal [80,24],terminal.size
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.6.0
|
5
|
-
prerelease:
|
4
|
+
version: 2.6.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- David Copeland
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -75,22 +75,38 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: cucumber
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - '='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.2.3
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.2.3
|
78
94
|
- !ruby/object:Gem::Dependency
|
79
95
|
name: aruba
|
80
96
|
requirement: !ruby/object:Gem::Requirement
|
81
97
|
none: false
|
82
98
|
requirements:
|
83
|
-
- -
|
99
|
+
- - '='
|
84
100
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
101
|
+
version: 0.5.1
|
86
102
|
type: :development
|
87
103
|
prerelease: false
|
88
104
|
version_requirements: !ruby/object:Gem::Requirement
|
89
105
|
none: false
|
90
106
|
requirements:
|
91
|
-
- -
|
107
|
+
- - '='
|
92
108
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
109
|
+
version: 0.5.1
|
94
110
|
- !ruby/object:Gem::Dependency
|
95
111
|
name: sdoc
|
96
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -365,15 +381,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
365
381
|
- - ! '>='
|
366
382
|
- !ruby/object:Gem::Version
|
367
383
|
version: '0'
|
368
|
-
segments:
|
369
|
-
- 0
|
370
|
-
hash: -2077859074459195456
|
371
384
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
372
385
|
none: false
|
373
386
|
requirements:
|
374
|
-
- - ! '
|
387
|
+
- - ! '>='
|
375
388
|
- !ruby/object:Gem::Version
|
376
|
-
version:
|
389
|
+
version: '0'
|
377
390
|
requirements: []
|
378
391
|
rubyforge_project: gli
|
379
392
|
rubygems_version: 1.8.25
|