twig 1.4 → 1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|