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
@@ -8,31 +8,33 @@ describe Twig::CommitTime do
|
|
8
8
|
describe '#initialize' do
|
9
9
|
it 'stores a Time object' do
|
10
10
|
commit_time = Twig::CommitTime.new(@time, '99 days ago')
|
11
|
-
commit_time.instance_variable_get(:@time).
|
11
|
+
expect(commit_time.instance_variable_get(:@time)).to eq(@time)
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'stores a "time ago" string as its shortened version' do
|
15
|
-
Twig::CommitTime.new(@time, '2 years ago').
|
16
|
-
instance_variable_get(:@time_ago).
|
17
|
-
Twig::CommitTime.new(@time, '2
|
18
|
-
instance_variable_get(:@time_ago).
|
19
|
-
Twig::CommitTime.new(@time, '2
|
20
|
-
instance_variable_get(:@time_ago).
|
21
|
-
Twig::CommitTime.new(@time, '2
|
22
|
-
instance_variable_get(:@time_ago).
|
23
|
-
Twig::CommitTime.new(@time, '2
|
24
|
-
instance_variable_get(:@time_ago).
|
25
|
-
Twig::CommitTime.new(@time, '2
|
26
|
-
instance_variable_get(:@time_ago).
|
27
|
-
Twig::CommitTime.new(@time, '2
|
28
|
-
instance_variable_get(:@time_ago).
|
15
|
+
expect(Twig::CommitTime.new(@time, '2 years, 2 months ago').
|
16
|
+
instance_variable_get(:@time_ago)).to eq('2y ago')
|
17
|
+
expect(Twig::CommitTime.new(@time, '2 years ago').
|
18
|
+
instance_variable_get(:@time_ago)).to eq('2y ago')
|
19
|
+
expect(Twig::CommitTime.new(@time, '2 months ago').
|
20
|
+
instance_variable_get(:@time_ago)).to eq('2mo ago')
|
21
|
+
expect(Twig::CommitTime.new(@time, '2 weeks ago').
|
22
|
+
instance_variable_get(:@time_ago)).to eq('2w ago')
|
23
|
+
expect(Twig::CommitTime.new(@time, '2 days ago').
|
24
|
+
instance_variable_get(:@time_ago)).to eq('2d ago')
|
25
|
+
expect(Twig::CommitTime.new(@time, '2 hours ago').
|
26
|
+
instance_variable_get(:@time_ago)).to eq('2h ago')
|
27
|
+
expect(Twig::CommitTime.new(@time, '2 minutes ago').
|
28
|
+
instance_variable_get(:@time_ago)).to eq('2m ago')
|
29
|
+
expect(Twig::CommitTime.new(@time, '2 seconds ago').
|
30
|
+
instance_variable_get(:@time_ago)).to eq('2s ago')
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
34
|
describe '#to_i' do
|
33
35
|
it 'returns the time as an integer' do
|
34
36
|
commit_time = Twig::CommitTime.new(@time, '99 days ago')
|
35
|
-
commit_time.to_i.
|
37
|
+
expect(commit_time.to_i).to eq(@time.to_i)
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
@@ -40,8 +42,8 @@ describe Twig::CommitTime do
|
|
40
42
|
it 'returns a formatted string, including time ago' do
|
41
43
|
commit_time = Twig::CommitTime.new(@time, '99 days ago')
|
42
44
|
result = commit_time.to_s
|
43
|
-
result.
|
44
|
-
result.
|
45
|
+
expect(result).to include('2000-12-01')
|
46
|
+
expect(result).to include('(99d ago)')
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
data/spec/twig/display_spec.rb
CHANGED
@@ -7,20 +7,20 @@ describe Twig::Display do
|
|
7
7
|
|
8
8
|
describe '#column' do
|
9
9
|
it 'returns a string with an exact fixed width' do
|
10
|
-
@twig.column('foo', :width => 8).
|
10
|
+
expect(@twig.column('foo', :width => 8)).to eq('foo' + (' ' * 5))
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'returns a string that fits a column exactly' do
|
14
|
-
@twig.column('asdfasdf', :width => 8).
|
14
|
+
expect(@twig.column('asdfasdf', :width => 8)).to eq('asdfasdf')
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'truncates a wide string with an ellipsis' do
|
18
|
-
@twig.column('asdfasdfasdf', :width => 8).
|
18
|
+
expect(@twig.column('asdfasdfasdf', :width => 8)).to eq('asdfa...')
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'passes options through to `format_string`' do
|
22
22
|
format_options = { :color => :red, :weight => :bold }
|
23
|
-
@twig.
|
23
|
+
expect(@twig).to receive(:format_string).
|
24
24
|
with('foo' + (' ' * 5), format_options)
|
25
25
|
|
26
26
|
@twig.column('foo', format_options)
|
@@ -29,52 +29,57 @@ describe Twig::Display do
|
|
29
29
|
|
30
30
|
describe '#property_column_width' do
|
31
31
|
it 'returns a default width if no property name is given' do
|
32
|
-
@twig.property_column_width.
|
32
|
+
expect(@twig.property_column_width).to eq(
|
33
33
|
Twig::Display::DEFAULT_PROPERTY_COLUMN_WIDTH
|
34
|
+
)
|
34
35
|
end
|
35
36
|
|
36
37
|
context 'with no custom column widths set' do
|
37
38
|
before :each do
|
38
|
-
@twig.options[:property_width].
|
39
|
+
expect(@twig.options[:property_width]).to be_nil
|
39
40
|
end
|
40
41
|
|
41
42
|
it 'returns a default width if a property name is given' do
|
42
|
-
@twig.property_column_width(:foo).
|
43
|
+
expect(@twig.property_column_width(:foo)).to eq(
|
43
44
|
Twig::Display::DEFAULT_PROPERTY_COLUMN_WIDTH
|
45
|
+
)
|
44
46
|
end
|
45
47
|
|
46
48
|
it 'returns a default width if :branch is given' do
|
47
|
-
@twig.property_column_width(:branch).
|
49
|
+
expect(@twig.property_column_width(:branch)).to eq(
|
48
50
|
Twig::Display::DEFAULT_BRANCH_COLUMN_WIDTH
|
51
|
+
)
|
49
52
|
end
|
50
53
|
end
|
51
54
|
|
52
55
|
context 'with custom column widths set' do
|
53
56
|
it 'returns a default width if a property name is given but it has no custom width' do
|
54
|
-
@twig.property_column_width(:baz).
|
57
|
+
expect(@twig.property_column_width(:baz)).to eq(
|
55
58
|
Twig::Display::DEFAULT_PROPERTY_COLUMN_WIDTH
|
59
|
+
)
|
56
60
|
end
|
57
61
|
|
58
62
|
it 'returns a custom width if a property name is given and it has a custom width' do
|
59
63
|
@twig.set_option(:property_width, :foo => 20)
|
60
|
-
@twig.property_column_width(:foo).
|
64
|
+
expect(@twig.property_column_width(:foo)).to eq(20)
|
61
65
|
end
|
62
66
|
|
63
67
|
it 'returns a default width if :branch is given but it has no custom width' do
|
64
|
-
@twig.property_column_width(:branch).
|
68
|
+
expect(@twig.property_column_width(:branch)).to eq(
|
65
69
|
Twig::Display::DEFAULT_BRANCH_COLUMN_WIDTH
|
70
|
+
)
|
66
71
|
end
|
67
72
|
|
68
73
|
it 'returns a custom width if :branch is given but it has no custom width' do
|
69
74
|
@twig.set_option(:property_width, :branch => 20)
|
70
|
-
@twig.property_column_width(:branch).
|
75
|
+
expect(@twig.property_column_width(:branch)).to eq(20)
|
71
76
|
end
|
72
77
|
end
|
73
78
|
end
|
74
79
|
|
75
80
|
describe '#branch_list_headers' do
|
76
81
|
before :each do
|
77
|
-
Twig::Branch.
|
82
|
+
allow(Twig::Branch).to receive(:all_property_names) { %w[foo quux] }
|
78
83
|
end
|
79
84
|
|
80
85
|
it 'returns a string of branch properties and underlines' do
|
@@ -84,14 +89,18 @@ describe Twig::Display do
|
|
84
89
|
date_time_column_width = 35
|
85
90
|
extra_property_column_width = 8
|
86
91
|
column_gutter = @twig.column_gutter
|
87
|
-
result_lines[0].
|
92
|
+
expect(result_lines[0]).to eq(
|
93
|
+
(' ' * date_time_column_width) + column_gutter +
|
88
94
|
'foo ' + (' ' * extra_property_column_width) + column_gutter +
|
89
95
|
'quux ' + (' ' * extra_property_column_width) + column_gutter +
|
90
96
|
' branch'
|
91
|
-
|
97
|
+
)
|
98
|
+
expect(result_lines[1]).to eq(
|
99
|
+
(' ' * date_time_column_width) + column_gutter +
|
92
100
|
'--- ' + (' ' * extra_property_column_width) + column_gutter +
|
93
101
|
'---- ' + (' ' * extra_property_column_width) + column_gutter +
|
94
102
|
' ------'
|
103
|
+
)
|
95
104
|
end
|
96
105
|
|
97
106
|
it 'sets a header width' do
|
@@ -103,44 +112,51 @@ describe Twig::Display do
|
|
103
112
|
date_time_column_width = 35
|
104
113
|
extra_property_column_width = 8
|
105
114
|
column_gutter = @twig.column_gutter
|
106
|
-
result_lines[0].
|
115
|
+
expect(result_lines[0]).to eq(
|
116
|
+
(' ' * date_time_column_width) + column_gutter +
|
107
117
|
'foo ' + column_gutter +
|
108
118
|
'quux ' + (' ' * extra_property_column_width) + column_gutter +
|
109
119
|
' branch'
|
110
|
-
|
120
|
+
)
|
121
|
+
expect(result_lines[1]).to eq(
|
122
|
+
(' ' * date_time_column_width) + column_gutter +
|
111
123
|
'--- ' + column_gutter +
|
112
124
|
'---- ' + (' ' * extra_property_column_width) + column_gutter +
|
113
125
|
' ------'
|
126
|
+
)
|
114
127
|
end
|
115
128
|
|
116
129
|
it 'sets a header color' do
|
117
130
|
result = @twig.branch_list_headers({ :header_color => :green })
|
118
131
|
header_line = result.split("\n").first
|
119
132
|
color = Twig::Display::COLORS[:green]
|
120
|
-
header_line.gsub(/\s/, '').
|
133
|
+
expect(header_line.gsub(/\s/, '')).to eq(
|
121
134
|
"\e[#{color}mfoo\e[0m" <<
|
122
135
|
"\e[#{color}mquux\e[0m" <<
|
123
136
|
"\e[#{color}mbranch\e[0m"
|
137
|
+
)
|
124
138
|
end
|
125
139
|
|
126
140
|
it 'sets a header weight' do
|
127
141
|
result = @twig.branch_list_headers({ :header_weight => :bold })
|
128
142
|
header_line = result.split("\n").first
|
129
143
|
weight = Twig::Display::WEIGHTS[:bold]
|
130
|
-
header_line.gsub(/\s/, '').
|
144
|
+
expect(header_line.gsub(/\s/, '')).to eq(
|
131
145
|
"\e[#{weight}mfoo\e[0m" <<
|
132
146
|
"\e[#{weight}mquux\e[0m" <<
|
133
147
|
"\e[#{weight}mbranch\e[0m"
|
148
|
+
)
|
134
149
|
end
|
135
150
|
|
136
151
|
it 'sets a header color and weight' do
|
137
152
|
result = @twig.branch_list_headers({ :header_color => :red, :header_weight => :bold })
|
138
153
|
header_line = result.split("\n").first
|
139
154
|
color, weight = Twig::Display::COLORS[:red], Twig::Display::WEIGHTS[:bold]
|
140
|
-
header_line.gsub(/\s/, '').
|
155
|
+
expect(header_line.gsub(/\s/, '')).to eq(
|
141
156
|
"\e[#{color};#{weight}mfoo\e[0m" <<
|
142
157
|
"\e[#{color};#{weight}mquux\e[0m" <<
|
143
158
|
"\e[#{color};#{weight}mbranch\e[0m"
|
159
|
+
)
|
144
160
|
end
|
145
161
|
end
|
146
162
|
|
@@ -148,20 +164,18 @@ describe Twig::Display do
|
|
148
164
|
before :each do
|
149
165
|
@current_branch = Twig::Branch.new('my-branch')
|
150
166
|
@other_branch = Twig::Branch.new('other-branch')
|
151
|
-
@twig.
|
152
|
-
Twig::Branch.
|
153
|
-
@current_branch.
|
154
|
-
'foo' => 'foo!',
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
'bar' => 'bar!'
|
160
|
-
})
|
167
|
+
expect(@twig).to receive(:current_branch_name).and_return(@current_branch.name)
|
168
|
+
allow(Twig::Branch).to receive(:all_property_names) { %w[foo bar] }
|
169
|
+
allow(@current_branch).to receive(:get_properties) do
|
170
|
+
{ 'foo' => 'foo!', 'bar' => 'bar!' }
|
171
|
+
end
|
172
|
+
allow(@other_branch).to receive(:get_properties) do
|
173
|
+
{ 'foo' => 'foo!', 'bar' => 'bar!' }
|
174
|
+
end
|
161
175
|
commit_time = Twig::CommitTime.new(Time.now, '')
|
162
|
-
commit_time.
|
163
|
-
@current_branch.
|
164
|
-
@other_branch.
|
176
|
+
expect(commit_time).to receive(:to_s).and_return('2000-01-01')
|
177
|
+
allow(@current_branch).to receive(:last_commit_time) { commit_time }
|
178
|
+
allow(@other_branch).to receive(:last_commit_time) { commit_time }
|
165
179
|
end
|
166
180
|
|
167
181
|
it 'returns a line for the current branch' do
|
@@ -171,38 +185,38 @@ describe Twig::Display do
|
|
171
185
|
|
172
186
|
result = @twig.branch_list_line(branch)
|
173
187
|
|
174
|
-
result.
|
188
|
+
expect(result).to match(/2000-01-01\s+foo!\s+bar!\s+#{branch_regexp}/)
|
175
189
|
end
|
176
190
|
|
177
191
|
it 'returns a line for a branch other than the current branch' do
|
178
192
|
branch = @other_branch
|
179
193
|
result = @twig.branch_list_line(branch)
|
180
|
-
result.
|
194
|
+
expect(result).to match(/2000-01-01\s+foo!\s+bar!\s+#{Regexp.escape(branch.name)}/)
|
181
195
|
end
|
182
196
|
|
183
197
|
it 'returns a line containing an empty branch property' do
|
184
|
-
Twig::Branch.
|
198
|
+
expect(Twig::Branch).to receive(:all_property_names).and_return(%w[foo bar baz])
|
185
199
|
branch = @other_branch
|
186
200
|
|
187
201
|
result = @twig.branch_list_line(branch)
|
188
202
|
|
189
203
|
empty_indicator = Twig::Display::EMPTY_BRANCH_PROPERTY_INDICATOR
|
190
|
-
result.
|
204
|
+
expect(result).to match(/2000-01-01\s+foo!\s+bar!\s+#{empty_indicator}\s+#{Regexp.escape(branch.name)}/)
|
191
205
|
end
|
192
206
|
|
193
207
|
it 'changes line break characters to spaces' do
|
194
208
|
branch = @current_branch
|
195
209
|
property_names = %w[foo bar linebreaks]
|
196
|
-
branch.
|
210
|
+
expect(branch).to receive(:get_properties).with(property_names).and_return(
|
197
211
|
'foo' => 'foo!',
|
198
212
|
'bar' => 'bar!',
|
199
213
|
'linebreaks' => "line\r\nbreaks!"
|
200
214
|
)
|
201
|
-
Twig::Branch.
|
215
|
+
expect(Twig::Branch).to receive(:all_property_names).and_return(property_names)
|
202
216
|
|
203
217
|
result = @twig.branch_list_line(branch)
|
204
218
|
|
205
|
-
result.
|
219
|
+
expect(result).to include('line breaks')
|
206
220
|
end
|
207
221
|
|
208
222
|
it 'returns a line with custom column widths' do
|
@@ -212,11 +226,12 @@ describe Twig::Display do
|
|
212
226
|
result = @twig.branch_list_line(branch)
|
213
227
|
|
214
228
|
column_gutter = @twig.column_gutter
|
215
|
-
result.
|
229
|
+
expect(result).to eq(
|
216
230
|
'2000-01-01' + (' ' * 25) + column_gutter +
|
217
231
|
'foo! ' + column_gutter +
|
218
232
|
'bar!' + (' ' * 12) + column_gutter +
|
219
233
|
' ' + branch.name
|
234
|
+
)
|
220
235
|
end
|
221
236
|
|
222
237
|
context 'with a custom width for the branch column' do
|
@@ -233,11 +248,12 @@ describe Twig::Display do
|
|
233
248
|
unformatted_result = @twig.unformat_string(result)
|
234
249
|
|
235
250
|
column_gutter = @twig.column_gutter
|
236
|
-
unformatted_result.
|
251
|
+
expect(unformatted_result).to eq(
|
237
252
|
'2000-01-01' + (' ' * 25) + column_gutter +
|
238
253
|
'foo!' + (' ' * 12) + column_gutter +
|
239
254
|
'bar!' + (' ' * 12) + column_gutter +
|
240
255
|
indicator + 'my-br...'
|
256
|
+
)
|
241
257
|
end
|
242
258
|
|
243
259
|
it 'returns a line for a branch other than the current branch' do
|
@@ -246,67 +262,102 @@ describe Twig::Display do
|
|
246
262
|
result = @twig.branch_list_line(branch)
|
247
263
|
|
248
264
|
column_gutter = @twig.column_gutter
|
249
|
-
result.
|
265
|
+
expect(result).to eq(
|
250
266
|
'2000-01-01' + (' ' * 25) + column_gutter +
|
251
267
|
'foo!' + (' ' * 12) + column_gutter +
|
252
268
|
'bar!' + (' ' * 12) + column_gutter +
|
253
269
|
' ' + 'other...'
|
270
|
+
)
|
254
271
|
end
|
255
272
|
end
|
256
273
|
end
|
257
274
|
|
275
|
+
describe '#branches_json' do
|
276
|
+
before :each do
|
277
|
+
@commit_time = Twig::CommitTime.new(Time.now, '')
|
278
|
+
allow(@commit_time).to receive(:to_s).and_return('2000-01-01')
|
279
|
+
end
|
280
|
+
|
281
|
+
it 'returns JSON for an array of branches' do
|
282
|
+
branches = [
|
283
|
+
Twig::Branch.new('branch1'),
|
284
|
+
Twig::Branch.new('branch2')
|
285
|
+
]
|
286
|
+
branch_hashes = [
|
287
|
+
{ 'name' => 'branch1' },
|
288
|
+
{ 'name' => 'branch2' }
|
289
|
+
]
|
290
|
+
expect(@twig).to receive(:branches).and_return(branches)
|
291
|
+
expect(branches[0]).to receive(:to_hash).and_return(branch_hashes[0])
|
292
|
+
expect(branches[1]).to receive(:to_hash).and_return(branch_hashes[1])
|
293
|
+
|
294
|
+
result = @twig.branches_json
|
295
|
+
|
296
|
+
expect(result).to eq({ 'branches' => branch_hashes }.to_json)
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'returns JSON for an empty array if there are no branches' do
|
300
|
+
expect(@twig).to receive(:branches).and_return([])
|
301
|
+
result = @twig.branches_json
|
302
|
+
expect(result).to eq({ 'branches' => [] }.to_json)
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
258
306
|
describe '#format_string' do
|
259
307
|
it 'returns a plain string' do
|
260
|
-
@twig.format_string('foo', {}).
|
308
|
+
expect(@twig.format_string('foo', {})).to eq('foo')
|
261
309
|
end
|
262
310
|
|
263
311
|
it 'returns a string with a color code' do
|
264
|
-
@twig.format_string('foo', :color => :red).
|
265
|
-
|
312
|
+
expect(@twig.format_string('foo', :color => :red)).to eq(
|
313
|
+
"\e[#{Twig::Display::COLORS[:red]}mfoo\e[0m"
|
314
|
+
)
|
266
315
|
end
|
267
316
|
|
268
317
|
it 'returns a string with a weight code' do
|
269
|
-
@twig.format_string('foo', :weight => :bold).
|
270
|
-
|
318
|
+
expect(@twig.format_string('foo', :weight => :bold)).to eq(
|
319
|
+
"\e[#{Twig::Display::WEIGHTS[:bold]}mfoo\e[0m"
|
320
|
+
)
|
271
321
|
end
|
272
322
|
|
273
323
|
it 'returns a string with a color and weight code 'do
|
274
324
|
color_code = Twig::Display::COLORS[:red]
|
275
325
|
weight_code = Twig::Display::WEIGHTS[:bold]
|
276
326
|
|
277
|
-
@twig.format_string('foo', :color => :red, :weight => :bold).
|
278
|
-
|
327
|
+
expect(@twig.format_string('foo', :color => :red, :weight => :bold)).to eq(
|
328
|
+
"\e[#{color_code};#{weight_code}mfoo\e[0m"
|
329
|
+
)
|
279
330
|
end
|
280
331
|
end
|
281
332
|
|
282
333
|
describe '#unformat_string' do
|
283
334
|
it 'unformats a plain text string' do
|
284
335
|
string = 'foo'
|
285
|
-
@twig.unformat_string(string).
|
336
|
+
expect(@twig.unformat_string(string)).to eq(string)
|
286
337
|
end
|
287
338
|
|
288
339
|
it 'unformats a string with color' do
|
289
340
|
string = 'foo'
|
290
341
|
formatted_string = @twig.format_string(string, :color => :red)
|
291
|
-
formatted_string.size.
|
342
|
+
expect(formatted_string.size).to be > 3
|
292
343
|
|
293
|
-
@twig.unformat_string(formatted_string).
|
344
|
+
expect(@twig.unformat_string(formatted_string)).to eq(string)
|
294
345
|
end
|
295
346
|
|
296
347
|
it 'unformats a string with weight' do
|
297
348
|
string = 'foo'
|
298
349
|
formatted_string = @twig.format_string(string, :weight => :bold)
|
299
|
-
formatted_string.size.
|
350
|
+
expect(formatted_string.size).to be > 3
|
300
351
|
|
301
|
-
@twig.unformat_string(formatted_string).
|
352
|
+
expect(@twig.unformat_string(formatted_string)).to eq(string)
|
302
353
|
end
|
303
354
|
|
304
355
|
it 'unformats a string with color and weight' do
|
305
356
|
string = 'foo'
|
306
357
|
formatted_string = @twig.format_string(string, :color => :red, :weight => :bold)
|
307
|
-
formatted_string.size.
|
358
|
+
expect(formatted_string.size).to be > 3
|
308
359
|
|
309
|
-
@twig.unformat_string(formatted_string).
|
360
|
+
expect(@twig.unformat_string(formatted_string)).to eq(string)
|
310
361
|
end
|
311
362
|
end
|
312
363
|
end
|
data/spec/twig/github_spec.rb
CHANGED
@@ -15,67 +15,72 @@ describe Twig::GithubRepo do
|
|
15
15
|
|
16
16
|
describe '#initialize' do
|
17
17
|
it 'runs the given block' do
|
18
|
-
|
19
|
-
Twig
|
20
|
-
Twig::GithubRepo.
|
21
|
-
Twig::GithubRepo.
|
18
|
+
origin_url = @github_ssh_read_write_url
|
19
|
+
allow(Twig).to receive(:repo?) { true }
|
20
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
21
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { 'username' }
|
22
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { 'repository' }
|
22
23
|
|
23
24
|
block_has_run = false
|
24
25
|
Twig::GithubRepo.new do |gh_repo|
|
25
26
|
block_has_run = true
|
26
27
|
end
|
27
28
|
|
28
|
-
block_has_run.
|
29
|
+
expect(block_has_run).to be_true
|
29
30
|
end
|
30
31
|
|
31
32
|
it 'aborts if this is not a Git repo' do
|
32
|
-
|
33
|
-
Twig
|
34
|
-
Twig::GithubRepo.
|
35
|
-
Twig::GithubRepo.
|
36
|
-
Twig::GithubRepo.
|
37
|
-
|
33
|
+
origin_url = @github_ssh_read_write_url
|
34
|
+
allow(Twig).to receive(:repo?) { false }
|
35
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
36
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { 'username' }
|
37
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { 'repository' }
|
38
|
+
expect_any_instance_of(Twig::GithubRepo).to receive(:abort) do |message|
|
39
|
+
expect(message).to include('not a git repository')
|
38
40
|
end
|
39
41
|
|
40
42
|
Twig::GithubRepo.new { |gh_repo| } # Do nothing
|
41
43
|
end
|
42
44
|
|
43
45
|
it 'aborts if the repo origin URL is empty' do
|
44
|
-
Twig.
|
45
|
-
Twig::GithubRepo.
|
46
|
-
Twig::GithubRepo.
|
47
|
-
Twig::GithubRepo.
|
48
|
-
Twig::GithubRepo.
|
46
|
+
allow(Twig).to receive(:repo?) { true }
|
47
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { '' }
|
48
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { 'username' }
|
49
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { 'repository' }
|
50
|
+
expect_any_instance_of(Twig::GithubRepo).to receive(:abort_for_non_github_repo)
|
49
51
|
|
50
52
|
Twig::GithubRepo.new { |gh_repo| } # Do nothing
|
51
53
|
end
|
52
54
|
|
53
55
|
it 'aborts if the repo username is empty' do
|
54
|
-
|
55
|
-
Twig
|
56
|
-
Twig::GithubRepo.
|
57
|
-
Twig::GithubRepo.
|
58
|
-
Twig::GithubRepo.
|
56
|
+
origin_url = @github_ssh_read_write_url
|
57
|
+
allow(Twig).to receive(:repo?) { true }
|
58
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
59
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { '' }
|
60
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { 'repository' }
|
61
|
+
expect_any_instance_of(Twig::GithubRepo).to receive(:abort_for_non_github_repo)
|
59
62
|
|
60
63
|
Twig::GithubRepo.new { |gh_repo| } # Do nothing
|
61
64
|
end
|
62
65
|
|
63
66
|
it 'aborts if the repo name is empty' do
|
64
|
-
|
65
|
-
Twig
|
66
|
-
Twig::GithubRepo.
|
67
|
-
Twig::GithubRepo.
|
68
|
-
Twig::GithubRepo.
|
67
|
+
origin_url = @github_ssh_read_write_url
|
68
|
+
allow(Twig).to receive(:repo?) { true }
|
69
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
70
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { 'username' }
|
71
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { '' }
|
72
|
+
expect_any_instance_of(Twig::GithubRepo).to receive(:abort_for_non_github_repo)
|
69
73
|
|
70
74
|
Twig::GithubRepo.new { |gh_repo| } # Do nothing
|
71
75
|
end
|
72
76
|
|
73
77
|
it 'aborts if the repo is not hosted by GitHub' do
|
74
|
-
|
75
|
-
Twig
|
76
|
-
Twig::GithubRepo.
|
77
|
-
Twig::GithubRepo.
|
78
|
-
Twig::GithubRepo.
|
78
|
+
origin_url = @generic_ssh_read_write_url
|
79
|
+
allow(Twig).to receive(:repo?) { true }
|
80
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
81
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { 'username' }
|
82
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { 'repository' }
|
83
|
+
expect_any_instance_of(Twig::GithubRepo).to receive(:abort_for_non_github_repo)
|
79
84
|
|
80
85
|
Twig::GithubRepo.new { |gh_repo| } # Do nothing
|
81
86
|
end
|
@@ -83,14 +88,14 @@ describe Twig::GithubRepo do
|
|
83
88
|
|
84
89
|
describe '#origin_url' do
|
85
90
|
before :each do
|
86
|
-
Twig.
|
87
|
-
Twig::GithubRepo.
|
88
|
-
Twig::GithubRepo.
|
91
|
+
allow(Twig).to receive(:repo?) { true }
|
92
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { 'username' }
|
93
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { 'repository' }
|
89
94
|
end
|
90
95
|
|
91
96
|
it 'gets the origin URL from the repo config' do
|
92
97
|
origin_url = @github_ssh_read_write_url
|
93
|
-
Twig.
|
98
|
+
expect(Twig).to receive(:run).
|
94
99
|
with('git config remote.origin.url').once { origin_url }
|
95
100
|
|
96
101
|
Twig::GithubRepo.new do |gh_repo|
|
@@ -101,36 +106,37 @@ describe Twig::GithubRepo do
|
|
101
106
|
|
102
107
|
describe '#origin_url_parts' do
|
103
108
|
before :each do
|
104
|
-
Twig.
|
105
|
-
Twig::GithubRepo.
|
106
|
-
Twig::GithubRepo.
|
109
|
+
allow(Twig).to receive(:repo?) { true }
|
110
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { 'username' }
|
111
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { 'repository' }
|
107
112
|
end
|
108
113
|
|
109
114
|
it 'splits the origin URL into useful parts' do
|
110
115
|
origin_url = @github_ssh_read_write_url
|
111
|
-
Twig::GithubRepo.
|
116
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
112
117
|
|
113
118
|
origin_url_parts = nil
|
114
119
|
Twig::GithubRepo.new do |gh_repo|
|
115
120
|
origin_url_parts = gh_repo.origin_url_parts
|
116
121
|
end
|
117
122
|
|
118
|
-
origin_url_parts.
|
123
|
+
expect(origin_url_parts).to eq(%w[
|
119
124
|
git@github.com
|
120
125
|
rondevera
|
121
126
|
twig.git
|
122
|
-
]
|
127
|
+
])
|
123
128
|
end
|
124
129
|
end
|
125
130
|
|
126
131
|
describe '#github_repo?' do
|
127
132
|
before :each do
|
128
|
-
Twig.
|
133
|
+
allow(Twig).to receive(:repo?) { true }
|
129
134
|
end
|
130
135
|
|
131
136
|
context 'with a GitHub HTTPS URL' do
|
132
137
|
before :each do
|
133
|
-
|
138
|
+
origin_url = @github_https_url
|
139
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
134
140
|
end
|
135
141
|
|
136
142
|
it 'returns true' do
|
@@ -139,13 +145,14 @@ describe Twig::GithubRepo do
|
|
139
145
|
is_github_repo = gh_repo.github_repo?
|
140
146
|
end
|
141
147
|
|
142
|
-
is_github_repo.
|
148
|
+
expect(is_github_repo).to be_true
|
143
149
|
end
|
144
150
|
end
|
145
151
|
|
146
152
|
context 'with a GitHub Git read-only URL' do
|
147
153
|
before :each do
|
148
|
-
|
154
|
+
origin_url = @github_git_read_only_url
|
155
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
149
156
|
end
|
150
157
|
|
151
158
|
it 'returns true' do
|
@@ -154,13 +161,14 @@ describe Twig::GithubRepo do
|
|
154
161
|
is_github_repo = gh_repo.github_repo?
|
155
162
|
end
|
156
163
|
|
157
|
-
is_github_repo.
|
164
|
+
expect(is_github_repo).to be_true
|
158
165
|
end
|
159
166
|
end
|
160
167
|
|
161
168
|
context 'with a GitHub SSH read/write URL' do
|
162
169
|
before :each do
|
163
|
-
|
170
|
+
origin_url = @github_ssh_read_write_url
|
171
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
164
172
|
end
|
165
173
|
|
166
174
|
it 'returns true' do
|
@@ -169,14 +177,15 @@ describe Twig::GithubRepo do
|
|
169
177
|
is_github_repo = gh_repo.github_repo?
|
170
178
|
end
|
171
179
|
|
172
|
-
is_github_repo.
|
180
|
+
expect(is_github_repo).to be_true
|
173
181
|
end
|
174
182
|
end
|
175
183
|
|
176
184
|
context 'with a generic HTTPS URL' do
|
177
185
|
before :each do
|
178
|
-
|
179
|
-
Twig::GithubRepo.
|
186
|
+
origin_url = @generic_https_url
|
187
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
188
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:abort_for_non_github_repo)
|
180
189
|
end
|
181
190
|
|
182
191
|
it 'returns false' do
|
@@ -185,14 +194,15 @@ describe Twig::GithubRepo do
|
|
185
194
|
is_github_repo = gh_repo.github_repo?
|
186
195
|
end
|
187
196
|
|
188
|
-
is_github_repo.
|
197
|
+
expect(is_github_repo).to be_false
|
189
198
|
end
|
190
199
|
end
|
191
200
|
|
192
201
|
context 'with a generic Git read-only URL' do
|
193
202
|
before :each do
|
194
|
-
|
195
|
-
Twig::GithubRepo.
|
203
|
+
origin_url = @generic_git_read_only_url
|
204
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
205
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:abort_for_non_github_repo)
|
196
206
|
end
|
197
207
|
|
198
208
|
it 'returns false' do
|
@@ -201,14 +211,15 @@ describe Twig::GithubRepo do
|
|
201
211
|
is_github_repo = gh_repo.github_repo?
|
202
212
|
end
|
203
213
|
|
204
|
-
is_github_repo.
|
214
|
+
expect(is_github_repo).to be_false
|
205
215
|
end
|
206
216
|
end
|
207
217
|
|
208
218
|
context 'with a generic SSH read/write URL' do
|
209
219
|
before :each do
|
210
|
-
|
211
|
-
Twig::GithubRepo.
|
220
|
+
origin_url = @generic_ssh_read_write_url
|
221
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
222
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:abort_for_non_github_repo)
|
212
223
|
end
|
213
224
|
|
214
225
|
it 'returns false' do
|
@@ -217,82 +228,88 @@ describe Twig::GithubRepo do
|
|
217
228
|
is_github_repo = gh_repo.github_repo?
|
218
229
|
end
|
219
230
|
|
220
|
-
is_github_repo.
|
231
|
+
expect(is_github_repo).to be_false
|
221
232
|
end
|
222
233
|
end
|
223
234
|
end
|
224
235
|
|
225
236
|
describe '#username' do
|
226
237
|
before :each do
|
227
|
-
Twig.
|
228
|
-
Twig::GithubRepo.
|
238
|
+
allow(Twig).to receive(:repo?) { true }
|
239
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:repository) { 'repository' }
|
229
240
|
end
|
230
241
|
|
231
242
|
it 'gets the username for a HTTPS repo' do
|
232
|
-
|
243
|
+
origin_url = @github_ssh_read_write_url
|
244
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
233
245
|
username = nil
|
234
246
|
Twig::GithubRepo.new do |gh_repo|
|
235
247
|
username = gh_repo.username
|
236
248
|
end
|
237
249
|
|
238
|
-
username.
|
250
|
+
expect(username).to eq('rondevera')
|
239
251
|
end
|
240
252
|
|
241
253
|
it 'gets the username for a Git read-only repo' do
|
242
|
-
|
254
|
+
origin_url = @github_git_read_only_url
|
255
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
243
256
|
username = nil
|
244
257
|
Twig::GithubRepo.new do |gh_repo|
|
245
258
|
username = gh_repo.username
|
246
259
|
end
|
247
260
|
|
248
|
-
username.
|
261
|
+
expect(username).to eq('rondevera')
|
249
262
|
end
|
250
263
|
|
251
264
|
it 'gets the username for a SSH read/write repo' do
|
252
|
-
|
265
|
+
origin_url = @github_ssh_read_write_url
|
266
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
253
267
|
username = nil
|
254
268
|
Twig::GithubRepo.new do |gh_repo|
|
255
269
|
username = gh_repo.username
|
256
270
|
end
|
257
271
|
|
258
|
-
username.
|
272
|
+
expect(username).to eq('rondevera')
|
259
273
|
end
|
260
274
|
end
|
261
275
|
|
262
276
|
describe '#repository' do
|
263
277
|
before :each do
|
264
|
-
Twig.
|
265
|
-
Twig::GithubRepo.
|
278
|
+
allow(Twig).to receive(:repo?) { true }
|
279
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:username) { 'repository' }
|
266
280
|
end
|
267
281
|
|
268
282
|
it 'gets the repo name for a HTTPS repo' do
|
269
|
-
|
283
|
+
origin_url = @github_https_url
|
284
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
270
285
|
repository = nil
|
271
286
|
Twig::GithubRepo.new do |gh_repo|
|
272
287
|
repository = gh_repo.repository
|
273
288
|
end
|
274
289
|
|
275
|
-
repository.
|
290
|
+
expect(repository).to eq('twig')
|
276
291
|
end
|
277
292
|
|
278
293
|
it 'gets the repo name for a Git read-only repo' do
|
279
|
-
|
294
|
+
origin_url = @github_git_read_only_url
|
295
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
280
296
|
repository = nil
|
281
297
|
Twig::GithubRepo.new do |gh_repo|
|
282
298
|
repository = gh_repo.repository
|
283
299
|
end
|
284
300
|
|
285
|
-
repository.
|
301
|
+
expect(repository).to eq('twig')
|
286
302
|
end
|
287
303
|
|
288
304
|
it 'gets the repo name for a SSH read/write repo' do
|
289
|
-
|
305
|
+
origin_url = @github_ssh_read_write_url
|
306
|
+
allow_any_instance_of(Twig::GithubRepo).to receive(:origin_url) { origin_url }
|
290
307
|
repository = nil
|
291
308
|
Twig::GithubRepo.new do |gh_repo|
|
292
309
|
repository = gh_repo.repository
|
293
310
|
end
|
294
311
|
|
295
|
-
repository.
|
312
|
+
expect(repository).to eq('twig')
|
296
313
|
end
|
297
314
|
end
|
298
315
|
|