beefcake 0.5.0 → 1.0.0.pre2

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
  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