msgpack 0.6.0-x86-mswin32-60
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 +7 -0
- data/.gitignore +20 -0
- data/.travis.yml +26 -0
- data/ChangeLog +129 -0
- data/Dockerfile +62 -0
- data/LICENSE +177 -0
- data/README.rdoc +141 -0
- data/Rakefile +68 -0
- data/bench/pack.rb +23 -0
- data/bench/pack_log.rb +33 -0
- data/bench/pack_log_long.rb +65 -0
- data/bench/run.sh +14 -0
- data/bench/run_long.sh +35 -0
- data/bench/unpack.rb +21 -0
- data/bench/unpack_log.rb +34 -0
- data/bench/unpack_log_long.rb +67 -0
- data/doclib/msgpack.rb +77 -0
- data/doclib/msgpack/buffer.rb +193 -0
- data/doclib/msgpack/core_ext.rb +101 -0
- data/doclib/msgpack/error.rb +14 -0
- data/doclib/msgpack/packer.rb +134 -0
- data/doclib/msgpack/unpacker.rb +146 -0
- data/ext/java/org/msgpack/jruby/Buffer.java +221 -0
- data/ext/java/org/msgpack/jruby/Decoder.java +201 -0
- data/ext/java/org/msgpack/jruby/Encoder.java +308 -0
- data/ext/java/org/msgpack/jruby/ExtensionValue.java +136 -0
- data/ext/java/org/msgpack/jruby/MessagePackLibrary.java +107 -0
- data/ext/java/org/msgpack/jruby/Packer.java +78 -0
- data/ext/java/org/msgpack/jruby/Types.java +37 -0
- data/ext/java/org/msgpack/jruby/Unpacker.java +170 -0
- data/ext/msgpack/buffer.c +695 -0
- data/ext/msgpack/buffer.h +447 -0
- data/ext/msgpack/buffer_class.c +507 -0
- data/ext/msgpack/buffer_class.h +32 -0
- data/ext/msgpack/compat.h +114 -0
- data/ext/msgpack/core_ext.c +129 -0
- data/ext/msgpack/core_ext.h +26 -0
- data/ext/msgpack/extconf.rb +30 -0
- data/ext/msgpack/packer.c +168 -0
- data/ext/msgpack/packer.h +441 -0
- data/ext/msgpack/packer_class.c +302 -0
- data/ext/msgpack/packer_class.h +30 -0
- data/ext/msgpack/rbinit.c +33 -0
- data/ext/msgpack/rmem.c +94 -0
- data/ext/msgpack/rmem.h +109 -0
- data/ext/msgpack/sysdep.h +115 -0
- data/ext/msgpack/sysdep_endian.h +50 -0
- data/ext/msgpack/sysdep_types.h +46 -0
- data/ext/msgpack/unpacker.c +771 -0
- data/ext/msgpack/unpacker.h +122 -0
- data/ext/msgpack/unpacker_class.c +405 -0
- data/ext/msgpack/unpacker_class.h +32 -0
- data/lib/msgpack.rb +13 -0
- data/lib/msgpack/version.rb +3 -0
- data/msgpack.gemspec +31 -0
- data/msgpack.org.md +46 -0
- data/spec/cases.json +1 -0
- data/spec/cases.msg +0 -0
- data/spec/cases_compact.msg +0 -0
- data/spec/cases_spec.rb +39 -0
- data/spec/cruby/buffer_io_spec.rb +256 -0
- data/spec/cruby/buffer_packer.rb +29 -0
- data/spec/cruby/buffer_spec.rb +572 -0
- data/spec/cruby/buffer_unpacker.rb +19 -0
- data/spec/cruby/packer_spec.rb +120 -0
- data/spec/cruby/unpacker_spec.rb +305 -0
- data/spec/format_spec.rb +282 -0
- data/spec/jruby/benchmarks/shootout_bm.rb +73 -0
- data/spec/jruby/benchmarks/symbolize_keys_bm.rb +25 -0
- data/spec/jruby/msgpack/unpacker_spec.rb +290 -0
- data/spec/jruby/msgpack_spec.rb +142 -0
- data/spec/pack_spec.rb +67 -0
- data/spec/random_compat.rb +24 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/unpack_spec.rb +60 -0
- metadata +208 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
/*
|
2
|
+
* MessagePack for Ruby
|
3
|
+
*
|
4
|
+
* Copyright (C) 2008-2013 Sadayuki Furuhashi
|
5
|
+
*
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
* you may not use this file except in compliance with the License.
|
8
|
+
* You may obtain a copy of the License at
|
9
|
+
*
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
*
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
* See the License for the specific language governing permissions and
|
16
|
+
* limitations under the License.
|
17
|
+
*/
|
18
|
+
#ifndef MSGPACK_RUBY_UNPACKER_CLASS_H__
|
19
|
+
#define MSGPACK_RUBY_UNPACKER_CLASS_H__
|
20
|
+
|
21
|
+
#include "unpacker.h"
|
22
|
+
|
23
|
+
extern VALUE cMessagePack_Unpacker;
|
24
|
+
|
25
|
+
void MessagePack_Unpacker_module_init(VALUE mMessagePack);
|
26
|
+
|
27
|
+
VALUE MessagePack_unpack(int argc, VALUE* argv);
|
28
|
+
|
29
|
+
void MessagePack_Unpacker_initialize(msgpack_unpacker_t* uk, VALUE io, VALUE options);
|
30
|
+
|
31
|
+
#endif
|
32
|
+
|
data/lib/msgpack.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "msgpack/version"
|
2
|
+
|
3
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" # This is same with `/java/ =~ RUBY_VERSION`
|
4
|
+
require "java"
|
5
|
+
require "msgpack/msgpack.jar"
|
6
|
+
org.msgpack.jruby.MessagePackLibrary.new.load(JRuby.runtime, false)
|
7
|
+
else
|
8
|
+
begin
|
9
|
+
require "msgpack/#{RUBY_VERSION[/\d+.\d+/]}/msgpack"
|
10
|
+
rescue LoadError
|
11
|
+
require "msgpack/msgpack"
|
12
|
+
end
|
13
|
+
end
|
data/msgpack.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
$LOAD_PATH.push File.expand_path("../lib", __FILE__)
|
2
|
+
require 'msgpack/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "msgpack"
|
6
|
+
s.version = MessagePack::VERSION
|
7
|
+
s.summary = "MessagePack, a binary-based efficient data interchange format."
|
8
|
+
s.description = %q{MessagePack is a binary-based efficient object serialization library. It enables to exchange structured objects between many languages like JSON. But unlike JSON, it is very fast and small.}
|
9
|
+
s.authors = ["Sadayuki Furuhashi", "Theo Hultberg"]
|
10
|
+
s.email = ["frsyuki@gmail.com", "theo@iconara.net"]
|
11
|
+
s.license = "Apache 2.0"
|
12
|
+
s.homepage = "http://msgpack.org/"
|
13
|
+
s.rubyforge_project = "msgpack"
|
14
|
+
s.has_rdoc = false
|
15
|
+
s.require_paths = ["lib"]
|
16
|
+
if /java/ =~ RUBY_PLATFORM
|
17
|
+
s.files = Dir['lib/**/*.rb', 'lib/**/*.jar']
|
18
|
+
s.platform = Gem::Platform.new('java')
|
19
|
+
else
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.extensions = ["ext/msgpack/extconf.rb"]
|
22
|
+
end
|
23
|
+
s.test_files = `git ls-files -- {test,spec}/*`.split("\n")
|
24
|
+
|
25
|
+
s.add_development_dependency 'bundler', ['~> 1.0']
|
26
|
+
s.add_development_dependency 'rake', ['~> 0.9.2']
|
27
|
+
s.add_development_dependency 'rake-compiler', ['~> 0.8.3']
|
28
|
+
s.add_development_dependency 'rspec', ['~> 2.11']
|
29
|
+
s.add_development_dependency 'json', ['~> 1.7']
|
30
|
+
s.add_development_dependency 'yard', ['~> 0.8.2']
|
31
|
+
end
|
data/msgpack.org.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# MessagePack for Ruby
|
2
|
+
|
3
|
+
```
|
4
|
+
require 'msgpack'
|
5
|
+
msg = [1,2,3].to_msgpack #=> "\x93\x01\x02\x03"
|
6
|
+
MessagePack.unpack(msg) #=> [1,2,3]
|
7
|
+
```
|
8
|
+
|
9
|
+
## Install
|
10
|
+
|
11
|
+
```
|
12
|
+
gem install msgpack
|
13
|
+
```
|
14
|
+
|
15
|
+
## Use cases
|
16
|
+
|
17
|
+
* Create REST API returing MessagePack using Rails + [RABL](https://github.com/nesquena/rabl)
|
18
|
+
* Store objects efficiently in memcached or Redis
|
19
|
+
* Upload data in efficient format from mobile devices. See also MessagePack for [Objective-C](https://github.com/msgpack/msgpack-objectivec) and [Java](https://github.com/msgpack/msgpack-java)
|
20
|
+
|
21
|
+
## Links
|
22
|
+
|
23
|
+
* [Github](https://github.com/msgpack/msgpack-ruby)
|
24
|
+
* [API document](http://ruby.msgpack.org/)
|
25
|
+
|
26
|
+
## Streaming API
|
27
|
+
|
28
|
+
```
|
29
|
+
# serialize a 2-element array [e1, e2]
|
30
|
+
pk = MessagePack::Packer.new(io)
|
31
|
+
pk.write_array_header(2).write(e1).write(e2).flush
|
32
|
+
```
|
33
|
+
|
34
|
+
```
|
35
|
+
# deserialize objects from an IO
|
36
|
+
u = MessagePack::Unpacker.new(io)
|
37
|
+
u.each { |obj| ... }
|
38
|
+
```
|
39
|
+
|
40
|
+
```
|
41
|
+
# event-driven deserialization
|
42
|
+
def on_read(data)
|
43
|
+
@u ||= MessagePack::Unpacker.new
|
44
|
+
@u.feed_each(data) { |obj| ... }
|
45
|
+
end
|
46
|
+
```
|
data/spec/cases.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
[false,true,null,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,127,127,255,65535,4294967295,-32,-32,-128,-32768,-2147483648,0.0,-0.0,1.0,-1.0,"a","a","a","","","",[0],[0],[0],[],[],[],{},{},{},{"a":97},{"a":97},{"a":97},[[]],[["a"]]]
|
data/spec/cases.msg
ADDED
Binary file
|
Binary file
|
data/spec/cases_spec.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe MessagePack do
|
5
|
+
here = File.dirname(__FILE__)
|
6
|
+
CASES = File.read("#{here}/cases.msg")
|
7
|
+
CASES_JSON = File.read("#{here}/cases.json")
|
8
|
+
CASES_COMPACT = File.read("#{here}/cases_compact.msg")
|
9
|
+
|
10
|
+
it 'compare with json' do
|
11
|
+
ms = []
|
12
|
+
MessagePack::Unpacker.new.feed_each(CASES) {|m|
|
13
|
+
ms << m
|
14
|
+
}
|
15
|
+
|
16
|
+
js = JSON.load(CASES_JSON)
|
17
|
+
|
18
|
+
ms.zip(js) {|m,j|
|
19
|
+
m.should == j
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'compare with compat' do
|
24
|
+
ms = []
|
25
|
+
MessagePack::Unpacker.new.feed_each(CASES) {|m|
|
26
|
+
ms << m
|
27
|
+
}
|
28
|
+
|
29
|
+
cs = []
|
30
|
+
MessagePack::Unpacker.new.feed_each(CASES_COMPACT) {|c|
|
31
|
+
cs << c
|
32
|
+
}
|
33
|
+
|
34
|
+
ms.zip(cs) {|m,c|
|
35
|
+
m.should == c
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,256 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'random_compat'
|
3
|
+
|
4
|
+
require 'stringio'
|
5
|
+
if defined?(Encoding)
|
6
|
+
Encoding.default_external = 'ASCII-8BIT'
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Buffer do
|
10
|
+
r = Random.new
|
11
|
+
random_seed = r.seed
|
12
|
+
puts "buffer_io random seed: 0x#{random_seed.to_s(16)}"
|
13
|
+
|
14
|
+
let :source do
|
15
|
+
''
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_source(s)
|
19
|
+
source.replace(s)
|
20
|
+
end
|
21
|
+
|
22
|
+
let :io do
|
23
|
+
StringIO.new(source.dup)
|
24
|
+
end
|
25
|
+
|
26
|
+
let :buffer do
|
27
|
+
Buffer.new(io)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'io returns internal io' do
|
31
|
+
buffer.io.should == io
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'close closes internal io' do
|
35
|
+
io.should_receive(:close)
|
36
|
+
buffer.close
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'short feed and read all' do
|
40
|
+
set_source 'aa'
|
41
|
+
buffer.read.should == 'aa'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'short feed and read short' do
|
45
|
+
set_source 'aa'
|
46
|
+
buffer.read(1).should == 'a'
|
47
|
+
buffer.read(1).should == 'a'
|
48
|
+
buffer.read(1).should == nil
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'long feed and read all' do
|
52
|
+
set_source ' '*(1024*1024)
|
53
|
+
s = buffer.read
|
54
|
+
s.size.should == source.size
|
55
|
+
s.should == source
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'long feed and read mixed' do
|
59
|
+
set_source ' '*(1024*1024)
|
60
|
+
buffer.read(10).should == source.slice!(0, 10)
|
61
|
+
buffer.read(10).should == source.slice!(0, 10)
|
62
|
+
buffer.read(10).should == source.slice!(0, 10)
|
63
|
+
s = buffer.read
|
64
|
+
s.size.should == source.size
|
65
|
+
s.should == source
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'eof' do
|
69
|
+
set_source ''
|
70
|
+
buffer.read.should == ''
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'eof 2' do
|
74
|
+
set_source 'a'
|
75
|
+
buffer.read.should == 'a'
|
76
|
+
buffer.read.should == ''
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'write short once and flush' do
|
80
|
+
buffer.write('aa')
|
81
|
+
buffer.flush
|
82
|
+
io.string.should == 'aa'
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'write short twice and flush' do
|
86
|
+
buffer.write('a')
|
87
|
+
buffer.write('a')
|
88
|
+
buffer.flush
|
89
|
+
io.string.should == 'aa'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'write long once and flush' do
|
93
|
+
s = ' '*(1024*1024)
|
94
|
+
buffer.write s
|
95
|
+
buffer.flush
|
96
|
+
io.string.size.should == s.size
|
97
|
+
io.string.should == s
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'write short multi and flush' do
|
101
|
+
s = ' '*(1024*1024)
|
102
|
+
1024.times {
|
103
|
+
buffer.write ' '*1024
|
104
|
+
}
|
105
|
+
buffer.flush
|
106
|
+
io.string.size.should == s.size
|
107
|
+
io.string.should == s
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'random read' do
|
111
|
+
r = Random.new(random_seed)
|
112
|
+
|
113
|
+
50.times {
|
114
|
+
fragments = []
|
115
|
+
|
116
|
+
r.rand(4).times do
|
117
|
+
n = r.rand(1024*1400)
|
118
|
+
s = r.bytes(n)
|
119
|
+
fragments << s
|
120
|
+
end
|
121
|
+
|
122
|
+
io = StringIO.new(fragments.join)
|
123
|
+
b = Buffer.new(io)
|
124
|
+
|
125
|
+
fragments.each {|s|
|
126
|
+
x = b.read(s.size)
|
127
|
+
x.size.should == s.size
|
128
|
+
x.should == s
|
129
|
+
}
|
130
|
+
b.empty?.should == true
|
131
|
+
b.read.should == ''
|
132
|
+
}
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'random read_all' do
|
136
|
+
r = Random.new(random_seed)
|
137
|
+
|
138
|
+
50.times {
|
139
|
+
fragments = []
|
140
|
+
sx = r.bytes(0)
|
141
|
+
|
142
|
+
r.rand(4).times do
|
143
|
+
n = r.rand(1024*1400)
|
144
|
+
s = r.bytes(n)
|
145
|
+
fragments << s
|
146
|
+
end
|
147
|
+
|
148
|
+
io = StringIO.new(fragments.join)
|
149
|
+
b = Buffer.new(io)
|
150
|
+
|
151
|
+
fragments.each {|s|
|
152
|
+
x = b.read_all(s.size)
|
153
|
+
x.size.should == s.size
|
154
|
+
x.should == s
|
155
|
+
}
|
156
|
+
b.empty?.should == true
|
157
|
+
lambda {
|
158
|
+
b.read_all(1)
|
159
|
+
}.should raise_error(EOFError)
|
160
|
+
}
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'random skip' do
|
164
|
+
r = Random.new(random_seed)
|
165
|
+
|
166
|
+
50.times {
|
167
|
+
fragments = []
|
168
|
+
|
169
|
+
r.rand(4).times do
|
170
|
+
n = r.rand(1024*1400)
|
171
|
+
s = r.bytes(n)
|
172
|
+
fragments << s
|
173
|
+
end
|
174
|
+
|
175
|
+
io = StringIO.new(fragments.join)
|
176
|
+
b = Buffer.new(io)
|
177
|
+
|
178
|
+
fragments.each {|s|
|
179
|
+
b.skip(s.size).should == s.size
|
180
|
+
}
|
181
|
+
b.empty?.should == true
|
182
|
+
b.skip(1).should == 0
|
183
|
+
}
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'random skip_all' do
|
187
|
+
r = Random.new(random_seed)
|
188
|
+
|
189
|
+
50.times {
|
190
|
+
fragments = []
|
191
|
+
|
192
|
+
r.rand(4).times do
|
193
|
+
n = r.rand(1024*1400)
|
194
|
+
s = r.bytes(n)
|
195
|
+
fragments << s
|
196
|
+
end
|
197
|
+
|
198
|
+
io = StringIO.new(fragments.join)
|
199
|
+
b = Buffer.new(io)
|
200
|
+
|
201
|
+
fragments.each {|s|
|
202
|
+
lambda {
|
203
|
+
b.skip_all(s.size)
|
204
|
+
}.should_not raise_error
|
205
|
+
}
|
206
|
+
b.empty?.should == true
|
207
|
+
lambda {
|
208
|
+
b.skip_all(1)
|
209
|
+
}.should raise_error(EOFError)
|
210
|
+
}
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'random write and flush' do
|
214
|
+
r = Random.new(random_seed)
|
215
|
+
|
216
|
+
50.times {
|
217
|
+
s = r.bytes(0)
|
218
|
+
io = StringIO.new
|
219
|
+
b = Buffer.new(io)
|
220
|
+
|
221
|
+
r.rand(4).times do
|
222
|
+
n = r.rand(1024*1400)
|
223
|
+
x = r.bytes(n)
|
224
|
+
s << x
|
225
|
+
b.write(x)
|
226
|
+
end
|
227
|
+
|
228
|
+
(io.string.size + b.size).should == s.size
|
229
|
+
|
230
|
+
b.flush
|
231
|
+
|
232
|
+
io.string.size.should == s.size
|
233
|
+
io.string.should == s
|
234
|
+
}
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'random write and clear' do
|
238
|
+
r = Random.new(random_seed)
|
239
|
+
b = Buffer.new
|
240
|
+
|
241
|
+
50.times {
|
242
|
+
s = r.bytes(0)
|
243
|
+
|
244
|
+
r.rand(4).times do
|
245
|
+
n = r.rand(1024*1400)
|
246
|
+
x = r.bytes(n)
|
247
|
+
s << x
|
248
|
+
b.write(x)
|
249
|
+
end
|
250
|
+
|
251
|
+
b.size.should == s.size
|
252
|
+
b.clear
|
253
|
+
}
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
require 'stringio'
|
5
|
+
if defined?(Encoding)
|
6
|
+
Encoding.default_external = 'ASCII-8BIT'
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Packer do
|
10
|
+
let :packer do
|
11
|
+
Packer.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'initialize' do
|
15
|
+
Packer.new
|
16
|
+
Packer.new(nil)
|
17
|
+
Packer.new(StringIO.new)
|
18
|
+
Packer.new({})
|
19
|
+
Packer.new(StringIO.new, {})
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'buffer' do
|
23
|
+
o1 = packer.buffer.object_id
|
24
|
+
packer.buffer << 'frsyuki'
|
25
|
+
packer.buffer.to_s.should == 'frsyuki'
|
26
|
+
packer.buffer.object_id.should == o1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|