command_kit 0.4.1 → 0.5.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.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.rubocop.yml +7 -1
  4. data/ChangeLog.md +11 -0
  5. data/Gemfile +2 -0
  6. data/README.md +3 -0
  7. data/Rakefile +2 -0
  8. data/command_kit.gemspec +8 -6
  9. data/lib/command_kit/arguments/argument.rb +3 -1
  10. data/lib/command_kit/arguments/argument_value.rb +2 -0
  11. data/lib/command_kit/arguments.rb +5 -5
  12. data/lib/command_kit/bug_report.rb +4 -2
  13. data/lib/command_kit/colors.rb +2 -2
  14. data/lib/command_kit/command.rb +13 -11
  15. data/lib/command_kit/command_name.rb +3 -1
  16. data/lib/command_kit/commands/auto_load/subcommand.rb +3 -1
  17. data/lib/command_kit/commands/auto_load.rb +3 -3
  18. data/lib/command_kit/commands/auto_require.rb +5 -3
  19. data/lib/command_kit/commands/command.rb +4 -2
  20. data/lib/command_kit/commands/help.rb +2 -2
  21. data/lib/command_kit/commands/parent_command.rb +2 -0
  22. data/lib/command_kit/commands/subcommand.rb +2 -0
  23. data/lib/command_kit/commands.rb +8 -8
  24. data/lib/command_kit/completion/install.rb +277 -0
  25. data/lib/command_kit/description.rb +3 -1
  26. data/lib/command_kit/edit.rb +1 -1
  27. data/lib/command_kit/env/home.rb +1 -1
  28. data/lib/command_kit/env/path.rb +1 -1
  29. data/lib/command_kit/env/prefix.rb +41 -0
  30. data/lib/command_kit/env/shell.rb +58 -0
  31. data/lib/command_kit/env.rb +2 -0
  32. data/lib/command_kit/examples.rb +4 -2
  33. data/lib/command_kit/exception_handler.rb +4 -2
  34. data/lib/command_kit/file_utils.rb +2 -0
  35. data/lib/command_kit/help/man.rb +4 -4
  36. data/lib/command_kit/help.rb +2 -0
  37. data/lib/command_kit/interactive.rb +1 -1
  38. data/lib/command_kit/main.rb +2 -0
  39. data/lib/command_kit/open_app.rb +4 -2
  40. data/lib/command_kit/options/option.rb +3 -1
  41. data/lib/command_kit/options/option_value.rb +2 -2
  42. data/lib/command_kit/options/parser.rb +3 -3
  43. data/lib/command_kit/options/quiet.rb +3 -1
  44. data/lib/command_kit/options/verbose.rb +3 -1
  45. data/lib/command_kit/options/version.rb +3 -1
  46. data/lib/command_kit/options.rb +5 -3
  47. data/lib/command_kit/os/linux.rb +3 -1
  48. data/lib/command_kit/os.rb +2 -0
  49. data/lib/command_kit/package_manager.rb +6 -4
  50. data/lib/command_kit/pager.rb +4 -4
  51. data/lib/command_kit/printing/fields.rb +3 -1
  52. data/lib/command_kit/printing/indent.rb +2 -0
  53. data/lib/command_kit/printing/lists.rb +1 -1
  54. data/lib/command_kit/printing/tables/border_style.rb +2 -0
  55. data/lib/command_kit/printing/tables/row_builder.rb +3 -1
  56. data/lib/command_kit/printing/tables/style.rb +1 -1
  57. data/lib/command_kit/printing/tables/table_builder.rb +3 -1
  58. data/lib/command_kit/printing/tables.rb +4 -4
  59. data/lib/command_kit/printing.rb +1 -1
  60. data/lib/command_kit/program_name.rb +2 -0
  61. data/lib/command_kit/stdio.rb +2 -0
  62. data/lib/command_kit/sudo.rb +1 -1
  63. data/lib/command_kit/terminal.rb +4 -2
  64. data/lib/command_kit/usage.rb +4 -2
  65. data/lib/command_kit/version.rb +3 -1
  66. data/lib/command_kit/xdg.rb +4 -2
  67. data/lib/command_kit.rb +4 -2
  68. metadata +5 -65
  69. data/spec/arguments/argument_spec.rb +0 -133
  70. data/spec/arguments/argument_value_spec.rb +0 -66
  71. data/spec/arguments_spec.rb +0 -279
  72. data/spec/bug_report_spec.rb +0 -266
  73. data/spec/colors_spec.rb +0 -771
  74. data/spec/command_kit_spec.rb +0 -8
  75. data/spec/command_name_spec.rb +0 -130
  76. data/spec/command_spec.rb +0 -123
  77. data/spec/commands/auto_load/subcommand_spec.rb +0 -82
  78. data/spec/commands/auto_load_spec.rb +0 -159
  79. data/spec/commands/auto_require_spec.rb +0 -142
  80. data/spec/commands/fixtures/test_auto_load/cli/commands/test1.rb +0 -10
  81. data/spec/commands/fixtures/test_auto_load/cli/commands/test2.rb +0 -10
  82. data/spec/commands/fixtures/test_auto_require/lib/test_auto_require/cli/commands/test1.rb +0 -10
  83. data/spec/commands/help_spec.rb +0 -66
  84. data/spec/commands/parent_command_spec.rb +0 -40
  85. data/spec/commands/subcommand_spec.rb +0 -99
  86. data/spec/commands_spec.rb +0 -865
  87. data/spec/description_spec.rb +0 -179
  88. data/spec/edit_spec.rb +0 -72
  89. data/spec/env/home_spec.rb +0 -46
  90. data/spec/env/path_spec.rb +0 -84
  91. data/spec/env_spec.rb +0 -123
  92. data/spec/examples_spec.rb +0 -211
  93. data/spec/exception_handler_spec.rb +0 -103
  94. data/spec/file_utils_spec.rb +0 -59
  95. data/spec/fixtures/template.erb +0 -5
  96. data/spec/help/man_spec.rb +0 -345
  97. data/spec/help_spec.rb +0 -94
  98. data/spec/inflector_spec.rb +0 -166
  99. data/spec/interactive_spec.rb +0 -415
  100. data/spec/main_spec.rb +0 -179
  101. data/spec/man_spec.rb +0 -46
  102. data/spec/open_app_spec.rb +0 -85
  103. data/spec/options/option_spec.rb +0 -343
  104. data/spec/options/option_value_spec.rb +0 -171
  105. data/spec/options/parser_spec.rb +0 -274
  106. data/spec/options/quiet_spec.rb +0 -51
  107. data/spec/options/verbose_spec.rb +0 -51
  108. data/spec/options/version_spec.rb +0 -146
  109. data/spec/options_spec.rb +0 -465
  110. data/spec/os/linux_spec.rb +0 -164
  111. data/spec/os_spec.rb +0 -233
  112. data/spec/package_manager_spec.rb +0 -806
  113. data/spec/pager_spec.rb +0 -217
  114. data/spec/printing/fields_spec.rb +0 -167
  115. data/spec/printing/indent_spec.rb +0 -132
  116. data/spec/printing/lists_spec.rb +0 -99
  117. data/spec/printing/tables/border_style.rb +0 -43
  118. data/spec/printing/tables/cell_builer_spec.rb +0 -135
  119. data/spec/printing/tables/row_builder_spec.rb +0 -165
  120. data/spec/printing/tables/style_spec.rb +0 -377
  121. data/spec/printing/tables/table_builder_spec.rb +0 -252
  122. data/spec/printing/tables/table_formatter_spec.rb +0 -1190
  123. data/spec/printing/tables_spec.rb +0 -1069
  124. data/spec/printing_spec.rb +0 -106
  125. data/spec/program_name_spec.rb +0 -70
  126. data/spec/spec_helper.rb +0 -3
  127. data/spec/stdio_spec.rb +0 -264
  128. data/spec/sudo_spec.rb +0 -51
  129. data/spec/terminal_spec.rb +0 -231
  130. data/spec/usage_spec.rb +0 -237
  131. data/spec/xdg_spec.rb +0 -191
