transit-ruby 0.8.467 → 0.8.539

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.
data/spec/spec_helper.rb CHANGED
@@ -37,11 +37,25 @@ require 'wrong/adapters/rspec'
37
37
  require 'transit'
38
38
  require 'spec_helper-local' if File.exist?(File.expand_path('../spec_helper-local.rb', __FILE__))
39
39
 
40
+ if Transit::jruby?
41
+ require 'transit/unmarshaler/jruby/messagepack'
42
+ end
43
+
40
44
  RSpec.configure do |c|
41
45
  c.alias_example_to :fit, :focus => true
42
46
  c.filter_run_including :focus => true, :focused => true
47
+ c.filter_run_excluding :jruby => true
43
48
  c.run_all_when_everything_filtered = true
44
49
  c.mock_with :nothing
50
+
51
+ c.before(:suite) do
52
+ # TODO: make it work later
53
+ #if Transit::jruby?
54
+ # require 'rake'
55
+ # load File.expand_path("Rakefile")
56
+ # Rake::Task['compile'].invoke
57
+ #end
58
+ end
45
59
  end
46
60
 
47
61
  ALPHA_NUM = 'abcdefghijklmnopqrstuvwxyzABCDESFHIJKLMNOPQRSTUVWXYZ_0123456789'
@@ -112,7 +112,8 @@ EXEMPLARS = [
112
112
  Exemplar.new("vector_unrecognized_vals", ["~Unrecognized"]),
113
113
  Exemplar.new("vector_1935_keywords_repeated_twice", array_of_symbols(1935, 3870)),
114
114
  Exemplar.new("vector_1936_keywords_repeated_twice", array_of_symbols(1936, 3872)),
115
- Exemplar.new("vector_1937_keywords_repeated_twice", array_of_symbols(1937, 3874))
115
+ Exemplar.new("vector_1937_keywords_repeated_twice", array_of_symbols(1937, 3874)),
116
+ Exemplar.new("vector_special_numbers", [Float::NAN, Float::INFINITY, -Float::INFINITY])
116
117
  ]
117
118
 
118
119
  [10, 1935, 1936, 1937].each do |i|
@@ -115,12 +115,20 @@ module Transit
115
115
  end
116
116
  end
117
117
 
118
+ describe 'Dates/Times' do
119
+ it "delivers a UTC DateTime for a non-UTC date string" do
120
+ io = StringIO.new(["~t2014-04-14T12:20:50.152-05:00"].to_json)
121
+ reader = Reader.new(:json, io)
122
+ expect(Transit::DateTimeUtil.to_millis(reader.read.first)).to eq(Transit::DateTimeUtil.to_millis(DateTime.new(2014,4,14,17,20,50.152,"Z")))
123
+ end
124
+ end
125
+
118
126
  describe 'edge cases found in generative testing' do
119
- it 'supports ...' do
120
- io = StringIO.new(["~#cmap",[["~#ratio",["~n10","~n11"]],"~:foobar",["^1",["~n10","~n13"]],"^2"]].to_json)
127
+ it 'caches nested structures correctly' do
128
+ io = StringIO.new(["~#cmap",[["~#point",["~n10","~n11"]],"~:foobar",["^1",["~n10","~n13"]],"^2"]].to_json)
121
129
  reader = Reader.new(:json, io)
122
- expected = {TaggedValue.new("ratio",[10,11]) => :foobar,
123
- TaggedValue.new("ratio",[10,13]) => :foobar}
130
+ expected = {TaggedValue.new("point", [10,11]) => :foobar,
131
+ TaggedValue.new("point", [10,13]) => :foobar}
124
132
  assert { reader.read == expected }
125
133
  end
126
134
  end
@@ -14,6 +14,10 @@
14
14
 
15
15
  require 'spec_helper'
16
16
 
17
+ def nan?(obj)
18
+ obj.respond_to?(:nan?) and obj.nan?
19
+ end
20
+
17
21
  def round_trip(obj, type, opts={})
18
22
  obj_before = obj
19
23
 
@@ -22,63 +26,48 @@ def round_trip(obj, type, opts={})
22
26
  writer.write(obj)
23
27
 
24
28
  # ensure that we don't modify the object being written
