command_kit 0.1.0.pre2 → 0.2.1
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/.github/workflows/ruby.yml +15 -0
- data/.rubocop.yml +141 -0
- data/ChangeLog.md +98 -2
- data/Gemfile +3 -0
- data/README.md +189 -117
- data/Rakefile +3 -2
- data/command_kit.gemspec +4 -4
- data/examples/command.rb +1 -1
- data/gemspec.yml +10 -2
- data/lib/command_kit/arguments/argument.rb +2 -0
- data/lib/command_kit/arguments/argument_value.rb +2 -0
- data/lib/command_kit/arguments.rb +23 -4
- data/lib/command_kit/colors.rb +253 -45
- data/lib/command_kit/command.rb +6 -1
- data/lib/command_kit/command_name.rb +9 -0
- data/lib/command_kit/commands/auto_load.rb +24 -1
- data/lib/command_kit/commands/auto_require.rb +16 -0
- data/lib/command_kit/commands/command.rb +3 -0
- data/lib/command_kit/commands/help.rb +5 -2
- data/lib/command_kit/commands/parent_command.rb +7 -0
- data/lib/command_kit/commands/subcommand.rb +13 -1
- data/lib/command_kit/commands.rb +54 -9
- data/lib/command_kit/description.rb +12 -1
- data/lib/command_kit/env/home.rb +9 -0
- data/lib/command_kit/env/path.rb +16 -1
- data/lib/command_kit/env.rb +4 -0
- data/lib/command_kit/examples.rb +12 -1
- data/lib/command_kit/exception_handler.rb +4 -0
- data/lib/command_kit/help/man.rb +26 -30
- data/lib/command_kit/help.rb +7 -1
- data/lib/command_kit/inflector.rb +49 -17
- data/lib/command_kit/interactive.rb +248 -0
- data/lib/command_kit/main.rb +18 -9
- data/lib/command_kit/man.rb +44 -0
- data/lib/command_kit/open_app.rb +69 -0
- data/lib/command_kit/options/option.rb +3 -6
- data/lib/command_kit/options/option_value.rb +5 -2
- data/lib/command_kit/options/parser.rb +46 -19
- data/lib/command_kit/options/quiet.rb +3 -0
- data/lib/command_kit/options/verbose.rb +5 -0
- data/lib/command_kit/options/version.rb +6 -0
- data/lib/command_kit/options.rb +32 -7
- data/lib/command_kit/os/linux.rb +157 -0
- data/lib/command_kit/os.rb +165 -11
- data/lib/command_kit/package_manager.rb +200 -0
- data/lib/command_kit/pager.rb +80 -11
- data/lib/command_kit/printing/indent.rb +27 -4
- data/lib/command_kit/printing.rb +35 -1
- data/lib/command_kit/program_name.rb +7 -0
- data/lib/command_kit/stdio.rb +24 -0
- data/lib/command_kit/sudo.rb +40 -0
- data/lib/command_kit/terminal.rb +159 -0
- data/lib/command_kit/usage.rb +14 -0
- data/lib/command_kit/version.rb +1 -1
- data/lib/command_kit/xdg.rb +13 -0
- data/lib/command_kit.rb +1 -0
- data/spec/arguments/argument_spec.rb +2 -2
- data/spec/arguments_spec.rb +53 -27
- data/spec/colors_spec.rb +277 -13
- data/spec/command_name_spec.rb +1 -1
- data/spec/command_spec.rb +79 -5
- data/spec/commands/auto_load/subcommand_spec.rb +1 -1
- data/spec/commands/auto_load_spec.rb +34 -3
- data/spec/commands/auto_require_spec.rb +2 -2
- data/spec/commands/help_spec.rb +1 -1
- data/spec/commands/parent_command_spec.rb +1 -1
- data/spec/commands/subcommand_spec.rb +1 -1
- data/spec/commands_spec.rb +103 -29
- data/spec/description_spec.rb +1 -25
- data/spec/env/home_spec.rb +1 -1
- data/spec/env/path_spec.rb +7 -1
- data/spec/examples_spec.rb +1 -25
- data/spec/exception_handler_spec.rb +1 -1
- data/spec/help/man_spec.rb +45 -58
- data/spec/help_spec.rb +0 -25
- data/spec/inflector_spec.rb +71 -9
- data/spec/interactive_spec.rb +415 -0
- data/spec/main_spec.rb +7 -7
- data/spec/man_spec.rb +46 -0
- data/spec/open_app_spec.rb +85 -0
- data/spec/options/option_spec.rb +5 -5
- data/spec/options/option_value_spec.rb +56 -1
- data/spec/options_spec.rb +283 -1
- data/spec/os/linux_spec.rb +164 -0
- data/spec/os_spec.rb +201 -14
- data/spec/package_manager_spec.rb +806 -0
- data/spec/pager_spec.rb +76 -11
- data/spec/printing/indent_spec.rb +8 -6
- data/spec/printing_spec.rb +33 -3
- data/spec/program_name_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -3
- data/spec/sudo_spec.rb +51 -0
- data/spec/{console_spec.rb → terminal_spec.rb} +65 -35
- data/spec/usage_spec.rb +2 -2
- data/spec/xdg_spec.rb +1 -1
- metadata +26 -8
- data/lib/command_kit/console.rb +0 -141
data/spec/options_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'command_kit/options'
|
3
3
|
|
4
|
-
describe Options do
|
4
|
+
describe CommandKit::Options do
|
5
5
|
module TestOptions
|
6
6
|
class ImplicitCmd
|
7
7
|
include CommandKit::Options
|
@@ -133,5 +133,287 @@ describe Options do
|
|
133
133
|
it "must initialize #options" do
|
134
134
|
expect(subject.options).to eq({})
|
135
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
|
136
418
|
end
|
137
419
|
end
|
@@ -0,0 +1,164 @@
|
|
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
|
data/spec/os_spec.rb
CHANGED
@@ -1,46 +1,233 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'command_kit/os'
|
3
3
|
|
4
|
-
describe OS do
|
5
|
-
|
6
|
-
|
4
|
+
describe CommandKit::OS do
|
5
|
+
module TestOS
|
6
|
+
class TestCommand
|
7
|
+
include CommandKit::OS
|
8
|
+
end
|
7
9
|
end
|
8
10
|
|
9
|
-
|
11
|
+
let(:command_class) { TestOS::TestCommand }
|
12
|
+
subject { command_class.new }
|
13
|
+
|
14
|
+
describe ".os" do
|
15
|
+
subject { command_class }
|
10
16
|
|
11
|
-
describe "#linux?" do
|
12
17
|
context "when RUBY_PLATFORM contains 'linux'" do
|
13
18
|
before { stub_const('RUBY_PLATFORM','x86_64-linux') }
|
14
19
|
|
15
|
-
it { expect(subject.
|
20
|
+
it { expect(subject.os).to be(:linux) }
|
16
21
|
end
|
17
22
|
|
18
|
-
context "when RUBY_PLATFORM
|
23
|
+
context "when RUBY_PLATFORM contains 'darwin'" do
|
19
24
|
before { stub_const('RUBY_PLATFORM','aarch64-darwin') }
|
20
25
|
|
26
|
+
it { expect(subject.os).to be(:macos) }
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when RUBY_PLATFORM contains 'freebsd'" do
|
30
|
+
before { stub_const('RUBY_PLATFORM','x86_64-freebsd') }
|
31
|
+
|
32
|
+
it { expect(subject.os).to be(:freebsd) }
|
33
|
+
end
|
34
|
+
|
35
|
+
context "when RUBY_PLATFORM contains 'openbsd'" do
|
36
|
+
before { stub_const('RUBY_PLATFORM','x86_64-openbsd') }
|
37
|
+
|
38
|
+
it { expect(subject.os).to be(:openbsd) }
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when RUBY_PLATFORM contains 'netbsd'" do
|
42
|
+
before { stub_const('RUBY_PLATFORM','x86_64-netbsd') }
|
43
|
+
|
44
|
+
it { expect(subject.os).to be(:netbsd) }
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when Gem.win_platform? returns true" do
|
48
|
+
before do
|
49
|
+
stub_const('RUBY_PLATFORM','x86_64-mswin')
|
50
|
+
|
51
|
+
expect(Gem).to receive(:win_platform?).and_return(true)
|
52
|
+
end
|
53
|
+
|
54
|
+
it { expect(subject.os).to be(:windows) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#initialize" do
|
59
|
+
it "must default #os to self.class.os" do
|
60
|
+
expect(subject.os).to eq(command_class.os)
|
61
|
+
end
|
62
|
+
|
63
|
+
context "when initialized with the os: keyword" do
|
64
|
+
let(:os) { :netbsd }
|
65
|
+
|
66
|
+
subject { command_class.new(os: os) }
|
67
|
+
|
68
|
+
it "must set #os" do
|
69
|
+
expect(subject.os).to eq(os)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#linux?" do
|
75
|
+
context "when #os is :linux" do
|
76
|
+
subject { command_class.new(os: :linux) }
|
77
|
+
|
78
|
+
it { expect(subject.linux?).to be(true) }
|
79
|
+
end
|
80
|
+
|
81
|
+
context "when #os is not :linux" do
|
82
|
+
subject { command_class.new(os: :windows) }
|
83
|
+
|
21
84
|
it { expect(subject.linux?).to be(false) }
|
22
85
|
end
|
23
86
|
end
|
24
87
|
|
25
88
|
describe "#macos?" do
|
26
|
-
context "when
|
27
|
-
|
89
|
+
context "when #os is :macos" do
|
90
|
+
subject { command_class.new(os: :macos) }
|
28
91
|
|
29
92
|
it { expect(subject.macos?).to be(true) }
|
30
93
|
end
|
31
94
|
|
32
|
-
context "when
|
33
|
-
|
95
|
+
context "when #os is not :macos" do
|
96
|
+
subject { command_class.new(os: :windows) }
|
34
97
|
|
35
98
|
it { expect(subject.macos?).to be(false) }
|
36
99
|
end
|
37
100
|
end
|
38
101
|
|
102
|
+
describe "#freebsd?" do
|
103
|
+
context "when #os is :freebsd" do
|
104
|
+
subject { command_class.new(os: :freebsd) }
|
105
|
+
|
106
|
+
it { expect(subject.freebsd?).to be(true) }
|
107
|
+
end
|
108
|
+
|
109
|
+
context "when #os is not :freebsd" do
|
110
|
+
subject { command_class.new(os: :windows) }
|
111
|
+
|
112
|
+
it { expect(subject.freebsd?).to be(false) }
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#openbsd?" do
|
117
|
+
context "when #os is :openbsd" do
|
118
|
+
subject { command_class.new(os: :openbsd) }
|
119
|
+
|
120
|
+
it { expect(subject.openbsd?).to be(true) }
|
121
|
+
end
|
122
|
+
|
123
|
+
context "when #os is not :openbsd" do
|
124
|
+
subject { command_class.new(os: :windows) }
|
125
|
+
|
126
|
+
it { expect(subject.openbsd?).to be(false) }
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#netbsd?" do
|
131
|
+
context "when #os is :netbsd" do
|
132
|
+
subject { command_class.new(os: :netbsd) }
|
133
|
+
|
134
|
+
it { expect(subject.netbsd?).to be(true) }
|
135
|
+
end
|
136
|
+
|
137
|
+
context "when #os is not :netbsd" do
|
138
|
+
subject { command_class.new(os: :windows) }
|
139
|
+
|
140
|
+
it { expect(subject.netbsd?).to be(false) }
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "#bsd?" do
|
145
|
+
context "when #os is :freebsd" do
|
146
|
+
subject { command_class.new(os: :freebsd) }
|
147
|
+
|
148
|
+
it { expect(subject.bsd?).to be(true) }
|
149
|
+
end
|
150
|
+
|
151
|
+
context "when #os is :openbsd" do
|
152
|
+
subject { command_class.new(os: :openbsd) }
|
153
|
+
|
154
|
+
it { expect(subject.bsd?).to be(true) }
|
155
|
+
end
|
156
|
+
|
157
|
+
context "when #os is :netbsd" do
|
158
|
+
subject { command_class.new(os: :netbsd) }
|
159
|
+
|
160
|
+
it { expect(subject.bsd?).to be(true) }
|
161
|
+
end
|
162
|
+
|
163
|
+
context "when #os is :macos" do
|
164
|
+
subject { command_class.new(os: :macos) }
|
165
|
+
|
166
|
+
it { expect(subject.bsd?).to be(false) }
|
167
|
+
end
|
168
|
+
|
169
|
+
context "when #os is :linux" do
|
170
|
+
subject { command_class.new(os: :linux) }
|
171
|
+
|
172
|
+
it { expect(subject.bsd?).to be(false) }
|
173
|
+
end
|
174
|
+
|
175
|
+
context "when #os is :windows" do
|
176
|
+
subject { command_class.new(os: :windows) }
|
177
|
+
|
178
|
+
it { expect(subject.bsd?).to be(false) }
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "#unix?" do
|
183
|
+
context "when #os is :freebsd" do
|
184
|
+
subject { command_class.new(os: :freebsd) }
|
185
|
+
|
186
|
+
it { expect(subject.unix?).to be(true) }
|
187
|
+
end
|
188
|
+
|
189
|
+
context "when #os is :openbsd" do
|
190
|
+
subject { command_class.new(os: :openbsd) }
|
191
|
+
|
192
|
+
it { expect(subject.unix?).to be(true) }
|
193
|
+
end
|
194
|
+
|
195
|
+
context "when #os is :netbsd" do
|
196
|
+
subject { command_class.new(os: :netbsd) }
|
197
|
+
|
198
|
+
it { expect(subject.unix?).to be(true) }
|
199
|
+
end
|
200
|
+
|
201
|
+
context "when #os is :macos" do
|
202
|
+
subject { command_class.new(os: :macos) }
|
203
|
+
|
204
|
+
it { expect(subject.unix?).to be(true) }
|
205
|
+
end
|
206
|
+
|
207
|
+
context "when #os is :linux" do
|
208
|
+
subject { command_class.new(os: :linux) }
|
209
|
+
|
210
|
+
it { expect(subject.unix?).to be(true) }
|
211
|
+
end
|
212
|
+
|
213
|
+
context "when #os is :windows" do
|
214
|
+
subject { command_class.new(os: :windows) }
|
215
|
+
|
216
|
+
it { expect(subject.unix?).to be(false) }
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
39
220
|
describe "#windows?" do
|
40
|
-
|
41
|
-
|
221
|
+
context "when #os is :windows" do
|
222
|
+
subject { command_class.new(os: :windows) }
|
223
|
+
|
224
|
+
it { expect(subject.windows?).to be(true) }
|
225
|
+
end
|
226
|
+
|
227
|
+
context "when #os is not :windows" do
|
228
|
+
subject { command_class.new(os: :linux) }
|
42
229
|
|
43
|
-
subject.windows?
|
230
|
+
it { expect(subject.windows?).to be(false) }
|
44
231
|
end
|
45
232
|
end
|
46
233
|
end
|