gli 2.9.0 → 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.
Files changed (94) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +28 -0
  3. data/.gitignore +3 -3
  4. data/.tool-versions +1 -0
  5. data/Gemfile +0 -2
  6. data/README.rdoc +29 -18
  7. data/Rakefile +15 -37
  8. data/bin/ci +29 -0
  9. data/bin/gli +24 -54
  10. data/bin/rake +29 -0
  11. data/bin/setup +5 -0
  12. data/exe/gli +68 -0
  13. data/gli.gemspec +20 -24
  14. data/gli.rdoc +9 -9
  15. data/lib/gli/app.rb +42 -8
  16. data/lib/gli/app_support.rb +17 -5
  17. data/lib/gli/argument.rb +20 -0
  18. data/lib/gli/command.rb +27 -2
  19. data/lib/gli/command_finder.rb +42 -25
  20. data/lib/gli/command_support.rb +13 -7
  21. data/lib/gli/commands/doc.rb +9 -3
  22. data/lib/gli/commands/help.rb +2 -1
  23. data/lib/gli/commands/help_modules/arg_name_formatter.rb +29 -2
  24. data/lib/gli/commands/help_modules/command_help_format.rb +19 -1
  25. data/lib/gli/commands/help_modules/full_synopsis_formatter.rb +5 -4
  26. data/lib/gli/commands/help_modules/global_help_format.rb +1 -1
  27. data/lib/gli/commands/help_modules/options_formatter.rb +4 -6
  28. data/lib/gli/commands/initconfig.rb +3 -6
  29. data/lib/gli/commands/rdoc_document_listener.rb +2 -1
  30. data/lib/gli/commands/scaffold.rb +71 -142
  31. data/lib/gli/dsl.rb +25 -1
  32. data/lib/gli/exceptions.rb +26 -0
  33. data/lib/gli/flag.rb +23 -2
  34. data/lib/gli/gli_option_parser.rb +73 -21
  35. data/lib/gli/option_parser_factory.rb +10 -3
  36. data/lib/gli/options.rb +2 -2
  37. data/lib/gli/switch.rb +4 -0
  38. data/lib/gli/terminal.rb +6 -2
  39. data/lib/gli/version.rb +1 -1
  40. data/lib/gli.rb +2 -0
  41. data/object-model.dot +29 -0
  42. data/object-model.png +0 -0
  43. data/test/apps/todo/Gemfile +1 -1
  44. data/test/apps/todo/bin/todo +16 -6
  45. data/test/apps/todo/lib/todo/commands/create.rb +48 -18
  46. data/test/apps/todo/lib/todo/commands/list.rb +48 -35
  47. data/test/apps/todo/lib/todo/commands/ls.rb +25 -24
  48. data/test/apps/todo/lib/todo/commands/make.rb +42 -39
  49. data/test/apps/todo/todo.gemspec +1 -2
  50. data/test/apps/todo_legacy/todo.gemspec +1 -2
  51. data/test/apps/todo_plugins/commands/third.rb +2 -0
  52. data/test/integration/gli_cli_test.rb +69 -0
  53. data/test/integration/gli_powered_app_test.rb +52 -0
  54. data/test/integration/scaffold_test.rb +30 -0
  55. data/test/integration/test_helper.rb +52 -0
  56. data/test/unit/command_finder_test.rb +54 -0
  57. data/test/{tc_command.rb → unit/command_test.rb} +20 -7
  58. data/test/unit/compound_command_test.rb +17 -0
  59. data/test/{tc_doc.rb → unit/doc_test.rb} +38 -51
  60. data/test/{tc_flag.rb → unit/flag_test.rb} +19 -25
  61. data/test/{tc_gli.rb → unit/gli_test.rb} +92 -49
  62. data/test/{tc_help.rb → unit/help_test.rb} +54 -113
  63. data/test/{init_simplecov.rb → unit/init_simplecov.rb} +0 -0
  64. data/test/{tc_options.rb → unit/options_test.rb} +4 -4
  65. data/test/unit/subcommand_parsing_test.rb +263 -0
  66. data/test/unit/subcommands_test.rb +245 -0
  67. data/test/{fake_std_out.rb → unit/support/fake_std_out.rb} +0 -0
  68. data/test/{config.yaml → unit/support/gli_test_config.yml} +1 -0
  69. data/test/unit/switch_test.rb +49 -0
  70. data/test/{tc_terminal.rb → unit/terminal_test.rb} +28 -3
  71. data/test/unit/test_helper.rb +13 -0
  72. data/test/unit/verbatim_wrapper_test.rb +24 -0
  73. metadata +86 -141
  74. data/.ruby-gemset +0 -1
  75. data/.ruby-version +0 -1
  76. data/.travis.yml +0 -12
  77. data/ObjectModel.graffle +0 -1191
  78. data/bin/report_on_rake_results +0 -10
  79. data/bin/test_all_rubies.sh +0 -6
  80. data/features/gli_executable.feature +0 -90
  81. data/features/gli_init.feature +0 -232
  82. data/features/step_definitions/gli_executable_steps.rb +0 -18
  83. data/features/step_definitions/gli_init_steps.rb +0 -11
  84. data/features/step_definitions/todo_steps.rb +0 -96
  85. data/features/support/env.rb +0 -54
  86. data/features/todo.feature +0 -449
  87. data/features/todo_legacy.feature +0 -128
  88. data/test/option_test_helper.rb +0 -13
  89. data/test/tc_compound_command.rb +0 -22
  90. data/test/tc_subcommand_parsing.rb +0 -104
  91. data/test/tc_subcommands.rb +0 -259
  92. data/test/tc_switch.rb +0 -55
  93. data/test/tc_verbatim_wrapper.rb +0 -36
  94. data/test/test_helper.rb +0 -20