25
- assert { obj == obj_before }
29
+ if nan?(obj_before)
30
+ assert { obj.nan? }
31
+ else
32
+ assert { obj == obj_before }
33
+ end
26
34
  reader = Transit::Reader.new(type, StringIO.new(io.string), :handlers => opts[:read_handlers])
27
35
  reader.read
28
36
  end
29
37
 
30
38
  def assert_equal_times(actual,expected)
39
+ return false unless expected.is_a?(Date) || expected.is_a?(Time) || expected.is_a?(DateTime)
31
40
  assert { Transit::DateTimeUtil.to_millis(actual) == Transit::DateTimeUtil.to_millis(expected) }
32
41
  assert { actual.zone == expected.zone }
33
42
  end
34
43
 
44
+ def assert_nan(actual,expected)
45
+ return false unless nan?(expected)
46
+ expect(actual.respond_to?(:nan?)).to eq(true)
47
+ expect(actual.nan?).to eq(true)
48
+ end
49
+
50
+ def validate(expected, actual)
51
+ assert_equal_times(actual, expected) || assert_nan(actual, expected) || (expect(actual).to eq(expected))
52
+ end
53
+
35
54
  def round_trips(label, obj, type, opts={})
36
55
  expected = opts[:expected] || obj
37
56
 
38
57
  it "round trips #{label} at top level", :focus => !!opts[:focus], :pending => opts[:pending] do
39
- case obj
40
- when Date, Time, DateTime
41
- assert_equal_times(round_trip(obj, type), expected)
42
- else
43
- actual = round_trip(obj, type, opts)
44
- expect(actual).to eq(expected)
45
- end
58
+ validate(expected, round_trip(obj, type, opts))
46
59
  end
47
60
 
48
- case obj
49
- when Date, Time, DateTime
50
- it "round trips #{label} as a map key", :focus => !!opts[:focus], :pending => opts[:pending] do
51
- after = round_trip({obj => 0}, type)
52
- assert_equal_times(after.keys.first, expected)
53
- end
54
- else
55
- it "round trips #{label} as a map key", :focus => !!opts[:focus], :pending => opts[:pending] do
56
- actual = round_trip({obj => 0}, type, opts)
57
- wrapped_expected = {expected => 0}
58
- assert { actual == wrapped_expected }
59
- end
61
+ it "round trips #{label} as a map key", :focus => !!opts[:focus], :pending => opts[:pending] do
62
+ validate(expected, round_trip({obj => 0}, type, opts).keys.first)
60
63
  end
61
64
 
62
65
  it "round trips #{label} as a map value", :focus => !!opts[:focus], :pending => opts[:pending] do
63
- case obj
64
- when Date, Time, DateTime
65
- after = round_trip({:a => obj}, type)
66
- assert_equal_times(after.values.first, expected)
67
- else
68
- actual = round_trip({a: obj}, type, opts)
69
- assert { actual == {a: expected} }
70
- end
66
+ validate(expected, round_trip({a: obj}, type, opts).values.first)
71
67
  end
72
68
 
73
69
  it "round trips #{label} as an array value", :focus => !!opts[:focus], :pending => opts[:pending] do
74
- case obj
75
- when Date, Time, DateTime
76
- after = round_trip([obj], type)
77
- assert_equal_times(after.first, expected)
78
- else
79
- actual = round_trip([obj], type, opts)
80
- assert { actual == [expected] }
81
- end
70
+ validate(expected, round_trip([obj], type, opts).first)
82
71
  end
83
72
  end
84
73
 
@@ -118,6 +107,9 @@ module Transit
118
107
  round_trips("a big int", 123456789012345, type)
119
108
  round_trips("a very big int", 123456789012345679012345678890, type)
120
109
  round_trips("a float", 1234.56, type)
110
+ round_trips("NaN", Float::NAN, type)
111
+ round_trips("Infinity", Float::INFINITY, type)
112
+ round_trips("-Infinity", -Float::INFINITY, type)
121
113
  round_trips("a bigdec", BigDecimal.new("123.45"), type)
122
114
  round_trips("an instant (DateTime local)", DateTime.new(2014,1,2,3,4,5, "-5"), type,
123
115
  :expected => DateTime.new(2014,1,2, (3+5) ,4,5, "+00:00"))
@@ -163,6 +155,7 @@ module Transit
163
155
  round_trips("a nested structure (map on top)", {a: [1, [{b: "~c"}]]}, type)