data/spec/main_spec.rb DELETED
@@ -1,179 +0,0 @@
1
- require 'spec_helper'
2
- require 'command_kit/main'
3
-
4
- describe CommandKit::Main do
5
- module TestMain
6
- class TestCommand
7
- include CommandKit::Main
8
- end
9
-
10
- class TestCommandWithInitialize
11
- include CommandKit::Main
12
-
13
- attr_reader :foo
14
-
15
- attr_reader :bar
16
-
17
- def initialize(foo: 'foo', bar: 'bar', **kwargs)
18
- super(**kwargs)
19
-
20
- @foo = foo
21
- @bar = bar
22
- end
23
- end
24
- end
25
-
26
- let(:command_class) { TestMain::TestCommand }
27
-
28
- describe ".start" do
29
- subject { command_class }
30
-
31
- it "must exit with 0 by default" do
32
- expect(subject).to receive(:exit).with(0)
33
-
34
- subject.start
35
- end
36
-
37
- context "when given an argv argument" do
38
- let(:argv) { %w[one two three] }
39
-
40
- it "must pass argv to .main" do
41
- expect(subject).to receive(:main).with(argv)
42
- allow(subject).to receive(:exit)
43
-
44
- subject.start(argv)
45
- end
46
- end
47
-
48
- context "when given keyword arguments" do
49
- let(:command_class) { TestMain::TestCommandWithInitialize }
50
-
51
- let(:kwargs) { {foo: 'custom foo', bar: 'custom bar'} }
52
-
53
- it "must pass the keyword arguments down to .main" do
54
- expect(subject).to receive(:main).with(ARGV, **kwargs)
55
- allow(subject).to receive(:exit)
56
-
57
- subject.start(**kwargs)
58
- end
59
- end
60
-
61
- context "when Interrupt is raised" do
62
- module TestMain
63
- class TestCommandWithInterrupt
64
- include CommandKit::Main
65
-
66
- def main(*argv)
67
- raise(Interrupt)
68
- end
69
- end
70
- end
71
-
72
- let(:command_class) { TestMain::TestCommandWithInterrupt }
73
-
74
- it "must exit with 130" do
75
- expect(command_class).to receive(:exit).with(130)
76
-
77
- command_class.start
78
- end
79
- end
80
-
81
- context "when Errno::EPIPE is raised" do
82
- module TestMain
83
- class TestCommandWithBrokenPipe
84
- include CommandKit::Main
85
-
86
- def main(*argv)
87
- raise(Errno::EPIPE)
88
- end
89
- end
90
- end
91
-
92
- let(:command_class) { TestMain::TestCommandWithBrokenPipe }
93
-
94
- it "must exit with 0" do
95
- expect(command_class).to receive(:exit).with(0)
96
-
97
- command_class.start
98
- end
99
- end
100
- end
101
-
102
- module TestMain
103
- class TestCommandWithSystemExit
104
-
105
- include CommandKit::Main
106
-
107
- def run(*argv)
108
- raise(SystemExit.new(-1))
109
- end
110
-
111
- end
112
- end
113
-
114
- describe ".main" do
115
- subject { command_class }
116
-
117
- it "must return 0 by default" do
118
- expect(subject.main).to eq(0)
119
- end
120
-
121
- let(:command_class) { TestMain::TestCommandWithInitialize }
122
-
123
- context "when given a custom argv" do
124
- let(:instance) { command_class.new }
125
- let(:argv) { %w[one two three] }
126
-
127
- it "must call #main with the custom argv" do
128
- expect(subject).to receive(:new).with(no_args).and_return(instance)
129
- expect(instance).to receive(:main).with(argv)
130
-
131
- subject.main(argv)
132
- end
133
- end
134
-
135
- context "when given keyword arguments" do
136
- let(:kwargs) { {foo: 'custom foo', bar: 'custom bar'} }
137
- let(:instance) { command_class.new(**kwargs) }
138
-
139
- it "must pass the keyword arguments .new then call #main" do
140
- expect(subject).to receive(:new).with(**kwargs).and_return(instance)
141
- expect(instance).to receive(:main).with([])
142
-
143
- subject.main(**kwargs)
144
- end
145
- end
146
-
147
- context "when #main raises SystemExit" do
148
- let(:command_class) { TestMain::TestCommandWithSystemExit }
149
-
150
- it "must rescue SystemExit and return the exit status code" do
151
- expect(subject.main()).to eq(-1)
152
- end
153
- end
154
- end
155
-
156
- describe "#main" do
157
- subject { command_class.new }
158
-
159
- it "must return 0 by default" do
160
- expect(subject.main).to eq(0)
161
- end
162
-
163
- it "must call #run with the given argv" do
164
- argv = ["foo", "bar", "baz"]
165
-
166
- expect(subject).to receive(:run).with(*argv)
167
-
168
- subject.main(argv)
169
- end
170
-
171
- context "when #run raises SystemExit" do
172
- let(:command_class) { TestMain::TestCommandWithSystemExit }
173
-
174
- it "must rescue SystemExit and return the exit status code" do
175
- expect(subject.main()).to eq(-1)
176
- end
177
- end
178
- end
179
- end
data/spec/man_spec.rb DELETED
@@ -1,46 +0,0 @@
1
- require 'spec_helper'
2
- require 'command_kit/man'
3
-
4
- describe CommandKit::Man do
5
- module TestMan
6
- class TestCommand
7
- include CommandKit::Man
8
- end
9
- end
10
-
11
- let(:command_class) { TestMan::TestCommand }
12
-
13
- subject { command_class.new }
14
-
15
- describe "#man" do
16
- let(:man_page) { 'foo' }
17
-
18
- it "must call system() with the given man page" do
19
- expect(subject).to receive(:system).with('man',man_page)
20
-
21
- subject.man(man_page)
22
- end
23
-
24
- context "when given a non-String man-page argument" do
25
- let(:man_page_arg) { double(:non_string_arg) }
26
-
27
- it "must call #to_s on the man-page argument" do
28
- expect(man_page_arg).to receive(:to_s).and_return(man_page)
29
-
30
- expect(subject).to receive(:system).with('man',man_page)
31
-
32
- subject.man(man_page_arg)
33
- end
34
- end
35
-
36
- context "when given the section: keyword argument" do
37
- let(:section) { 7 }
38
-
39
- it "must call system() with the given section number and man page" do
40
- expect(subject).to receive(:system).with('man',section.to_s,man_page)
41
-
42
- subject.man(man_page, section: section)
43
- end
44
- end
45
- end
46
- end
@@ -1,85 +0,0 @@
1
- require 'spec_helper'
2
- require 'command_kit/open_app'
3
-
4
- describe CommandKit::OpenApp do
5
- module TestOpenApp
6
- class TestCommand
7
- include CommandKit::OpenApp
8
- end
9
- end
10
-
11
- let(:command_class) { TestOpenApp::TestCommand }
12
-
13
- subject { command_class.new }
14
-
15
- describe "#initialize" do
16
- context "when the OS is macOS" do
17
- subject { command_class.new(os: :macos) }
18
-
19
- it "must set @open_command to \"open\"" do
20
- expect(subject.instance_variable_get("@open_command")).to eq("open")
21
- end
22
- end
23
-
24
- context "when the OS is Linux" do
25
- subject { command_class.new(os: :linux) }
26
-
27
- it "must set @open_command to \"xdg-open\"" do
28
- expect(subject.instance_variable_get("@open_command")).to eq("xdg-open")
29
- end
30
- end
31
-
32
- context "when the OS is FreeBSD" do
33
- subject { command_class.new(os: :freebsd) }
34
-
35
- it "must set @open_command to \"xdg-open\"" do
36
- expect(subject.instance_variable_get("@open_command")).to eq("xdg-open")
37
- end
38
- end
39
-
40
- context "when the OS is OpenBSD" do
41
- subject { command_class.new(os: :openbsd) }
42
-
43
- it "must set @open_command to \"xdg-open\"" do
44
- expect(subject.instance_variable_get("@open_command")).to eq("xdg-open")
45
- end
46
- end
47
-
48
- context "when the OS is NetBSD" do
49
- subject { command_class.new(os: :openbsd) }
50
-
51
- it "must set @open_command to \"xdg-open\"" do
52
- expect(subject.instance_variable_get("@open_command")).to eq("xdg-open")
53
- end
54
- end
55
-
56
- context "when the OS is Windows" do
57
- subject { command_class.new(os: :windows) }
58
-
59
- it "must set @open_command to \"start\"" do
60
- expect(subject.instance_variable_get("@open_command")).to eq("start")
61
- end
62
- end
63
- end
64
-
65
- describe "#open_app_for" do
66
- context "when @open_command is set" do
67
- let(:file_or_uri) { "foo" }
68
- let(:status) { true }
69
-
70
- it "must execute the @open_command with the given URI or file" do
71
- expect(subject).to receive(:system).with(subject.instance_variable_get("@open_command"),file_or_uri).and_return(status)
72
-
73
- expect(subject.open_app_for(file_or_uri)).to be(status)
74
- end
75
- end
76
-
77
- context "when @open_command is not set" do
78
- before do
79
- subject.instance_variable_set("@open_command",nil)
80
- end
81
-
82
- it { expect(subject.open_app_for("foo")).to be(nil) }
83
- end
84
- end
85
- end
@@ -1,343 +0,0 @@
1
- require 'spec_helper'
2
- require 'command_kit/options/option'
3
-
4
- describe CommandKit::Options::Option do
5
- let(:name) { :foo }
6
- let(:short) { nil }
7
- let(:long) { '--foo' }
8
- let(:equals) { false }
9
- let(:value_usage) { 'FOO' }
10
- let(:value_required) { true }
11
- let(:value) do
12
- {
13
- usage: value_usage,
14
- required: value_required
15
- }
16
- end
17
- let(:desc) { 'Foo option' }
18
- let(:block) do
19
- ->(arg) { @foo = arg }
20
- end
21
-
22
- subject do
23
- described_class.new(name, short: short,
24
- long: long,
25
- equals: equals,
26
- desc: desc,
27
- value: value,
28
- &block)
29
- end
30
-
31
- describe "#initialize" do
32
- context "when the short: keyword is given" do
33
- subject { described_class.new(name, short: short, desc: desc) }
34
-
35
- it "must set #short" do
36
- expect(subject.short).to eq(short)
37
- end
38
- end
39
-
40
- context "when the short: keyword is not given" do
41
- subject { described_class.new(name, desc: desc) }
42
-
43
- it { expect(subject.short).to be(nil) }
44
- end
45
-
46
- context "when the long: keyword is given" do
47
- let(:long) { '--opt' }
48
-
49
- subject { described_class.new(name, long: long, desc: desc) }
50
-
51
- it "must set #long" do
52
- expect(subject.long).to eq(long)
53
- end
54
- end
55
-
56
- context "when the long: keyword is not given" do
57
- subject { described_class.new(name, desc: desc) }
58
-
59
- it "default #long to a '--option' flag based on #name" do
60
- expect(subject.long).to eq("--#{name}")
61
- end
62
- end
63
-
64
- context "when the equals: keyword is given" do
65
- let(:equals) { true }
66
-
67
- subject { described_class.new(name, equals: equals, desc: desc) }
68
-
69
- it "must set #equals" do
70
- expect(subject.equals?).to eq(equals)
71
- end
72
- end
73
-
74
- context "when the equals: keyword is not given" do
75
- subject { described_class.new(name, desc: desc) }
76
-
77
- it { expect(subject.equals?).to be(false) }
78
- end
79
-
80
- context "when the values: keyword is given" do
81
- context "and it is a Hash" do
82
- let(:type) { Integer }
83
-
84
- subject { described_class.new(name, value: {type: type}, desc: desc) }
85
-
86
- it "must initialize #value" do
87
- expect(subject.value).to be_kind_of(CommandKit::Options::OptionValue)
88
- expect(subject.value.type).to eq(type)
89
- end
90
- end
91
-
92
- context "and it is true" do
93
- subject { described_class.new(name, value: true, desc: desc) }
94
-
95
- it "must initialize #value with defaults" do
96
- expect(subject.value).to be_kind_of(CommandKit::Options::OptionValue)
97
- expect(subject.value.type).to eq(String)
98
- expect(subject.value.required?).to be(true)
99
- expect(subject.value.usage).to eq('STR')
100
- end
101
- end
102
-
103
- context "and it is false" do
104
- subject { described_class.new(name, value: false, desc: desc) }
105
-
106
- it "must not initialize #value" do
107
- expect(subject.value).to be(nil)
108
- end
109
- end
110
-
111
- context "and it is nil" do
112
- subject { described_class.new(name, value: nil, desc: desc) }
113
-
114
- it "must not initialize #value" do
115
- expect(subject.value).to be(nil)
116
- end
117
- end
118
-
119
- context "when it is another type" do
120
- it do
121
- expect {
122
- described_class.new(name, value: 'foo', desc: desc)
123
- }.to raise_error(TypeError)
124
- end
125
- end
126
- end
127
-
128
- context "when the values: keyword is not given" do
129
- subject { described_class.new(name, desc: desc) }
130
-
131
- it { expect(subject.value).to be(nil) }
132
- end
133
-
134
- context "when the desc: keyword is given" do
135
- subject { described_class.new(name, desc: desc) }
136
-
137
- it "must set #desc" do
138
- expect(subject.desc).to eq(desc)
139
- end
140
- end
141
-
142
- context "when the desc: keyword is not given" do
143
- it do
144
- expect {
145
- described_class.new(name)
146
- }.to raise_error(ArgumentError)
147
- end
148
- end
149
-
150
- it "must default #category to nil" do
151
- expect(subject.category).to be(nil)
152
- end
153
-
154
- context "when the category: keyword is given" do
155
- let(:category) { 'Other Options' }
156
-
157
- subject { described_class.new(name, desc: desc, category: category) }
158
-
159
- it "must set #category" do
160
- expect(subject.category).to eq(category)
161
- end
162
- end
163
-
164
- context "when a block is given" do
165
- subject { described_class.new(name, desc: desc, &block) }
166
-
167
- it "must set #block" do
168
- expect(subject.block).to eq(block)
169
- end
170
- end
171
-
172
- context "when no block is given" do
173
- subject { described_class.new(name, desc: desc) }
174
-
175
- it { expect(subject.block).to be(nil) }
176
- end
177
- end
178
-
179
- describe "#equals?" do
180
- context "when initialized with equals: true" do
181
- let(:equals) { true }
182
-
183
- it { expect(subject.equals?).to be(true) }
184
- end
185
-
186
- context "when initialized with equals: false" do
187
- let(:equals) { false }
188
-
189
- it { expect(subject.equals?).to be(false) }
190
- end
191
- end
192
-
193
- describe "#separator" do
194
- context "when #value is initialized" do
195
- context "and #equals? is true" do
196
- let(:equals) { true }
197
-
198
- it { expect(subject.separator).to eq('=') }
199
- end
200
-
201
- context "and #equals? is false" do
202
- let(:equals) { false }
203
-
204
- it { expect(subject.separator).to eq(' ') }
205
- end
206
- end
207
-
208
- context "when #value is not initialized" do
209
- let(:value) { nil }
210
-
211
- it { expect(subject.separator).to be(nil) }
212
- end
213
- end
214
-
215
- describe "#usage" do
216
- let(:long) { '--foo' }
217
-
218
- it "must start with the long '--option'" do
219
- expect(subject.usage.last).to start_with(long)
220
- end
221
-
222
- context "when #value is initialized" do
223
- it "must return '--option USAGE'" do
224
- expect(subject.usage.last).to eq("#{long} #{subject.value.usage}")
225
- end
226
-
227
- context "and #equals? is true" do
228
- let(:equals) { true }
229
-
230
- it "must return '--option=USAGE'" do
231
- expect(subject.usage.last).to eq("#{long}=#{subject.value.usage}")
232
- end
233
-
234
- context "but the #value is also optional?" do
235
- let(:value_required) { false }
236
-
237
- it "must return '--option[=USAGE]'" do
238
- expect(subject.usage.last).to eq("#{long}[=#{subject.value.usage}]")
239
- end
240
- end
241
- end
242
- end
243
-
244
- context "when #short is not nil" do
245
- let(:short) { '-f' }
246
-
247
- it "to have two elements" do
248
- expect(subject.usage.length).to eq(2)
249
- end
250
-
251
- it "the first element should be the short option" do
252
- expect(subject.usage[0]).to eq(short)
253
- end
254
- end
255
- end
256
-
257
- describe "#value?" do
258
- context "when #value has been initialized" do
259
- let(:value) { {} }
260
-
261
- it { expect(subject.value?).to be(true) }
262
- end
263
-
264
- context "when #value has not been initialized" do
265
- let(:value) { nil }
266
-
267
- it { expect(subject.value?).to be(false) }
268
- end
269
- end
270
-
271
- describe "#type" do
272
- context "when #value has been initialized and has a #type" do
273
- let(:type) { String }
274
- let(:value) { {type: type} }
275
-
276
- it "must return the #value.type" do
277
- expect(subject.type).to eq(type)
278
- end
279
- end
280
-
281
- context "when #value has not been initialized" do
282
- let(:value) { nil }
283
-
284
- it { expect(subject.type).to be(nil) }
285
- end
286
- end
287
-
288
- describe "#default_value" do
289
- context "when #value has been initialized and has a #default" do
290
- let(:default) { "" }
291
- let(:value) { {default: default} }
292
-
293
- it "must return the #value.default_value" do
294
- expect(subject.default_value).to eq(default)
295
- end
296
- end
297
-
298
- context "when #value has not been initialized" do
299
- let(:value) { nil }
300
-
301
- it { expect(subject.default_value).to be(nil) }
302
- end
303
- end
304
-
305
- describe "#desc" do
306
- let(:desc) { 'Foo option' }
307
-
308
- it "must return the desc: value" do
309
- expect(subject.desc).to eq(desc)
310
- end
311
-
312
- context "when #value has been initialized with a default value" do
313
- let(:default) { "foo" }
314
- let(:value) { {default: default} }
315
-
316
- it "should reutrn the desc value and '(Default: ...)'" do
317
- expect(subject.desc).to eq("#{desc} (Default: #{default})")
318
- end
319
- end
320
-
321
- context "when #desc was initialized with an Array" do
322
- let(:desc) do
323
- [
324
- 'Line 1',
325
- 'Line 2'
326
- ]
327
- end
328
-
329
- it "must return the desc: value" do
330
- expect(subject.desc).to eq(desc)
331
- end
332
-
333
- context "when #value has been initialized with a default value" do
334
- let(:default) { "foo" }
335
- let(:value) { {default: default} }
336
-
337
- it "should append '(Default: ...)' to the desc Array" do
338
- expect(subject.desc).to eq([*desc, "(Default: #{default})"])
339
- end
340
- end
341
- end
342
- end
343
- end