prepor-beefcake 1.1.0 → 1.1.1
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 +4 -4
- data/.travis.yml +12 -2
- data/README.md +1 -2
- data/RELEASE_NOTES.md +13 -2
- data/beefcake.gemspec +2 -2
- data/lib/beefcake.rb +91 -6
- data/lib/beefcake/version.rb +1 -1
- data/test/message_test.rb +117 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 14f8f3b9ce47e2ce5d95ffbc30ac2cb85c9d16a9
|
|
4
|
+
data.tar.gz: b8438b597123b5a75e3e261255d93b36c959aff0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ef80c4dc456a091607a1626987d794a0c0ecf81ef7b6f3dcfa6d8e84562bb7ead6941a6d05cd399c1db72bcb64a7ccc6efc4781aae82898de28f40bb10a327e3
|
|
7
|
+
data.tar.gz: f4916f34a41889d77a55893f5f8160143bfe47af18e37f920c6ff1cc4ae2db35239d91fca0b8078b2d8f22f8b77dfe5231d39cffe0a0eeb0f68a70833bfee871
|
data/.travis.yml
CHANGED
|
@@ -3,6 +3,16 @@ rvm:
|
|
|
3
3
|
- 1.9.3
|
|
4
4
|
- 2.0.0
|
|
5
5
|
- 2.1.0
|
|
6
|
-
- 2.1.
|
|
7
|
-
- 2.
|
|
6
|
+
- 2.1.6
|
|
7
|
+
- 2.2.0
|
|
8
|
+
- 2.2.1
|
|
9
|
+
- 2.2.2
|
|
8
10
|
- jruby-19mode
|
|
11
|
+
- rbx-2.2.7
|
|
12
|
+
- jruby-9.0.0.0.pre2
|
|
13
|
+
- ruby-head
|
|
14
|
+
- jruby-head
|
|
15
|
+
matrix:
|
|
16
|
+
allow_failures:
|
|
17
|
+
- rvm: jruby-head
|
|
18
|
+
- rvm: ruby-head
|
data/README.md
CHANGED
data/RELEASE_NOTES.md
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
# Beefcake Release Notes
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# 1.1.0 - 2015-05-26
|
|
4
|
+
|
|
5
|
+
Release 1.1.0 includes improvements and bug fixes.
|
|
6
|
+
|
|
7
|
+
* Correct message-hash conversion behavior, fixed by Peter "kybu" Vrabel.
|
|
8
|
+
* Remove trailing whitespace in generator output without package name.
|
|
9
|
+
* Allow a Hash instead of an Array<Hash> when assigning a repeated field that's
|
|
10
|
+
only repeated once.
|
|
11
|
+
* Ensure object identities are persisted through message initialization,
|
|
12
|
+
reported by Peter Neubauer.
|
|
13
|
+
|
|
14
|
+
# 1.0.0 - 2014-09-05
|
|
4
15
|
|
|
5
16
|
Release 1.0.0 includes changes and improvements.
|
|
6
17
|
|
|
@@ -21,7 +32,7 @@ Release 0.5.0 corrects a few behaviors.
|
|
|
21
32
|
* Don't crash when attempting to reencode frozen strings,
|
|
22
33
|
found thanks to Kyle "Aphyr" Kingsbury
|
|
23
34
|
* Return `nil` instead of raising a generic Ruby error when trying to
|
|
24
|
-
decode a zero-length buffer, fixed by Tobias "grobie" Schmidt
|
|
35
|
+
decode a zero-length buffer, fixed by Tobias "grobie" Schmidt
|
|
25
36
|
|
|
26
37
|
# 0.4.0 - 2013-10-10
|
|
27
38
|
|
data/beefcake.gemspec
CHANGED
|
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
|
|
|
9
9
|
s.authors = ["Blake Mizerany", "Matt Proud", "Bryce Kerley"]
|
|
10
10
|
s.email = ["blake.mizerany@gmail.com", "matt.proud@gmail.com", "bkerley@brycekerley.net"]
|
|
11
11
|
s.homepage = "https://github.com/protobuf-ruby/beefcake"
|
|
12
|
-
s.summary = %q{A
|
|
13
|
-
s.description = %q{A
|
|
12
|
+
s.summary = %q{A pure-Ruby protobuf library}
|
|
13
|
+
s.description = %q{A pure-Ruby Protocol Buffers library}
|
|
14
14
|
s.license = 'MIT'
|
|
15
15
|
|
|
16
16
|
s.files = `git ls-files`.split("\n")
|
data/lib/beefcake.rb
CHANGED
|
@@ -33,6 +33,22 @@ module Beefcake
|
|
|
33
33
|
def <=>(o)
|
|
34
34
|
fn <=> o.fn
|
|
35
35
|
end
|
|
36
|
+
|
|
37
|
+
def same_type?(obj)
|
|
38
|
+
type == obj
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def matches_type?(obj)
|
|
42
|
+
obj.is_a? type
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def is_protobuf?
|
|
46
|
+
type.is_a?(Class) and type.include?(Beefcake::Message)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def required? ; rule == :required end
|
|
50
|
+
def repeated? ; rule == :repeated end
|
|
51
|
+
def optional? ; rule == :optional end
|
|
36
52
|
end
|
|
37
53
|
|
|
38
54
|
|
|
@@ -185,7 +201,8 @@ module Beefcake
|
|
|
185
201
|
end
|
|
186
202
|
elsif fld.rule == :repeated
|
|
187
203
|
val = buf.read(fld.type)
|
|
188
|
-
|
|
204
|
+
o[fld.name] ||= []
|
|
205
|
+
o[fld.name] << val
|
|
189
206
|
else
|
|
190
207
|
val = buf.read(fld.type)
|
|
191
208
|
o[fld.name] = val
|
|
@@ -224,10 +241,66 @@ module Beefcake
|
|
|
224
241
|
o.send(:include, Encode)
|
|
225
242
|
end
|
|
226
243
|
|
|
244
|
+
# (see #assign)
|
|
227
245
|
def initialize(attrs={})
|
|
246
|
+
assign attrs
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# Handles filling a protobuf message from a hash. Embedded messages can
|
|
250
|
+
# be passed in two ways, by a pure hash or as an instance of embedded class(es).
|
|
251
|
+
#
|
|
252
|
+
# @example By a pure hash.
|
|
253
|
+
# {:field1 => 2, :embedded => {:embedded_f1 => 'lala'}}
|
|
254
|
+
#
|
|
255
|
+
# @example Repeated embedded message by a pure hash.
|
|
256
|
+
# {:field1 => 2, :embedded => [
|
|
257
|
+
# {:embedded_f1 => 'lala'},
|
|
258
|
+
# {:embedded_f1 => 'lulu'}
|
|
259
|
+
# ]}
|
|
260
|
+
#
|
|
261
|
+
# @example As an instance of embedded class.
|
|
262
|
+
# {:field1 => 2, :embedded => EmbeddedMsg.new({:embedded_f1 => 'lala'})}
|
|
263
|
+
#
|
|
264
|
+
# @param [Hash] data to fill a protobuf message with.
|
|
265
|
+
def assign(attrs)
|
|
228
266
|
__beefcake_fields__.values.each do |fld|
|
|
229
|
-
|
|
267
|
+
attribute = attrs[fld.name]
|
|
268
|
+
|
|
269
|
+
if attribute.nil?
|
|
270
|
+
self[fld.name] = nil
|
|
271
|
+
next
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
unless fld.is_protobuf?
|
|
275
|
+
self[fld.name] = attribute
|
|
276
|
+
next
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
if fld.repeated? && attribute.is_a?(Hash)
|
|
280
|
+
self[fld.name] = fld.type.new(attribute)
|
|
281
|
+
next
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
if fld.repeated? && attribute.is_a?(fld.type)
|
|
285
|
+
self[fld.name] = [attribute]
|
|
286
|
+
next
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
if fld.repeated?
|
|
290
|
+
self[fld.name] = attribute.map do |i|
|
|
291
|
+
fld.matches_type?(i) ? i : fld.type.new(i)
|
|
292
|
+
end
|
|
293
|
+
next
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
if fld.matches_type? attribute
|
|
297
|
+
self[fld.name] = attribute
|
|
298
|
+
next
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
self[fld.name] = fld.type.new(attribute)
|
|
230
302
|
end
|
|
303
|
+
self
|
|
231
304
|
end
|
|
232
305
|
|
|
233
306
|
def __beefcake_fields__
|
|
@@ -270,10 +343,22 @@ module Beefcake
|
|
|
270
343
|
|
|
271
344
|
def to_hash
|
|
272
345
|
__beefcake_fields__.values.inject({}) do |h, fld|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
346
|
+
v = self[fld.name]
|
|
347
|
+
next h if v.nil?
|
|
348
|
+
|
|
349
|
+
h[fld.name] =
|
|
350
|
+
case
|
|
351
|
+
when v.respond_to?(:to_hash)
|
|
352
|
+
# A nested protobuf message, so let's call its 'to_hash' method.
|
|
353
|
+
v.to_hash
|
|
354
|
+
when v.is_a?(Array)
|
|
355
|
+
# There can be two field types stored in array.
|
|
356
|
+
# Primitive type or nested another protobuf message.
|
|
357
|
+
# The later one has got a 'to_hash' method.
|
|
358
|
+
v.map { |i| i.respond_to?(:to_hash) ? i.to_hash : i }
|
|
359
|
+
else
|
|
360
|
+
v
|
|
361
|
+
end
|
|
277
362
|
h
|
|
278
363
|
end
|
|
279
364
|
end
|
data/lib/beefcake/version.rb
CHANGED
data/test/message_test.rb
CHANGED
|
@@ -102,6 +102,70 @@ class FieldsMessage
|
|
|
102
102
|
repeated :fields, :string, 1
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
+
class FieldTest < Minitest::Test
|
|
106
|
+
FIELD = Beefcake::Message::Field
|
|
107
|
+
|
|
108
|
+
def test_required?
|
|
109
|
+
f = FIELD.new :required, :field1, :string, 1
|
|
110
|
+
assert f.required?
|
|
111
|
+
refute f.optional?
|
|
112
|
+
refute f.repeated?
|
|
113
|
+
|
|
114
|
+
f = FIELD.new :optional, :field1, :int32, 1
|
|
115
|
+
refute f.required?
|
|
116
|
+
|
|
117
|
+
f = FIELD.new :repeated, :field1, :int32, 1
|
|
118
|
+
refute f.required?
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_optional?
|
|
122
|
+
f = FIELD.new :optional, :field1, :string, 1
|
|
123
|
+
assert f.optional?
|
|
124
|
+
refute f.required?
|
|
125
|
+
refute f.repeated?
|
|
126
|
+
|
|
127
|
+
f = FIELD.new :required, :field1, :int32, 1
|
|
128
|
+
refute f.optional?
|
|
129
|
+
|
|
130
|
+
f = FIELD.new :repeated, :field1, :int32, 1
|
|
131
|
+
refute f.optional?
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_repeated?
|
|
135
|
+
f = FIELD.new :repeated, :field1, :string, 1
|
|
136
|
+
assert f.repeated?
|
|
137
|
+
refute f.required?
|
|
138
|
+
refute f.optional?
|
|
139
|
+
|
|
140
|
+
f = FIELD.new :optional, :field1, :int32, 1
|
|
141
|
+
refute f.repeated?
|
|
142
|
+
|
|
143
|
+
f = FIELD.new :required, :field1, :int32, 1
|
|
144
|
+
refute f.optional?
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def test_same_type
|
|
148
|
+
f = FIELD.new(:required, :field1, :int32, 1)
|
|
149
|
+
assert f.same_type?(:int32)
|
|
150
|
+
refute f.same_type?(:int64)
|
|
151
|
+
refute f.same_type?(SimpleMessage)
|
|
152
|
+
|
|
153
|
+
f = FIELD.new(:required, :field1, SimpleMessage, 1)
|
|
154
|
+
assert f.same_type?(SimpleMessage)
|
|
155
|
+
refute f.same_type?(:int32)
|
|
156
|
+
refute f.same_type?(:string)
|
|
157
|
+
refute f.same_type?(NumericsMessage)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_is_protobuf?
|
|
161
|
+
f = FIELD.new(:required, :field1, SimpleMessage, 1)
|
|
162
|
+
assert f.is_protobuf?
|
|
163
|
+
|
|
164
|
+
f = FIELD.new(:required, :field1, :string, 1)
|
|
165
|
+
refute f.is_protobuf?
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
105
169
|
class MessageTest < Minitest::Test
|
|
106
170
|
B = Beefcake::Buffer
|
|
107
171
|
|
|
@@ -163,6 +227,12 @@ class MessageTest < Minitest::Test
|
|
|
163
227
|
)
|
|
164
228
|
|
|
165
229
|
assert_equal buf2.to_s, msg.encode.to_s
|
|
230
|
+
|
|
231
|
+
msg = CompositeMessage.new(
|
|
232
|
+
:encodable => {:a => 123}
|
|
233
|
+
)
|
|
234
|
+
assert_equal buf2.to_s, msg.encode.to_s
|
|
235
|
+
|
|
166
236
|
end
|
|
167
237
|
|
|
168
238
|
def test_encode_to_string
|
|
@@ -196,6 +266,9 @@ class MessageTest < Minitest::Test
|
|
|
196
266
|
|
|
197
267
|
msg = EnumsMessage.new :a => EnumsMessage::X::A
|
|
198
268
|
assert_equal "\b\001", msg.encode.to_s
|
|
269
|
+
|
|
270
|
+
msg = EnumsMessage.new :a => 1
|
|
271
|
+
assert_equal "\b\001", msg.encode.to_s
|
|
199
272
|
end
|
|
200
273
|
|
|
201
274
|
def test_encode_invalid_enum_value
|
|
@@ -269,6 +342,16 @@ class MessageTest < Minitest::Test
|
|
|
269
342
|
msg.encode.to_s
|
|
270
343
|
end
|
|
271
344
|
|
|
345
|
+
def test_repeated_with_hash
|
|
346
|
+
before = { simple: { b: 'hello' } }
|
|
347
|
+
RepeatedNestedMessage.new before
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def test_repeated_with_scalar
|
|
351
|
+
inner = SimpleMessage.new(b: 'hello')
|
|
352
|
+
RepeatedNestedMessage.new simple: inner
|
|
353
|
+
end
|
|
354
|
+
|
|
272
355
|
## Decoding
|
|
273
356
|
def test_decode_numerics
|
|
274
357
|
msg = NumericsMessage.new({
|
|
@@ -361,6 +444,16 @@ class MessageTest < Minitest::Test
|
|
|
361
444
|
assert_equal 2, got.simple.size
|
|
362
445
|
assert_equal 1, got.simple[0].a
|
|
363
446
|
assert_equal "hello", got.simple[1].b
|
|
447
|
+
|
|
448
|
+
simple_pure = [
|
|
449
|
+
{:a => 1},
|
|
450
|
+
{:b => "hello"}
|
|
451
|
+
]
|
|
452
|
+
msg = RepeatedNestedMessage.new(:simple => simple_pure).encode
|
|
453
|
+
got = RepeatedNestedMessage.decode(msg)
|
|
454
|
+
assert_equal 2, got.simple.size
|
|
455
|
+
assert_equal 1, got.simple[0].a
|
|
456
|
+
assert_equal "hello", got.simple[1].b
|
|
364
457
|
end
|
|
365
458
|
|
|
366
459
|
def test_equality
|
|
@@ -378,6 +471,13 @@ class MessageTest < Minitest::Test
|
|
|
378
471
|
refute_equal :symbol, d
|
|
379
472
|
end
|
|
380
473
|
|
|
474
|
+
def test_object_identity
|
|
475
|
+
inside = [SimpleMessage.new(a: 12345)]
|
|
476
|
+
outside = RepeatedNestedMessage.new simple: inside
|
|
477
|
+
|
|
478
|
+
assert_equal outside.simple.first.object_id, inside.first.object_id
|
|
479
|
+
end
|
|
480
|
+
|
|
381
481
|
def test_inspect
|
|
382
482
|
msg = SimpleMessage.new :a => 1
|
|
383
483
|
assert_equal "<SimpleMessage a: 1>", msg.inspect
|
|
@@ -409,7 +509,23 @@ class MessageTest < Minitest::Test
|
|
|
409
509
|
def test_to_hash
|
|
410
510
|
msg = SimpleMessage.new :a => 1
|
|
411
511
|
exp = { :a => 1 }
|
|
412
|
-
assert_equal
|
|
512
|
+
assert_equal exp, msg.to_hash
|
|
513
|
+
|
|
514
|
+
msg = RepeatedNestedMessage.new(
|
|
515
|
+
:simple => [
|
|
516
|
+
SimpleMessage.new(:a => 1),
|
|
517
|
+
SimpleMessage.new(:b => 'abc dfg'),
|
|
518
|
+
SimpleMessage.new(:a => 2, :b => 'ijk lmn')
|
|
519
|
+
]
|
|
520
|
+
)
|
|
521
|
+
exp = {
|
|
522
|
+
:simple =>[
|
|
523
|
+
{:a => 1},
|
|
524
|
+
{:b => 'abc dfg'},
|
|
525
|
+
{:a => 2, :b => 'ijk lmn'}
|
|
526
|
+
]
|
|
527
|
+
}
|
|
528
|
+
assert_equal exp, msg.to_hash
|
|
413
529
|
end
|
|
414
530
|
|
|
415
531
|
def test_duplicate_index
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: prepor-beefcake
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Blake Mizerany
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2015-
|
|
13
|
+
date: 2015-06-01 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: rake
|
|
@@ -40,7 +40,7 @@ dependencies:
|
|
|
40
40
|
- - "~>"
|
|
41
41
|
- !ruby/object:Gem::Version
|
|
42
42
|
version: '5.3'
|
|
43
|
-
description: A
|
|
43
|
+
description: A pure-Ruby Protocol Buffers library
|
|
44
44
|
email:
|
|
45
45
|
- blake.mizerany@gmail.com
|
|
46
46
|
- matt.proud@gmail.com
|
|
@@ -97,7 +97,7 @@ rubyforge_project:
|
|
|
97
97
|
rubygems_version: 2.4.3
|
|
98
98
|
signing_key:
|
|
99
99
|
specification_version: 4
|
|
100
|
-
summary: A
|
|
100
|
+
summary: A pure-Ruby protobuf library
|
|
101
101
|
test_files:
|
|
102
102
|
- test/benchmark_test.rb
|
|
103
103
|
- test/buffer_decode_test.rb
|