object-stream 0.4 → 0.5
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/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:
|