beefcake 0.5.0 → 1.0.0.pre2

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: 4c8b59ed31faa70fbb239a3e2409237196ce148f
4
- data.tar.gz: 8a67dfdb73a449209b12e359ea07e1d3703afb46
3
+ metadata.gz: 9b7cab784e70b3c3800d45d9d109687848a2d429
4
+ data.tar.gz: e00c7156ab112921ec2ad56e412a4121e9106f52
5
5
  SHA512:
6
- metadata.gz: af0890820ca418b3207f8670027eb905b6453e583b590fefaf8a9f28ce6da221e5110a4f6fdaf52750083ab2675d5d5492238a30547521d63fbb130c3b2af146
7
- data.tar.gz: 01a872f9dcbd8f182639b3a054ab10f818f57565d700baa38e46c4fd2adc61abe47ddfdd055f0f934cfa79df26f59593392d56c6bc4c17080195012815180119
6
+ metadata.gz: 3c4c02406d0afc4bf7cd3788c7387bae133264167371ff530eee11d4b9565ef1595824247a9556e4409354cbc1e741829e99e216bc175804afc3285498f60447
7
+ data.tar.gz: 3219554a0b7023643d795ebd5cd21cb3c89da8669b7d5a5d1eb1920a4ba8904c1291be1ba120be01852679f8ebcfa9b1253e10350d430305aa6827f1f30335e2
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  *.gem
2
2
  Gemfile.lock
3
+ bench/beefcake.prof.*
@@ -1,8 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
- - 1.9.2
5
3
  - 1.9.3
6
4
  - 2.0.0
7
- - jruby-18mode
8
- - jruby-19mode
5
+ - 2.1.0
6
+ - 2.1.1
7
+ - 2.1.2
8
+ - jruby-19mode
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in beefcake.gemspec
4
4
  gemspec
data/README.md CHANGED
@@ -141,7 +141,7 @@ http://code.google.com/apis/protocolbuffers/docs/encoding.html
141
141
  rake test
142
142
 
