command_kit 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +6 -0
  3. data/README.md +3 -0
  4. data/command_kit.gemspec +7 -2
  5. data/lib/command_kit/completion/install.rb +276 -0
  6. data/lib/command_kit/env/prefix.rb +41 -0
  7. data/lib/command_kit/env/shell.rb +58 -0
  8. data/lib/command_kit/version.rb +1 -1
  9. metadata +4 -64
  10. data/spec/arguments/argument_spec.rb +0 -133
  11. data/spec/arguments/argument_value_spec.rb +0 -66
  12. data/spec/arguments_spec.rb +0 -279
  13. data/spec/bug_report_spec.rb +0 -266
  14. data/spec/colors_spec.rb +0 -771
  15. data/spec/command_kit_spec.rb +0 -8
  16. data/spec/command_name_spec.rb +0 -130
  17. data/spec/command_spec.rb +0 -123
  18. data/spec/commands/auto_load/subcommand_spec.rb +0 -82
  19. data/spec/commands/auto_load_spec.rb +0 -159
  20. data/spec/commands/auto_require_spec.rb +0 -142
  21. data/spec/commands/fixtures/test_auto_load/cli/commands/test1.rb +0 -10
  22. data/spec/commands/fixtures/test_auto_load/cli/commands/test2.rb +0 -10
  23. data/spec/commands/fixtures/test_auto_require/lib/test_auto_require/cli/commands/test1.rb +0 -10
  24. data/spec/commands/help_spec.rb +0 -66
  25. data/spec/commands/parent_command_spec.rb +0 -40
  26. data/spec/commands/subcommand_spec.rb +0 -99
  27. data/spec/commands_spec.rb +0 -865
  28. data/spec/description_spec.rb +0 -179
  29. data/spec/edit_spec.rb +0 -72
  30. data/spec/env/home_spec.rb +0 -46
  31. data/spec/env/path_spec.rb +0 -84
  32. data/spec/env_spec.rb +0 -123
  33. data/spec/examples_spec.rb +0 -211
  34. data/spec/exception_handler_spec.rb +0 -103
  35. data/spec/file_utils_spec.rb +0 -59
  36. data/spec/fixtures/template.erb +0 -5
  37. data/spec/help/man_spec.rb +0 -345
  38. data/spec/help_spec.rb +0 -94
  39. data/spec/inflector_spec.rb +0 -166
  40. data/spec/interactive_spec.rb +0 -415
  41. data/spec/main_spec.rb +0 -179
  42. data/spec/man_spec.rb +0 -46
  43. data/spec/open_app_spec.rb +0 -85
  44. data/spec/options/option_spec.rb +0 -343
  45. data/spec/options/option_value_spec.rb +0 -171
  46. data/spec/options/parser_spec.rb +0 -274
  47. data/spec/options/quiet_spec.rb +0 -51
  48. data/spec/options/verbose_spec.rb +0 -51
  49. data/spec/options/version_spec.rb +0 -146
  50. data/spec/options_spec.rb +0 -465
  51. data/spec/os/linux_spec.rb +0 -164
  52. data/spec/os_spec.rb +0 -233
  53. data/spec/package_manager_spec.rb +0 -806
  54. data/spec/pager_spec.rb +0 -217
  55. data/spec/printing/fields_spec.rb +0 -167
  56. data/spec/printing/indent_spec.rb +0 -132
  57. data/spec/printing/lists_spec.rb +0 -99
  58. data/spec/printing/tables/border_style.rb +0 -43
  59. data/spec/printing/tables/cell_builer_spec.rb +0 -135
  60. data/spec/printing/tables/row_builder_spec.rb +0 -165
  61. data/spec/printing/tables/style_spec.rb +0 -377
  62. data/spec/printing/tables/table_builder_spec.rb +0 -252
  63. data/spec/printing/tables/table_formatter_spec.rb +0 -1190
  64. data/spec/printing/tables_spec.rb +0 -1069
  65. data/spec/printing_spec.rb +0 -106
  66. data/spec/program_name_spec.rb +0 -70
  67. data/spec/spec_helper.rb +0 -3
  68. data/spec/stdio_spec.rb +0 -264
  69. data/spec/sudo_spec.rb +0 -51
  70. data/spec/terminal_spec.rb +0 -231
  71. data/spec/usage_spec.rb +0 -237
  72. data/spec/xdg_spec.rb +0 -191
