twig 1.5 → 1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.travis.yml +2 -0
- data/CONTRIBUTING.md +5 -3
- data/HISTORY.md +23 -0
- data/LICENSE.md +1 -1
- data/README.md +98 -12
- data/bin/twig +1 -0
- data/bin/twig-checkout-child +50 -0
- data/bin/twig-checkout-parent +35 -0
- data/bin/twig-create-branch +24 -0
- data/bin/twig-diff +15 -12
- data/bin/twig-gh-open +14 -5
- data/bin/twig-gh-open-issue +19 -12
- data/bin/twig-gh-update +14 -4
- data/bin/twig-init +15 -0
- data/bin/twig-init-completion +14 -2
- data/bin/twig-init-completion-bash +11 -3
- data/bin/twig-rebase +15 -12
- data/lib/twig.rb +40 -20
- data/lib/twig/branch.rb +34 -13
- data/lib/twig/cli.rb +52 -9
- data/lib/twig/commit_time.rb +1 -1
- data/lib/twig/display.rb +6 -8
- data/lib/twig/options.rb +25 -24
- data/lib/twig/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/twig/branch_spec.rb +85 -6
- data/spec/twig/cli_spec.rb +90 -35
- data/spec/twig/commit_time_spec.rb +4 -0
- data/spec/twig/display_spec.rb +57 -7
- data/spec/twig/options_spec.rb +33 -16
- data/spec/twig_spec.rb +53 -50
- data/twig.gemspec +17 -10
- metadata +32 -48
@@ -12,8 +12,12 @@ describe Twig::CommitTime do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'stores a "time ago" string as its shortened version' do
|
15
|
+
expect(Twig::CommitTime.new(@time, '1 year, 1 month ago').
|
16
|
+
instance_variable_get(:@time_ago)).to eq('1y ago')
|
15
17
|
expect(Twig::CommitTime.new(@time, '2 years, 2 months ago').
|
16
18
|
instance_variable_get(:@time_ago)).to eq('2y ago')
|
19
|
+
expect(Twig::CommitTime.new(@time, '1 year ago').
|
20
|
+
instance_variable_get(:@time_ago)).to eq('1y ago')
|
17
21
|
expect(Twig::CommitTime.new(@time, '2 years ago').
|
18
22
|
instance_variable_get(:@time_ago)).to eq('2y ago')
|
19
23
|
expect(Twig::CommitTime.new(@time, '2 months ago').
|
data/spec/twig/display_spec.rb
CHANGED
@@ -103,6 +103,28 @@ describe Twig::Display do
|
|
103
103
|
)
|
104
104
|
end
|
105
105
|
|
106
|
+
it 'only includes certain property names' do
|
107
|
+
@twig.set_option(:property_only_name, /foo/)
|
108
|
+
|
109
|
+
result = @twig.branch_list_headers({})
|
110
|
+
result_lines = result.split("\n")
|
111
|
+
|
112
|
+
expect(result_lines[0]).to include('foo')
|
113
|
+
expect(result_lines[0]).not_to include('quux')
|
114
|
+
expect(result_lines[0]).to include('branch')
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'excludes certain property names' do
|
118
|
+
@twig.set_option(:property_except_name, /foo/)
|
119
|
+
|
120
|
+
result = @twig.branch_list_headers({})
|
121
|
+
result_lines = result.split("\n")
|
122
|
+
|
123
|
+
expect(result_lines[0]).not_to include('foo')
|
124
|
+
expect(result_lines[0]).to include('quux')
|
125
|
+
expect(result_lines[0]).to include('branch')
|
126
|
+
end
|
127
|
+
|
106
128
|
it 'sets a header width' do
|
107
129
|
@twig.set_option(:property_width, :foo => 4)
|
108
130
|
|
@@ -127,7 +149,7 @@ describe Twig::Display do
|
|
127
149
|
end
|
128
150
|
|
129
151
|
it 'sets a header color' do
|
130
|
-
result = @twig.branch_list_headers(
|
152
|
+
result = @twig.branch_list_headers(:header_color => :green)
|
131
153
|
header_line = result.split("\n").first
|
132
154
|
color = Twig::Display::COLORS[:green]
|
133
155
|
expect(header_line.gsub(/\s/, '')).to eq(
|
@@ -138,7 +160,7 @@ describe Twig::Display do
|
|
138
160
|
end
|
139
161
|
|
140
162
|
it 'sets a header weight' do
|
141
|
-
result = @twig.branch_list_headers(
|
163
|
+
result = @twig.branch_list_headers(:header_weight => :bold)
|
142
164
|
header_line = result.split("\n").first
|
143
165
|
weight = Twig::Display::WEIGHTS[:bold]
|
144
166
|
expect(header_line.gsub(/\s/, '')).to eq(
|
@@ -149,7 +171,7 @@ describe Twig::Display do
|
|
149
171
|
end
|
150
172
|
|
151
173
|
it 'sets a header color and weight' do
|
152
|
-
result = @twig.branch_list_headers(
|
174
|
+
result = @twig.branch_list_headers(:header_color => :red, :header_weight => :bold)
|
153
175
|
header_line = result.split("\n").first
|
154
176
|
color, weight = Twig::Display::COLORS[:red], Twig::Display::WEIGHTS[:bold]
|
155
177
|
expect(header_line.gsub(/\s/, '')).to eq(
|
@@ -219,6 +241,30 @@ describe Twig::Display do
|
|
219
241
|
expect(result).to include('line breaks')
|
220
242
|
end
|
221
243
|
|
244
|
+
it 'only includes certain property names' do
|
245
|
+
@twig.set_option(:property_only_name, /foo/)
|
246
|
+
branch = @current_branch
|
247
|
+
expect(branch).to receive(:get_properties).
|
248
|
+
with(['foo']).
|
249
|
+
and_return('foo' => 'foo!')
|
250
|
+
|
251
|
+
result = @twig.branch_list_line(branch)
|
252
|
+
|
253
|
+
expect(result).to include('foo!')
|
254
|
+
end
|
255
|
+
|
256
|
+
it 'excludes certain property names' do
|
257
|
+
@twig.set_option(:property_except_name, /foo/)
|
258
|
+
branch = @current_branch
|
259
|
+
expect(branch).to receive(:get_properties).
|
260
|
+
with(['bar']).
|
261
|
+
and_return('bar' => 'bar!')
|
262
|
+
|
263
|
+
result = @twig.branch_list_line(branch)
|
264
|
+
|
265
|
+
expect(result).to include('bar!')
|
266
|
+
end
|
267
|
+
|
222
268
|
it 'returns a line with custom column widths' do
|
223
269
|
branch = @other_branch
|
224
270
|
@twig.set_option(:property_width, :foo => 5)
|
@@ -274,8 +320,8 @@ describe Twig::Display do
|
|
274
320
|
|
275
321
|
describe '#branches_json' do
|
276
322
|
before :each do
|
277
|
-
@
|
278
|
-
allow(@
|
323
|
+
@property_names = %w[foo bar]
|
324
|
+
allow(@twig).to receive(:property_names).and_return(@property_names)
|
279
325
|
end
|
280
326
|
|
281
327
|
it 'returns JSON for an array of branches' do
|
@@ -288,8 +334,12 @@ describe Twig::Display do
|
|
288
334
|
{ 'name' => 'branch2' }
|
289
335
|
]
|
290
336
|
expect(@twig).to receive(:branches).and_return(branches)
|
291
|
-
expect(branches[0]).to receive(:to_hash).
|
292
|
-
|
337
|
+
expect(branches[0]).to receive(:to_hash).
|
338
|
+
with(@property_names).
|
339
|
+
and_return(branch_hashes[0])
|
340
|
+
expect(branches[1]).to receive(:to_hash).
|
341
|
+
with(@property_names).
|
342
|
+
and_return(branch_hashes[1])
|
293
343
|
|
294
344
|
result = @twig.branches_json
|
295
345
|
|
data/spec/twig/options_spec.rb
CHANGED
@@ -213,7 +213,7 @@ describe Twig::Options do
|
|
213
213
|
|
214
214
|
it 'reads and sets a single option' do
|
215
215
|
path = Twig::CONFIG_PATH
|
216
|
-
allow(
|
216
|
+
allow(Twig::Branch).to receive(:all_branch_names) { ['test'] }
|
217
217
|
expect(@twig).to receive(:readable_config_file_path).and_return(path)
|
218
218
|
expect(@twig).to receive(:parse_config_file).with(path).and_return(
|
219
219
|
'branch' => 'test'
|
@@ -227,7 +227,7 @@ describe Twig::Options do
|
|
227
227
|
|
228
228
|
it 'reads and sets multiple options' do
|
229
229
|
path = Twig::CONFIG_PATH
|
230
|
-
allow(
|
230
|
+
allow(Twig::Branch).to receive(:all_branch_names) { ['test'] }
|
231
231
|
expect(@twig).to receive(:readable_config_file_path).and_return(path)
|
232
232
|
expect(@twig).to receive(:parse_config_file).with(path).and_return(
|
233
233
|
# Filtering branches:
|
@@ -239,10 +239,12 @@ describe Twig::Options do
|
|
239
239
|
'only-foo' => 'test-only-foo',
|
240
240
|
|
241
241
|
# Displaying branches:
|
242
|
-
'format'
|
243
|
-
'
|
244
|
-
'
|
245
|
-
'
|
242
|
+
'format' => 'json',
|
243
|
+
'except-property' => 'foo',
|
244
|
+
'only-property' => 'bar',
|
245
|
+
'header-style' => 'green bold',
|
246
|
+
'reverse' => 'true',
|
247
|
+
'foo-width' => '4',
|
246
248
|
|
247
249
|
# GitHub integration:
|
248
250
|
'github-api-uri-prefix' => 'https://github-enterprise.example.com/api/v3',
|
@@ -263,6 +265,8 @@ describe Twig::Options do
|
|
263
265
|
expect(@twig.options[:max_days_old]).to be_nil
|
264
266
|
expect(@twig.options[:property_except]).to be_nil
|
265
267
|
expect(@twig.options[:property_only]).to be_nil
|
268
|
+
expect(@twig.options[:property_except_name]).to be_nil
|
269
|
+
expect(@twig.options[:property_only_name]).to be_nil
|
266
270
|
expect(@twig.options[:property_width]).to be_nil
|
267
271
|
expect(@twig.options[:reverse]).to be_nil
|
268
272
|
|
@@ -287,6 +291,8 @@ describe Twig::Options do
|
|
287
291
|
:branch => /test-only-branch/,
|
288
292
|
:foo => /test-only-foo/
|
289
293
|
)
|
294
|
+
expect(@twig.options[:property_except_name]).to eq(/foo/)
|
295
|
+
expect(@twig.options[:property_only_name]).to eq(/bar/)
|
290
296
|
expect(@twig.options[:property_width]).to eq(:foo => 4)
|
291
297
|
expect(@twig.options[:reverse]).to be_true
|
292
298
|
end
|
@@ -300,7 +306,7 @@ describe Twig::Options do
|
|
300
306
|
|
301
307
|
it 'succeeds' do
|
302
308
|
branch_name = 'foo'
|
303
|
-
expect(
|
309
|
+
expect(Twig::Branch).to receive(:all_branch_names).and_return(%[foo bar])
|
304
310
|
|
305
311
|
@twig.set_option(:branch, branch_name)
|
306
312
|
|
@@ -309,7 +315,7 @@ describe Twig::Options do
|
|
309
315
|
|
310
316
|
it 'fails if the branch is unknown' do
|
311
317
|
branch_name = 'foo'
|
312
|
-
expect(
|
318
|
+
expect(Twig::Branch).to receive(:all_branch_names).and_return([])
|
313
319
|
expect(@twig).to receive(:abort) do |message|
|
314
320
|
expect(message).to include(%{branch `#{branch_name}` could not be found})
|
315
321
|
end
|
@@ -390,6 +396,18 @@ describe Twig::Options do
|
|
390
396
|
expect(@twig.options[:property_only]).to eq(:branch => /important_prefix_/)
|
391
397
|
end
|
392
398
|
|
399
|
+
it 'sets a :property_except_name option' do
|
400
|
+
expect(@twig.options[:property_except_name]).to be_nil
|
401
|
+
@twig.set_option(:property_except_name, /foo/)
|
402
|
+
expect(@twig.options[:property_except_name]).to eq(/foo/)
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'sets a :property_only_name option' do
|
406
|
+
expect(@twig.options[:property_only_name]).to be_nil
|
407
|
+
@twig.set_option(:property_only_name, /foo/)
|
408
|
+
expect(@twig.options[:property_only_name]).to eq(/foo/)
|
409
|
+
end
|
410
|
+
|
393
411
|
it 'sets a :property_width option' do
|
394
412
|
width = 10
|
395
413
|
expect(@twig).to receive(:set_property_width_option).with(width)
|
@@ -430,7 +448,6 @@ describe Twig::Options do
|
|
430
448
|
|
431
449
|
describe '#set_header_style_option' do
|
432
450
|
before :each do
|
433
|
-
# Preconditions:
|
434
451
|
expect(@twig.options[:header_color]).to eq(Twig::DEFAULT_HEADER_COLOR)
|
435
452
|
expect(@twig.options[:header_weight]).to be_nil
|
436
453
|
end
|
@@ -519,7 +536,7 @@ describe Twig::Options do
|
|
519
536
|
end
|
520
537
|
|
521
538
|
it 'succeeds' do
|
522
|
-
@twig.
|
539
|
+
@twig.set_property_width_option(:foo => '20', :bar => '40')
|
523
540
|
expect(@twig.options[:property_width]).to eq(:foo => 20, :bar => 40)
|
524
541
|
end
|
525
542
|
|
@@ -531,11 +548,11 @@ describe Twig::Options do
|
|
531
548
|
end
|
532
549
|
|
533
550
|
begin
|
534
|
-
@twig.
|
551
|
+
@twig.set_property_width_option(:branch => width)
|
535
552
|
rescue SystemExit => exception
|
536
553
|
end
|
537
554
|
|
538
|
-
expect(@twig.options[:property_width]).to
|
555
|
+
expect(@twig.options[:property_width]).to eq({})
|
539
556
|
end
|
540
557
|
|
541
558
|
it 'fails if width is below minimum value' do
|
@@ -548,11 +565,11 @@ describe Twig::Options do
|
|
548
565
|
end
|
549
566
|
|
550
567
|
begin
|
551
|
-
@twig.
|
568
|
+
@twig.set_property_width_option(:x => width)
|
552
569
|
rescue SystemExit => exception
|
553
570
|
end
|
554
571
|
|
555
|
-
expect(@twig.options[:property_width]).to
|
572
|
+
expect(@twig.options[:property_width]).to eq({})
|
556
573
|
end
|
557
574
|
|
558
575
|
it 'fails if width is below width of property name' do
|
@@ -565,11 +582,11 @@ describe Twig::Options do
|
|
565
582
|
end
|
566
583
|
|
567
584
|
begin
|
568
|
-
@twig.
|
585
|
+
@twig.set_property_width_option(property_name => width)
|
569
586
|
rescue SystemExit => exception
|
570
587
|
end
|
571
588
|
|
572
|
-
expect(@twig.options[:property_width]).to
|
589
|
+
expect(@twig.options[:property_width]).to eq({})
|
573
590
|
end
|
574
591
|
end
|
575
592
|
|
data/spec/twig_spec.rb
CHANGED
@@ -32,6 +32,22 @@ describe Twig do
|
|
32
32
|
:header_color => Twig::DEFAULT_HEADER_COLOR
|
33
33
|
)
|
34
34
|
end
|
35
|
+
|
36
|
+
it 'reads config files and command-line options when `:read_options` is true' do
|
37
|
+
expect_any_instance_of(Twig).to receive(:read_config_file!)
|
38
|
+
expect_any_instance_of(Twig).to receive(:read_cli_options!)
|
39
|
+
|
40
|
+
Twig.new(:read_options => true)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'does not read config files or command-line options when `:read_options` is falsy' do
|
44
|
+
expect_any_instance_of(Twig).not_to receive(:read_config_file!)
|
45
|
+
expect_any_instance_of(Twig).not_to receive(:read_cli_options!)
|
46
|
+
|
47
|
+
Twig.new(:read_options => false)
|
48
|
+
Twig.new(:read_options => nil)
|
49
|
+
Twig.new
|
50
|
+
end
|
35
51
|
end
|
36
52
|
|
37
53
|
describe '#current_branch_name' do
|
@@ -47,52 +63,23 @@ describe Twig do
|
|
47
63
|
end
|
48
64
|
end
|
49
65
|
|
50
|
-
describe '#
|
66
|
+
describe '#target_branch_name' do
|
51
67
|
before :each do
|
52
|
-
@
|
53
|
-
|
54
|
-
|
55
|
-
fix_nothing
|
56
|
-
]
|
57
|
-
@commit_time_strings = ['2001-01-01', '2002-02-02', '2003-03-03' ]
|
58
|
-
@commit_time_agos = ['111 days ago', '2 months ago', '3 years, 3 months ago']
|
59
|
-
@command =
|
60
|
-
%{git for-each-ref #{Twig::REF_PREFIX} --format="#{Twig::REF_FORMAT}"}
|
61
|
-
|
62
|
-
@branch_tuples = (0..2).map do |i|
|
63
|
-
[
|
64
|
-
@branch_names[i],
|
65
|
-
@commit_time_strings[i],
|
66
|
-
@commit_time_agos[i]
|
67
|
-
].join(Twig::REF_FORMAT_SEPARATOR)
|
68
|
-
end.join("\n")
|
68
|
+
@current_branch_name = 'current-branch'
|
69
|
+
@twig = Twig.new
|
70
|
+
allow(@twig).to receive(:current_branch_name).and_return(@current_branch_name)
|
69
71
|
end
|
70
72
|
|
71
|
-
it 'returns
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
branches = twig.all_branches
|
73
|
+
it 'returns the branch specified in options' do
|
74
|
+
feature_branch_name = 'feature-branch'
|
75
|
+
expect(Twig::Branch).to receive(:all_branch_names).and_return([feature_branch_name])
|
76
|
+
@twig.set_option(:branch, feature_branch_name)
|
76
77
|
|
77
|
-
expect(
|
78
|
-
expect(branches[0].last_commit_time.to_s).to match(
|
79
|
-
%r{#{@commit_time_strings[0]} .* \(111d ago\)}
|
80
|
-
)
|
81
|
-
expect(branches[1].name).to eq(@branch_names[1])
|
82
|
-
expect(branches[1].last_commit_time.to_s).to match(
|
83
|
-
%r{#{@commit_time_strings[1]} .* \(2mo ago\)}
|
84
|
-
)
|
85
|
-
expect(branches[2].name).to eq(@branch_names[2])
|
86
|
-
expect(branches[2].last_commit_time.to_s).to match(
|
87
|
-
%r{#{@commit_time_strings[2]} .* \(3y ago\)}
|
88
|
-
)
|
78
|
+
expect(@twig.target_branch_name).to eq(feature_branch_name)
|
89
79
|
end
|
90
80
|
|
91
|
-
it '
|
92
|
-
expect(
|
93
|
-
twig = Twig.new
|
94
|
-
|
95
|
-
2.times { twig.all_branches }
|
81
|
+
it 'returns the current branch by default' do
|
82
|
+
expect(@twig.target_branch_name).to eq(@current_branch_name)
|
96
83
|
end
|
97
84
|
end
|
98
85
|
|
@@ -117,7 +104,7 @@ describe Twig do
|
|
117
104
|
Twig::Branch.new(branch_names[2], :last_commit_time => commit_times[2]),
|
118
105
|
Twig::Branch.new(branch_names[3], :last_commit_time => commit_times[3])
|
119
106
|
]
|
120
|
-
allow(
|
107
|
+
allow(Twig::Branch).to receive(:all_branches) { @branches }
|
121
108
|
end
|
122
109
|
|
123
110
|
it 'returns all branches' do
|
@@ -193,14 +180,30 @@ describe Twig do
|
|
193
180
|
end
|
194
181
|
end
|
195
182
|
|
196
|
-
describe '#
|
197
|
-
|
198
|
-
twig = Twig.new
|
199
|
-
|
200
|
-
|
201
|
-
|
183
|
+
describe '#property_names' do
|
184
|
+
before :each do
|
185
|
+
@twig = Twig.new
|
186
|
+
property_names = %w[foo bar baz]
|
187
|
+
expect(Twig::Branch).to receive(:all_property_names).and_return(property_names)
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'returns an array of all property names' do
|
191
|
+
property_names = @twig.property_names
|
192
|
+
expect(property_names).to eq(%w[foo bar baz])
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'returns an array with only certain property names' do
|
196
|
+
@twig.set_option(:property_only_name, /ba/)
|
197
|
+
property_names = @twig.property_names
|
198
|
+
|
199
|
+
expect(property_names).to eq(%w[bar baz])
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'returns an array without certain property names' do
|
203
|
+
@twig.set_option(:property_except_name, /ba/)
|
204
|
+
property_names = @twig.property_names
|
202
205
|
|
203
|
-
expect(
|
206
|
+
expect(property_names).to eq(%w[foo])
|
204
207
|
end
|
205
208
|
end
|
206
209
|
|
@@ -240,7 +243,7 @@ describe Twig do
|
|
240
243
|
end
|
241
244
|
|
242
245
|
it 'returns a message if all branches were filtered out by options' do
|
243
|
-
allow(
|
246
|
+
allow(Twig::Branch).to receive(:all_branches) { %w[foo bar] }
|
244
247
|
allow(@twig).to receive(:branches) { [] }
|
245
248
|
|
246
249
|
expect(@twig.list_branches).to include(
|
@@ -249,7 +252,7 @@ describe Twig do
|
|
249
252
|
end
|
250
253
|
|
251
254
|
it 'returns a message if the repo has no branches' do
|
252
|
-
allow(
|
255
|
+
allow(Twig::Branch).to receive(:all_branches) { [] }
|
253
256
|
allow(@twig).to receive(:branches) { [] }
|
254
257
|
|
255
258
|
expect(@twig.list_branches).to include('This repository has no branches')
|
data/twig.gemspec
CHANGED
@@ -14,18 +14,24 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.summary = %{Your personal Git branch assistant.}
|
15
15
|
spec.description = %w[
|
16
16
|
Twig is your personal Git branch assistant. It's a command-line tool for
|
17
|
-
listing your most recent branches, and for remembering
|
18
|
-
|
19
|
-
|
20
|
-
workflow, and will save you a ton
|
17
|
+
listing your most recent branches, and for remembering branch details for
|
18
|
+
you, like issue tracker ids and todos. It supports subcommands, like
|
19
|
+
automatically fetching statuses from your issue tracking system. It's
|
20
|
+
flexible enough to fit your everyday Git workflow, and will save you a ton
|
21
|
+
of time.
|
21
22
|
].join(' ')
|
22
23
|
spec.post_install_message =
|
23
24
|
"\n**************************************************************" <<
|
24
25
|
"\n* *" <<
|
25
26
|
"\n* Welcome to Twig! *" <<
|
26
27
|
"\n* *" <<
|
27
|
-
"\n*
|
28
|
-
"\n*
|
28
|
+
"\n* Quick start: *" <<
|
29
|
+
"\n* *" <<
|
30
|
+
"\n* 1. Run `twig init` to set up tab completion. *" <<
|
31
|
+
"\n* 2. Run `twig` to list your Git branches. *" <<
|
32
|
+
"\n* *" <<
|
33
|
+
"\n* For more info, run `twig --help` or visit *" <<
|
34
|
+
"\n* #{sprintf('%-59s', Twig::HOMEPAGE) }*" <<
|
29
35
|
"\n* *" <<
|
30
36
|
"\n**************************************************************" <<
|
31
37
|
"\n\n"
|
@@ -36,8 +42,9 @@ Gem::Specification.new do |spec|
|
|
36
42
|
spec.test_files = spec.files.grep(%r{^spec/})
|
37
43
|
|
38
44
|
spec.required_ruby_version = '>= 1.8.7'
|
39
|
-
spec.add_runtime_dependency 'json',
|
40
|
-
spec.add_runtime_dependency 'launchy',
|
41
|
-
spec.add_development_dependency 'rake',
|
42
|
-
spec.add_development_dependency 'rspec',
|
45
|
+
spec.add_runtime_dependency 'json', '~> 1.7.5'
|
46
|
+
spec.add_runtime_dependency 'launchy', '~> 2.3.0'
|
47
|
+
spec.add_development_dependency 'rake', '~> 0.9.2'
|
48
|
+
spec.add_development_dependency 'rspec', '~> 2.14.1'
|
49
|
+
spec.add_development_dependency 'rspec-radar', '~> 0.1.0'
|
43
50
|
end
|