linked-list 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 203cf979a2f074eaa22dd987096ecf8ec298198344ddf1f8cafafca20be8552b
4
- data.tar.gz: e8fc8a7584f411444d4685aa3c9ecc7328a2ba59f1f0e0de55a1abb2130ff63f
3
+ metadata.gz: 1d11a48bdb387744768bf129513fce5e6f31001988e8cf45bf8b974009938e98
4
+ data.tar.gz: 9ba15ea4897065b9a111e6add68d6a60dac5ab61b9e3aba0ab83c7b42e91f8b5
5
5
  SHA512:
6
- metadata.gz: 4e87238b13c8a4621ff4b30502f6d4295df7f9ad7a219144bfcdbea24c7676b859767f53b3070ac11707576f639a8f1323bd1e96903bcba76403c1a865a2d552
7
- data.tar.gz: 9419f5694a938f436084247464b016c213b8914fdbcc3a255eed8fffbe21164938f6b10f27aac2187d985995c1120b6bbc581ea6c295a8fd7da45f5acbe01655
6
+ metadata.gz: 13f2b676935b4b18a9302e9a484f888c9c4730e81cab6fb6a891e4da5cc721fd0adf07d3f62b7a490fe985d32ed6143fdd9e01f586904214824c29c1cc8ed6f6
7
+ data.tar.gz: 5f844ebe95b710614b30ebc6a0a732c361987882ea661cc30e3773432f1702c347a2cf8979f63c6b50e6011cdd348adff1f458d0a81d22cab67aaf3b15528c36
@@ -3,3 +3,5 @@ rvm:
3
3
  - 2.3.0
4
4
  - 2.5.0
5
5
  cache: bundler
