twig 1.5 → 1.6
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.
- 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
|