164
156
  round_trips("a nested structure (array on top)", [37, {a: [1, [{b: "~c"}]]}], type)
165
157
  round_trips("a map that looks like transit data", [{"~#set"=>[1,2,3]},{"~#set"=>[4,5,6]}], type)
158
+ round_trips("a ratio of big value", [{"~#ratio"=>["~n36893488147419103231","~n73786976294838206463"]}], type)
166
159
  end
167
160
 
168
161
  describe "Transit using json" do
@@ -46,7 +46,16 @@ module Transit
46
46
  marshals_scalar("a Fixnum", 9007199254740999, "~i9007199254740999")
47
47
  marshals_scalar("a Bignum", 9223372036854775806, "~i9223372036854775806")
48
48
  marshals_scalar("a Very Bignum", 4256768765123454321897654321234567, "~n4256768765123454321897654321234567")
49
- marshals_scalar("a ByteArray", ByteArray.new(bytes), "~b#{ByteArray.new(bytes).to_base64}")
49
+ # Ruby's base64 encoding adds line feed in every 60 encoded
50
+ # characters, while Java,
51
+ # org.apache.commons.codec.binary.Base64, doesn't add any. Java
52
+ # method has option to add line feed, but every 76 characters.
53
+ # this divergence may be inevitable
54
+ if Transit::jruby?
55
+ marshals_scalar("a ByteArray", ByteArray.new(bytes), "~b#{ByteArray.new(bytes).to_base64}".gsub(/\n/, ""))
56
+ else
57
+ marshals_scalar("a ByteArray", ByteArray.new(bytes), "~b#{ByteArray.new(bytes).to_base64}")
58
+ end
50
59
  marshals_scalar("an URI", Addressable::URI.parse("http://example.com/search"), "~rhttp://example.com/search")
51
60
  marshals_structure("a link",
52
61
  Link.new(Addressable::URI.parse("http://example.com/search"), "search", nil, "link", nil),
@@ -57,6 +66,8 @@ module Transit
57
66
  "render" => "link",
58
67
  "prompt" => nil}})
59
68
  marshals_structure("a TaggedValue", TaggedValue.new("tag", "value"), {"~#tag" => "value"})
69
+ marshals_structure("a ratio by Rational class", Rational(1, 3), {"~#ratio" => [1, 3]})
70
+ marshals_structure("a Rational with big number", Rational(4953778853208128465, 636801457410081246), {"~#ratio" => ["~i4953778853208128465", "~i636801457410081246"]})
60
71
  end
61
72
 
62
73
  describe "custom handlers" do
@@ -65,7 +76,13 @@ module Transit
65
76
  def tag(_) nil end
66
77
  end
67
78
  writer = Writer.new(:json_verbose, io, :handlers => {Date => handler.new})
68
- assert { rescuing { writer.write(Date.today) }.message =~ /must provide a non-nil tag/ }
79
+ # transit-java returns the error message "Not supported:
80
+ # 2014-08-20". JRuby tests the error will be raised
81
+ if Transit::jruby?
82
+ assert { rescuing { writer.write(Date.today) }.is_a?(RuntimeError) }
83
+ else
84
+ assert { rescuing { writer.write(Date.today) }.message =~ /must provide a non-nil tag/ }
85
+ end
69
86
  end
70
87
 
71
88
  it "supports custom handlers for core types" do
@@ -204,17 +221,19 @@ module Transit
204
221
  describe "MESSAGE_PACK" do
205
222
  let(:writer) { Writer.new(:msgpack, io) }
206
223
 
207
- it "writes a single-char tagged-value as a 2-element array" do
224
+ # JRuby skips these 3 examples since they use raw massage pack
225
+ # api. Also, JRuby doesn't hava good counterpart.
226
+ it "writes a single-char tagged-value as a 2-element array", :jruby => Transit::jruby? do
208
227
  writer.write(TaggedValue.new("a","bc"))
209
228
  assert { MessagePack::Unpacker.new(StringIO.new(io.string)).read == ["~#'", "~abc"] }
210
229
  end
211
230
 
212
- it "writes a multi-char tagged-value as a 2-element array" do
231
+ it "writes a multi-char tagged-value as a 2-element array", :jruby => Transit::jruby? do
213
232
  writer.write(TaggedValue.new("abc","def"))