@@ -1,449 +0,0 @@
1
- Feature: The todo app has a nice user interface
2
- As a user of the todo application
3
- It should have a nice UI, since it's GLI-powered
4
-
5
- Background:
6
- Given I have GLI installed
7
- And GLI's libs are in my path
8
- And my terminal size is "80x24"
9
- And todo's bin directory is in my path
10
-
11
- Scenario: Error message for unknown command
12
- When I run `todo help unknown`
13
- Then the output should contain:
14
- """
15
- error: Unknown command 'unknown'. Use 'todo help' for a list of commands.
16
- """
17
-
18
- Scenario Outline: Getting Help for todo in general
19
- When I successfully run `todo <help>`
20
- Then the output should contain:
21
- """
22
- NAME
23
- todo - Manages tasks
24
-
25
- A test program that has a sophisticated UI that can be used to exercise a
26
- lot of GLI's power
27
-
28
- SYNOPSIS
29
- todo [global options] command [command options] [arguments...]
30
-
31
- VERSION
32
- 0.0.1
33
-
34
- GLOBAL OPTIONS
35
- --flag=arg - (default: none)
36
- --help - Show this message
37
- --[no-]otherswitch -
38
- --[no-]switch -
39
- --version - Display the program version
40
-
41
- COMMANDS
42
- chained -
43
- chained2, ch2 -
44
- create, new - Create a new task or context
45
- first -
46
- help - Shows a list of commands or help for one command
47
- initconfig - Initialize the config file using current global options
48
- list - List things, such as tasks or contexts
49
- ls - LS things, such as tasks or contexts
50
- make -
51
- second -
52
- third -
53
- """
54
- Examples:
55
- | help |
56
- | help |
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
- """
64
-
65
- Scenario: Help completion mode
66
- When I successfully run `todo help -c`
67
- Then the output should contain:
68
- """
69
- _doc
70
- ch2
71
- chained
72
- chained2
73
- create
74
- first
75
- help
76
- initconfig
77
- list
78
- ls
79
- make
80
- new
81
- second
82
- third
83
- """
84
-
85
- Scenario: Help completion mode for partial match
86
- When I successfully run `todo help -c ch`
87
- Then the output should contain:
88
- """
89
- ch2
90
- chained
91
- chained2
92
- """
93
-
94
- Scenario: Help completion mode for subcommands
95
- When I successfully run `todo help -c list`
96
- Then the output should contain:
97
- """
98
- contexts
99
- tasks
100
- """
101
-
102
- Scenario: Help completion mode partial match for subcommands
103
- When I successfully run `todo help -c list con`
104
- Then the output should contain:
105
- """
106
- contexts
107
- """
108
-
109
- Scenario: Getting Help with self-ordered commands
110
- Given the todo app is coded to avoid sorted help commands
111
- When I successfully run `todo help`
112
- Then the output should contain:
113
- """
114
- NAME
115
- todo - Manages tasks
116
-
117
- A test program that has a sophisticated UI that can be used to exercise a
118
- lot of GLI's power
119
-
120
- SYNOPSIS
121
- todo [global options] command [command options] [arguments...]
122
-
123
- VERSION
124
- 0.0.1
125
-
126
- GLOBAL OPTIONS
127
- --flag=arg - (default: none)
128
- --[no-]switch -
129
- --[no-]otherswitch -
130
- --version - Display the program version
131
- --help - Show this message
132
-
133
- COMMANDS
134
- help - Shows a list of commands or help for one command
135
- initconfig - Initialize the config file using current global options
136
- create, new - Create a new task or context
137
- list - List things, such as tasks or contexts
138
- ls - LS things, such as tasks or contexts
139
- make -
140
- third -
141
- first -
142
- second -
143
- chained -
144
- chained2, ch2 -
145
- """
146
-
147
- Scenario Outline: Getting Help for a top level command of todo
148
- When I successfully run `todo <help_invocation>`
149
- Then the output should contain:
150
- """
151
- NAME
152
- list - List things, such as tasks or contexts
153
-
154
- SYNOPSIS
155
- todo [global options] list [command options] [tasks] [--flag arg] [-x arg]
156
- todo [global options] list [command options] contexts [--otherflag arg] [-b] [-f|--foobar]
157
-
158
- DESCRIPTION
159
- List a whole lot of things that you might be keeping track of in your
160
- overall todo list.
161
-
162
- This is your go-to place or finding all of the things that you might have
163
- stored in your todo databases.
164
-
165
- COMMAND OPTIONS
166
- -l, --[no-]long - Show long form
167
- --required_flag=arg - (required, default: none)
168
-
169
- COMMANDS
170
- contexts - List contexts
171
- tasks - List tasks (default)
172
- """
173
-
174
- Examples:
175
- | help_invocation |
176
- | help list |
177
- | list -h |
178
- | list --help |
179
- | --help list |
180
-
181
-
182
- Scenario: Getting Help for a top level command of todo with no command options
183
- When I successfully run `todo help chained`
184
- Then the output should contain:
185
- """
186
- NAME
187
- chained -
188
-
189
- SYNOPSIS
190
- todo [global options] chained
191
- """
192
-
193
- Scenario: Getting Help with no wrapping
194
- Given the todo app is coded to avoid wrapping text
195
- When I successfully run `todo help list`
196
- Then the output should contain:
197
- """
198
- NAME
199
- list - List things, such as tasks or contexts
200
-
201
- SYNOPSIS
202
- todo [global options] list [command options] [tasks] [--flag arg] [-x arg]
203
- todo [global options] list [command options] contexts [--otherflag arg] [-b] [-f|--foobar]
204
-
205
- DESCRIPTION
206
- List a whole lot of things that you might be keeping track of in your overall todo list. This is your go-to place or finding all of the things that you might have stored in your todo databases.
207
-
208
- COMMAND OPTIONS
209
- -l, --[no-]long - Show long form
210
- --required_flag=arg - (required, default: none)
211
-
212
- COMMANDS
213
- contexts - List contexts
214
- tasks - List tasks (default)
215
- """
216
-
217
- Scenario: Getting Help with verbatim formatting
218
- Given the todo app is coded to use verbatim formatting
219
- When I successfully run `todo help list`
220
- Then the output should contain:
221
- """
222
- NAME
223
- list - List things, such as tasks or contexts
224
-
225
- SYNOPSIS
226
- todo [global options] list [command options] [tasks] [--flag arg] [-x arg]
227
- todo [global options] list [command options] contexts [--otherflag arg] [-b] [-f|--foobar]
228
-
229
- DESCRIPTION
230
-
231
- List a whole lot of things that you might be keeping track of
232
- in your overall todo list.
233
-
234
- This is your go-to place or finding all of the things that you
235
- might have
236
- stored in
237
- your todo databases.
238
-
239
-
240
- COMMAND OPTIONS
241
- -l, --[no-]long - Show long form
242
- --required_flag=arg - (required, default: none)
243
-
244
- COMMANDS
245
- contexts - List contexts
246
- tasks - List tasks (default)
247
- """
248
-
249
- Scenario: Getting Help without wrapping
250
- Given the todo app is coded to wrap text only for tty
251
- When I successfully run `todo help list`
252
- Then the output should contain:
253
- """
254
- NAME
255
- list - List things, such as tasks or contexts
256
-
257
- SYNOPSIS
258
- todo [global options] list [command options] [tasks] [--flag arg] [-x arg]
259
- todo [global options] list [command options] contexts [--otherflag arg] [-b] [-f|--foobar]
260
-
261
- DESCRIPTION
262
- List a whole lot of things that you might be keeping track of in your overall todo list. This is your go-to place or finding all of the things that you might have stored in your todo databases.
263
-
264
- COMMAND OPTIONS
265
- -l, --[no-]long - Show long form
266
- --required_flag=arg - (required, default: none)
267
-
268
- COMMANDS
269
- contexts - List contexts
270
- tasks - List tasks (default)
271
- """
272
-
273
- Scenario: Getting Help for a sub command of todo list
274
- When I successfully run `todo help list tasks`
275
- Then the output should contain:
276
- """
277
- NAME
278
- tasks - List tasks
279
-
280
- SYNOPSIS
281
- todo [global options] list tasks [command options]
282
- todo [global options] list tasks [command options] open
283
-
284
- DESCRIPTION
285
- Lists all of your tasks that you have, in varying orders, and all that
286
- stuff. Yes, this is long, but I need a long description.
287
-
288
- COMMAND OPTIONS
289
- --flag=arg - (default: none)
290
- -x arg - blah blah crud x whatever (default: none)
291
-
292
- COMMANDS
293
- <default> - list all tasks
294
- open - list open tasks
295
- """
296
-
297
- Scenario: Getting Help for a sub command with no command options
298
- When I successfully run `todo help new`
299
- Then the output should contain:
300
- """
301
- NAME
302
- create - Create a new task or context
303
-
304
- SYNOPSIS
305
- todo [global options] create
306
- todo [global options] create contexts [context_name]
307
- todo [global options] create tasks task_name[, task_name]*
308
-
309
- COMMANDS
310
- <default> - Makes a new task
311
- contexts - Make a new context
312
- tasks - Make a new task
313
- """
314
- And the output should not contain "COMMAND OPTIONS"
315
-
316
- Scenario: Running list w/out subcommand performs list tasks by default
317
- When I successfully run `todo list --required_flag=blah boo yay`
318
- Then the output should contain "list tasks: boo,yay"
319
-
320
- Scenario: Running list w/out subcommand or any arguments performs list tasks by default
321
- When I successfully run `todo list --required_flag=blah`
322
- Then the output should contain "list tasks:"
323
-
324
- Scenario: Running chained commands works
325
- When I successfully run `todo chained foo bar`
326
- Then the output should contain:
327
- """
328
- first: foo,bar
329
- second: foo,bar
330
- """
331
-
332
- Scenario: Running chained commands works and is ordered
333
- When I successfully run `todo chained2 foo bar`
334
- Then the output should contain:
335
- """
336
- second: foo,bar
337
- first: foo,bar
338
- """
339
-
340
- Scenario: Running chained commands works and is ordered
341
- When I successfully run `todo ch2 foo bar`
342
- Then the output should contain:
343
- """
344
- second: foo,bar
345
- first: foo,bar
346
- """
347
-
348
- Scenario: Running ls w/out subcommand shows help and an error
349
- When I run `todo ls`
350
- Then the exit status should not be 0
351
- And the stderr should contain "error: Command 'ls' requires a subcommand"
352
- And the stdout should contain:
353
- """
354
- NAME
355
- ls - LS things, such as tasks or contexts
356
-
357
- SYNOPSIS
358
- todo [global options] ls [command options] contexts [-b] [-f|--foobar]
359
- todo [global options] ls [command options] tasks [-x arg]
360
-
361
- DESCRIPTION
362
- List a whole lot of things that you might be keeping track of in your
363
- overall todo list.
364
-
365
- This is your go-to place or finding all of the things that you might have
366
- stored in your todo databases.
367
-
368
- COMMAND OPTIONS
369
- -l, --[no-]long - Show long form
370
-
371
- COMMANDS
372
- contexts - List contexts
373
- tasks - List tasks
374
- """
375
-
376
- Scenario: Access to the complex command-line options for nested subcommands
377
- Given I run `todo make -l MAKE task -l TASK bug -l BUG other args`
378
- Then the exit status should be 0
379
- And the stdout should contain:
380
- """
381
- new task bug
382
- other,args
383
- BUG
384
-
385
- BUG
386
- TASK
387
- TASK
388
-
389
- MAKE
390
- MAKE
391
-
392
- """
393
-
394
- Scenario: Init Config makes a reasonable config file
395
- Given a clean home directory
396
- When I successfully run `todo --flag foo --switch --no-otherswitch initconfig`
397
- Then the config file should contain a section for each command and subcommand
398
-
399
- Scenario: Init Config makes a reasonable config file if one is there and we force it
400
- Given a clean home directory
401
- And I successfully run `todo --flag foo --switch --no-otherswitch initconfig`
402
- When I run `todo --flag foo --switch --no-otherswitch initconfig`
403
- Then the exit status should not be 0
404
- When I run `todo --flag foo --switch --no-otherswitch initconfig --force`
405
- Then the exit status should be 0
406
-
407
- Scenario: Configuration percolates to the app
408
- Given a clean home directory
409
- And a config file that specifies defaults for some commands with subcommands
410
- When I successfully run `todo help list tasks`
411
- Then I should see the defaults for 'list tasks' from the config file in the help
412
-
413
- Scenario: Do it again because aruba buffers all output
414
- Given a clean home directory
415
- And a config file that specifies defaults for some commands with subcommands
416
- When I successfully run `todo help list contexts`
417
- Then I should see the defaults for 'list contexts' from the config file in the help
418
-
419
- Scenario: A complex SYNOPSIS section gets summarized in terminal mode
420
- Given my terminal is 50 characters wide
421
- And my app is configured for "terminal" synopses
422
- When I run `todo ls`
423
- Then the exit status should not be 0
424
- And the stderr should contain "error: Command 'ls' requires a subcommand"
425
- And the stdout should contain:
426
- """
427
- NAME
428
- ls - LS things, such as tasks or contexts
429
-
430
- SYNOPSIS
431
- todo [global options] ls [command options] contexts [subcommand options]
432
- todo [global options] ls [command options] tasks [subcommand options]
433
- """
434
-
435
- Scenario: We can always use a compact SYNOPSIS
436
- Given my terminal is 500 characters wide
437
- And my app is configured for "compact" synopses
438
- When I run `todo ls`
439
- Then the exit status should not be 0
440
- And the stderr should contain "error: Command 'ls' requires a subcommand"
441
- And the stdout should contain:
442
- """
443
- NAME
444
- ls - LS things, such as tasks or contexts
445
-
446
- SYNOPSIS
447
- todo [global options] ls [command options] contexts [subcommand options]
448
- todo [global options] ls [command options] tasks [subcommand options]
449
- """
@@ -1,128 +0,0 @@
1
- Feature: The todo app is backwards compatible with legacy subcommand parsing
2
- As a user of GLI
3
- My apps with subcommands should support the old, legacy way, by default
4
-
5
- Background:
6
- Given I have GLI installed
7
- And GLI's libs are in my path
8
- And my terminal size is "80x24"
9
- And todo_legacy's bin directory is in my path
10
-
11
- Scenario: Help completion mode for subcommands
12
- When I successfully run `todo help -c list`
13
- Then the output should contain:
14
- """
15
- contexts
16
- tasks
17
- """
18
-
19
- Scenario: Help completion mode partial match for subcommands
20
- When I successfully run `todo help -c list con`
21
- Then the output should contain:
22
- """
23
- contexts
24
- """
25
-
26
- Scenario Outline: Getting Help for a top level command of todo
27
- When I successfully run `todo <help_invocation>`
28
- Then the output should contain:
29
- """
30
- NAME
31
- list - List things, such as tasks or contexts
32
-
33
- SYNOPSIS
34
- todo [global options] list [command options] [tasks] [--flag arg] [-x arg]
35
- todo [global options] list [command options] contexts [--otherflag arg] [-b] [-f|--foobar]
36
-
37
- DESCRIPTION
38
- List a whole lot of things that you might be keeping track of in your
39
- overall todo list.
40
-
41
- This is your go-to place or finding all of the things that you might have
42
- stored in your todo databases.
43
-
44
- COMMAND OPTIONS
45
- -l, --[no-]long - Show long form
46
-
47
- COMMANDS
48
- contexts - List contexts
49
- tasks - List tasks (default)
50
- """
51
-
52
- Examples:
53
- | help_invocation |
54
- | help list |
55
- | list -h |
56
- | list --help |
57
-
58
-
59
- Scenario: Getting Help for a sub command of todo list
60
- When I successfully run `todo help list tasks`
61
- Then the output should contain:
62
- """
63
- NAME
64
- tasks - List tasks
65
-
66
- SYNOPSIS
67
- todo [global options] list tasks [command options]
68
- todo [global options] list tasks [command options] open
69
-
70
- DESCRIPTION
71
- Lists all of your tasks that you have, in varying orders, and all that
72
- stuff. Yes, this is long, but I need a long description.
73
-
74
- COMMAND OPTIONS
75
- --flag=arg - (default: none)
76
- -x arg - blah blah crud x whatever (default: none)
77
-
78
- COMMANDS
79
- <default> - list all tasks
80
- open - list open tasks
81
- """
82
-
83
- Scenario: Getting Help for a sub command with no command options
84
- When I successfully run `todo help new`
85
- Then the output should contain:
86
- """
87
- NAME
88
- create - Create a new task or context
89
-
90
- SYNOPSIS
91
- todo [global options] create
92
- todo [global options] create contexts [context_name]
93
- todo [global options] create tasks task_name[, task_name]*
94
-
95
- COMMANDS
96
- <default> - Makes a new task
97
- contexts - Make a new context
98
- tasks - Make a new task
99
- """
100
- And the output should not contain "COMMAND OPTIONS"
101
-
102
- Scenario: Running ls w/out subcommand shows help and an error
103
- When I run `todo ls`
104
- Then the exit status should not be 0
105
- And the stderr should contain "error: Command 'ls' requires a subcommand"
106
- And the stdout should contain:
107
- """
108
- NAME
109
- ls - LS things, such as tasks or contexts
110
-
111
- SYNOPSIS
112
- todo [global options] ls [command options] contexts [-b] [-f|--foobar]
113
- todo [global options] ls [command options] tasks [-x arg]
114
-
115
- DESCRIPTION
116
- List a whole lot of things that you might be keeping track of in your
117
- overall todo list.
118
-
119
- This is your go-to place or finding all of the things that you might have
120
- stored in your todo databases.
121
-
122
- COMMAND OPTIONS
123
- -l, --[no-]long - Show long form
124
-
125
- COMMANDS
126
- contexts - List contexts
127
- tasks - List tasks
128
- """
@@ -1,13 +0,0 @@
1
- module OptionTestHelper
2
- def name_should_be(name)
3
- lambda {
4
- assert_equal(name,@cli_option.name)
5
- }
6
- end
7
-
8
- def aliases_should_be(aliases)
9
- lambda {
10
- assert_equal(aliases,@cli_option.aliases)
11
- }
12
- end
13
- end
@@ -1,22 +0,0 @@
1
- require 'test_helper'
2
- require 'tempfile'
3
-
4
- class TC_testCompounCommand < Clean::Test::TestCase
5
- include TestHelper
6
-
7
- test_that "when we create a CompoundCommand where some commands are missing, we get an exception" do
8
- Given {
9
- @name = any_string
10
- @unknown_name = any_string
11
- @existing_command = OpenStruct.new(:name => @name)
12
- @base = OpenStruct.new( :commands => { @name => @existing_command })
13
- }
14
- When {
15
- @code = lambda { GLI::Commands::CompoundCommand.new(@base,{:foo => [@name,@unknown_name]}) }
16
- }
17
- Then {
18
- ex = assert_raises(RuntimeError,&@code)
19
- assert_match /#{@unknown_name}/,ex.message
20
- }
21
- end
22
- end