twig 1.4 → 1.5
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.
- data/HISTORY.md +15 -0
- data/README.md +17 -4
- data/bin/twig-gh-open +1 -1
- data/bin/twig-gh-open-issue +1 -1
- data/bin/twig-gh-update +1 -1
- data/bin/twig-help +1 -1
- data/bin/twig-init-completion-bash +22 -3
- data/bin/twig-rebase +1 -1
- data/lib/twig.rb +23 -13
- data/lib/twig/branch.rb +24 -9
- data/lib/twig/cli.rb +84 -25
- data/lib/twig/commit_time.rb +10 -0
- data/lib/twig/display.rb +9 -0
- data/lib/twig/options.rb +88 -46
- data/lib/twig/subcommands.rb +26 -0
- data/lib/twig/system.rb +9 -0
- data/lib/twig/version.rb +1 -1
- data/spec/spec_helper.rb +7 -0
- data/spec/twig/branch_spec.rb +134 -60
- data/spec/twig/cli_spec.rb +247 -156
- data/spec/twig/commit_time_spec.rb +20 -18
- data/spec/twig/display_spec.rb +108 -57
- data/spec/twig/github_spec.rb +90 -73
- data/spec/twig/options_spec.rb +311 -152
- data/spec/twig/subcommands_spec.rb +29 -0
- data/spec/twig/system_spec.rb +36 -0
- data/spec/twig/util_spec.rb +20 -20
- data/spec/twig_spec.rb +103 -76
- data/twig.gemspec +9 -6
- metadata +17 -11
data/spec/twig/options_spec.rb
CHANGED
@@ -5,52 +5,103 @@ describe Twig::Options do
|
|
5
5
|
@twig = Twig.new
|
6
6
|
end
|
7
7
|
|
8
|
-
describe '#
|
8
|
+
describe '#readable_config_file_path' do
|
9
9
|
before :each do
|
10
|
-
File.
|
10
|
+
expect(File).to receive(:expand_path).with(Twig::CONFIG_PATH).
|
11
11
|
and_return(Twig::CONFIG_PATH)
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
File.should_receive(:open).with(Twig::CONFIG_PATH).and_yield(file)
|
19
|
-
file.should_receive(:read).and_return('branch: test')
|
20
|
-
@twig.options[:branch].should be_nil # Precondition
|
14
|
+
context 'with a config path that exists' do
|
15
|
+
before :each do
|
16
|
+
expect(File).to receive(:exists?).with(Twig::CONFIG_PATH).and_return(true)
|
17
|
+
end
|
21
18
|
|
22
|
-
|
19
|
+
it 'returns the config path if is readable' do
|
20
|
+
path = Twig::CONFIG_PATH
|
21
|
+
expect(File).to receive(:readable?).with(path).and_return(true)
|
22
|
+
expect($stderr).not_to receive(:puts)
|
23
|
+
|
24
|
+
result = @twig.readable_config_file_path
|
23
25
|
|
24
|
-
|
26
|
+
expect(result).to eq(path)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'prints a warning and returns nil if the config path is not readable' do
|
30
|
+
path = Twig::CONFIG_PATH
|
31
|
+
expect(File).to receive(:readable?).with(path).and_return(false)
|
32
|
+
expect($stderr).to receive(:puts) do |message|
|
33
|
+
expect(message).to include('not readable')
|
34
|
+
end
|
35
|
+
|
36
|
+
result = @twig.readable_config_file_path
|
37
|
+
|
38
|
+
expect(result).to be_nil
|
39
|
+
end
|
25
40
|
end
|
26
41
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
File.should_receive(:readable?).with(path).and_return(false)
|
33
|
-
File.should_receive(:readable?).with(deprecated_path).and_return(true)
|
34
|
-
File.should_receive(:expand_path).with(deprecated_path).
|
35
|
-
and_return(deprecated_path)
|
36
|
-
File.should_receive(:open).with(deprecated_path).and_yield(file)
|
37
|
-
file.should_receive(:read).and_return('branch: test')
|
38
|
-
$stderr.should_receive(:puts) do |message|
|
39
|
-
message.should =~ /^DEPRECATED:/
|
42
|
+
context 'with a config path that does not exist' do
|
43
|
+
before :each do
|
44
|
+
expect(File).to receive(:exists?).with(Twig::CONFIG_PATH).and_return(false)
|
45
|
+
expect(File).to receive(:expand_path).with(Twig::DEPRECATED_CONFIG_PATH).
|
46
|
+
and_return(Twig::DEPRECATED_CONFIG_PATH)
|
40
47
|
end
|
41
|
-
@twig.options[:branch].should be_nil
|
42
48
|
|
43
|
-
|
49
|
+
it 'prints a deprecation warning and returns the deprecated config path if it exists and is readable' do
|
50
|
+
path = Twig::DEPRECATED_CONFIG_PATH
|
51
|
+
expect(File).to receive(:exists?).with(path).and_return(true)
|
52
|
+
expect(File).to receive(:readable?).with(path).and_return(true)
|
53
|
+
expect($stderr).to receive(:puts) do |message|
|
54
|
+
expect(message).to match(/^DEPRECATED:/)
|
55
|
+
expect(message).to include('Please rename')
|
56
|
+
expect(message).not_to include('make it readable')
|
57
|
+
end
|
58
|
+
|
59
|
+
result = @twig.readable_config_file_path
|
44
60
|
|
45
|
-
|
61
|
+
expect(result).to eq(path)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'prints a deprecation warning and returns nil if the deprecated config path exists but is not readable' do
|
65
|
+
path = Twig::DEPRECATED_CONFIG_PATH
|
66
|
+
expect(File).to receive(:exists?).with(path).and_return(true)
|
67
|
+
expect(File).to receive(:readable?).with(path).and_return(false)
|
68
|
+
expect($stderr).to receive(:puts) do |message|
|
69
|
+
expect(message).to match(/^DEPRECATED:/)
|
70
|
+
expect(message).to include('Please rename')
|
71
|
+
expect(message).to include('make it readable')
|
72
|
+
end
|
73
|
+
|
74
|
+
result = @twig.readable_config_file_path
|
75
|
+
|
76
|
+
expect(result).to be_nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'returns nil if the deprecated config path does not exist' do
|
80
|
+
path = Twig::DEPRECATED_CONFIG_PATH
|
81
|
+
expect(File).to receive(:exists?).with(path).and_return(false)
|
82
|
+
|
83
|
+
result = @twig.readable_config_file_path
|
84
|
+
|
85
|
+
expect(result).to be_nil
|
86
|
+
end
|
46
87
|
end
|
88
|
+
end
|
47
89
|
|
48
|
-
|
49
|
-
|
50
|
-
file = double('file')
|
51
|
-
|
52
|
-
File.
|
53
|
-
|
90
|
+
describe '#parse_config_file' do
|
91
|
+
before :each do
|
92
|
+
@file = double('file')
|
93
|
+
@path = Twig::CONFIG_PATH
|
94
|
+
expect(File).to receive(:open).with(@path).and_yield(@file)
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'reads a single option' do
|
98
|
+
expect(@file).to receive(:read).and_return('branch: test')
|
99
|
+
options = @twig.parse_config_file(@path)
|
100
|
+
expect(options).to eq('branch' => 'test')
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'reads multiple options' do
|
104
|
+
expect(@file).to receive(:read).and_return([
|
54
105
|
# Filtering branches:
|
55
106
|
'branch: test',
|
56
107
|
'max-days-old: 30.5',
|
@@ -69,258 +120,366 @@ describe Twig::Options do
|
|
69
120
|
'github-uri-prefix: https://github-enterprise.example.com'
|
70
121
|
].join("\n"))
|
71
122
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
123
|
+
options = @twig.parse_config_file(@path)
|
124
|
+
|
125
|
+
expect(options).to eq(
|
126
|
+
'branch' => 'test',
|
127
|
+
'max-days-old' => '30.5',
|
128
|
+
'except-branch' => 'test-except-branch',
|
129
|
+
'only-branch' => 'test-only-branch',
|
130
|
+
'except-foo' => 'test-except-foo',
|
131
|
+
'only-foo' => 'test-only-foo',
|
132
|
+
'header-style' => 'green bold',
|
133
|
+
'reverse' => 'true',
|
134
|
+
'foo-width' => '4',
|
135
|
+
'github-api-uri-prefix' => 'https://github-enterprise.example.com/api/v3',
|
136
|
+
'github-uri-prefix' => 'https://github-enterprise.example.com'
|
137
|
+
)
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'skips and reports empty keys' do
|
141
|
+
expect(@file).to receive(:read).and_return([
|
142
|
+
'except-branch: foo',
|
143
|
+
': bar'
|
144
|
+
].join("\n"))
|
145
|
+
expect($stderr).to receive(:puts) do |message|
|
146
|
+
expect(message).to include('Invalid line')
|
147
|
+
expect(message).to include(@path)
|
148
|
+
end
|
83
149
|
|
84
|
-
@twig.
|
150
|
+
options = @twig.parse_config_file(@path)
|
85
151
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
@twig.options[:property_width].should == { :foo => 4 }
|
103
|
-
@twig.options[:reverse].should be_true
|
152
|
+
expect(options).to eq('except-branch' => 'foo')
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'skips and reports invalid lines' do
|
156
|
+
expect(@file).to receive(:read).and_return([
|
157
|
+
'except-branch: foo',
|
158
|
+
'max-days-old 30'
|
159
|
+
].join("\n"))
|
160
|
+
expect($stderr).to receive(:puts) do |message|
|
161
|
+
expect(message).to include('Invalid line')
|
162
|
+
expect(message).to include(@path)
|
163
|
+
end
|
164
|
+
|
165
|
+
options = @twig.parse_config_file(@path)
|
166
|
+
|
167
|
+
expect(options).to eq('except-branch' => 'foo')
|
104
168
|
end
|
105
169
|
|
106
170
|
it 'skips comments' do
|
107
|
-
file
|
108
|
-
File.should_receive(:readable?).with(Twig::CONFIG_PATH).and_return(true)
|
109
|
-
File.should_receive(:open).with(Twig::CONFIG_PATH).and_yield(file)
|
110
|
-
file.should_receive(:read).and_return([
|
171
|
+
expect(@file).to receive(:read).and_return([
|
111
172
|
'# max-days-old: 40',
|
112
173
|
'max-days-old: 30',
|
113
174
|
'# max-days-old: 20',
|
114
175
|
' # foo-width: 4'
|
115
176
|
].join("\n"))
|
116
|
-
|
177
|
+
expect($stderr).not_to receive(:puts)
|
117
178
|
|
118
|
-
@twig.
|
179
|
+
options = @twig.parse_config_file(@path)
|
119
180
|
|
120
|
-
|
181
|
+
expect(options).to eq('max-days-old' => '30')
|
121
182
|
end
|
122
183
|
|
123
184
|
it 'skips line breaks' do
|
124
|
-
file
|
125
|
-
File.should_receive(:readable?).with(Twig::CONFIG_PATH).and_return(true)
|
126
|
-
File.should_receive(:open).with(Twig::CONFIG_PATH).and_yield(file)
|
127
|
-
file.should_receive(:read).and_return([
|
185
|
+
expect(@file).to receive(:read).and_return([
|
128
186
|
'except-branch: test-except',
|
129
187
|
'',
|
130
188
|
'only-branch: test-only'
|
131
189
|
].join("\n"))
|
190
|
+
expect($stderr).not_to receive(:puts)
|
132
191
|
|
133
|
-
|
134
|
-
|
135
|
-
|
192
|
+
options = @twig.parse_config_file(@path)
|
193
|
+
|
194
|
+
expect(options).to eq(
|
195
|
+
'except-branch' => 'test-except',
|
196
|
+
'only-branch' => 'test-only'
|
197
|
+
)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe '#read_config_file!' do
|
202
|
+
before :each do
|
203
|
+
allow(File).to receive(:expand_path).with(Twig::CONFIG_PATH).
|
204
|
+
and_return(Twig::CONFIG_PATH)
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'does nothing if there is no readable config file' do
|
208
|
+
allow(@twig).to receive(:readable_config_file_path).and_return(nil)
|
209
|
+
expect(@twig).not_to receive(:parse_config_file)
|
136
210
|
|
137
211
|
@twig.read_config_file!
|
212
|
+
end
|
138
213
|
|
139
|
-
|
140
|
-
|
214
|
+
it 'reads and sets a single option' do
|
215
|
+
path = Twig::CONFIG_PATH
|
216
|
+
allow(@twig).to receive(:all_branch_names) { ['test'] }
|
217
|
+
expect(@twig).to receive(:readable_config_file_path).and_return(path)
|
218
|
+
expect(@twig).to receive(:parse_config_file).with(path).and_return(
|
219
|
+
'branch' => 'test'
|
220
|
+
)
|
221
|
+
expect(@twig.options[:branch]).to be_nil
|
222
|
+
|
223
|
+
@twig.read_config_file!
|
224
|
+
|
225
|
+
expect(@twig.options[:branch]).to eq('test')
|
141
226
|
end
|
142
227
|
|
143
|
-
it '
|
228
|
+
it 'reads and sets multiple options' do
|
144
229
|
path = Twig::CONFIG_PATH
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
230
|
+
allow(@twig).to receive(:all_branch_names) { ['test'] }
|
231
|
+
expect(@twig).to receive(:readable_config_file_path).and_return(path)
|
232
|
+
expect(@twig).to receive(:parse_config_file).with(path).and_return(
|
233
|
+
# Filtering branches:
|
234
|
+
'branch' => 'test',
|
235
|
+
'max-days-old' => '30.5',
|
236
|
+
'except-branch' => 'test-except-branch',
|
237
|
+
'only-branch' => 'test-only-branch',
|
238
|
+
'except-foo' => 'test-except-foo',
|
239
|
+
'only-foo' => 'test-only-foo',
|
240
|
+
|
241
|
+
# Displaying branches:
|
242
|
+
'format' => 'json',
|
243
|
+
'header-style' => 'green bold',
|
244
|
+
'reverse' => 'true',
|
245
|
+
'foo-width' => '4',
|
246
|
+
|
247
|
+
# GitHub integration:
|
248
|
+
'github-api-uri-prefix' => 'https://github-enterprise.example.com/api/v3',
|
249
|
+
'github-uri-prefix' => 'https://github-enterprise.example.com'
|
250
|
+
)
|
251
|
+
|
252
|
+
# Check preconditions
|
253
|
+
expect(@twig.options[:branch]).to be_nil
|
254
|
+
expect(@twig.options[:format]).to be_nil
|
255
|
+
expect(@twig.options[:github_api_uri_prefix]).to eq(
|
256
|
+
Twig::DEFAULT_GITHUB_API_URI_PREFIX
|
257
|
+
)
|
258
|
+
expect(@twig.options[:github_uri_prefix]).to eq(
|
259
|
+
Twig::DEFAULT_GITHUB_URI_PREFIX
|
260
|
+
)
|
261
|
+
expect(@twig.options[:header_color]).to eq(Twig::DEFAULT_HEADER_COLOR)
|
262
|
+
expect(@twig.options[:header_weight]).to be_nil
|
263
|
+
expect(@twig.options[:max_days_old]).to be_nil
|
264
|
+
expect(@twig.options[:property_except]).to be_nil
|
265
|
+
expect(@twig.options[:property_only]).to be_nil
|
266
|
+
expect(@twig.options[:property_width]).to be_nil
|
267
|
+
expect(@twig.options[:reverse]).to be_nil
|
268
|
+
|
269
|
+
@twig.read_config_file!
|
270
|
+
|
271
|
+
expect(@twig.options[:branch]).to eq('test')
|
272
|
+
expect(@twig.options[:format]).to eq(:json)
|
273
|
+
expect(@twig.options[:github_api_uri_prefix]).to eq(
|
274
|
+
'https://github-enterprise.example.com/api/v3'
|
275
|
+
)
|
276
|
+
expect(@twig.options[:github_uri_prefix]).to eq(
|
277
|
+
'https://github-enterprise.example.com'
|
278
|
+
)
|
279
|
+
expect(@twig.options[:header_color]).to eq(:green)
|
280
|
+
expect(@twig.options[:header_weight]).to eq(:bold)
|
281
|
+
expect(@twig.options[:max_days_old]).to eq(30.5)
|
282
|
+
expect(@twig.options[:property_except]).to eq(
|
283
|
+
:branch => /test-except-branch/,
|
284
|
+
:foo => /test-except-foo/
|
285
|
+
)
|
286
|
+
expect(@twig.options[:property_only]).to eq(
|
287
|
+
:branch => /test-only-branch/,
|
288
|
+
:foo => /test-only-foo/
|
289
|
+
)
|
290
|
+
expect(@twig.options[:property_width]).to eq(:foo => 4)
|
291
|
+
expect(@twig.options[:reverse]).to be_true
|
151
292
|
end
|
152
293
|
end
|
153
294
|
|
154
295
|
describe '#set_option' do
|
155
296
|
context 'when setting a :branch option' do
|
156
297
|
before :each do
|
157
|
-
@twig.options[:branch].
|
298
|
+
expect(@twig.options[:branch]).to be_nil
|
158
299
|
end
|
159
300
|
|
160
301
|
it 'succeeds' do
|
161
302
|
branch_name = 'foo'
|
162
|
-
@twig.
|
303
|
+
expect(@twig).to receive(:all_branch_names).and_return(%[foo bar])
|
163
304
|
|
164
305
|
@twig.set_option(:branch, branch_name)
|
165
306
|
|
166
|
-
@twig.options[:branch].
|
307
|
+
expect(@twig.options[:branch]).to eq(branch_name)
|
167
308
|
end
|
168
309
|
|
169
310
|
it 'fails if the branch is unknown' do
|
170
311
|
branch_name = 'foo'
|
171
|
-
@twig.
|
172
|
-
@twig.
|
173
|
-
message.
|
312
|
+
expect(@twig).to receive(:all_branch_names).and_return([])
|
313
|
+
expect(@twig).to receive(:abort) do |message|
|
314
|
+
expect(message).to include(%{branch `#{branch_name}` could not be found})
|
174
315
|
end
|
175
316
|
|
176
317
|
@twig.set_option(:branch, branch_name)
|
177
318
|
|
178
|
-
@twig.options[:branch].
|
319
|
+
expect(@twig.options[:branch]).to be_nil
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
context 'when setting a :format option' do
|
324
|
+
it 'succeeds' do
|
325
|
+
@twig.set_option(:format, 'json')
|
326
|
+
expect(@twig.options[:format]).to eq(:json)
|
327
|
+
end
|
328
|
+
|
329
|
+
it 'fails if the option is not :json' do
|
330
|
+
value = 'foo'
|
331
|
+
expect(@twig).to receive(:abort) do |message|
|
332
|
+
expect(message).to include("format `#{value}` is not supported")
|
333
|
+
end
|
334
|
+
|
335
|
+
@twig.set_option(:format, value)
|
336
|
+
|
337
|
+
expect(@twig.options[:format]).to be_nil
|
179
338
|
end
|
180
339
|
end
|
181
340
|
|
182
341
|
it 'sets a :github_api_uri_prefix option' do
|
183
342
|
prefix = 'https://github-enterprise.example.com/api/v3'
|
184
343
|
@twig.set_option(:github_api_uri_prefix, prefix)
|
185
|
-
@twig.options[:github_api_uri_prefix].
|
344
|
+
expect(@twig.options[:github_api_uri_prefix]).to eq(prefix)
|
186
345
|
end
|
187
346
|
|
188
347
|
it 'sets a :github_uri_prefix option' do
|
189
348
|
prefix = 'https://github-enterprise.example.com'
|
190
349
|
@twig.set_option(:github_uri_prefix, prefix)
|
191
|
-
@twig.options[:github_uri_prefix].
|
350
|
+
expect(@twig.options[:github_uri_prefix]).to eq(prefix)
|
192
351
|
end
|
193
352
|
|
194
353
|
it 'sets a :header_style option' do
|
195
354
|
style = 'red bold'
|
196
|
-
@twig.
|
355
|
+
expect(@twig).to receive(:set_header_style_option).with(style)
|
197
356
|
|
198
357
|
@twig.set_option(:header_style, style)
|
199
358
|
end
|
200
359
|
|
201
360
|
context 'when setting a :max_days_old option' do
|
202
361
|
before :each do
|
203
|
-
@twig.options[:max_days_old].
|
362
|
+
expect(@twig.options[:max_days_old]).to be_nil
|
204
363
|
end
|
205
364
|
|
206
365
|
it 'succeeds' do
|
207
366
|
@twig.set_option(:max_days_old, 1)
|
208
|
-
@twig.options[:max_days_old].
|
367
|
+
expect(@twig.options[:max_days_old]).to eq(1)
|
209
368
|
end
|
210
369
|
|
211
370
|
it 'fails if the option is not numeric' do
|
212
371
|
value = 'blargh'
|
213
|
-
@twig.
|
214
|
-
message.
|
372
|
+
expect(@twig).to receive(:abort) do |message|
|
373
|
+
expect(message).to include("`--max-days-old=#{value}` is invalid")
|
215
374
|
end
|
216
375
|
@twig.set_option(:max_days_old, value)
|
217
376
|
|
218
|
-
@twig.options[:max_days_old].
|
377
|
+
expect(@twig.options[:max_days_old]).to be_nil
|
219
378
|
end
|
220
379
|
end
|
221
380
|
|
222
381
|
it 'sets a :property_except option' do
|
223
|
-
@twig.options[:property_except].
|
382
|
+
expect(@twig.options[:property_except]).to be_nil
|
224
383
|
@twig.set_option(:property_except, :branch => 'unwanted_prefix_')
|
225
|
-
@twig.options[:property_except].
|
384
|
+
expect(@twig.options[:property_except]).to eq(:branch => /unwanted_prefix_/)
|
226
385
|
end
|
227
386
|
|
228
387
|
it 'sets a :property_only option' do
|
229
|
-
@twig.options[:property_only].
|
388
|
+
expect(@twig.options[:property_only]).to be_nil
|
230
389
|
@twig.set_option(:property_only, :branch => 'important_prefix_')
|
231
|
-
@twig.options[:property_only].
|
390
|
+
expect(@twig.options[:property_only]).to eq(:branch => /important_prefix_/)
|
232
391
|
end
|
233
392
|
|
234
393
|
it 'sets a :property_width option' do
|
235
394
|
width = 10
|
236
|
-
@twig.
|
395
|
+
expect(@twig).to receive(:set_property_width_option).with(width)
|
237
396
|
|
238
397
|
@twig.set_option(:property_width, width)
|
239
398
|
end
|
240
399
|
|
241
400
|
context 'when setting a :reverse option' do
|
242
401
|
before :each do
|
243
|
-
@twig.options[:reverse].
|
402
|
+
expect(@twig.options[:reverse]).to be_nil
|
244
403
|
end
|
245
404
|
|
246
405
|
it 'sets the option to true when input is truthy' do
|
247
406
|
input = 'yes'
|
248
|
-
Twig::Util.
|
407
|
+
expect(Twig::Util).to receive(:truthy?).with(input).and_call_original
|
249
408
|
|
250
409
|
@twig.set_option(:reverse, input)
|
251
410
|
|
252
|
-
@twig.options[:reverse].
|
411
|
+
expect(@twig.options[:reverse]).to be_true
|
253
412
|
end
|
254
413
|
|
255
414
|
it 'sets the option to false when input is not truthy' do
|
256
415
|
input = 'blargh'
|
257
|
-
Twig::Util.
|
416
|
+
expect(Twig::Util).to receive(:truthy?).with(input).and_call_original
|
258
417
|
|
259
418
|
@twig.set_option(:reverse, input)
|
260
419
|
|
261
|
-
@twig.options[:reverse].
|
420
|
+
expect(@twig.options[:reverse]).to be_false
|
262
421
|
end
|
263
422
|
end
|
264
423
|
|
265
424
|
it 'sets an :unset_property option' do
|
266
|
-
@twig.options[:unset_property].
|
425
|
+
expect(@twig.options[:unset_property]).to be_nil
|
267
426
|
@twig.set_option(:unset_property, 'unwanted_property')
|
268
|
-
@twig.options[:unset_property].
|
427
|
+
expect(@twig.options[:unset_property]).to eq('unwanted_property')
|
269
428
|
end
|
270
429
|
end
|
271
430
|
|
272
431
|
describe '#set_header_style_option' do
|
273
432
|
before :each do
|
274
433
|
# Preconditions:
|
275
|
-
@twig.options[:header_color].
|
276
|
-
@twig.options[:header_weight].
|
434
|
+
expect(@twig.options[:header_color]).to eq(Twig::DEFAULT_HEADER_COLOR)
|
435
|
+
expect(@twig.options[:header_weight]).to be_nil
|
277
436
|
end
|
278
437
|
|
279
438
|
it 'succeeds at setting a color option' do
|
280
439
|
@twig.set_header_style_option('red')
|
281
|
-
@twig.options[:header_color].
|
282
|
-
@twig.options[:header_weight].
|
440
|
+
expect(@twig.options[:header_color]).to eq(:red)
|
441
|
+
expect(@twig.options[:header_weight]).to be_nil
|
283
442
|
end
|
284
443
|
|
285
444
|
it 'succeeds at setting a weight option' do
|
286
445
|
@twig.set_header_style_option('bold')
|
287
|
-
@twig.options[:header_color].
|
288
|
-
@twig.options[:header_weight].
|
446
|
+
expect(@twig.options[:header_color]).to eq(Twig::DEFAULT_HEADER_COLOR)
|
447
|
+
expect(@twig.options[:header_weight]).to eq(:bold)
|
289
448
|
end
|
290
449
|
|
291
450
|
it 'succeeds at setting color and weight options, color first' do
|
292
451
|
@twig.set_header_style_option('red bold')
|
293
|
-
@twig.options[:header_color].
|
294
|
-
@twig.options[:header_weight].
|
452
|
+
expect(@twig.options[:header_color]).to eq(:red)
|
453
|
+
expect(@twig.options[:header_weight]).to eq(:bold)
|
295
454
|
end
|
296
455
|
|
297
456
|
it 'succeeds at setting color and weight options, weight first' do
|
298
457
|
@twig.set_header_style_option('bold red')
|
299
|
-
@twig.options[:header_color].
|
300
|
-
@twig.options[:header_weight].
|
458
|
+
expect(@twig.options[:header_color]).to eq(:red)
|
459
|
+
expect(@twig.options[:header_weight]).to eq(:bold)
|
301
460
|
end
|
302
461
|
|
303
462
|
it 'succeeds at setting color and weight options with extra space between words' do
|
304
463
|
@twig.set_header_style_option('red bold')
|
305
|
-
@twig.options[:header_color].
|
306
|
-
@twig.options[:header_weight].
|
464
|
+
expect(@twig.options[:header_color]).to eq(:red)
|
465
|
+
expect(@twig.options[:header_weight]).to eq(:bold)
|
307
466
|
end
|
308
467
|
|
309
468
|
it 'fails if the one-word option is invalid' do
|
310
469
|
style = 'handsofblue' # Two by two...
|
311
|
-
@twig.
|
312
|
-
message.
|
470
|
+
expect(@twig).to receive(:abort) do |message|
|
471
|
+
expect(message).to include("`--header-style=#{style}` is invalid")
|
313
472
|
end
|
314
473
|
@twig.set_header_style_option(style)
|
315
474
|
|
316
|
-
@twig.options[:header_color].
|
317
|
-
@twig.options[:header_weight].
|
475
|
+
expect(@twig.options[:header_color]).to eq(Twig::DEFAULT_HEADER_COLOR)
|
476
|
+
expect(@twig.options[:header_weight]).to be_nil
|
318
477
|
end
|
319
478
|
|
320
479
|
it 'fails if the color of the two-word option is invalid' do
|
321
480
|
style = 'handsofblue bold'
|
322
|
-
@twig.
|
323
|
-
message.
|
481
|
+
expect(@twig).to receive(:abort) do |message|
|
482
|
+
expect(message).to include("`--header-style=#{style}` is invalid")
|
324
483
|
end
|
325
484
|
|
326
485
|
@twig.set_header_style_option(style)
|
@@ -328,8 +487,8 @@ describe Twig::Options do
|
|
328
487
|
|
329
488
|
it 'fails if the weight of the two-word option is invalid' do
|
330
489
|
style = 'red extrabold'
|
331
|
-
@twig.
|
332
|
-
message.
|
490
|
+
expect(@twig).to receive(:abort) do |message|
|
491
|
+
expect(message).to include("`--header-style=#{style}` is invalid")
|
333
492
|
end
|
334
493
|
|
335
494
|
@twig.set_header_style_option(style)
|
@@ -337,8 +496,8 @@ describe Twig::Options do
|
|
337
496
|
|
338
497
|
it 'fails if there are two colors' do
|
339
498
|
style = 'red green'
|
340
|
-
@twig.
|
341
|
-
message.
|
499
|
+
expect(@twig).to receive(:abort) do |message|
|
500
|
+
expect(message).to include("`--header-style=#{style}` is invalid")
|
342
501
|
end
|
343
502
|
|
344
503
|
@twig.set_header_style_option(style)
|
@@ -346,8 +505,8 @@ describe Twig::Options do
|
|
346
505
|
|
347
506
|
it 'fails if there are two weights' do
|
348
507
|
style = 'bold bold'
|
349
|
-
@twig.
|
350
|
-
message.
|
508
|
+
expect(@twig).to receive(:abort) do |message|
|
509
|
+
expect(message).to include("`--header-style=#{style}` is invalid")
|
351
510
|
end
|
352
511
|
|
353
512
|
@twig.set_header_style_option(style)
|
@@ -356,18 +515,18 @@ describe Twig::Options do
|
|
356
515
|
|
357
516
|
describe '#set_property_width_option' do
|
358
517
|
before :each do
|
359
|
-
@twig.options[:property_width].
|
518
|
+
expect(@twig.options[:property_width]).to be_nil
|
360
519
|
end
|
361
520
|
|
362
521
|
it 'succeeds' do
|
363
522
|
@twig.set_option(:property_width, :foo => '20', :bar => '40')
|
364
|
-
@twig.options[:property_width].
|
523
|
+
expect(@twig.options[:property_width]).to eq(:foo => 20, :bar => 40)
|
365
524
|
end
|
366
525
|
|
367
526
|
it 'fails if width is not numeric' do
|
368
527
|
width = 'blargh'
|
369
|
-
@twig.
|
370
|
-
message.
|
528
|
+
expect(@twig).to receive(:abort) do |message|
|
529
|
+
expect(message).to include("`--branch-width=#{width}` is invalid")
|
371
530
|
abort # Original behavior, but don't show message in test output
|
372
531
|
end
|
373
532
|
|
@@ -376,15 +535,15 @@ describe Twig::Options do
|
|
376
535
|
rescue SystemExit => exception
|
377
536
|
end
|
378
537
|
|
379
|
-
@twig.options[:property_width].
|
538
|
+
expect(@twig.options[:property_width]).to be_nil
|
380
539
|
end
|
381
540
|
|
382
541
|
it 'fails if width is below minimum value' do
|
383
542
|
min_width = Twig::Options::MIN_PROPERTY_WIDTH
|
384
543
|
width = min_width - 1
|
385
|
-
@twig.
|
386
|
-
message.
|
387
|
-
message.
|
544
|
+
expect(@twig).to receive(:abort) do |message|
|
545
|
+
expect(message).to include("`--x-width=#{width}` is too low. ")
|
546
|
+
expect(message).to include("The minimum is #{min_width}.")
|
388
547
|
abort
|
389
548
|
end
|
390
549
|
|
@@ -393,15 +552,15 @@ describe Twig::Options do
|
|
393
552
|
rescue SystemExit => exception
|
394
553
|
end
|
395
554
|
|
396
|
-
@twig.options[:property_width].
|
555
|
+
expect(@twig.options[:property_width]).to be_nil
|
397
556
|
end
|
398
557
|
|
399
558
|
it 'fails if width is below width of property name' do
|
400
559
|
property_name = :foobarbaz
|
401
560
|
width = property_name.to_s.size - 1
|
402
|
-
@twig.
|
403
|
-
message.
|
404
|
-
message.
|
561
|
+
expect(@twig).to receive(:abort) do |message|
|
562
|
+
expect(message).to include("`--#{property_name}-width=#{width}` is too low. ")
|
563
|
+
expect(message).to include(%{The minimum is 9 (width of "#{property_name}")})
|
405
564
|
abort
|
406
565
|
end
|
407
566
|
|
@@ -410,17 +569,17 @@ describe Twig::Options do
|
|
410
569
|
rescue SystemExit => exception
|
411
570
|
end
|
412
571
|
|
413
|
-
@twig.options[:property_width].
|
572
|
+
expect(@twig.options[:property_width]).to be_nil
|
414
573
|
end
|
415
574
|
end
|
416
575
|
|
417
576
|
describe '#unset_option' do
|
418
577
|
it 'unsets an option' do
|
419
578
|
@twig.set_option(:max_days_old, 1)
|
420
|
-
@twig.options[:max_days_old].
|
579
|
+
expect(@twig.options[:max_days_old]).to eq(1)
|
421
580
|
|
422
581
|
@twig.unset_option(:max_days_old)
|
423
|
-
@twig.options[:max_days_old].
|
582
|
+
expect(@twig.options[:max_days_old]).to be_nil
|
424
583
|
end
|
425
584
|
end
|
426
585
|
end
|