214
233
  assert { MessagePack::Unpacker.new(StringIO.new(io.string)).read == ["~#abc", "def"] }
215
234
  end
216
235
 
217
- it "writes a top-level scalar as a quote-tagged value" do
236
+ it "writes a top-level scalar as a quote-tagged value", :jruby => Transit::jruby? do
218
237
  writer.write("this")
219
238
  assert { MessagePack::Unpacker.new(StringIO.new(io.string)).read == ["~#'", "this"] }
220
239
  end
@@ -269,7 +288,14 @@ module Transit
269
288
  it 'raises when there is no handler for the type' do
270
289
  type = Class.new
271
290
  obj = type.new
272
- assert { rescuing { writer.write(obj) }.message =~ /Can not find a Write Handler/ }
291
+ # transit-java returns the error message "Not supported:
292
+ # #<#<Class:0x12d40609>:0x76437e9b>". JRuby tests error will
293
+ # be raised.
294
+ if Transit::jruby?
295
+ assert { rescuing { writer.write(obj) }.is_a?(RuntimeError) }
296
+ else
297
+ assert { rescuing { writer.write(obj) }.message =~ /Can not find a Write Handler/ }
298
+ end
273
299
  end
274
300
  end
275
301
  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.467
4
+ version: 0.8.539
5
5
  platform: ruby
6
6
  authors:
7
7
  - Russ Olsen
@@ -33,28 +33,22 @@ cert_chain:
33
33
  jTUiQ3C5kyy08BEMP/x+MtvWcT2dmub6YZ7uYGfNsYcuGKXLIs5Ew95ebzWGJ16M
34
34
  PSs4XGS0
35
35
  -----END CERTIFICATE-----
36
- date: 2014-07-22 00:00:00.000000000 Z
36
+ date: 2014-09-05 00:00:00.000000000 Z
37
37
  dependencies:
38
38
  - !ruby/object:Gem::Dependency
39
- name: addressable
39
+ name: oj
40
40
  requirement: !ruby/object:Gem::Requirement
41
41
  requirements:
42
42
  - - "~>"
43
43
  - !ruby/object:Gem::Version
44
- version: 2.3.6
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 2.3.6
44
+ version: 2.10.1
48
45
  type: :runtime
49
46
  prerelease: false
50
47
  version_requirements: !ruby/object:Gem::Requirement
51
48
  requirements:
52
49
  - - "~>"
53
50
  - !ruby/object:Gem::Version
54
- version: 2.3.6
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- version: 2.3.6
51
+ version: 2.10.1
58
52
  - !ruby/object:Gem::Dependency
59
53
  name: msgpack
60
54
  requirement: !ruby/object:Gem::Requirement
@@ -62,9 +56,6 @@ dependencies:
62
56
  - - "~>"
63
57
  - !ruby/object:Gem::Version
64
58
  version: 0.5.8
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: 0.5.8
68
59
  type: :runtime
69
60
  prerelease: false
70
61
  version_requirements: !ruby/object:Gem::Requirement
@@ -72,29 +63,6 @@ dependencies:
72
63
  - - "~>"
73
64
  - !ruby/object:Gem::Version
74
65
  version: 0.5.8
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- version: 0.5.8
78
- - !ruby/object:Gem::Dependency
79
- name: oj
80
- requirement: !ruby/object:Gem::Requirement
81
- requirements:
82
- - - "~>"
83
- - !ruby/object:Gem::Version
84
- version: 2.9.9
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- version: 2.9.9
88
- type: :runtime
89
- prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- requirements:
92
- - - "~>"
93
- - !ruby/object:Gem::Version
94
- version: 2.9.9
95
- - - ">="
96
- - !ruby/object:Gem::Version
97
- version: 2.9.9
98
66
  - !ruby/object:Gem::Dependency
99
67
  name: yard
100
68
  requirement: !ruby/object:Gem::Requirement
@@ -102,9 +70,6 @@ dependencies:
102
70
  - - "~>"
103
71
  - !ruby/object:Gem::Version
104
72
  version: 0.8.7.4
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- version: 0.8.7.4
108
73
  type: :development
109
74
  prerelease: false
110
75
  version_requirements: !ruby/object:Gem::Requirement
@@ -112,9 +77,6 @@ dependencies:
112
77
  - - "~>"
113
78
  - !ruby/object:Gem::Version
