transit-ruby 0.8.572 → 0.8.586
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/CHANGELOG.md +9 -0
- data/lib/transit/decoder.rb +11 -1
- data/lib/transit/marshaler/base.rb +41 -22
- data/lib/transit/marshaler/cruby/json.rb +6 -7
- data/lib/transit/marshaler/cruby/messagepack.rb +4 -7
- data/lib/transit/writer.rb +4 -13
- data/spec/transit/marshaler_spec.rb +30 -0
- data/spec/transit/reader_spec.rb +6 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d01cddb9a52ad5f336423f8bad2a06bd46483886
|
4
|
+
data.tar.gz: abbc67aed1cde0c0a2e3abedd3b35b8f5644c11e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 484fe240df8ee5cdde7b0daa55957f50e06a8689e5470fe4c306afb7924c3dfe826fb8d7bc7888e9fec48e4c84df71580b4aeba86c618da9cb97e4fb15f94fef
|
7
|
+
data.tar.gz: 2f8ae4b32c5a95e0af41840cd816227503b5a59657d6ca404e7d3978ddfdac7c27d39c1027427306f632755ea124660d87fa343290e09cc7d425904bd47f0203
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
### 0.8.586 / 2015-03-13
|
2
|
+
|
3
|
+
* Add handler caching for MRI
|
4
|
+
* Bump to transit-java-0.8.285 for handler caching in JRuby
|
5
|
+
|
6
|
+
### 0.8.572 / 2015-01-15
|
7
|
+
|
8
|
+
* Marshal int map keys as ints in msgpack
|
9
|
+
|
1
10
|
### 0.8.569 / 2014-12-03
|
2
11
|
|
3
12
|
* ByteArray#to_s forces default encoding for platform
|
data/lib/transit/decoder.rb
CHANGED
@@ -16,6 +16,9 @@ module Transit
|
|
16
16
|
# Converts a transit value to an instance of a type
|
17
17
|
# @api private
|
18
18
|
class Decoder
|
19
|
+
MUTEX = Mutex.new
|
20
|
+
HANDLER_CACHE = {}
|
21
|
+
|
19
22
|
ESC_ESC = "#{ESC}#{ESC}"
|
20
23
|
ESC_SUB = "#{ESC}#{SUB}"
|
21
24
|
ESC_RES = "#{ESC}#{RES}"
|
@@ -27,7 +30,14 @@ module Transit
|
|
27
30
|
def initialize(options={})
|
28
31
|
custom_handlers = options[:handlers] || {}
|
29
32
|
custom_handlers.each {|k,v| validate_handler(k,v)}
|
30
|
-
|
33
|
+
MUTEX.synchronize do
|
34
|
+
if HANDLER_CACHE.has_key?(custom_handlers)
|
35
|
+
@handlers = HANDLER_CACHE[custom_handlers]
|
36
|
+
else
|
37
|
+
@handlers = ReadHandlers::DEFAULT_READ_HANDLERS.merge(custom_handlers)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
31
41
|
@default_handler = options[:default_handler] || ReadHandlers::DEFAULT_READ_HANDLER
|
32
42
|
end
|
33
43
|
|
@@ -17,21 +17,49 @@ module Transit
|
|
17
17
|
# @see https://github.com/cognitect/transit-format
|
18
18
|
module Marshaler
|
19
19
|
|
20
|
+
HANDLER_CACHE = {}
|
21
|
+
VERBOSE_HANDLER_CACHE = {}
|
22
|
+
MUTEX = Mutex.new
|
23
|
+
|
24
|
+
# @api private
|
25
|
+
# Included in VerboseJson subclasses. Defined here to make it
|
26
|
+
# available in CRuby and JRuby environments.
|
27
|
+
module VerboseHandlers
|
28
|
+
def build_handlers(custom_handlers)
|
29
|
+
if VERBOSE_HANDLER_CACHE.has_key?(custom_handlers)
|
30
|
+
VERBOSE_HANDLER_CACHE[custom_handlers]
|
31
|
+
else
|
32
|
+
handlers = super(custom_handlers).reduce({}) do |h, (k,v)|
|
33
|
+
if v.respond_to?(:verbose_handler) && vh = v.verbose_handler
|
34
|
+
h.store(k, vh)
|
35
|
+
else
|
36
|
+
h.store(k, v)
|
37
|
+
end
|
38
|
+
h
|
39
|
+
end
|
40
|
+
VERBOSE_HANDLER_CACHE[custom_handlers] = handlers
|
41
|
+
handlers
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
20
46
|
# @api private
|
21
47
|
module Base
|
22
48
|
def parse_options(opts)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
@
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
49
|
+
MUTEX.synchronize do
|
50
|
+
@handlers = build_handlers(opts[:handlers])
|
51
|
+
end
|
52
|
+
@handlers.values.each { |h| h.handlers=(@handlers) if h.respond_to?(:handlers=) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def build_handlers(custom_handlers)
|
56
|
+
if HANDLER_CACHE.has_key?(custom_handlers)
|
57
|
+
HANDLER_CACHE[custom_handlers]
|
58
|
+
else
|
59
|
+
handlers = WriteHandlers::DEFAULT_WRITE_HANDLERS.dup
|
60
|
+
handlers.merge!(custom_handlers) if custom_handlers
|
61
|
+
HANDLER_CACHE[custom_handlers] = handlers
|
62
|
+
handlers
|
35
63
|
end
|
36
64
|
end
|
37
65
|
|
@@ -44,15 +72,6 @@ module Transit
|
|
44
72
|
nil
|
45
73
|
end
|
46
74
|
|
47
|
-
def verbose_handlers(handlers)
|
48
|
-
handlers.each do |k, v|
|
49
|
-
if v.respond_to?(:verbose_handler) && vh = v.verbose_handler
|
50
|
-
handlers.store(k, vh)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
handlers
|
54
|
-
end
|
55
|
-
|
56
75
|
def escape(s)
|
57
76
|
if s.start_with?(SUB,ESC,RES) && s != "#{SUB} "
|
58
77
|
"#{ESC}#{s}"
|
@@ -67,7 +86,7 @@ module Transit
|
|
67
86
|
|
68
87
|
def emit_string(prefix, tag, value, as_map_key, cache)
|
69
88
|
encoded = "#{prefix}#{tag}#{value}"
|
70
|
-
if
|
89
|
+
if cache.cacheable?(encoded, as_map_key)
|
71
90
|
emit_value(cache.write(encoded), as_map_key)
|
72
91
|
else
|
73
92
|
emit_value(encoded, as_map_key)
|
@@ -19,16 +19,13 @@ module Transit
|
|
19
19
|
class BaseJson
|
20
20
|
include Transit::Marshaler::Base
|
21
21
|
|
22
|
-
def default_opts
|
23
|
-
{:prefer_strings => true,
|
24
|
-
:max_int => JSON_MAX_INT,
|
25
|
-
:min_int => JSON_MIN_INT}
|
26
|
-
end
|
27
|
-
|
28
22
|
def initialize(io, opts)
|
29
23
|
@oj = Oj::StreamWriter.new(io,opts.delete(:oj_opts) || {})
|
30
|
-
parse_options(default_opts.merge(opts))
|
31
24
|
@state = []
|
25
|
+
@max_int = JSON_MAX_INT
|
26
|
+
@min_int = JSON_MIN_INT
|
27
|
+
@prefer_strings = true
|
28
|
+
parse_options(opts)
|
32
29
|
end
|
33
30
|
|
34
31
|
def emit_array_start(size)
|
@@ -87,6 +84,8 @@ module Transit
|
|
87
84
|
|
88
85
|
# @api private
|
89
86
|
class VerboseJson < BaseJson
|
87
|
+
include Transit::Marshaler::VerboseHandlers
|
88
|
+
|
90
89
|
def emit_string(prefix, tag, value, as_map_key, cache)
|
91
90
|
emit_value("#{prefix}#{tag}#{value}", as_map_key)
|
92
91
|
end
|
@@ -19,16 +19,13 @@ module Transit
|
|
19
19
|
class MessagePack
|
20
20
|
include Transit::Marshaler::Base
|
21
21
|
|
22
|
-
def default_opts
|
23
|
-
{:prefer_strings => false,
|
24
|
-
:max_int => MAX_INT,
|
25
|
-
:min_int => MIN_INT}
|
26
|
-
end
|
27
|
-
|
28
22
|
def initialize(io, opts)
|
29
23
|
@io = io
|
30
24
|
@packer = ::MessagePack::Packer.new(io)
|
31
|
-
|
25
|
+
@max_int = MAX_INT
|
26
|
+
@min_int = MIN_INT
|
27
|
+
@prefer_strings = false
|
28
|
+
parse_options(opts)
|
32
29
|
end
|
33
30
|
|
34
31
|
def emit_array_start(size)
|
data/lib/transit/writer.rb
CHANGED
@@ -39,21 +39,12 @@ module Transit
|
|
39
39
|
def initialize(format, io, opts={})
|
40
40
|
@marshaler = case format
|
41
41
|
when :json
|
42
|
-
Marshaler::Json.new(io,
|
43
|
-
|
44
|
-
:verbose => false,
|
45
|
-
:handlers => {},
|
46
|
-
:oj_opts => {:indent => -1}}.merge(opts))
|
42
|
+
Marshaler::Json.new(io, {:handlers => {},
|
43
|
+
:oj_opts => {:indent => -1}}.merge(opts))
|
47
44
|
when :json_verbose
|
48
|
-
Marshaler::VerboseJson.new(io,
|
49
|
-
{:prefer_strings => true,
|
50
|
-
:verbose => true,
|
51
|
-
:handlers => {}}.merge(opts))
|
45
|
+
Marshaler::VerboseJson.new(io, {:handlers => {}}.merge(opts))
|
52
46
|
else
|
53
|
-
Marshaler::MessagePack.new(io,
|
54
|
-
{:prefer_strings => false,
|
55
|
-
:verbose => false,
|
56
|
-
:handlers => {}}.merge(opts))
|
47
|
+
Marshaler::MessagePack.new(io, {:handlers => {}}.merge(opts))
|
57
48
|
end
|
58
49
|
end
|
59
50
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Transit
|
2
|
+
describe Marshaler do
|
3
|
+
it "caches non-verbose handlers" do
|
4
|
+
io = StringIO.new
|
5
|
+
first = Transit::Marshaler::Json.new(io,{}).instance_variable_get("@handlers")
|
6
|
+
second = Transit::Marshaler::Json.new(io,{}).instance_variable_get("@handlers")
|
7
|
+
third = Transit::Marshaler::MessagePack.new(io,{}).instance_variable_get("@handlers")
|
8
|
+
assert { first }
|
9
|
+
assert { first.equal?(second) }
|
10
|
+
assert { second.equal?(third) }
|
11
|
+
end
|
12
|
+
|
13
|
+
it "caches verbose handlers" do
|
14
|
+
io = StringIO.new
|
15
|
+
first = Transit::Marshaler::VerboseJson.new(io,{}).instance_variable_get("@handlers")
|
16
|
+
second = Transit::Marshaler::VerboseJson.new(io,{}).instance_variable_get("@handlers")
|
17
|
+
assert { first }
|
18
|
+
assert { first.equal?(second) }
|
19
|
+
end
|
20
|
+
|
21
|
+
it "caches verbose and non-verbose handlers separately" do
|
22
|
+
io = StringIO.new
|
23
|
+
first = Transit::Marshaler::Json.new(io,{}).instance_variable_get("@handlers")
|
24
|
+
second = Transit::Marshaler::VerboseJson.new(io,{}).instance_variable_get("@handlers")
|
25
|
+
assert { first }
|
26
|
+
assert { second }
|
27
|
+
assert { !first.equal?(second) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/spec/transit/reader_spec.rb
CHANGED
@@ -47,7 +47,12 @@ module Transit
|
|
47
47
|
writer = Transit::Writer.new(type, io)
|
48
48
|
inputs.each {|i| writer.write(i)}
|
49
49
|
reader = Transit::Reader.new(type, StringIO.new(io.string))
|
50
|
-
|
50
|
+
if Transit::jruby?
|
51
|
+
# Ignore expected EOFException raised after the StringIO is exhausted
|
52
|
+
reader.read {|val| outputs << val} rescue nil
|
53
|
+
else
|
54
|
+
reader.read {|val| outputs << val}
|
55
|
+
end
|
51
56
|
|
52
57
|
assert { outputs == inputs }
|
53
58
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: transit-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.586
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Russ Olsen
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-03-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: oj
|
@@ -170,6 +170,7 @@ files:
|
|
170
170
|
- spec/transit/date_time_util_spec.rb
|
171
171
|
- spec/transit/decoder_spec.rb
|
172
172
|
- spec/transit/exemplar_spec.rb
|
173
|
+
- spec/transit/marshaler_spec.rb
|
173
174
|
- spec/transit/reader_spec.rb
|
174
175
|
- spec/transit/rolling_cache_spec.rb
|
175
176
|
- spec/transit/round_trip_spec.rb
|
@@ -204,6 +205,7 @@ test_files:
|
|
204
205
|
- spec/transit/date_time_util_spec.rb
|
205
206
|
- spec/transit/decoder_spec.rb
|
206
207
|
- spec/transit/exemplar_spec.rb
|
208
|
+
- spec/transit/marshaler_spec.rb
|
207
209
|
- spec/transit/reader_spec.rb
|
208
210
|
- spec/transit/rolling_cache_spec.rb
|
209
211
|
- spec/transit/round_trip_spec.rb
|