object-stream 0.4 → 0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/symbolize-keys.rb +38 -0
- data/lib/object-stream.rb +8 -5
- data/test/test-symbolize-keys.rb +56 -0
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2012223a66102b4befa32c0aaecbc6559f46d089
|
4
|
+
data.tar.gz: 348120adfb1bdf1a62b439fe3f4a78a3887fce0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03ea4758680c9209c65d178e938dc4025bbf37f09e73fd7a70955053aa09352edcf8c600b921cd5869735e4b0ce57227bd5202747fec618408786dd467f1ece0
|
7
|
+
data.tar.gz: 5afa9b0995c5f93e4055608202ba4a86551eb071c8415102a152cab179834b407c6e69310548a3e2421c0b99c07f6e71ae4bd932e226cf22bfde5a6dfcfd44c1
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# The marshal and yaml serializers preserve the difference between strings and
|
2
|
+
# symbols, but msgpack and json cannot: the formats only allow strings. However,
|
3
|
+
# sometimes we prefer to write programs that work with symbols even though the
|
4
|
+
# serialized data contain strings. On the write end of a stream, that is already
|
5
|
+
# possible: symbols are converted to strings as they are written.
|
6
|
+
#
|
7
|
+
# The symbolize keys feature solves the problem on the read end of a stream. It
|
8
|
+
# configures msgpack and json (yajl) to de-serialize strings as symbols. This
|
9
|
+
# can be more efficient, since it generates fewer string objects. It's also
|
10
|
+
# efficient and convenient to avoid conversions when connecting to other
|
11
|
+
# libraries that expect symbols, such as the Sequel database interface.
|
12
|
+
#
|
13
|
+
# Keep in mind that Ruby, as of version 2.1, does not garbage collect symbols
|
14
|
+
# (though this may be coming in 2.2). So this feature can lead to unbounded
|
15
|
+
# memory use as new, different symbols keep arriving. Only use it if (a) the set
|
16
|
+
# of symbols is bounded (and small), or (b) the program has a short lifespan, or
|
17
|
+
# (c) you can monitor the program's memory use and restart it as needed.
|
18
|
+
#
|
19
|
+
# It's safe for one end of a stream to use this option even if the other end
|
20
|
+
# does not: the stream itself is not affected, only the interface changes.
|
21
|
+
|
22
|
+
type = ARGV.shift || "msgpack"
|
23
|
+
|
24
|
+
case type
|
25
|
+
when "marshal", "yaml", "json", "msgpack"
|
26
|
+
else
|
27
|
+
abort "Usage: #$0 marshal|yaml|json|msgpack"
|
28
|
+
end
|
29
|
+
|
30
|
+
require 'object-stream'
|
31
|
+
require 'stringio'
|
32
|
+
|
33
|
+
sio = StringIO.new
|
34
|
+
stream = ObjectStream.new(sio, type: type, symbolize_keys: true)
|
35
|
+
stream << {x: 1, y: 2, z: 3}
|
36
|
+
|
37
|
+
sio.rewind
|
38
|
+
p stream.read
|
data/lib/object-stream.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
module ObjectStream
|
11
11
|
include Enumerable
|
12
12
|
|
13
|
-
VERSION = "0.
|
13
|
+
VERSION = "0.5"
|
14
14
|
|
15
15
|
# The IO through which the stream reads and writes serialized object data.
|
16
16
|
attr_reader :io
|
@@ -247,9 +247,10 @@ module ObjectStream
|
|
247
247
|
|
248
248
|
DEFAULT_CHUNK_SIZE = 2000
|
249
249
|
|
250
|
-
|
250
|
+
# See the discussion in examples/symbolize-keys.rb.
|
251
|
+
def initialize io, chunk_size: DEFAULT_CHUNK_SIZE, symbolize_keys: false
|
251
252
|
super
|
252
|
-
@parser = Yajl::Parser.new
|
253
|
+
@parser = Yajl::Parser.new(symbolize_keys: symbolize_keys)
|
253
254
|
@encoder = Yajl::Encoder.new
|
254
255
|
@chunk_size = chunk_size
|
255
256
|
end
|
@@ -280,9 +281,11 @@ module ObjectStream
|
|
280
281
|
DEFAULT_CHUNK_SIZE = 2000
|
281
282
|
DEFAULT_MAXBUF = 4000
|
282
283
|
|
283
|
-
|
284
|
+
# See the discussion in examples/symbolize-keys.rb.
|
285
|
+
def initialize io, chunk_size: DEFAULT_CHUNK_SIZE, maxbuf: DEFAULT_MAXBUF,
|
286
|
+
symbolize_keys: false
|
284
287
|
super
|
285
|
-
@unpacker = MessagePack::Unpacker.new
|
288
|
+
@unpacker = MessagePack::Unpacker.new(symbolize_keys: symbolize_keys)
|
286
289
|
# don't specify io, so don't have to read all of io in one loop
|
287
290
|
|
288
291
|
@packer = MessagePack::Packer.new(io)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'object-stream'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
require 'minitest/autorun'
|
5
|
+
|
6
|
+
module TestSymbolizeKeys
|
7
|
+
attr_reader :sio, :stream
|
8
|
+
|
9
|
+
BASIC_OBJECTS = [
|
10
|
+
nil,
|
11
|
+
true,
|
12
|
+
false,
|
13
|
+
"The quick brown fox jumped over the lazy dog's back.",
|
14
|
+
[-5, "foo", [4]],
|
15
|
+
{a: 1, b: 2},
|
16
|
+
{top: [ {middle: [bottom: "turtle"]} ] }
|
17
|
+
]
|
18
|
+
|
19
|
+
def type; self.class::TYPE; end
|
20
|
+
def objects; BASIC_OBJECTS + self.class::OBJECTS; end
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@sio = StringIO.new
|
24
|
+
@stream = ObjectStream.new sio, type: type, symbolize_keys: true
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_write_read
|
28
|
+
objects.each do |obj|
|
29
|
+
sio.rewind # do not need to clear stream's buffer (if any)
|
30
|
+
sio.truncate 0
|
31
|
+
stream.write obj
|
32
|
+
|
33
|
+
sio.rewind
|
34
|
+
dump = sio.read
|
35
|
+
sio.rewind
|
36
|
+
|
37
|
+
stream.read do |obj2|
|
38
|
+
assert_equal(obj, obj2, "dump is #{dump.inspect}")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class TestSymbolizeKeysJson < Minitest::Test
|
45
|
+
include TestSymbolizeKeys
|
46
|
+
|
47
|
+
TYPE = ObjectStream::JSON_TYPE
|
48
|
+
OBJECTS = []
|
49
|
+
end
|
50
|
+
|
51
|
+
class TestSymbolizeKeysMsgpack < Minitest::Test
|
52
|
+
include TestSymbolizeKeys
|
53
|
+
|
54
|
+
TYPE = ObjectStream::MSGPACK_TYPE
|
55
|
+
OBJECTS = []
|
56
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: object-stream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.5'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel VanderWerf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -58,6 +58,7 @@ files:
|
|
58
58
|
- examples/read-without-block.rb
|
59
59
|
- examples/slow-sender.rb
|
60
60
|
- examples/socket.rb
|
61
|
+
- examples/symbolize-keys.rb
|
61
62
|
- examples/udp.rb
|
62
63
|
- lib/object-stream-wrapper.rb
|
63
64
|
- lib/object-stream.rb
|
@@ -68,6 +69,7 @@ files:
|
|
68
69
|
- test/test-maxbuf.rb
|
69
70
|
- test/test-outbox.rb
|
70
71
|
- test/test-slow-sender.rb
|
72
|
+
- test/test-symbolize-keys.rb
|
71
73
|
homepage: https://github.com/vjoel/object-stream
|
72
74
|
licenses:
|
73
75
|
- BSD
|
@@ -95,16 +97,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
97
|
version: '0'
|
96
98
|
requirements: []
|
97
99
|
rubyforge_project:
|
98
|
-
rubygems_version: 2.2.
|
100
|
+
rubygems_version: 2.2.2
|
99
101
|
signing_key:
|
100
102
|
specification_version: 4
|
101
103
|
summary: Stream objects over IO using Marshal, JSON, YAML, or Msgpack
|
102
104
|
test_files:
|
103
|
-
- test/test-
|
105
|
+
- test/test-maxbuf.rb
|
104
106
|
- test/test-outbox.rb
|
107
|
+
- test/test-basic.rb
|
105
108
|
- test/test-consume.rb
|
106
|
-
- test/test-
|
109
|
+
- test/test-symbolize-keys.rb
|
107
110
|
- test/test-inbox.rb
|
108
|
-
- test/test-slow-sender.rb
|
109
111
|
- test/test-expect.rb
|
112
|
+
- test/test-slow-sender.rb
|
110
113
|
has_rdoc:
|