114
79
  version: 0.8.7.4
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: 0.8.7.4
118
80
  - !ruby/object:Gem::Dependency
119
81
  name: redcarpet
120
82
  requirement: !ruby/object:Gem::Requirement
@@ -122,9 +84,6 @@ dependencies:
122
84
  - - "~>"
123
85
  - !ruby/object:Gem::Version
124
86
  version: 3.1.1
125
- - - ">="
126
- - !ruby/object:Gem::Version
127
- version: 3.1.1
128
87
  type: :development
129
88
  prerelease: false
130
89
  version_requirements: !ruby/object:Gem::Requirement
@@ -132,9 +91,6 @@ dependencies:
132
91
  - - "~>"
133
92
  - !ruby/object:Gem::Version
134
93
  version: 3.1.1
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: 3.1.1
138
94
  - !ruby/object:Gem::Dependency
139
95
  name: yard-redcarpet-ext
140
96
  requirement: !ruby/object:Gem::Requirement
@@ -142,9 +98,6 @@ dependencies:
142
98
  - - "~>"
143
99
  - !ruby/object:Gem::Version
144
100
  version: 0.0.3
145
- - - ">="
146
- - !ruby/object:Gem::Version
147
- version: 0.0.3
148
101
  type: :development
149
102
  prerelease: false
150
103
  version_requirements: !ruby/object:Gem::Requirement
@@ -152,9 +105,20 @@ dependencies:
152
105
  - - "~>"
153
106
  - !ruby/object:Gem::Version
154
107
  version: 0.0.3
155
- - - ">="
108
+ - !ruby/object:Gem::Dependency
109
+ name: addressable
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
156
113
  - !ruby/object:Gem::Version
157
- version: 0.0.3
114
+ version: 2.3.6
115
+ type: :runtime
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 2.3.6
158
122
  - !ruby/object:Gem::Dependency
159
123
  name: rake
160
124
  requirement: !ruby/object:Gem::Requirement
@@ -190,9 +154,6 @@ dependencies:
190
154
  - - "~>"
191
155
  - !ruby/object:Gem::Version
192
156
  version: 0.7.1
193
- - - ">="
194
- - !ruby/object:Gem::Version
195
- version: 0.7.1
196
157
  type: :development
197
158
  prerelease: false
198
159
  version_requirements: !ruby/object:Gem::Requirement
@@ -200,9 +161,6 @@ dependencies:
200
161
  - - "~>"
201
162
  - !ruby/object:Gem::Version
202
163
  version: 0.7.1
203
- - - ">="
204
- - !ruby/object:Gem::Version
205
- version: 0.7.1
206
164
  description: Transit marshalling for Ruby
207
165
  email:
208
166
  - russ@cognitect.com
@@ -219,10 +177,15 @@ files:
219
177
  - lib/transit.rb
220
178
  - lib/transit/date_time_util.rb
221
179
  - lib/transit/decoder.rb
180
+ - lib/transit/marshaler/base.rb
181
+ - lib/transit/marshaler/cruby/json.rb
182
+ - lib/transit/marshaler/cruby/messagepack.rb
222
183
  - lib/transit/read_handlers.rb
223
184
  - lib/transit/reader.rb
224
185
  - lib/transit/rolling_cache.rb
225
186
  - lib/transit/transit_types.rb
187
+ - lib/transit/unmarshaler/cruby/json.rb
188
+ - lib/transit/unmarshaler/cruby/messagepack.rb
226
189
  - lib/transit/write_handlers.rb
227
190
  - lib/transit/writer.rb
228
191
  - spec/spec_helper.rb
metadata.gz.sig CHANGED
@@ -1 +1,3 @@
1
- 7=*KB)�?ɇ�c��|_;'�/�]rDy�u7��@"S��|O��֭G�+�'�f�O�\��:���fK��p0>��s��k5��G*3&����mMT`�V�g�Tiv�`^%�������k�[�,�&��@_��^��]o��
1
+ Rą#U2�V�=c.�w
2
+ �[5O3�,��MqK��Q}���׊�NiТU)I����HW�&|5����<�����n�91g>K�H��Z��Q�4H�,\ ��a�ʹz(h���tR�`'��P�m�V�]����m�RU/��n ����x7�p��U��1�qS�v LW��I����
3
+ �h&?y~}����M6���c�����)