beefcake 1.0.0 → 1.1.0.pre1
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 +9 -2
- data/lib/beefcake.rb +87 -6
- data/lib/beefcake/version.rb +1 -1
- data/test/message_test.rb +110 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30ed4bf45f17475a8deb5a11bf4b53cecae450b8
|
4
|
+
data.tar.gz: bd1faca7f9bb8691ef60b3c0a1b7ae0b4d08ec98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21fa7ab6f0d1dc688bda21ca235ccf4cafdcf642431923944661b591f336105f349ac52d06fe98d95cdbf5acb4582b7804dc79606c731e6366797f286fe8415a
|
7
|
+
data.tar.gz: 2c3e38af30b33354952d1fc7897db4a1bcc105e12e92ac73ec4fc8c5e70dcf4602959c8e6046bdbc31cc924621aa488683ed62a7d55c7160745f776d6899bd00
|
data/.travis.yml
CHANGED
data/lib/beefcake.rb
CHANGED
@@ -33,6 +33,18 @@ 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 is_protobuf?
|
42
|
+
type.is_a?(Class) and type.include?(Beefcake::Message)
|
43
|
+
end
|
44
|
+
|
45
|
+
def required? ; rule == :required end
|
46
|
+
def repeated? ; rule == :repeated end
|
47
|
+
def optional? ; rule == :optional end
|
36
48
|
end
|
37
49
|
|
38
50
|
|
@@ -185,7 +197,8 @@ module Beefcake
|
|
185
197
|
end
|
186
198
|
elsif fld.rule == :repeated
|
187
199
|
val = buf.read(fld.type)
|
188
|
-
|
200
|
+
o[fld.name] ||= []
|
201
|
+
o[fld.name] << val
|
189
202
|
else
|
190
203
|
val = buf.read(fld.type)
|
191
204
|
o[fld.name] = val
|
@@ -224,10 +237,66 @@ module Beefcake
|
|
224
237
|
o.send(:include, Encode)
|
225
238
|
end
|
226
239
|
|
240
|
+
# (see #assign)
|
227
241
|
def initialize(attrs={})
|
242
|
+
assign attrs
|
243
|
+
end
|
244
|
+
|
245
|
+
# Handles filling a protobuf message from a hash. Embedded messages can
|
246
|
+
# be passed in two ways, by a pure hash or as an instance of embedded class(es).
|
247
|
+
#
|
248
|
+
# @example By a pure hash.
|
249
|
+
# {:field1 => 2, :embedded => {:embedded_f1 => 'lala'}}
|
250
|
+
#
|
251
|
+
# @example Repeated embedded message by a pure hash.
|
252
|
+
# {:field1 => 2, :embedded => [
|
253
|
+
# {:embedded_f1 => 'lala'},
|
254
|
+
# {:embedded_f1 => 'lulu'}
|
255
|
+
# ]}
|
256
|
+
#
|
257
|
+
# @example As an instance of embedded class.
|
258
|
+
# {:field1 => 2, :embedded => EmbeddedMsg.new({:embedded_f1 => 'lala'})}
|
259
|
+
#
|
260
|
+
# @param [Hash] data to fill a protobuf message with.
|
261
|
+
def assign(attrs)
|
228
262
|
__beefcake_fields__.values.each do |fld|
|
229
|
-
|
263
|
+
attribute = attrs[fld.name]
|
264
|
+
|
265
|
+
if attribute.nil?
|
266
|
+
self[fld.name] = nil
|
267
|
+
next
|
268
|
+
end
|
269
|
+
|
270
|
+
unless fld.is_protobuf?
|
271
|
+
self[fld.name] = attribute
|
272
|
+
next
|
273
|
+
end
|
274
|
+
|
275
|
+
if fld.repeated? && attribute.is_a?(Hash)
|
276
|
+
self[fld.name] = fld.type.new(attribute)
|
277
|
+
next
|
278
|
+
end
|
279
|
+
|
280
|
+
if fld.repeated? && attribute.is_a?(fld.type)
|
281
|
+
self[fld.name] = [attribute]
|
282
|
+
next
|
283
|
+
end
|
284
|
+
|
285
|
+
if fld.repeated?
|
286
|
+
self[fld.name] = attribute.map do |i|
|
287
|
+
fld.same_type?(i) ? i : fld.type.new(i)
|
288
|
+
end
|
289
|
+
next
|
290
|
+
end
|
291
|
+
|
292
|
+
if fld.same_type? attribute
|
293
|
+
self[fld.name] = attribute
|
294
|
+
next
|
295
|
+
end
|
296
|
+
|
297
|
+
self[fld.name] = fld.type.new(attribute)
|
230
298
|
end
|
299
|
+
self
|
231
300
|
end
|
232
301
|
|
233
302
|
def __beefcake_fields__
|
@@ -270,10 +339,22 @@ module Beefcake
|
|
270
339
|
|
271
340
|
def to_hash
|
272
341
|
__beefcake_fields__.values.inject({}) do |h, fld|
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
342
|
+
v = self[fld.name]
|
343
|
+
next h if v.nil?
|
344
|
+
|
345
|
+
h[fld.name] =
|
346
|
+
case
|
347
|
+
when v.respond_to?(:to_hash)
|
348
|
+
# A nested protobuf message, so let's call its 'to_hash' method.
|
349
|
+
v.to_hash
|
350
|
+
when v.is_a?(Array)
|
351
|
+
# There can be two field types stored in array.
|
352
|
+
# Primitive type or nested another protobuf message.
|
353
|
+
# The later one has got a 'to_hash' method.
|
354
|
+
v.map { |i| i.respond_to?(:to_hash) ? i.to_hash : i }
|
355
|
+
else
|
356
|
+
v
|
357
|
+
end
|
277
358
|
h
|
278
359
|
end
|
279
360
|
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
|
@@ -409,7 +502,23 @@ class MessageTest < Minitest::Test
|
|
409
502
|
def test_to_hash
|
410
503
|
msg = SimpleMessage.new :a => 1
|
411
504
|
exp = { :a => 1 }
|
412
|
-
assert_equal
|
505
|
+
assert_equal exp, msg.to_hash
|
506
|
+
|
507
|
+
msg = RepeatedNestedMessage.new(
|
508
|
+
:simple => [
|
509
|
+
SimpleMessage.new(:a => 1),
|
510
|
+
SimpleMessage.new(:b => 'abc dfg'),
|
511
|
+
SimpleMessage.new(:a => 2, :b => 'ijk lmn')
|
512
|
+
]
|
513
|
+
)
|
514
|
+
exp = {
|
515
|
+
:simple =>[
|
516
|
+
{:a => 1},
|
517
|
+
{:b => 'abc dfg'},
|
518
|
+
{:a => 2, :b => 'ijk lmn'}
|
519
|
+
]
|
520
|
+
}
|
521
|
+
assert_equal exp, msg.to_hash
|
413
522
|
end
|
414
523
|
|
415
524
|
def test_duplicate_index
|
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: 1.0.
|
4
|
+
version: 1.1.0.pre1
|
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:
|
13
|
+
date: 2015-01-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -89,12 +89,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
89
|
version: 1.9.3
|
90
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
|
-
- - "
|
92
|
+
- - ">"
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
94
|
+
version: 1.3.1
|
95
95
|
requirements: []
|
96
96
|
rubyforge_project:
|
97
|
-
rubygems_version: 2.
|
97
|
+
rubygems_version: 2.4.5
|
98
98
|
signing_key:
|
99
99
|
specification_version: 4
|
100
100
|
summary: A sane protobuf library for Ruby
|