msgpack-ably 0.5.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +26 -0
  4. data/ChangeLog +101 -0
  5. data/README.rdoc +129 -0
  6. data/Rakefile +110 -0
  7. data/doclib/msgpack.rb +77 -0
  8. data/doclib/msgpack/buffer.rb +193 -0
  9. data/doclib/msgpack/core_ext.rb +101 -0
  10. data/doclib/msgpack/error.rb +14 -0
  11. data/doclib/msgpack/packer.rb +134 -0
  12. data/doclib/msgpack/unpacker.rb +146 -0
  13. data/ext/msgpack/buffer.c +678 -0
  14. data/ext/msgpack/buffer.h +441 -0
  15. data/ext/msgpack/buffer_class.c +507 -0
  16. data/ext/msgpack/buffer_class.h +32 -0
  17. data/ext/msgpack/compat.h +113 -0
  18. data/ext/msgpack/core_ext.c +129 -0
  19. data/ext/msgpack/core_ext.h +26 -0
  20. data/ext/msgpack/extconf.rb +28 -0
  21. data/ext/msgpack/packer.c +168 -0
  22. data/ext/msgpack/packer.h +429 -0
  23. data/ext/msgpack/packer_class.c +302 -0
  24. data/ext/msgpack/packer_class.h +30 -0
  25. data/ext/msgpack/rbinit.c +33 -0
  26. data/ext/msgpack/rmem.c +94 -0
  27. data/ext/msgpack/rmem.h +109 -0
  28. data/ext/msgpack/sysdep.h +115 -0
  29. data/ext/msgpack/sysdep_endian.h +50 -0
  30. data/ext/msgpack/sysdep_types.h +46 -0
  31. data/ext/msgpack/unpacker.c +781 -0
  32. data/ext/msgpack/unpacker.h +122 -0
  33. data/ext/msgpack/unpacker_class.c +405 -0
  34. data/ext/msgpack/unpacker_class.h +32 -0
  35. data/lib/msgpack.rb +6 -0
  36. data/lib/msgpack/version.rb +3 -0
  37. data/msgpack.gemspec +26 -0
  38. data/msgpack.org.md +49 -0
  39. data/spec/cases.json +1 -0
  40. data/spec/cases.msg +0 -0
  41. data/spec/cases_compact.msg +0 -0
  42. data/spec/cases_spec.rb +39 -0
  43. data/spec/cruby/buffer_io_spec.rb +256 -0
  44. data/spec/cruby/buffer_packer.rb +29 -0
  45. data/spec/cruby/buffer_spec.rb +572 -0
  46. data/spec/cruby/buffer_unpacker.rb +19 -0
  47. data/spec/format_spec.rb +256 -0
  48. data/spec/packer_spec.rb +120 -0
  49. data/spec/random_compat.rb +24 -0
  50. data/spec/spec_helper.rb +21 -0
  51. data/spec/unpacker_spec.rb +305 -0
  52. metadata +195 -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,6 @@
1
+ require "msgpack/version"
2
+ begin
3
+ require "msgpack/#{RUBY_VERSION[/\d+.\d+/]}/msgpack"
4
+ rescue LoadError
5
+ require "msgpack/msgpack"
6
+ end
@@ -0,0 +1,3 @@
1
+ module MessagePack
2
+ VERSION = "0.5.10"
3
+ end
data/msgpack.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require 'msgpack/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "msgpack-ably"
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.author = "Sadayuki Furuhashi"
10
+ s.email = "frsyuki@gmail.com"
11
+ s.license = "Apache 2.0"
12
+ s.homepage = "http://msgpack.org/"
13
+ s.rubyforge_project = "msgpack"
14
+ s.has_rdoc = false
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec}/*`.split("\n")
17
+ s.require_paths = ["lib"]
18
+ s.extensions = ["ext/msgpack/extconf.rb"]
19
+
20
+ s.add_development_dependency 'bundler', ['~> 1.0']
21
+ s.add_development_dependency 'rake', ['~> 0.9.2']
22
+ s.add_development_dependency 'rake-compiler', ['~> 0.8.3']
23
+ s.add_development_dependency 'rspec', ['~> 2.11']
24
+ s.add_development_dependency 'json', ['~> 1.7']
25
+ s.add_development_dependency 'yard', ['~> 0.8.2']
26
+ end
data/msgpack.org.md ADDED
@@ -0,0 +1,49 @@
1
+ # Ably fork of MessagePack for Ruby
2
+
3
+ This fork is needed until [the binary support PR](https://github.com/msgpack/msgpack-ruby/pull/45) is added to the [origin MessagePack gem](https://github.com/msgpack/msgpack-ruby).
4
+
5
+ ```
6
+ require 'msgpack'
7
+ msg = [1,2,3].to_msgpack #=> "\x93\x01\x02\x03"
8
+ MessagePack.unpack(msg) #=> [1,2,3]
9
+ ```
10
+
11
+ ## Install
12
+
13
+ ```
14
+ gem install msgpack-ably
15
+ ```
16
+
17
+ ## Use cases
18
+
19
+ * Create REST API returing MessagePack using Rails + [RABL](https://github.com/nesquena/rabl)
20
+ * Store objects efficiently in memcached or Redis
21
+ * 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)
22
+
23
+ ## Links
24
+
25
+ * [Github](https://github.com/msgpack/msgpack-ruby)
26
+ * [API document](http://ruby.msgpack.org/)
27
+ * [MessagePack spec](https://github.com/msgpack/msgpack/blob/master/spec.md)
28
+
29
+ ## Streaming API
30
+
31
+ ```
32
+ # serialize a 2-element array [e1, e2]
33
+ pk = MessagePack::Packer.new(io)
34
+ pk.write_array_header(2).write(e1).write(e2).flush
35
+ ```
36
+
37
+ ```
38
+ # deserialize objects from an IO
39
+ u = MessagePack::Unpacker.new(io)
40
+ u.each { |obj| ... }
41
+ ```
42
+
43
+ ```
44
+ # event-driven deserialization
45
+ def on_read(data)
46
+ @u ||= MessagePack::Unpacker.new
47
+ @u.feed_each(data) { |obj| ... }
48
+ end
49
+ ```
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
@@ -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
+