bis 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0cb3f0e41a0b024e7f77b584cb61a1f441696cfa
4
- data.tar.gz: 9fc69081e8ec4c9aace4b91ad6fe00ceeaa90b7b
3
+ metadata.gz: 61336b18bc5e7fd8daa89f0cee4a5d47b5c66859
4
+ data.tar.gz: 22444418a3a00b1a78caf0d370f429643e0b09e8
5
5
  SHA512:
6
- metadata.gz: 627846ec74bb17d7086473f6070a5ab7520bfca5a142f3d8062c8e704f71add31d316c401ec830ca28c68c58c0096b7c56a4c88133422aed2e5464cb0b63a390
7
- data.tar.gz: 3d736a96ac55b4d46645e033140cebfea8223b5e0df407fa11328ff99ae12f8686ca189f112d27dae9e04dc19e2b26871b8be7dbaf8a2e976db11faf88608835
6
+ metadata.gz: 26a5973b6e2376bad37eb55462442123eec989701cf0ce69bf63301938c1d5062747eb9898b96b01a167c564d971f2623e29ba189d591c314d2ad5a4835d322c
7
+ data.tar.gz: a5d6122cc1cde1e84952266449693a7e3c386db2f4a79b4c92746d634f3f6810a1308f36c09b09ab81f150ec9c286a8f4845e328a41096f09ae17ede598fd680
data/README.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Bis
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/bis.png)](http://badge.fury.io/rb/bis)
4
+ [![Build Status](https://travis-ci.org/fuadsaud/bis.png?branch=master)]
5
+ (https://travis-ci.org/fuadsaud/bis)
6
+ [![Code Climate](https://codeclimate.com/github/fuadsaud/bis.png)]
7
+ (https://codeclimate.com/github/fuadsaud/bis)
8
+
9
+
3
10
  A pure ruby bitset implementation.
4
11
 
5
12
  ## Installation
@@ -1,12 +1,14 @@
1
1
  class Bis
2
2
  module Conversion
3
+ private
4
+
3
5
  def Bis(obj)
4
6
  if obj.kind_of? Bis
5
7
  obj
6
8
  elsif obj.kind_of? Enumerable
7
9
  Bis.from_enum(obj)
8
10
  elsif obj.respond_to? :to_i
9
- Bis.new(Bis::WORD_SIZE, value: obj.to_i)
11
+ Bis.new(64, value: obj.to_i)
10
12
  else
11
13
  fail TypeError, "#{obj.class} can't be coerced to Bis"
12
14
  end
@@ -17,3 +19,7 @@ end
17
19
  module Kernel
18
20
  include Bis::Conversion
19
21
  end
22
+
23
+ class Object
24
+ include Kernel
25
+ end
data/lib/bis/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Bis
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
data/lib/bis.rb CHANGED
@@ -2,37 +2,35 @@ require 'bis/conversion'
2
2
  require 'bis/version'
3
3
 
4
4
  class Bis
5
- WORD_SIZE = 0.size * 8
6
-
7
- attr_reader :size
5
+ include Enumerable
8
6
 
9
7
  def self.from_enum(enum)
10
8
  Bis.new(enum.size, value: enum.join.to_i(2))
11
9
  end
12
10
 
13
- def initialize(size, value: 0)
14
- unless size.kind_of?(Integer) && size > 0
15
- fail ArgumentError, 'size must be a positive integer'
16
- end
11
+ attr_reader :size
12
+ alias_method :length, :size
13
+ alias_method :bitlength, :size # Ruby 2.1 Integer interoperability
17
14
 
18
- @size = size
19
- @store = Array.new(words_needed_for(size), 0)
15
+ def initialize(size, value: 0)
16
+ fail ArgumentError, 'size must be >= 0' if size < 0
20
17
 
21
- self.value = value if value != 0
18
+ @size = size.to_i
19
+ @store = value & ((1 << size) - 1)
22
20
  end
23
21
 
24
22
  def set(index)
25
- change_bit_at(index).(1)
23
+ new_with_same_size.(value: @store | 1 << index)
26
24
  end
27
25
 
28
26
  def clear(index)
29
- change_bit_at(index).(0)
27
+ new_with_same_size.(value: @store & (~(1 << index)))
30
28
  end
31
29
 
32
30
  def [](index)
33
- x, y = offset_for(index)
34
-
35
- @store[x][y]
31
+ with_valid_index index do |index|
32
+ @store[index]
33
+ end
36
34
  end
37
35
 
38
36
  # Not sure if it's a good idead to implement this.
@@ -45,22 +43,15 @@ class Bis
45
43
  end
46
44
  end
47
45
 
48
- def ==(other)
49
- to_i == other
50
- end
51
-
52
- def <=>(other)
53
- to_i <=> Bis(other).to_i
46
+ def concat(other)
47
+ size_and_value_for(other) do |other_size, other_value|
48
+ new.(size: size + other_size).(value: (to_i << other_size) | other_value)
49
+ end
54
50
  end
55
51
 
56
- def +(value)
57
- with_valid_bit value do |bit|
58
- new_bis = new.(size: size + 1)
59
-
60
- case bit
61
- when 1 then new_bis.(value: to_i << 1 | bit)
62
- when 0 then new_bis.(value: to_i << 1)
63
- end
52
+ def +(other)
53
+ size_and_value_for(other + to_i) do |result_size, result|
54
+ new.(size: result_size).(value: result)
64
55
  end
65
56
  end
66
57
 
@@ -92,44 +83,65 @@ class Bis
92
83
  end
93
84
  end
94
85
 
86
+ def each_byte
87
+ return enum_for :each_byte unless block_given?
88
+
89
+ (size / 8).times.reverse_each do |offset|
90
+ yield Bis.new(8, value: (to_i >> offset * 8) & ((1 << 8) - 1))
91
+ end
92
+ end
93
+
94
+ def bytes
95
+ each_byte.to_a
96
+ end
97
+
95
98
  def to_a
96
99
  each.to_a
97
100
  end
98
101
 
99
102
  def to_i
100
- each.reduce(0) { |a, e| (a << 1) | e }
103
+ @store
101
104
  end
102
105
 
103
106
  def to_s
104
107
  to_a.join
105
108
  end
106
109
 
107
- def inspect
108
- "<<#{ to_s }>> #{ to_i }"
110
+ def ==(other)
111
+ other == to_i
109
112
  end
110
113
 
111
- protected
112
- attr_writer :store
113
-
114
- private
114
+ def ===(other)
115
+ to_i === other
116
+ end
115
117
 
116
- def value=(value)
117
- @store.each_with_index do |_, i|
118
- @store[i] |= Integer(value >> (i * WORD_SIZE))
119
- end
118
+ def <=>(other)
119
+ to_i <=> Bis(other).to_i
120
120
  end
121
121
 
122
- def offset_for(index)
123
- if index >= size
124
- fail ArgumentError, "index #{index} out of boudaries for #{self}"
122
+ def coerce(other)
123
+ case other
124
+ when Integer
125
+ size_and_value_for(other) do |other_size, other_value|
126
+ [new.(size: other_size).(value: other_value), self]
127
+ end
128
+ else
129
+ fail TypeError, "#{ self.class } cannot be coerced into #{ other.class }"
125
130
  end
131
+ end
126
132
 
127
- [index / WORD_SIZE, index % WORD_SIZE]
133
+ def inspect
134
+ "<<#{ to_s }>> #{ to_i }"
128
135
  end
129
136
 
137
+ protected
130
138
 
131
- def words_needed_for(bits)
132
- (bits - 1) / WORD_SIZE + 1
139
+ attr_writer :store
140
+
141
+ private
142
+
143
+ def size_and_value_for(bitset_or_integer)
144
+ yield bitlenght_for(bitset_or_integer), bitset_or_integer.to_i
133
145
  end
134
146
 
135
147
  def with_valid_bit(bit)
@@ -139,22 +151,11 @@ class Bis
139
151
  end
140
152
  end
141
153
 
142
- def change_bit_at(index)
143
- ->(bit) {
144
- return self if self[index] == bit
145
-
146
- x, y = offset_for(index)
147
-
148
- new_with_same_size.().tap { |bis|
149
- bis.store = @store.dup.tap { |s|
150
- s[x] = s[x].send(change_operation_for(bit), 1 << y)
151
- }
152
- }
153
- }
154
- end
155
-
156
- def change_operation_for(bit)
157
- bit.zero? ? :^ : :|
154
+ def with_valid_index(index)
155
+ case index
156
+ when 0..@size then yield index
157
+ else fail ArgumentError, "index #{index} out of boudaries for #{self}"
158
+ end
158
159
  end
159
160
 
160
161
  def new_with_same_size
@@ -168,4 +169,16 @@ class Bis
168
169
  }
169
170
  }
170
171
  end
172
+
173
+ def bitlenght_for(bitset_or_integer)
174
+ case bitset_or_integer
175
+ when 0..1 then 1
176
+ when 2 then 2
177
+ when Integer then Math.log2(bitset_or_integer).ceil
178
+ when Bis then bitset_or_integer.size
179
+ else fail ArgumentError, 'cannot resolve a bitlength'
180
+ "#{ bitset_or_integer }. Must be either Integer"
181
+ 'or Bis'
182
+ end
183
+ end
171
184
  end
data/spec/bis_spec.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Bis do
4
- let(:size) { Bis::WORD_SIZE }
5
-
6
4
  it('has a version') { expect(Bis::VERSION).to be_a String }
7
5
 
8
6
  describe '.new' do
@@ -21,22 +19,40 @@ describe Bis do
21
19
  end
22
20
 
23
21
  context 'with size and value' do
24
- let(:value) { 10 }
25
-
26
22
  subject { Bis.new(size, value: value) }
27
23
 
28
- it 'is as big as the passed size' do
29
- expect(subject.size).to eq size
24
+ context 'with a bitset big enough to fit given size' do
25
+ let(:size) { 16 }
26
+ let(:value) { 10 }
27
+
28
+ it 'is as big as the passed size' do
29
+ expect(subject.size).to eq size
30
+ end
31
+
32
+ it 'has the bits set to the given value' do
33
+ expect(subject).to eq value
34
+ end
30
35
  end
31
36
 
32
- it 'has the bits set to the given value' do
33
- expect(subject).to eq value
37
+ context 'with value overflowing the size' do
38
+ let(:size) { 3 }
39
+ let(:value) { 10 }
40
+ subject { Bis.new(size, value: value) }
41
+
42
+ it 'is as big as the passed size' do
43
+ expect(subject.size).to eq size
44
+ end
45
+
46
+ it 'truncates the given value to fit in the given biy length' do
47
+ expect(subject.to_i).to eq 2
48
+ end
34
49
  end
35
50
  end
36
51
  end
37
52
 
38
53
  describe '#==' do
39
54
  context 'with an integer' do
55
+ let(:size) { 16 }
40
56
  let(:value) { 16 }
41
57
 
42
58
  subject { Bis.new(size, value: value) }
@@ -63,6 +79,7 @@ describe Bis do
63
79
  end
64
80
 
65
81
  context 'small numbers' do
82
+ let(:size) { 16 }
66
83
  let(:value) { 10 }
67
84
 
68
85
  subject { Bis.new(size, value: value) }
@@ -75,16 +92,17 @@ describe Bis do
75
92
  context 'large numbers' do
76
93
  let(:size) { 65 }
77
94
 
78
- subject { Bis.new(size).set(64) }
95
+ subject { Bis.new(size).set(16) }
79
96
 
80
97
  it 'returns the bit at the given position' do
81
- expect(subject[64]).to eq 1
98
+ expect(subject[16]).to eq 1
82
99
  end
83
100
  end
84
101
  end
85
102
 
86
103
  describe '#[]=', pending: "Not sure if it's a good idea to implement this" do
87
104
  context 'invalid argument' do
105
+ let(:size) { 16 }
88
106
  subject { Bis.new(size) }
89
107
 
90
108
  it 'fails' do
@@ -93,6 +111,7 @@ describe Bis do
93
111
  end
94
112
 
95
113
  context 'valid argument' do
114
+ let(:size) { 16 }
96
115
  let(:value) { 7 }
97
116
 
98
117
  subject { Bis.new(size, value: 7)[index] = argument }
@@ -118,6 +137,7 @@ describe Bis do
118
137
  end
119
138
 
120
139
  describe '#set' do
140
+ let(:size) { 16 }
121
141
  let(:before) { 0b101 }
122
142
  let(:after) { 0b111 }
123
143
 
@@ -129,6 +149,7 @@ describe Bis do
129
149
  end
130
150
 
131
151
  describe '#clear' do
152
+ let(:size) { 16 }
132
153
  let(:before) { 0b111 }
133
154
  let(:after) { 0b101 }
134
155
 
@@ -170,58 +191,189 @@ describe Bis do
170
191
  end
171
192
 
172
193
  shared_examples 'pushing a bit' do
173
- it 'increases the size' do
174
- expect(subject.size).to eq size + 1
194
+ end
195
+
196
+ describe '#concat' do
197
+ subject { Bis.new(size, value: value).concat(argument) }
198
+
199
+ context '0' do
200
+ context 'zero' do
201
+ let(:size) { 8 }
202
+ let(:value) { 10 }
203
+ let(:argument) { 0 }
204
+ let(:argument_size) { 1 }
205
+ let(:new_value) { (value << argument_size) | argument }
206
+
207
+ it 'has the orginal size plus enough to fit the new integer value' do
208
+ expect(subject.size).to eq size + argument_size
209
+ end
210
+
211
+ it "concatenates the integer bits to the end it's end" do
212
+ expect(subject).to eq new_value
213
+ end
214
+ end
215
+
216
+ context '1' do
217
+ let(:size) { 8 }
218
+ let(:value) { 10 }
219
+ let(:argument) { 1 }
220
+ let(:argument_size) { 1 }
221
+ let(:new_value) { (value << argument_size) | argument }
222
+
223
+ it 'has the orginal size plus enough to fit the new integer value' do
224
+ expect(subject.size).to eq size + argument_size
225
+ end
226
+
227
+ it "concatenates the integer bits to the end it's end" do
228
+ expect(subject).to eq new_value
229
+ end
230
+ end
231
+
232
+ context '2' do
233
+ let(:size) { 8 }
234
+ let(:value) { 10 }
235
+ let(:argument) { 2 }
236
+ let(:argument_size) { 2 }
237
+ let(:new_value) { (value << argument_size) | argument }
238
+
239
+ it 'has the orginal size plus enough to fit the new integer value' do
240
+ expect(subject.size).to eq size + argument_size
241
+ end
242
+
243
+ it "concatenates the integer bits to the end it's end" do
244
+ expect(subject).to eq new_value
245
+ end
246
+ end
247
+
248
+ context '> 1' do
249
+ let(:size) { 8 }
250
+ let(:value) { 10 }
251
+ let(:argument) { 3 }
252
+ let(:argument_size) { 2 }
253
+ let(:new_value) { (value << argument_size) | argument }
254
+
255
+ it 'has the orginal size plus enough to fit the new integer value' do
256
+ expect(subject.size).to eq size + argument_size
257
+ end
258
+
259
+ it "concatenates the integer bits to the end it's end" do
260
+ expect(subject).to eq new_value
261
+ end
262
+ end
175
263
  end
176
264
 
177
- it 'pushes the new bit to the end of the new bitset' do
178
- expect(subject).to eq new_value
265
+ context 'with a bitset' do
266
+ let(:size) { 4 }
267
+ let(:value) { 3 }
268
+ let(:argument_size) { 10 }
269
+ let(:argument_value) { 10 }
270
+ let(:argument) { Bis.new(argument_size, value: argument_value) }
271
+ let(:new_value) { (value << argument_size) | argument_value }
272
+
273
+ it 'returns a new bitset with the size of both bitsets combined' do
274
+ expect(subject.size).to eq size + argument_size
275
+ end
276
+
277
+ it 'concatenates the two bitsets' do
278
+ expect(subject.to_i).to eq new_value
279
+ end
179
280
  end
180
281
  end
181
-
282
+
182
283
  describe '#+' do
183
- let(:size) { 8 }
184
- let(:value) { 10 }
284
+ context 'with an integer' do
285
+ end
286
+ end
185
287
 
186
- subject { Bis.new(size, value: value) + argument }
288
+ describe '#&' do
289
+ let(:size) { 16 }
187
290
 
188
- context '1' do
189
- let(:argument) { 1 }
190
- let(:new_value) { (value << 1) | argument }
291
+ subject { Bis.new(size, value: value) & argument }
292
+
293
+ context 'with an integer' do
294
+ let(:size) { 16 }
295
+ let(:value) { 12 }
296
+ let(:argument) { 5 }
297
+ let(:result) { value & argument }
191
298
 
192
- it_behaves_like 'pushing a bit'
299
+ it 'evaluates to logic AND of the two bitsets' do
300
+ expect(subject).to eq result
301
+ end
193
302
  end
194
303
 
195
- context '0' do
196
- let(:argument) { 0 }
197
- let(:new_value) { value << 1 }
304
+ context 'with another bitset' do
305
+ let(:size) { 16 }
306
+ let(:value) { 12 }
307
+ let(:argument_value) { 5 }
308
+ let(:argument) { Bis.new(size, value: argument_value) }
309
+ let(:result) { value & argument_value }
198
310
 
199
- it_behaves_like 'pushing a bit'
311
+ it 'evaluates to logic AND of the two bitsets' do
312
+ expect(subject).to eq result
313
+ end
200
314
  end
201
315
  end
202
316
 
203
- describe '#&' do
204
- it 'evaluates to logic AND of the two bitsets' do
205
- expect(Bis.new(size, value: 0b1100) &
206
- Bis.new(size, value: 0b0101)).to eq Bis.new(size, value: 0b0100)
317
+ describe '#|' do
318
+ let(:size) { 16 }
319
+
320
+ subject { Bis.new(size, value: value) | argument }
321
+
322
+ context 'with an integer' do
323
+ let(:size) { 16 }
324
+ let(:value) { 12 }
325
+ let(:argument) { 5 }
326
+ let(:result) { value | argument }
327
+
328
+ it 'evaluates to logic AND of the two bitsets' do
329
+ expect(subject).to eq result
330
+ end
207
331
  end
208
- end
209
332
 
210
- describe '#|' do
211
- it 'evaluates to logic OR of the two bitsets' do
212
- expect(Bis.new(size, value: 0b1100) |
213
- Bis.new(size, value: 0b0110)).to eq Bis.new(size, value: 0b1110)
333
+ context 'with another bitset' do
334
+ let(:size) { 16 }
335
+ let(:value) { 12 }
336
+ let(:argument_value) { 5 }
337
+ let(:argument) { Bis.new(size, value: argument_value) }
338
+ let(:result) { value | argument_value }
339
+
340
+ it 'evaluates to logic OR of the two bitsets' do
341
+ expect(subject).to eq result
342
+ end
214
343
  end
215
344
  end
216
345
 
217
346
  describe '#^' do
218
- it 'evaluates to logic XOR of the two bitsets' do
219
- expect(Bis.new(size, value: 0b1100) ^
220
- Bis.new(size, value: 0b0110)).to eq Bis.new(size, value: 0b1010)
347
+ let(:size) { 16 }
348
+
349
+ subject { Bis.new(size, value: value) ^ argument }
350
+
351
+ context 'with an integer' do
352
+ let(:size) { 16 }
353
+ let(:value) { 12 }
354
+ let(:argument) { 5 }
355
+ let(:result) { value ^ argument }
356
+
357
+ it 'evaluates to logic AND of the two bitsets' do
358
+ expect(subject).to eq result
359
+ end
360
+ end
361
+
362
+ context 'with another bitset' do
363
+ let(:size) { 16 }
364
+ let(:value) { 12 }
365
+ let(:argument_value) { 5 }
366
+ let(:argument) { Bis.new(size, value: argument_value) }
367
+ let(:result) { value ^ argument_value }
368
+
369
+ it 'evaluates to logic XOR of the two bitsets' do
370
+ expect(subject).to eq result
371
+ end
221
372
  end
222
373
  end
223
374
 
224
375
  describe '#>>' do
376
+ let(:size) { 16 }
225
377
  let(:shift) { 1 }
226
378
 
227
379
  context 'zero value' do
@@ -244,6 +396,7 @@ describe Bis do
244
396
  end
245
397
 
246
398
  describe '#<<' do
399
+ let(:size) { 16 }
247
400
  let(:shift) { 1 }
248
401
 
249
402
  context 'zero value' do
@@ -264,4 +417,28 @@ describe Bis do
264
417
  end
265
418
  end
266
419
  end
420
+
421
+ describe '#each_byte' do
422
+ subject { ->(b) { Bis.new(size, value: value).each_byte(&b) } }
423
+
424
+ context 'bitset has less than 8 bits' do
425
+ let(:size) { 4 }
426
+ let(:value) { 0 }
427
+
428
+ it "doesn't yield" do
429
+ expect { |b| subject.(b) }.to_not yield_control
430
+ end
431
+ end
432
+
433
+ context 'bitset has at least pne byte' do
434
+ let(:size) { 16 }
435
+ let(:first_byte) { 38 }
436
+ let(:second_byte) { 213 }
437
+ let(:value) { (first_byte << 8) | second_byte }
438
+
439
+ it 'yields all the bytes' do
440
+ expect { |b| subject.(b) }.to yield_successive_args 38, 213
441
+ end
442
+ end
443
+ end
267
444
  end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,3 @@
1
1
  require 'rspec'
2
2
 
3
3
  require_relative File.join(__dir__, '../lib/bis')
4
-
5
- RSpec.configure do |config|
6
- config.include Bis::Conversion
7
- end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fuad Saud
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-11 00:00:00.000000000 Z
11
+ date: 2013-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rubocop
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: |2
@@ -78,12 +78,12 @@ require_paths:
78
78
  - lib
79
79
  required_ruby_version: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '>='
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
84
  required_rubygems_version: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - '>='
86
+ - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
89
  requirements: []