143
143
  Beefcake conducts continuous integration on [Travis CI](http://travis-ci.org).
144
- The current build status for HEAD is [![Build Status](https://travis-ci.org/protobuf-ruby/beefcake.png)](https://travis-ci.org/protobuf-ruby/beefcake).
144
+ The current build status for HEAD is [![Build Status](https://travis-ci.org/protobuf-ruby/beefcake.png?branch=master)](https://travis-ci.org/protobuf-ruby/beefcake).
145
145
 
146
146
  All pull requests automatically trigger a build request. Please ensure that
147
147
  tests succeed.
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require 'bundler/gem_tasks'
4
4
  Bundler::GemHelper.install_tasks
5
5
 
6
6
  Rake::TestTask.new do |t|
7
- t.libs << 'test'
7
+ t.libs << 'minitest'
8
8
  t.test_files = FileList['test/*_test.rb']
9
9
  t.verbose = true
10
10
  end
@@ -13,12 +13,13 @@ Gem::Specification.new do |s|
13
13
  s.description = %q{A sane protobuf library for Ruby}
14
14
  s.license = 'MIT'
15
15
 
16
- s.rubyforge_project = "beefcake"
17
-
18
16
  s.files = `git ls-files`.split("\n")
19
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
19
  s.require_paths = ["lib"]
22
20
 
23
- s.add_development_dependency('rake', '10.1.0')
21
+ s.required_ruby_version = '>= 1.9.3'
22
+
23
+ s.add_development_dependency('rake', '~> 10.1.0')
24
+ s.add_development_dependency('minitest', '~> 5.3')
24
25
  end
@@ -10,7 +10,10 @@ class MyMessage
10
10
  required :float, :float, 5
11
11
  end
12
12
 
13
- if ARGV[0] == 'pprof'
13
+ ITERS = 100_000
14
+
15
+ case ARGV[0]
16
+ when 'pprof'
14
17
  # profile message creation/encoding/decoding w/ perftools.rb
15
18
  # works on 1.8 and 1.9
16
19
  # ruby bench/simple.rb pprof
@@ -20,7 +23,7 @@ if ARGV[0] == 'pprof'
20
23
  require 'rubygems'
21
24
  require 'perftools'
22
25
  PerfTools::CpuProfiler.start(File.expand_path("../beefcake.prof", __FILE__)) do
23
- 100_000.times do
26
+ ITERS.times do
24
27
  str = MyMessage.new(
25
28
  :number => 12345,
26
29
  :chars => 'hello',
@@ -35,6 +38,31 @@ if ARGV[0] == 'pprof'
35
38
  `pprof.rb beefcake.prof --gif > beefcake.prof.gif`
36
39
  end
37
40
 
41
+ when 'ruby-prof'
42
+ # profile message creation/encoding/decoding w/ ruby-prof
43
+ # works on 1.8 and 1.9
44
+ # ruby bench/simple.rb ruby-prof
45
+ # open bench/beefcake.prof.html
46
+
47
+ require 'ruby-prof'
48
+ result = RubyProf.profile do
49
+ ITERS.times do
50
+ str = MyMessage.new(
51
+ :number => 12345,
52
+ :chars => 'hello',
53
+ :raw => 'world',
54
+ :bool => true,
55
+ :float => 1.2345
56
+ ).encode
57
+ MyMessage.decode(str)
58
+ end
59
+ end
60
+
61
+ filename = File.expand_path('beefcake.prof.html', File.dirname(__FILE__))
62
+ File.open(filename, 'w') do |file|
63
+ RubyProf::GraphHtmlPrinter.new(result).print(file)
64
+ end
65
+
38
66
  else
39
67
  # benchmark message creation/encoding/decoding
40
68
  # rvm install 1.8.7 1.9.2 jruby rbx
@@ -42,8 +70,6 @@ else
42
70
 
43
71
  require 'benchmark'
44
72
 
45
- ITERS = 100_000
46
-
47
73
  Benchmark.bmbm do |x|
48
74
  x.report 'object creation' do
49
75
  ITERS.times do
@@ -23,6 +23,11 @@ module Beefcake
23
23
  end
24
24
  end
25
25
 
26
+ class DuplicateFieldNumber < StandardError
27
+ def initialize(num, name)
28
+ super("Field number #{num} (#{name}) was already used")
29
+ end
30
+ end
26
31
 
27
32
  class Field < Struct.new(:rule, :name, :type, :fn, :opts)
28
33
  def <=>(o)
@@ -45,6 +50,9 @@ module Beefcake
45
50
  end
46
51
 
47
52
  def field(rule, name, type, fn, opts)
53
+ if fields.include?(fn)
54
+ raise DuplicateFieldNumber.new(fn, name)
55
+ end
48
56
  fields[fn] = Field.new(rule, name, type, fn, opts)
49
57
  attr_accessor name
50
58
  end
@@ -69,7 +77,7 @@ module Beefcake
69
77
 
70
78
  # TODO: Error if any required fields at nil
71
79
 
72
- fields.values.sort.each do |fld|
80
+ __beefcake_fields__.values.sort.each do |fld|
73
81
  if fld.opts[:packed]
74
82
  bytes = encode!(Buffer.new, fld, 0)
75
83
  buf.append_info(fld.fn, Buffer.wire_for(fld.type))
@@ -134,7 +142,7 @@ module Beefcake
134
142
  end
135
143
 
136
144
  def validate!
137
- fields.values.each do |fld|
145
+ __beefcake_fields__.values.each do |fld|
138
146
  if fld.rule == :required && self[fld.name].nil?
139
147
  raise RequiredFieldNotSetError, fld.name
140
148
  end
@@ -217,12 +225,12 @@ module Beefcake
217
225
  end
218
226
 
219
227
  def initialize(attrs={})
220
- fields.values.each do |fld|
228
+ __beefcake_fields__.values.each do |fld|
221
229
  self[fld.name] = attrs[fld.name]
222
230
  end
223
231
  end
224
232
 
225
- def fields
233
+ def __beefcake_fields__
226
234
  self.class.fields
227
235
  end
228
236
 
@@ -236,11 +244,12 @@ module Beefcake
236
244
 
237
245
  def ==(o)
238
246
  return false if (o == nil) || (o == false)
239
- fields.values.all? {|fld| self[fld.name] == o[fld.name] }
247
+ return false unless o.is_a? self.class
248
+ __beefcake_fields__.values.all? {|fld| self[fld.name] == o[fld.name] }
240
249
  end
241
250
 
242
251
  def inspect
243
- set = fields.values.select {|fld| self[fld.name] != nil }
252
+ set = __beefcake_fields__.values.select {|fld| self[fld.name] != nil }
244
253
 
245
254
  flds = set.map do |fld|
246
255
  val = self[fld.name]
@@ -260,7 +269,7 @@ module Beefcake
260
269
  end
261
270
 
262
271
  def to_hash
263
- fields.values.inject({}) do |h, fld|
272
+ __beefcake_fields__.values.inject({}) do |h, fld|
264
273
  value = self[fld.name]
265
274
  unless value.nil?
266
275
  h[fld.name] = value
@@ -3,31 +3,42 @@ module Beefcake
3
3
  class Buffer
4
4
 
5
5
  MinUint32 = 0
6
- MaxUint32 = (1<<32)-1
7
- MinInt32 = -(1<<31)
8
- MaxInt32 = (1<<31)-1
6
+ MaxUint32 = (1 << 32)-1
7
+ MinInt32 = -(1 << 31)
8
+ MaxInt32 = (1 << 31)-1
9
9
 
10
10
  MinUint64 = 0
11
- MaxUint64 = (1<<64)-1
12
- MinInt64 = -(1<<63)
13
- MaxInt64 = (1<<63)-1
11
+ MaxUint64 = (1 << 64)-1
12
+ MinInt64 = -(1 << 63)
13
+ MaxInt64 = (1 << 63)-1
14
+
15
+ WIRES = {
16
+ :int32 => 0,
17
+ :uint32 => 0,
18
+ :sint32 => 0,
19
+ :int64 => 0,
20
+ :uint64 => 0,
21
+ :sint64 => 0,
22
+ :bool => 0,
23
+ :fixed64 => 1,
24
+ :sfixed64 => 1,
25
+ :double => 1,
26
+ :string => 2,
27
+ :bytes => 2,
28
+ :fixed32 => 5,
29
+ :sfixed32 => 5,
30
+ :float => 5,
31
+ }
14
32
 
15
33
  def self.wire_for(type)
16
- case type
17
- when Class
18
- if encodable?(type)
19
- 2
20
- else
21
- raise UnknownType, type
22
- end
23
- when :int32, :uint32, :sint32, :int64, :uint64, :sint64, :bool, Module
24
- 0
25
- when :fixed64, :sfixed64, :double
26
- 1
27
- when :string, :bytes
34
+ wire = WIRES[type]
35
+
36
+ if wire
37
+ wire
38
+ elsif Class === type && encodable?(type)
28
39
  2
29
- when :fixed32, :sfixed32, :float
30
- 5
40
+ elsif Module === type
41
+ 0
31
42
  else
32
43
  raise UnknownType, type
33
44
  end
@@ -35,11 +46,10 @@ module Beefcake
35
46
 
36
47
  def self.encodable?(type)
37
48
  return false if ! type.is_a?(Class)
38
- pims = type.public_instance_methods
39
- pims.include?(:encode) || pims.include?("encode")
49
+ type.public_method_defined?(:encode)
40
50
  end
41
51
 
42
- attr_accessor :buf
52
+ attr_reader :buf
43
53
 
44
54
  alias :to_s :buf
45
55
  alias :to_str :buf
@@ -66,14 +76,14 @@ module Beefcake
66
76
  self.buf = buf
67
77
  end
68
78
 
69
- if ''.respond_to?(:force_encoding)
70
- def buf=(buf)
71
- @buf = buf.force_encoding('BINARY')
72
- end
79
+ def buf=(new_buf)
80
+ @buf = new_buf.force_encoding('BINARY')
81
+ @cursor = 0
73
82
  end
74
83
 
75
84
  def length
76
- @buf.respond_to?(:bytesize) ? @buf.bytesize : @buf.length
85
+ remain = buf.slice(@cursor..-1)
86
+ remain.bytesize
77
87
  end
78
88
 
79
89
  def <<(bytes)
@@ -90,7 +100,9 @@ module Beefcake
90
100
  when Module
91
101
  read_uint64
92
102
  else
93
- buf.slice!(0, n)
103
+ read_slice = buf.byteslice(@cursor, n)
104
+ @cursor += n
105
+ return read_slice
94
106
  end
95
107
  end
96
108
 
@@ -43,12 +43,7 @@ module Beefcake
43
43
  if shift >= 64
44
44
  raise BufferOverflowError, "varint"
45
45
  end
46
- b = buf.slice!(0)
47
-
48
- ## 1.8.6 to 1.9 Compat
49
- if b.respond_to?(:ord)
50
- b = b.ord
51
- end
46
+ b = read(1).ord
52
47
 
53
48
  n |= ((b & 0x7F) << shift)
54
49
  shift += 7
@@ -106,11 +106,7 @@ module Beefcake
106
106
 
107
107
  def append_string(s)
108
108
  actual_string = thaw_string s
109
- if actual_string.respond_to? :force_encoding
110
- encoded = actual_string.force_encoding 'binary'
111
- else
112
- encoded = actual_string
113
- end
109
+ encoded = actual_string.force_encoding 'binary'
114
110
  append_uint64(encoded.length)
115
111
  self << encoded
116
112
  end
@@ -1,3 +1,3 @@
1
1
  module Beefcake
2
- VERSION = "0.5.0"
2
+ VERSION = "1.0.0.pre2"
3
3
  end
@@ -0,0 +1,42 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/benchmark'
3
+ require 'beefcake'
4
+
5
+ class Inner
6
+ include Beefcake::Message
7
+
8
+ required :content, :string, 1
9
+ end
10
+
11
+ class Outer
12
+ include Beefcake::Message
13
+
14
+ repeated :inner, Inner, 1
15
+ end
16
+
17
+ class BenchmarkTest < Minitest::Benchmark
18
+ def setup
19
+ @buf = Beefcake::Buffer.new
20
+ end
21
+
22
+ def bench_read_string
23
+ assert_performance_linear 0.75 do |n|
24
+ candidate = 'x' * (n * 1_000)
25
+ @buf.append_string candidate
26
+ assert_equal candidate, @buf.read_string
27
+ end
28
+ end
29
+
30
+ def bench_decode
31
+ assert_performance_linear 0.75 do |n|
32
+ inners = n.times.map{ Inner.new :content => 'x' * 100 }
33
+ outer = Outer.new :inner => inners
34
+
35
+ encoded = outer.encode.to_s
36
+
37
+ decoded = Outer.decode encoded
38
+
39
+ assert_equal n, decoded.inner.length
40
+ end
41
+ end
42
+ end
@@ -1,7 +1,7 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
2
  require 'beefcake/buffer'
3
3
 
4
- class BufferDecodeTest < Test::Unit::TestCase
4
+ class BufferDecodeTest < Minitest::Test
5
5
 
6
6
  B = Beefcake::Buffer
7
7
 
@@ -1,8 +1,8 @@
1
1
  # encoding: ASCII-8BIT
2
- require 'test/unit'
2
+ require 'minitest/autorun'
3
3
  require 'beefcake/buffer/encode'
4
4
 
5
- class BufferEncodeTest < Test::Unit::TestCase
5
+ class BufferEncodeTest < Minitest::Test
6
6
 
7
7
  B = Beefcake::Buffer
8
8
 
@@ -211,9 +211,14 @@ class BufferEncodeTest < Test::Unit::TestCase
211
211
  assert_equal "\376\377\377\377\377\377\377\377", @buf.to_s
212
212
  end
213
213
 
214
- def test_append_string
215
- @buf.append_string("testing")
216
- assert_equal "\007testing", @buf.to_s
214
+ def test_append_unicode_string
215
+ ingest = "\u{1f63a}" * 5
216
+ assert_equal 5, ingest.chars.to_a.length
217
+ expected = ingest.bytes.to_a.length.chr + ingest
218
+ @buf.append_string(ingest)
219
+ actual = @buf.to_s
220
+ assert_equal expected.bytes.to_a.length, actual.bytes.to_a.length
221
+ assert_equal expected.bytes.to_a, actual.bytes.to_a
217
222
  end
218
223
 
219
224
  def test_append_bytes
@@ -1,7 +1,7 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
2
  require 'beefcake/buffer'
3
3
 
4
- class BufferTest < Test::Unit::TestCase
4
+ class BufferTest < Minitest::Test
5
5
 
6
6
  def setup
7
7
  @buf = Beefcake::Buffer.new
@@ -1,7 +1,7 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
2
  require 'beefcake/generator'
3
3
 
4
- class GeneratorTest < Test::Unit::TestCase
4
+ class GeneratorTest < Minitest::Test
5
5
 
6
6
  def setup
7
7
  # Load up the generator request for the addressbook.proto example
@@ -39,11 +39,7 @@ class GeneratorTest < Test::Unit::TestCase
39
39
  # Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and US-ASCII
40
40
  def test_encode_decode_generated_response
41
41
  @res = Beefcake::Generator.compile([], @req)
42
- assert_nothing_raised { @res.encode }
43
- end
44
42
 
45
- def test_encode_decode_generated_response
46
- @res = Beefcake::Generator.compile([], @req)
47
43
  assert_equal(CodeGeneratorResponse, @res.class)
48
44
 
49
45
  round_trip = CodeGeneratorResponse.decode(@res.encode)
@@ -1,4 +1,4 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
2
  require 'beefcake'
3
3
 
4
4
  class NumericsMessage
@@ -96,7 +96,13 @@ class LargeFieldNumberMessage
96
96
  required :field_2, :string, 100
97
97
  end
98
98
 
99
- class MessageTest < Test::Unit::TestCase
99
+ class FieldsMessage
100
+ include Beefcake::Message
101
+
102
+ repeated :fields, :string, 1
103
+ end
104
+
105
+ class MessageTest < Minitest::Test
100
106
  B = Beefcake::Buffer
101
107
 
102
108
  ## Encoding
@@ -258,6 +264,11 @@ class MessageTest < Test::Unit::TestCase
258
264
  assert_equal buf.to_s, msg.encode.to_s
259
265
  end
260
266
 
267
+ def test_encode_unknown_field
268
+ msg = SimpleMessage.new :mystery_field => 'asdf'
269
+ msg.encode.to_s
270
+ end
271
+
261
272
  ## Decoding
262
273
  def test_decode_numerics
263
274
  msg = NumericsMessage.new({
@@ -276,7 +287,7 @@ class MessageTest < Test::Unit::TestCase
276
287
 
277
288
  got = NumericsMessage.decode(msg.encode)
278
289
 
279
- msg.fields.values.each do |fld|
290
+ msg.__beefcake_fields__.values.each do |fld|
280
291
  assert_equal msg[fld.name], got[fld.name], fld.name
281
292
  end
282
293
  end
@@ -357,7 +368,14 @@ class MessageTest < Test::Unit::TestCase
357
368
  b = SimpleMessage.new :a => 1
358
369
  assert_equal a, b
359
370
  c = SimpleMessage.new :a => 2
360
- assert_not_equal b, c
371
+ refute_equal b, c
372
+
373
+ d = EnumsMessage.new :a => 5
374
+ e = EnumsDefaultMessage.new :a => 5
375
+
376
+ refute_equal d, e
377
+ refute_equal d, :symbol
378
+ refute_equal :symbol, d
361
379
  end
362
380
 
363
381
  def test_inspect
@@ -394,6 +412,17 @@ class MessageTest < Test::Unit::TestCase
394
412
  assert_equal(exp, msg.to_hash)
395
413
  end
396
414
 
415
+ def test_duplicate_index
416
+ assert_raises Beefcake::Message::DuplicateFieldNumber do
417
+ Class.new do
418
+ include Beefcake::Message
419
+
420
+ required :clever_name, :int32, 1
421
+ required :naughty_field, :string, 1
422
+ end
423
+ end
424
+ end
425
+
397
426
  def test_bool_to_hash
398
427
  true_message = BoolMessage.new :bool => true
399
428
  true_expectation = { :bool => true }
@@ -404,4 +433,14 @@ class MessageTest < Test::Unit::TestCase
404
433
  assert_equal false_expectation, false_message.to_hash
405
434
  end
406
435
 
436
+ def test_fields_named_fields
437
+ contents = %w{fields named fields}
438
+ msg = FieldsMessage.new fields: contents
439
+ assert_equal 1, msg.__beefcake_fields__.length
440
+ assert_equal contents, msg.fields
441
+
442
+ assert_equal msg, FieldsMessage.decode(msg.encode)
443
+
444
+ assert_equal "<FieldsMessage fields: [\"fields\", \"named\", \"fields\"]>", msg.inspect
445
+ end
407
446
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beefcake
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 1.0.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blake Mizerany
@@ -10,22 +10,36 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-12-20 00:00:00.000000000 Z
13
+ date: 2014-06-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - '='
19
+ - - "~>"
20
20
  - !ruby/object:Gem::Version
21
21
  version: 10.1.0
22
22
  type: :development
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - '='
26
+ - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: 10.1.0
29
+ - !ruby/object:Gem::Dependency
30
+ name: minitest
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '5.3'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '5.3'
29
43
  description: A sane protobuf library for Ruby
30
44
  email:
31
45
  - blake.mizerany@gmail.com
@@ -36,8 +50,8 @@ executables:
36
50
  extensions: []
37
51
  extra_rdoc_files: []
38
52
  files:
39
- - .gitignore
40
- - .travis.yml
53
+ - ".gitignore"
54
+ - ".travis.yml"
41
55
  - Gemfile
42
56
  - LICENSE
43
57
  - README.md
@@ -54,6 +68,7 @@ files:
54
68
  - lib/beefcake/buffer/encode.rb
55
69
  - lib/beefcake/generator.rb
56
70
  - lib/beefcake/version.rb
71
+ - test/benchmark_test.rb
57
72
  - test/buffer_decode_test.rb
58
73
  - test/buffer_encode_test.rb
59
74
  - test/buffer_test.rb
@@ -69,21 +84,22 @@ require_paths:
69
84
  - lib
70
85
  required_ruby_version: !ruby/object:Gem::Requirement
71
86
  requirements:
72
- - - '>='
87
+ - - ">="
73
88
  - !ruby/object:Gem::Version
74
- version: '0'
89
+ version: 1.9.3
75
90
  required_rubygems_version: !ruby/object:Gem::Requirement
76
91
  requirements:
77
- - - '>='
92
+ - - ">"
78
93
  - !ruby/object:Gem::Version
79
- version: '0'
94
+ version: 1.3.1
80
95
  requirements: []
81
- rubyforge_project: beefcake
82
- rubygems_version: 2.0.14
96
+ rubyforge_project:
97
+ rubygems_version: 2.2.2
83
98
  signing_key:
84
99
  specification_version: 4
85
100
  summary: A sane protobuf library for Ruby
86
101
  test_files:
102
+ - test/benchmark_test.rb
87
103
  - test/buffer_decode_test.rb
88
104
  - test/buffer_encode_test.rb
89
105
  - test/buffer_test.rb