data/spec/options_spec.rb DELETED
@@ -1,465 +0,0 @@
1
- require 'spec_helper'
2
- require 'command_kit/options'
3
-
4
- describe CommandKit::Options do
5
- module TestOptions
6
- class ImplicitCmd
7
- include CommandKit::Options
8
- end
9
- end
10
-
11
- let(:command_class) { TestOptions::ImplicitCmd }
12
- subject { command_class.new }
13
-
14
- describe ".options" do
15
- subject { TestOptions::ImplicitCmd }
16
-
17
- context "when no options have been defined" do
18
- it "should default to {}" do
19
- expect(subject.options).to eq({})
20
- end
21
- end
22
-
23
- context "when a options is explicitly set" do
24
- module TestOptions
25
- class ExplicitCmd
26
- include CommandKit::Options
27
- option :foo, desc: 'Foo option'
28
- option :bar, desc: 'Bar option'
29
- end
30
- end
31
-
32
- subject { TestOptions::ExplicitCmd }
33
-
34
- it "must return the explicitly set options" do
35
- expect(subject.options.keys).to eq([:foo, :bar])
36
- end
37
- end
38
-
39
- context "when the command class inherites from another class" do
40
- context "but no options are defined" do
41
- module TestOptions
42
- class BaseCmd
43
- include CommandKit::Options
44
- end
45
-
46
- class InheritedCmd < BaseCmd
47
- end
48
- end
49
-
50
- subject { TestOptions::InheritedCmd }
51
-
52
- it "must search each class then return {}"do
53
- expect(subject.options).to eq({})
54
- end
55
- end
56
-
57
- module TestOptions
58
- class ExplicitBaseCmd
59
- include CommandKit::Options
60
- option :foo, desc: 'Foo option'
61
- option :bar, desc: 'Bar option'
62
- end
63
- end
64
-
65
- context "when the superclass defines options" do
66
- module TestOptions
67
- class ImplicitInheritedCmd < ExplicitBaseCmd
68
- end
69
- end
70
-
71
- let(:super_subject) { TestOptions::ExplicitBaseCmd }
72
- subject { TestOptions::ImplicitInheritedCmd }
73
-
74
- it "must inherit the superclass'es options" do
75
- expect(subject.options).to eq(super_subject.options)
76
- end
77
-
78
- it "must not change the superclass'es options" do
79
- expect(super_subject.options.keys).to eq([:foo, :bar])
80
- end
81
- end
82
-
83
- context "when the subclass defines options" do
84
- module TestOptions
85
- class ImplicitBaseCmd
86
- include CommandKit::Options
87
- end
88
-
89
- class ExplicitInheritedCmd < ImplicitBaseCmd
90
- option :baz, desc: 'Baz option'
91
- option :qux, desc: 'Qux option'
92
- end
93
- end
94
-
95
- let(:super_subject) { TestOptions::ImplicitBaseCmd }
96
- subject { TestOptions::ExplicitInheritedCmd }
97
-
98
- it "must return the subclass'es options" do
99
- expect(subject.options.keys).to eq([:baz, :qux])
100
- end
101
-
102
- it "must not change the superclass'es options" do
103
- expect(super_subject.options).to eq({})
104
- end
105
- end
106
-
107
- context "when subclass overrides the superclass's optionss" do
108
- module TestOptions
109
- class ExplicitOverridingInheritedCmd < ExplicitBaseCmd
110
- option :foo, desc: "Overriden foo option"
111
- end
112
- end
113
-
114
- let(:super_subject) { TestOptions::ExplicitBaseCmd }
115
- subject { TestOptions::ExplicitOverridingInheritedCmd }
116
-
117
- it "must combine the superclass'es options with the subclass'es" do
118
- expect(subject.options.keys).to eq([:foo, :bar])
119
- expect(subject.options[:foo].desc).to eq("Overriden foo option")
120
- expect(subject.options[:bar].desc).to eq("Bar option")
121
- end
122
-
123
- it "must not change the superclass'es options" do
124
- expect(super_subject.options.keys).to eq([:foo, :bar])
125
- expect(super_subject.options[:foo].desc).to eq("Foo option")
126
- expect(super_subject.options[:bar].desc).to eq("Bar option")
127
- end
128
- end
129
- end
130
- end
131
-
132
- describe "#initialize" do
133
- it "must initialize #options" do
134
- expect(subject.options).to eq({})
135
- end
136
-
137
- context "when options have default values" do
138
- module TestOptions
139
- class TestCommandWithDefaultValues
140
-
141
- include CommandKit::Options
142
-
143
- option :option1, value: {
144
- required: true,
145
- type: String
146
- },
147
- desc: 'Option 1'
148
-
149
- option :option2, value: {
150
- required: false,
151
- type: String,
152
- default: "foo"
153
- },
154
- desc: 'Option 2'
155
- end
156
- end
157
-
158
- let(:command_class) { TestOptions::TestCommandWithDefaultValues }
159
-
160
- it "must pre-populate #options with the default values" do
161
- expect(subject.options).to_not have_key(:option1)
162
- expect(subject.options).to have_key(:option2)
163
- expect(subject.options[:option2]).to eq("foo")
164
- end
165
- end
166
- end
167
-
168
- module TestOptions
169
- class TestCommandWithOptionsAndArguments
170
-
171
- include CommandKit::Options
172
-
173
- usage '[OPTIONS] ARG1 [ARG2]'
174
-
175
- option :option1, short: '-a',
176
- value: {
177
- type: Integer,
178
- default: 1
179
- },
180
- desc: "Option 1"
181
-
182
- option :option2, short: '-b',
183
- value: {
184
- type: String,
185
- usage: 'FILE'
186
- },
187
- desc: "Option 2"
188
-
189
- argument :argument1, required: true,
190
- usage: 'ARG1',
191
- desc: "Argument 1"
192
-
193
- argument :argument2, required: false,
194
- usage: 'ARG2',
195
- desc: "Argument 2"
196
-
197
- end
198
- end
199
-
200
- describe "#option_parser" do
201
- context "when an option does not accept a value" do
202
- module TestOptions
203
- class TestCommandWithOptionWithoutValue
204
-
205
- include CommandKit::Options
206
-
207
- option :opt, desc: "Option without a value"
208
-
209
- end
210
- end
211
-
212
- let(:command_class) { TestOptions::TestCommandWithOptionWithoutValue }
213
-
214
- context "but the option flag was not given" do
215
- let(:argv) { [] }
216
-
217
- before { subject.option_parser.parse(argv) }
218
-
219
- it "must not populate #options with a value" do
220
- expect(subject.options).to be_empty
221
- end
222
- end
223
-
224
- context "and the option flag was given" do
225
- let(:argv) { %w[--opt] }
226
-
227
- before { subject.option_parser.parse(argv) }
228
-
229
- it "must set a key in #options to true" do
230
- expect(subject.options[:opt]).to be(true)
231
- end
232
- end
233
- end
234
-
235
- context "when an option requires a value" do
236
- module TestOptions
237
- class TestCommandWithOptionWithRequiredValue
238
-
239
- include CommandKit::Options
240
-
241
- option :opt, value: {
242
- required: true,
243
- type: String
244
- },
245
- desc: "Option without a value"
246
-
247
- end
248
- end
249
-
250
- let(:command_class) do
251
- TestOptions::TestCommandWithOptionWithRequiredValue
252
- end
253
-
254
- context "but the option flag was not given" do
255
- let(:argv) { [] }
256
-
257
- before { subject.option_parser.parse(argv) }
258
-
259
- it "must not populate #options with a value" do
260
- expect(subject.options).to be_empty
261
- end
262
- end
263
-
264
- context "and the option flag and value were given" do
265
- let(:value) { 'foo' }
266
- let(:argv) { ['--opt', value] }
267
-
268
- before { subject.option_parser.parse(argv) }
269
-
270
- it "must set a key in #options to the value" do
271
- expect(subject.options[:opt]).to eq(value)
272
- end
273
- end
274
- end
275
-
276
- context "when an option does not require a value" do
277
- module TestOptions
278
- class TestCommandWithOptionWithOptionalValue
279
-
280
- include CommandKit::Options
281
-
282
- option :opt, value: {
283
- required: false,
284
- type: String
285
- },
286
- desc: "Option without a value"
287
-
288
- end
289
- end
290
-
291
- let(:command_class) do
292
- TestOptions::TestCommandWithOptionWithOptionalValue
293
- end
294
-
295
- context "but the option flag was not given" do
296
- let(:argv) { [] }
297
-
298
- before { subject.option_parser.parse(argv) }
299
-
300
- it "must not populate #options with a value" do
301
- expect(subject.options).to be_empty
302
- end
303
- end
304
-
305
- context "and the option flag and value were given" do
306
- let(:value) { 'foo' }
307
- let(:argv) { ['--opt', value] }
308
-
309
- before { subject.option_parser.parse(argv) }
310
-
311
- it "must set a key in #options to the value" do
312
- expect(subject.options[:opt]).to eq(value)
313
- end
314
- end
315
-
316
- context "and the option has a default value" do
317
- module TestOptions
318
- class TestCommandWithOptionWithOptionalValueAndDefaultValue
319
-
320
- include CommandKit::Options
321
-
322
- option :opt, value: {
323
- required: false,
324
- type: String,
325
- default: "bar"
326
- },
327
- desc: "Option without a value"
328
-
329
- end
330
- end
331
-
332
- let(:command_class) do
333
- TestOptions::TestCommandWithOptionWithOptionalValueAndDefaultValue
334
- end
335
-
336
- context "but the option flag was not given" do
337
- let(:argv) { [] }
338
-
339
- before { subject.option_parser.parse(argv) }
340
-
341
- it "must set a key in #options to the default value" do
342
- expect(subject.options[:opt]).to eq("bar")
343
- end
344
- end
345
-
346
- context "and the option flag and value were given" do
347
- let(:value) { 'foo' }
348
- let(:argv) { ['--opt', value] }
349
-
350
- before { subject.option_parser.parse(argv) }
351
-
352
- it "must set a key in #options to the value" do
353
- expect(subject.options[:opt]).to eq(value)
354
- end
355
- end
356
-
357
- context "and the option flag but not the value are given" do
358
- let(:argv) { ['--opt'] }
359
-
360
- before { subject.option_parser.parse(argv) }
361
-
362
- it "must set a key in #options to nil" do
363
- expect(subject.options).to have_key(:opt)
364
- expect(subject.options[:opt]).to be(nil)
365
- end
366
- end
367
- end
368
- end
369
- end
370
-
371
- describe "#main" do
372
- let(:command_class) { TestOptions::TestCommandWithOptionsAndArguments }
373
-
374
- let(:argv) { %w[-a 42 -b foo.txt arg1 arg2] }
375
-
376
- it "must parse options before validating the number of arguments" do
377
- expect {
378
- expect(subject.main(argv)).to eq(0)
379
- }.to_not output.to_stderr
380
- end
381
-
382
- context "but the wrong number of arguments are given" do
383
- let(:argv) { %w[-a 42 -b foo.txt] }
384
-
385
- it "must still validate the number of arguments" do
386
- expect {
387
- expect(subject.main(argv)).to eq(1)
388
- }.to output("#{subject.command_name}: insufficient number of arguments.#{$/}").to_stderr
389
- end
390
- end
391
- end
392
-
393
- describe "#help" do
394
- let(:command_class) { TestOptions::TestCommandWithOptionsAndArguments }
395
-
396
- let(:option1) { command_class.options[:option1] }
397
- let(:option2) { command_class.options[:option2] }
398
- let(:argument1) { command_class.arguments[:argument1] }
399
- let(:argument2) { command_class.arguments[:argument2] }
400
-
401
- it "must print the usage, options and arguments" do
402
- expect { subject.help }.to output(
403
- [
404
- "Usage: #{subject.usage}",
405
- '',
406
- 'Options:',
407
- " #{option1.usage.join(', ').ljust(33 - 1)} #{option1.desc}",
408
- " #{option2.usage.join(', ').ljust(33 - 1)} #{option2.desc}",
409
- ' -h, --help Print help information',
410
- '',
411
- "Arguments:",
412
- " #{argument1.usage.ljust(33)}#{argument1.desc}",
413
- " #{argument2.usage.ljust(33)}#{argument2.desc}",
414
- ''
415
- ].join($/)
416
- ).to_stdout
417
- end
418
-
419
- context "but when the options are have categories" do
420
- module TestOptions
421
- class TestCommandWithOptionsAndCategories
422
-
423
- include CommandKit::Options
424
-
425
- option :opt1, short: '-a',
426
- desc: "Option 1"
427
- option :opt2, short: '-b',
428
- desc: "Option 2"
429
-
430
- option :opt3, short: '-c',
431
- desc: "Option 3",
432
- category: 'Other Options'
433
- option :opt4, short: '-d',
434
- desc: "Option 4",
435
- category: 'Other Options'
436
- end
437
- end
438
-
439
- let(:command_class) { TestOptions::TestCommandWithOptionsAndCategories }
440
-
441
- let(:option1) { command_class.options[:opt1] }
442
- let(:option2) { command_class.options[:opt2] }
443
- let(:option3) { command_class.options[:opt3] }
444
- let(:option4) { command_class.options[:opt4] }
445
-
446
- it "must group the options by category" do
447
- expect { subject.help }.to output(
448
- [
449
- "Usage: #{subject.usage}",
450
- '',
451
- 'Other Options:',
452
- " #{option3.usage.join(', ').ljust(33 - 1)} #{option3.desc}",
453
- " #{option4.usage.join(', ').ljust(33 - 1)} #{option4.desc}",
454
- '',
455
- 'Options:',
456
- " #{option1.usage.join(', ').ljust(33 - 1)} #{option1.desc}",
457
- " #{option2.usage.join(', ').ljust(33 - 1)} #{option2.desc}",
458
- ' -h, --help Print help information',
459
- ''
460
- ].join($/)
461
- ).to_stdout
462
- end
463
- end
464
- end
465
- end
@@ -1,164 +0,0 @@
1
- require 'spec_helper'
2
- require 'command_kit/os/linux'
3
-
4
- describe CommandKit::OS::Linux do
5
- module TestOSLinux
6
- class TestCommand
7
- include CommandKit::OS::Linux
8
- end
9
- end
10
-
11
- let(:command_class) { TestOSLinux::TestCommand }
12
-
13
- describe ".linux_distro" do
14
- subject { command_class }
15
-
16
- context "and the /etc/fedora-release file exists" do
17
- before do
18
- expect(File).to receive(:file?).with("/etc/fedora-release").and_return(true)
19
- end
20
-
21
- it { expect(subject.linux_distro).to be(:fedora) }
22
- end
23
-
24
- context "and the /etc/redhat-release file exists" do
25
- before do
26
- allow(File).to receive(:file?).with("/etc/fedora-release").and_return(false)
27
- expect(File).to receive(:file?).with("/etc/redhat-release").and_return(true)
28
- end
29
-
30
- it { expect(subject.linux_distro).to be(:redhat) }
31
- end
32
-
33
- context "and the /etc/debian_version file exists" do
34
- before do
35
- allow(File).to receive(:file?).with("/etc/fedora-release").and_return(false)
36
- allow(File).to receive(:file?).with("/etc/redhat-release").and_return(false)
37
- expect(File).to receive(:file?).with("/etc/debian_version").and_return(true)
38
- end
39
-
40
- it { expect(subject.linux_distro).to be(:debian) }
41
- end
42
-
43
- context "and the /etc/SuSE-release file exists" do
44
- before do
45
- allow(File).to receive(:file?).with("/etc/fedora-release").and_return(false)
46
- allow(File).to receive(:file?).with("/etc/redhat-release").and_return(false)
47
- allow(File).to receive(:file?).with("/etc/debian_version").and_return(false)
48
- expect(File).to receive(:file?).with("/etc/SuSE-release").and_return(true)
49
- end
50
-
51
- it { expect(subject.linux_distro).to be(:suse) }
52
- end
53
-
54
- context "and the /etc/arch-release file exists" do
55
- before do
56
- allow(File).to receive(:file?).with("/etc/fedora-release").and_return(false)
57
- allow(File).to receive(:file?).with("/etc/redhat-release").and_return(false)
58
- allow(File).to receive(:file?).with("/etc/debian_version").and_return(false)
59
- allow(File).to receive(:file?).with("/etc/SuSE-release").and_return(false)
60
- expect(File).to receive(:file?).with("/etc/arch-release").and_return(true)
61
- end
62
-
63
- it { expect(subject.linux_distro).to be(:arch) }
64
- end
65
- end
66
-
67
- subject { command_class.new }
68
-
69
- describe "#initialize" do
70
- it "must default #linux_distro to self.class.linux_distro" do
71
- expect(subject.linux_distro).to eq(command_class.linux_distro)
72
- end
73
-
74
- context "when the linux_distro: keyword is given" do
75
- let(:linux_distro) { :suse }
76
-
77
- subject { command_class.new(linux_distro: linux_distro) }
78
-
79
- it "must set #linux_distro" do
80
- expect(subject.linux_distro).to eq(linux_distro)
81
- end
82
- end
83
- end
84
-
85
- describe "#redhat_linux?" do
86
- subject { command_class.new(linux_distro: linux_distro) }
87
-
88
- context "when #linux_distro is :redhat" do
89
- let(:linux_distro) { :redhat }
90
-
91
- it { expect(subject.redhat_linux?).to be(true) }
92
- end
93
-
94
- context "when #linux_distro is not :redhat" do
95
- let(:linux_distro) { :debian }
96
-
97
- it { expect(subject.redhat_linux?).to be(false) }
98
- end
99
- end
100
-
101
- describe "#fedora_linux?" do
102
- subject { command_class.new(linux_distro: linux_distro) }
103
-
104
- context "when #linux_distro is :fedora" do
105
- let(:linux_distro) { :fedora }
106
-
107
- it { expect(subject.fedora_linux?).to be(true) }
108
- end
109
-
110
- context "when #linux_distro is not :fedora" do
111
- let(:linux_distro) { :debian }
112
-
113
- it { expect(subject.fedora_linux?).to be(false) }
114
- end
115
- end
116
-
117
- describe "#debian_linux?" do
118
- subject { command_class.new(linux_distro: linux_distro) }
119
-
120
- context "when #linux_distro is :debian" do
121
- let(:linux_distro) { :debian }
122
-
123
- it { expect(subject.debian_linux?).to be(true) }
124
- end
125
-
126
- context "when #linux_distro is not :fedora" do
127
- let(:linux_distro) { :redhat }
128
-
129
- it { expect(subject.debian_linux?).to be(false) }
130
- end
131
- end
132
-
133
- describe "#suse_linux?" do
134
- subject { command_class.new(linux_distro: linux_distro) }
135
-
136
- context "when #linux_distro is :suse" do
137
- let(:linux_distro) { :suse }
138
-
139
- it { expect(subject.suse_linux?).to be(true) }
140
- end
141
-
142
- context "when #linux_distro is not :suse" do
143
- let(:linux_distro) { :debian }
144
-
145
- it { expect(subject.suse_linux?).to be(false) }
146
- end
147
- end
148
-
149
- describe "#arch_linux?" do
150
- subject { command_class.new(linux_distro: linux_distro) }
151
-
152
- context "when #linux_distro is :arch" do
153
- let(:linux_distro) { :arch }
154
-
155
- it { expect(subject.arch_linux?).to be(true) }
156
- end
157
-
158
- context "when #linux_distro is not :arch" do
159
- let(:linux_distro) { :debian }
160
-
161
- it { expect(subject.arch_linux?).to be(false) }
162
- end
163
- end
164
- end