6
+ env:
7
+ CI: true
@@ -1,9 +1,20 @@
1
- # 0.0.11 / 2018-04-02
1
+ # 0.0.12 / 2018-09-04
2
+
3
+ ## Added
4
+
5
+ - Added `insert`, `insert_before` and `insert_after` methods (mpospelov in [#3](https://github.com/spectator/linked-list/pull/3))
6
+ - Added `reverse_each` and `reverse_each_node` methods (mpospelov in [#4](https://github.com/spectator/linked-list/pull/4))
7
+
8
+ [Compare v0.0.11...v0.0.12](https://github.com/spectator/linked-list/compare/v0.0.11...v0.0.12)
9
+
10
+ # 0.0.11 / 2018-08-23
2
11
 
3
12
  ## Added
4
13
 
5
14
  - Added `delete` and `delete_all` methods (mpospelov in [#2](https://github.com/spectator/linked-list/pull/2))
6
15
 
16
+ [Compare v0.0.10...v0.0.11](https://github.com/spectator/linked-list/compare/v0.0.10...v0.0.11)
17
+
7
18
  # 0.0.10 / 2018-04-02
8
19
 
9
20
  ## Fixed
data/README.md CHANGED
@@ -41,20 +41,38 @@ list.unshift(object)
41
41
  list.pop
42
42
  list.shift
43
43
 
44
+ list.insert(object, before: object)
45
+ list.insert(object, before: ->(n) { n == 'foo' })
46
+
47
+ list.insert(object, after: object)
48
+ list.insert(object, after: ->(n) { n == 'foo' })
49
+
50
+ list.insert_before(object, node)
51
+ list.insert_after(object, node)
52
+
44
53
  list.reverse
45
54
  list.reverse!
46
55
 
47
56
  list.delete(object)
57
+ list.delete { |n| n == 'foo' }
58
+
48
59
  list.delete_all(object)
60
+ list.delete_all { |n| n == 'foo' }
49
61
 
50
- list.each # Enumerator object
62
+ list.each # Enumerator object
51
63
  list.each { |e| puts e }
52
64
 
53
- list.first # head of the list
54
- list.last # tail of the list
65
+ list.reverse_each # Enumerator object
66
+ list.reverse_each { |e| puts e }
67
+
68
+ list.reverse_each_node # Enumerator object
69
+ list.reverse_each_node { |node| puts node.data }
70
+
71
+ list.first # head of the list
72
+ list.last # tail of the list
55
73
 
56
74
  list.length
57
- list.size # same as `length`
75
+ list.size # same as `length`
58
76
 
59
77
  list.to_a
60
78
  ```
@@ -79,10 +97,6 @@ List([object, object]) # will return new `List` object with two `Node` objects
79
97
  Please see `LinkedList::List`, `LinkedList::Node`, and
80
98
  `LinkedList::Conversions` for details.
81
99
 
82
- ## TODO
83
-
84
- * Insert in the middle
85
-
86
100
  ## Tests
87
101
 
88
102
  Run test with
@@ -69,6 +69,65 @@ module LinkedList
69
69
  self
70
70
  end
71
71
 
72
+ # Inserts after or before first matched node.data from the the list by passed block or value.
73
+ #
74
+ # == Returns:
75
+ # Inserted node data
76
+ #
77
+ def insert(to_add, after: nil, before: nil)
78
+ if after && before || !after && !before
79
+ raise ArgumentError, 'either :after or :before keys should be passed'
80
+ end
81
+ matcher = after || before
82
+ matcher_proc = if matcher.is_a?(Proc)
83
+ __to_matcher(&matcher)
84
+ else
85
+ __to_matcher(matcher)
86
+ end
87
+ node = each_node.find(&matcher_proc)
88
+ return unless node
89
+ new_node = after ? insert_after_node(to_add, node) : insert_before_node(to_add, node)
90
+ new_node.data
91
+ end
92
+
93
+ # Inserts data after first matched node.data.
94
+ #
95
+ # == Returns:
96
+ # Inserted node
97
+ #
98
+ def insert_after_node(data, node)
99
+ Node(data).tap do |new_node|
100
+ new_node.prev = node
101
+ new_node.next = node.next
102
+ if node.next
103
+ node.next.prev = new_node
104
+ else
105
+ @tail = new_node
106
+ end
107
+ node.next = new_node
108
+ @length += 1
109
+ end
110
+ end
111
+
112
+ # Inserts data before first matched node.data.
113
+ #
114
+ # == Returns:
115
+ # Inserted node
116
+ #
117
+ def insert_before_node(data, node)
118
+ Node(data).tap do |new_node|
119
+ new_node.next = node
120
+ new_node.prev = node.prev
121
+ if node.prev
122
+ node.prev.next = new_node
123
+ else
124
+ @head = new_node
125
+ end
126
+ node.prev = new_node
127
+ @length += 1
128
+ end
129
+ end
130
+
72
131
  # Removes first matched node.data from the the list by passed block or value.
73
132
  #
74
133
  # == Returns:
@@ -76,8 +135,8 @@ module LinkedList
76
135
  #
77
136
  def delete(val = nil, &block)
78
137
  each_node.find(&__to_matcher(val, &block)).tap do |node_to_delete|
79
- return if node_to_delete.blank?
80
- __unlink(node_to_delete)
138
+ return unless node_to_delete
139
+ __unlink_node(node_to_delete)
81
140
  end.data
82
141
  end
83
142
 
@@ -88,8 +147,8 @@ module LinkedList
88
147
  #
89
148
  def delete_all(val = nil, &block)
90
149
  each_node.select(&__to_matcher(val, &block)).each do |node_to_delete|
91
- next if node_to_delete.blank?
92
- __unlink(node_to_delete)
150
+ next unless node_to_delete
151
+ __unlink_node(node_to_delete)
93
152
  end.map(&:data)
94
153
  end
95
154
 
@@ -171,6 +230,30 @@ module LinkedList
171
230
  __each { |node| yield(node) }
172
231
  end
173
232
 
233
+
234
+ # Iterates over nodes from bottom to top passing node data to the block if
235
+ # given. If no block given, returns +Enumerator+.
236
+ #
237
+ # == Returns:
238
+ # +Enumerator+ or yields data to the block stored in every node on the
239
+ # list.
240
+ #
241
+ def reverse_each
242
+ return to_enum(__callee__) unless block_given?
243
+ __reverse_each { |node| yield(node.data) }
244
+ end
245
+
246
+ # Iterates over nodes from bottom to top passing node(LinkedList::Node instance)
247
+ # to the block if given. If no block given, returns +Enumerator+.
248
+ #
249
+ # == Returns:
250
+ # +Enumerator+ or yields list nodes to the block
251
+ #
252
+ def reverse_each_node
253
+ return to_enum(__callee__) unless block_given?
254
+ __reverse_each { |node| yield(node) }
255
+ end
256
+
174
257
  # Converts list to array.
175
258
  #
176
259
  def to_a
@@ -191,19 +274,52 @@ module LinkedList
191
274
  self
192
275
  end
193
276
 
194
- private
277
+ # Inserts data after passed node.
278
+ #
279
+ # == Returns:
280
+ # Inserted node
281
+ #
282
+ def insert_after_node(data, node)
283
+ Node(data).tap do |new_node|
284
+ new_node.prev = node
285
+ new_node.next = node.next
286
+ if node.next
287
+ node.next.prev = new_node
288
+ else
289
+ @tail = new_node
290
+ end
291
+ node.next = new_node
292
+ @length += 1
293
+ end
294
+ end
195
295
 
196
- def __to_matcher(val = nil, &block)
197
- raise ArgumentError, 'either value or block should be passed' if val && block_given?
198
- block = ->(e) { e == val } unless block_given?
199
- -> (node) { block.call(node.data) }
296
+
297
+ # Inserts data before passed node.
298
+ #
299
+ # == Returns:
300
+ # Inserted node
301
+ #
302
+ def insert_before_node(data, node)
303
+ Node(data).tap do |new_node|
304
+ new_node.next = node
305
+ new_node.prev = node.prev
306
+ if node.prev
307
+ node.prev.next = new_node
308
+ else
309
+ @head = new_node
310
+ end
311
+ node.prev = new_node
312
+ @length += 1
313
+ end
200
314
  end
201
315
 
202
- def __unlink(node)
203
- if node.prev.blank?
316
+ private
317
+
318
+ def __unlink_node(node)
319
+ if node.prev.nil?
204
320
  node.next.prev = nil if node.next
205
321
  @head = node.next
206
- elsif node.next.blank?
322
+ elsif node.next.nil?
207
323
  node.prev.next = nil if node.prev
208
324
  @tail = node.prev
209
325
  else
@@ -212,6 +328,13 @@ module LinkedList
212
328
  @length -= 1
213
329
  end
214
330
 
331
+
332
+ def __to_matcher(val = nil, &block)
333
+ raise ArgumentError, 'either value or block should be passed' if val && block_given?
334
+ block = ->(e) { e == val } unless block_given?
335
+ ->(node) { block.call(node.data) }
336
+ end
337
+
215
338
  def __shift
216
339
  head = @head
217
340
  @head = @head.next
@@ -226,6 +349,14 @@ module LinkedList
226
349
  tail
227
350
  end
228
351
 
352
+ def __reverse_each
353
+ curr_node = @tail
354
+ while(curr_node)
355
+ yield curr_node
356
+ curr_node = curr_node.prev
357
+ end
358
+ end
359
+
229
360
  def __each
230
361
  curr_node = @head
231
362
  while(curr_node)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Linked
4
4
  module List
5
- VERSION = '0.0.11'
5
+ VERSION = '0.0.12'
6
6
  end
7
7
  end
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_development_dependency 'bundler', '>= 1.3', '<= 2.0'
22
- spec.add_development_dependency 'coveralls'
23
- spec.add_development_dependency 'm', '~> 1.5.0'
22
+ spec.add_development_dependency 'coveralls', '~> 0'
23
+ spec.add_development_dependency 'm', '~> 1.5', '>= 1.5.0'
24
24
  spec.add_development_dependency 'minitest', '>= 5.0', '<= 6.0'
25
- spec.add_development_dependency 'rake'
25
+ spec.add_development_dependency 'rake', '~> 0'
26
26
  end
@@ -134,6 +134,229 @@ describe LinkedList::List do
134
134
  end
135
135
  end
136
136
 
137
+ describe '#insert' do
138
+ it 'raises error if after and before are passed' do
139
+ err = assert_raises ArgumentError do
140
+ assert_nil list.insert(1, after: 'x', before: 'y')
141
+ end
142
+ assert_equal err.message, 'either :after or :before keys should be passed'
143
+ end
144
+
145
+ it 'raises error if no after nore before are passed' do
146
+ err = assert_raises ArgumentError do
147
+ assert_nil list.insert(1)
148
+ end
149
+ assert_equal err.message, 'either :after or :before keys should be passed'
150
+ end
151
+
152
+ describe 'after:' do
153
+ describe 'by block' do
154
+ it 'does not add value if insert after not found' do
155
+ list.push('foo')
156
+ assert_nil list.insert(1, after: ->(d) { d == 'foo1' })
157
+ assert_equal ['foo'], list.to_a
158
+ end
159
+
160
+ it 'inserts value after first matching node by block' do
161
+ list.push('foo')
162
+ list.push('bar')
163
+ assert_equal 1, list.insert(1, after: ->(d) { d == 'foo' })
164
+ assert_equal ['foo', 1, 'bar'], list.to_a
165
+ assert_equal 3, list.length
166
+ end
167
+
168
+ describe 'position edge cases' do
169
+ before do
170
+ list.push(0)
171
+ list.push(1)
172
+ list.push(2)
173
+ end
174
+
175
+ it 'inserts after in the middle' do
176
+ list.insert('foo', after: ->(d) { d == 0 })
177
+ assert_equal [0, 'foo', 1, 2], list.to_a
178
+ end
179
+
180
+ it 'inserts after the tail' do
181
+ list.insert('foo', after: ->(d) { d == 2 })
182
+ assert_equal [0, 1, 2, 'foo'], list.to_a
183
+ assert_equal 'foo', list.last
184
+ end
185
+ end
186
+ end
187
+
188
+ describe 'by value' do
189
+ it 'does not add value if insert after not found' do
190
+ list.push('foo')
191
+ assert_nil list.insert(1, after: 'foo1')
192
+ assert_equal ['foo'], list.to_a
193
+ end
194
+
195
+ it 'inserts value after first matching node by block' do
196
+ list.push('foo')
197
+ list.push('bar')
198
+ assert_equal 1, list.insert(1, after: 'foo')
199
+ assert_equal ['foo', 1, 'bar'], list.to_a
200
+ assert_equal 3, list.length
201
+ end
202
+
203
+ describe 'position edge cases' do
204
+ before do
205
+ list.push(0)
206
+ list.push(1)
207
+ list.push(2)
208
+ end
209
+
210
+ it 'inserts after in the middle' do
211
+ list.insert('foo', after: 0)
212
+ assert_equal [0, 'foo', 1, 2], list.to_a
213
+ end
214
+
215
+ it 'inserts after the tail' do
216
+ list.insert('foo', after: 2)
217
+ assert_equal [0, 1, 2, 'foo'], list.to_a
218
+ assert_equal 'foo', list.last
219
+ end
220
+ end
221
+ end
222
+ end
223
+
224
+ describe ':before' do
225
+ describe 'by block' do
226
+ it 'does not add value if insert before not found' do
227
+ list.push('foo')
228
+ assert_nil list.insert(1, before: ->(d) { d == 'foo1' })
229
+ assert_equal ['foo'], list.to_a
230
+ end
231
+
232
+ it 'inserts value before first matching node by block' do
233
+ list.push('foo')
234
+ list.push('bar')
235
+ assert_equal 1, list.insert(1, before: ->(d) { d == 'foo' })
236
+ assert_equal [1, 'foo', 'bar'], list.to_a
237
+ assert_equal 3, list.length
238
+ end
239
+
240
+ describe 'position edge cases' do
241
+ before do
242
+ list.push(0)
243
+ list.push(1)
244
+ list.push(2)
245
+ end
246
+
247
+ it 'inserts before head' do
248
+ list.insert('foo', before: ->(d) { d == 0 })
249
+ assert_equal ['foo', 0, 1, 2], list.to_a
250
+ assert_equal 'foo', list.first
251
+ end
252
+
253
+ it 'inserts before in the middle' do
254
+ list.insert('foo', before: ->(d) { d == 2 })
255
+ assert_equal [0, 1, 'foo', 2], list.to_a
256
+ end
257
+ end
258
+ end
259
+
260
+ describe 'by value' do
261
+ it 'does not add value if insert before not found' do
262
+ list.push('foo')
263
+ assert_nil list.insert(1, before: 'foo1')
264
+ assert_equal ['foo'], list.to_a
265
+ end
266
+
267
+ it 'inserts value before first' do
268
+ list.push('foo')
269
+ list.push('bar')
270
+ assert_equal 1, list.insert(1, before: 'foo')
271
+ assert_equal [1, 'foo', 'bar'], list.to_a
272
+ assert_equal 3, list.length
273
+ end
274
+
275
+ describe 'position edge cases' do
276
+ before do
277
+ list.push(0)
278
+ list.push(1)
279
+ list.push(2)
280
+ end
281
+
282
+ it 'inserts before head' do
283
+ list.insert('foo', before: 0)
284
+ assert_equal ['foo', 0, 1, 2], list.to_a
285
+ assert_equal 'foo', list.first
286
+ end
287
+
288
+ it 'inserts before in the middle' do
289
+ list.insert('foo', before: 2)
290
+ assert_equal [0, 1, 'foo', 2], list.to_a
291
+ end
292
+ end
293
+ end
294
+ end
295
+ end
296
+
297
+ describe '#insert_after_node' do
298
+ it 'inserts value after passed node' do
299
+ list.push('foo')
300
+ list.push('bar')
301
+ node = list.each_node.find { |n| n.data == 'foo' }
302
+ assert_equal 1, list.insert_after_node(1, node).data
303
+ assert_equal ['foo', 1, 'bar'], list.to_a
304
+ assert_equal 3, list.length
305
+ end
306
+
307
+ describe 'position edge cases' do
308
+ before do
309
+ list.push(0)
310
+ list.push(1)
311
+ list.push(2)
312
+ end
313
+
314
+ it 'inserts after in the middle' do
315
+ node = list.each_node.find { |n| n.data == 0 }
316
+ list.insert_after_node('foo', node)
317
+ assert_equal [0, 'foo', 1, 2], list.to_a
318
+ end
319
+
320
+ it 'inserts after the tail' do
321
+ node = list.each_node.find { |n| n.data == 2 }
322
+ list.insert_after_node('foo', node)
323
+ assert_equal [0, 1, 2, 'foo'], list.to_a
324
+ assert_equal 'foo', list.last
325
+ end
326
+ end
327
+ end
328
+
329
+ describe '#insert_after_node' do
330
+ it 'inserts value before first' do
331
+ list.push('foo')
332
+ list.push('bar')
333
+ node = list.each_node.find { |n| n.data == 'foo' }
334
+ assert_equal 1, list.insert_before_node(1, node).data
335
+ assert_equal [1, 'foo', 'bar'], list.to_a
336
+ assert_equal 3, list.length
337
+ end
338
+
339
+ describe 'position edge cases' do
340
+ before do
341
+ list.push(0)
342
+ list.push(1)
343
+ list.push(2)
344
+ end
345
+
346
+ it 'inserts before head' do
347
+ node = list.each_node.find { |n| n.data == 0 }
348
+ list.insert_before_node('foo', node)
349
+ assert_equal ['foo', 0, 1, 2], list.to_a
350
+ assert_equal 'foo', list.first
351
+ end
352
+
353
+ it 'inserts before in the middle' do
354
+ node = list.each_node.find { |n| n.data == 2 }
355
+ list.insert_before_node('foo', node)
356
+ assert_equal [0, 1, 'foo', 2], list.to_a
357
+ end
358
+ end
359
+ end
137
360
 
138
361
  describe '#delete' do
139
362
  it 'raises error if block and value are passed' do
@@ -149,12 +372,14 @@ describe LinkedList::List do
149
372
  end
150
373
 
151
374
  it 'deletes value in first matching node' do
375
+ calls_count = 0
152
376
  list.push('foo')
153
377
  list.push('foo')
154
378
  list.push('bar')
155
379
  list.push('foo')
156
- list.delete { |d| d == 'foo' }
157
- assert_equal ['foo', 'bar', 'foo'], list.to_a
380
+ list.delete { |d| calls_count += 1;d == 'bar' }
381
+ assert_equal ['foo', 'foo', 'foo'], list.to_a
382
+ assert_equal 3, calls_count
158
383
  end
159
384
 
160
385
  it 'returns deleted value' do
@@ -189,7 +414,6 @@ describe LinkedList::List do
189
414
  assert_equal [0, 2], list.to_a
190
415
  end
191
416
 
192
-
193
417
  it 'deletes value from tail' do
194
418
  list.delete { |d| d == 2 }
195
419
  assert_equal [0, 1], list.to_a
@@ -416,6 +640,48 @@ describe LinkedList::List do
416
640
  end
417
641
  end
418
642
 
643
+ describe '#each_node' do
644
+ it 'returns enumerator if no block given' do
645
+ assert_instance_of Enumerator, list.each
646
+ end
647
+
648
+ it 'pass each node data to the block' do
649
+ list.push(node_1)
650
+ list.push(node_2)
651
+ nodes = []
652
+ list.each_node { |e| nodes << e }
653
+ assert_equal %w(foo bar), nodes.map(&:data)
654
+ end
655
+ end
656
+
657
+ describe '#reverse_each' do
658
+ it 'returns enumerator if no block given' do
659
+ assert_instance_of Enumerator, list.each
660
+ end
661
+
662
+ it 'pass each node data to the block' do
663
+ list.push(node_1)
664
+ list.push(node_2)
665
+ nodes = []
666
+ list.reverse_each { |e| nodes << e }
667
+ assert_equal %w(bar foo), nodes
668
+ end
669
+ end
670
+
671
+ describe '#reverse_each_node' do
672
+ it 'returns enumerator if no block given' do
673
+ assert_instance_of Enumerator, list.each
674
+ end
675
+
676
+ it 'pass each node data to the block' do
677
+ list.push(node_1)
678
+ list.push(node_2)
679
+ nodes = []
680
+ list.reverse_each_node { |e| nodes << e }
681
+ assert_equal %w(bar foo), nodes.map(&:data)
682
+ end
683
+ end
684
+
419
685
  describe '#inspect' do
420
686
  it 'includes class name' do
421
687
  assert_match(/LinkedList::List/, list.inspect)
@@ -1,5 +1,7 @@
1
- require 'coveralls'
2
- Coveralls.wear!
1
+ if ENV['CI']
2
+ require 'coveralls'
3
+ Coveralls.wear!
4
+ end
3
5
 
4
6
  require 'linked-list'
5
7
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linked-list
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yury Velikanau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-23 00:00:00.000000000 Z
11
+ date: 2018-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -34,14 +34,14 @@ dependencies:
34
34
  name: coveralls
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ">="
37
+ - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
47
  - !ruby/object:Gem::Dependency
@@ -49,6 +49,9 @@ dependencies:
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.5'
54
+ - - ">="
52
55
  - !ruby/object:Gem::Version
53
56
  version: 1.5.0
54
57
  type: :development
@@ -56,6 +59,9 @@ dependencies:
56
59
  version_requirements: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '1.5'
64
+ - - ">="
59
65
  - !ruby/object:Gem::Version
60
66
  version: 1.5.0
61
67
  - !ruby/object:Gem::Dependency
@@ -82,14 +88,14 @@ dependencies:
82
88
  name: rake
83
89
  requirement: !ruby/object:Gem::Requirement
84
90
  requirements:
85
- - - ">="
91
+ - - "~>"
86
92
  - !ruby/object:Gem::Version
87
93
  version: '0'
88
94
  type: :development
89
95
  prerelease: false
90
96
  version_requirements: !ruby/object:Gem::Requirement
91
97
  requirements:
92
- - - ">="
98
+ - - "~>"
93
99
  - !ruby/object:Gem::Version
94
100
  version: '0'
95
101
  description: Ruby implementation of Doubly Linked List, following some Ruby idioms.