beefcake 0.1.0
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.
- data/LICENSE +22 -0
- data/README.md +126 -0
- data/lib/beefcake.rb +203 -0
- data/lib/beefcake/buffer.rb +2 -0
- data/lib/beefcake/buffer/base.rb +92 -0
- data/lib/beefcake/buffer/decode.rb +101 -0
- data/lib/beefcake/buffer/encode.rb +115 -0
- data/test/buffer_decode_test.rb +114 -0
- data/test/buffer_encode_test.rb +222 -0
- data/test/buffer_test.rb +44 -0
- data/test/message_test.rb +280 -0
- metadata +122 -0
data/test/buffer_test.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'beefcake/buffer'
|
2
|
+
|
3
|
+
class BufferTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@buf = Beefcake::Buffer.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_simple
|
10
|
+
assert_equal "", @buf.to_s
|
11
|
+
|
12
|
+
@buf << "asdf"
|
13
|
+
assert_equal "asdf", @buf.to_s
|
14
|
+
assert_equal "asdf", @buf.to_str
|
15
|
+
|
16
|
+
@buf.buf = ""
|
17
|
+
assert_equal "", @buf.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_wire_for
|
21
|
+
assert_equal 0, Beefcake::Buffer.wire_for(:int32)
|
22
|
+
assert_equal 0, Beefcake::Buffer.wire_for(:uint32)
|
23
|
+
assert_equal 0, Beefcake::Buffer.wire_for(:sint32)
|
24
|
+
assert_equal 0, Beefcake::Buffer.wire_for(:int64)
|
25
|
+
assert_equal 0, Beefcake::Buffer.wire_for(:uint64)
|
26
|
+
assert_equal 0, Beefcake::Buffer.wire_for(:sint64)
|
27
|
+
|
28
|
+
assert_equal 1, Beefcake::Buffer.wire_for(:fixed64)
|
29
|
+
assert_equal 1, Beefcake::Buffer.wire_for(:sfixed64)
|
30
|
+
assert_equal 1, Beefcake::Buffer.wire_for(:double)
|
31
|
+
|
32
|
+
assert_equal 2, Beefcake::Buffer.wire_for(:string)
|
33
|
+
assert_equal 2, Beefcake::Buffer.wire_for(:bytes)
|
34
|
+
|
35
|
+
assert_equal 5, Beefcake::Buffer.wire_for(:fixed32)
|
36
|
+
assert_equal 5, Beefcake::Buffer.wire_for(:sfixed32)
|
37
|
+
assert_equal 5, Beefcake::Buffer.wire_for(:float)
|
38
|
+
|
39
|
+
assert_raises Beefcake::Buffer::UnknownType do
|
40
|
+
Beefcake::Buffer.wire_for(:asdf)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,280 @@
|
|
1
|
+
require 'beefcake'
|
2
|
+
|
3
|
+
class NumericsMessage
|
4
|
+
include Beefcake::Message
|
5
|
+
|
6
|
+
required :int32, :int32, 1
|
7
|
+
required :uint32, :uint32, 2
|
8
|
+
required :sint32, :sint32, 3
|
9
|
+
required :fixed32, :fixed32, 4
|
10
|
+
required :sfixed32, :sfixed32, 5
|
11
|
+
|
12
|
+
required :int64, :int64, 6
|
13
|
+
required :uint64, :uint64, 7
|
14
|
+
required :sint64, :sint64, 8
|
15
|
+
required :fixed64, :fixed64, 9
|
16
|
+
required :sfixed64, :sfixed64, 10
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
class LendelsMessage
|
21
|
+
include Beefcake::Message
|
22
|
+
|
23
|
+
required :string, :string, 1
|
24
|
+
required :bytes, :bytes, 2
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
class SimpleMessage
|
29
|
+
include Beefcake::Message
|
30
|
+
|
31
|
+
optional :a, :int32, 1
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
class CompositeMessage
|
36
|
+
include Beefcake::Message
|
37
|
+
|
38
|
+
required :encodable, SimpleMessage, 1
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
class EnumsMessage
|
43
|
+
include Beefcake::Message
|
44
|
+
|
45
|
+
module X
|
46
|
+
A = 1
|
47
|
+
end
|
48
|
+
|
49
|
+
required :a, X, 1
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
class EnumsDefaultMessage
|
54
|
+
include Beefcake::Message
|
55
|
+
|
56
|
+
module X
|
57
|
+
A = 1
|
58
|
+
B = 2
|
59
|
+
end
|
60
|
+
|
61
|
+
optional :a, X, 1, :default => X::B
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
class RepeatedMessage
|
66
|
+
include Beefcake::Message
|
67
|
+
|
68
|
+
repeated :a, :int32, 1
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
class PackedRepeatedMessage
|
73
|
+
include Beefcake::Message
|
74
|
+
|
75
|
+
repeated :a, :int32, 1, :packed => true
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
class MessageTest < Test::Unit::TestCase
|
80
|
+
B = Beefcake::Buffer
|
81
|
+
|
82
|
+
## Encoding
|
83
|
+
def test_encode_numerics
|
84
|
+
buf = Beefcake::Buffer.new
|
85
|
+
|
86
|
+
buf.append(:int32, B::MaxInt32, 1)
|
87
|
+
buf.append(:uint32, B::MaxUint32, 2)
|
88
|
+
buf.append(:sint32, B::MinInt32, 3)
|
89
|
+
buf.append(:fixed32, B::MaxInt32, 4)
|
90
|
+
buf.append(:sfixed32, B::MinInt32, 5)
|
91
|
+
buf.append(:int64, B::MaxInt64, 6)
|
92
|
+
buf.append(:uint64, B::MaxUint64, 7)
|
93
|
+
buf.append(:sint64, B::MinInt64, 8)
|
94
|
+
buf.append(:fixed64, B::MaxInt64, 9)
|
95
|
+
buf.append(:sfixed64, B::MinInt64, 10)
|
96
|
+
|
97
|
+
msg = NumericsMessage.new({
|
98
|
+
:int32 => B::MaxInt32,
|
99
|
+
:uint32 => B::MaxUint32,
|
100
|
+
:sint32 => B::MinInt32,
|
101
|
+
:fixed32 => B::MaxInt32,
|
102
|
+
:sfixed32 => B::MinInt32,
|
103
|
+
|
104
|
+
:int64 => B::MaxInt64,
|
105
|
+
:uint64 => B::MaxUint64,
|
106
|
+
:sint64 => B::MinInt64,
|
107
|
+
:fixed64 => B::MaxInt64,
|
108
|
+
:sfixed64 => B::MinInt64
|
109
|
+
})
|
110
|
+
|
111
|
+
assert_equal buf.to_s, msg.encode.to_s
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_encode_strings
|
115
|
+
buf = Beefcake::Buffer.new
|
116
|
+
|
117
|
+
buf.append(:string, "testing", 1)
|
118
|
+
buf.append(:bytes, "unixisawesome", 2)
|
119
|
+
|
120
|
+
msg = LendelsMessage.new({
|
121
|
+
:string => "testing",
|
122
|
+
:bytes => "unixisawesome"
|
123
|
+
})
|
124
|
+
|
125
|
+
assert_equal buf.to_s, msg.encode.to_s
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_encode_string_composite
|
129
|
+
buf1 = Beefcake::Buffer.new
|
130
|
+
buf1.append(:int32, 123, 1)
|
131
|
+
|
132
|
+
buf2 = Beefcake::Buffer.new
|
133
|
+
buf2.append(:string, buf1, 1)
|
134
|
+
|
135
|
+
msg = CompositeMessage.new(
|
136
|
+
:encodable => SimpleMessage.new(:a => 123)
|
137
|
+
)
|
138
|
+
|
139
|
+
assert_equal buf2.to_s, msg.encode.to_s
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_encode_to_string
|
143
|
+
msg = SimpleMessage.new :a => 123
|
144
|
+
str = ""
|
145
|
+
msg.encode(str)
|
146
|
+
assert_equal "\b{", str
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_encode_enum
|
150
|
+
buf = Beefcake::Buffer.new
|
151
|
+
buf.append(:int32, 2, 1)
|
152
|
+
|
153
|
+
msg = EnumsMessage.new :a => EnumsMessage::X::A
|
154
|
+
assert_equal "\b\001", msg.encode.to_s
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_encode_invalid_enum_value
|
158
|
+
assert_raises Beefcake::Message::InvalidValueError do
|
159
|
+
EnumsMessage.new(:a => 99).encode
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_encode_unset_required_field
|
164
|
+
assert_raises Beefcake::Message::RequiredFieldNotSetError do
|
165
|
+
NumericsMessage.new.encode
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_encode_repeated_field
|
170
|
+
buf = Beefcake::Buffer.new
|
171
|
+
|
172
|
+
buf.append(:int32, 1, 1)
|
173
|
+
buf.append(:int32, 2, 1)
|
174
|
+
buf.append(:int32, 3, 1)
|
175
|
+
buf.append(:int32, 4, 1)
|
176
|
+
buf.append(:int32, 5, 1)
|
177
|
+
|
178
|
+
msg = RepeatedMessage.new :a => [1, 2, 3, 4, 5]
|
179
|
+
|
180
|
+
assert_equal buf.to_s, msg.encode.to_s
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_encode_packed_repeated_field
|
184
|
+
buf = Beefcake::Buffer.new
|
185
|
+
|
186
|
+
# Varint
|
187
|
+
buf.append_info(1, 0)
|
188
|
+
|
189
|
+
# Give size in bytes
|
190
|
+
buf.append_uint64 5
|
191
|
+
|
192
|
+
# Values
|
193
|
+
buf.append_int32 1
|
194
|
+
buf.append_int32 2
|
195
|
+
buf.append_int32 3
|
196
|
+
buf.append_int32 4
|
197
|
+
buf.append_int32 5
|
198
|
+
|
199
|
+
msg = PackedRepeatedMessage.new :a => [1, 2, 3, 4, 5]
|
200
|
+
|
201
|
+
assert_equal buf.to_s, msg.encode.to_s
|
202
|
+
end
|
203
|
+
|
204
|
+
## Decoding
|
205
|
+
def test_decode_numerics
|
206
|
+
msg = NumericsMessage.new({
|
207
|
+
:int32 => B::MaxInt32,
|
208
|
+
:uint32 => B::MaxUint32,
|
209
|
+
:sint32 => B::MinInt32,
|
210
|
+
:fixed32 => B::MaxInt32,
|
211
|
+
:sfixed32 => B::MinInt32,
|
212
|
+
|
213
|
+
:int64 => B::MaxInt64,
|
214
|
+
:uint64 => B::MaxUint64,
|
215
|
+
:sint64 => B::MinInt64,
|
216
|
+
:fixed64 => B::MaxInt64,
|
217
|
+
:sfixed64 => B::MinInt64
|
218
|
+
})
|
219
|
+
|
220
|
+
got = NumericsMessage.decode(msg.encode)
|
221
|
+
|
222
|
+
msg.fields.values.each do |fld|
|
223
|
+
assert_equal msg[fld.name], got[fld.name], fld.name
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_wire_does_not_match_decoded_info
|
228
|
+
buf = Beefcake::Buffer.new
|
229
|
+
buf.append(:string, "testing", 1)
|
230
|
+
|
231
|
+
assert_raises Beefcake::Message::WrongTypeError do
|
232
|
+
SimpleMessage.decode(buf)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_decode_unknown_field_number
|
237
|
+
buf = Beefcake::Buffer.new
|
238
|
+
buf.append(:string, "testing", 2)
|
239
|
+
|
240
|
+
msg = SimpleMessage.decode(buf)
|
241
|
+
|
242
|
+
assert_equal nil, msg.a
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_decode_repeated_field
|
246
|
+
msg = RepeatedMessage.new :a => [1, 2, 3, 4, 5]
|
247
|
+
got = RepeatedMessage.decode(msg.encode)
|
248
|
+
|
249
|
+
assert_equal msg.a, got.a
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_decode_packed_repeated_field
|
253
|
+
msg = PackedRepeatedMessage.new :a => [1, 2, 3, 4, 5]
|
254
|
+
got = PackedRepeatedMessage.decode(msg.encode)
|
255
|
+
|
256
|
+
assert_equal msg.a, got.a
|
257
|
+
end
|
258
|
+
|
259
|
+
def test_decode_merge
|
260
|
+
a = SimpleMessage.new :a => 1
|
261
|
+
b = SimpleMessage.new :a => 2
|
262
|
+
|
263
|
+
x = SimpleMessage.decode(a.encode)
|
264
|
+
SimpleMessage.decode(b.encode, x)
|
265
|
+
|
266
|
+
assert_equal b.a, x.a
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_decode_default
|
270
|
+
got = EnumsDefaultMessage.decode("")
|
271
|
+
assert_equal EnumsDefaultMessage.fields[1].opts[:default], got.a
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_decode_unset_required_fields
|
275
|
+
assert_raises Beefcake::Message::RequiredFieldNotSetError do
|
276
|
+
NumericsMessage.decode("")
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: beefcake
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Blake Mizerany
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-01-21 00:00:00 -08:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: crack
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 1
|
30
|
+
- 4
|
31
|
+
version: 0.1.4
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: ruby-hmac
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 3
|
44
|
+
- 2
|
45
|
+
version: 0.3.2
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: contest
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
- 1
|
58
|
+
- 2
|
59
|
+
version: 0.1.2
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
62
|
+
description: A sane protobuf library for Ruby
|
63
|
+
email:
|
64
|
+
executables: []
|
65
|
+
|
66
|
+
extensions: []
|
67
|
+
|
68
|
+
extra_rdoc_files:
|
69
|
+
- README.md
|
70
|
+
- LICENSE
|
71
|
+
files:
|
72
|
+
- LICENSE
|
73
|
+
- README.md
|
74
|
+
- lib/beefcake/buffer/base.rb
|
75
|
+
- lib/beefcake/buffer/decode.rb
|
76
|
+
- lib/beefcake/buffer/encode.rb
|
77
|
+
- lib/beefcake/buffer.rb
|
78
|
+
- lib/beefcake.rb
|
79
|
+
- test/buffer_decode_test.rb
|
80
|
+
- test/buffer_encode_test.rb
|
81
|
+
- test/buffer_test.rb
|
82
|
+
- test/message_test.rb
|
83
|
+
has_rdoc: true
|
84
|
+
homepage: http://github.com/bmizerany/beefcake
|
85
|
+
licenses: []
|
86
|
+
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options:
|
89
|
+
- --line-numbers
|
90
|
+
- --inline-source
|
91
|
+
- --title
|
92
|
+
- Sinatra
|
93
|
+
- --main
|
94
|
+
- README.rdoc
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
segments:
|
109
|
+
- 0
|
110
|
+
version: "0"
|
111
|
+
requirements: []
|
112
|
+
|
113
|
+
rubyforge_project: beefcake
|
114
|
+
rubygems_version: 1.3.6
|
115
|
+
signing_key:
|
116
|
+
specification_version: 2
|
117
|
+
summary: A sane protobuf library for Ruby
|
118
|
+
test_files:
|
119
|
+
- test/buffer_decode_test.rb
|
120
|
+
- test/buffer_encode_test.rb
|
121
|
+
- test/buffer_test.rb
|
122
|
+
- test/message_test.rb
|