xnlogic-transit-ruby 0.8.572-java

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.
@@ -0,0 +1,319 @@
1
+ # Copyright 2014 Cognitect. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS-IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'spec_helper'
16
+ require 'json'
17
+
18
+ module Transit
19
+ describe Writer do
20
+ let(:io) { StringIO.new('', 'w+') }
21
+ let(:writer) { Writer.new(:json_verbose, io) }
22
+
23
+ describe "marshaling transit types" do
24
+ def self.bytes
25
+ @bytes ||= SecureRandom.random_bytes
26
+ end
27
+
28
+ def self.marshals_scalar(label, value, rep, opts={})
29
+ it "marshals #{label}", :focus => opts[:focus] do
30
+ writer.write(value)
31
+ assert { JSON.parse(io.string) == {"~#'" => rep} }
32
+ end
33
+ end
34
+
35
+ def self.marshals_structure(label, value, rep, opts={})
36
+ it "marshals #{label}", :focus => opts[:focus] do
37
+ writer.write(value)
38
+ assert { JSON.parse(io.string) == rep }
39
+ end
40
+ end
41
+
42
+ marshals_scalar("a UUID",
43
+ UUID.new("dda5a83f-8f9d-4194-ae88-5745c8ca94a7"),
44
+ "~udda5a83f-8f9d-4194-ae88-5745c8ca94a7")
45
+ marshals_scalar("a Transit::Symbol", Transit::Symbol.new("foo"), "~$foo" )
46
+ marshals_scalar("a Fixnum", 9007199254740999, "~i9007199254740999")
47
+ marshals_scalar("a Bignum", 9223372036854775806, "~i9223372036854775806")
48
+ marshals_scalar("a Very Bignum", 4256768765123454321897654321234567, "~n4256768765123454321897654321234567")
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
59
+ marshals_scalar("an URI", Addressable::URI.parse("http://example.com/search"), "~rhttp://example.com/search")
60
+ marshals_structure("a link",
61
+ Link.new(Addressable::URI.parse("http://example.com/search"), "search", nil, "link", nil),
62
+ {"~#link" =>
63
+ {"href" => "~rhttp://example.com/search",
64
+ "rel" => "search",
65
+ "name" => nil,
66
+ "render" => "link",
67
+ "prompt" => nil}})
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"]})
71
+ end
72
+
73
+ describe "custom handlers" do
74
+ it "raises when a handler provides nil as a tag" do
75
+ handler = Class.new do
76
+ def tag(_) nil end
77
+ end
78
+ writer = Writer.new(:json_verbose, io, :handlers => {Date => handler.new})
79
+ if Transit::jruby?
80
+ assert { rescuing { writer.write(Date.today) }.message =~ /Not supported/ }
81
+ else
82
+ assert { rescuing { writer.write(Date.today) }.message =~ /must provide a non-nil tag/ }
83
+ end
84
+ end
85
+
86
+ it "supports custom handlers for core types" do
87
+ handler = Class.new do
88
+ def tag(_) "s" end
89
+ def rep(s) "MYSTRING: #{s}" end
90
+ def string_rep(s) rep(s) end
91
+ end
92
+ writer = Writer.new(:json_verbose, io, :handlers => {String => handler.new})
93
+ writer.write("this")
94
+ assert { JSON.parse(io.string).values.first == "MYSTRING: this" }
95
+ end
96
+
97
+ it "supports custom handlers for custom types" do
98
+ handler = Class.new do
99
+ def tag(_) "person" end
100
+ def rep(s) {:first_name => s.first_name} end
101
+ def string_rep(s) s.first_name end
102
+ end
103
+ writer = Writer.new(:json_verbose, io, :handlers => {Person => handler.new})
104
+ writer.write(Person.new("Russ"))
105
+ assert { JSON.parse(io.string) == {"~#person" => { "~:first_name" => "Russ" } } }
106
+ end
107
+
108
+ it "supports verbose handlers" do
109
+ phone_class = Class.new do
110
+ attr_reader :p
111
+ def initialize(p)
112
+ @p = p
113
+ end
114
+ end
115
+ handler = Class.new do
116
+ def tag(_) "phone" end
117
+ def rep(v) v.p end
118
+ def string_rep(v) v.p.to_s end
119
+ def verbose_handler
120
+ Class.new do
121
+ def tag(_) "phone" end
122
+ def rep(v) "PHONE: #{v.p}" end
123
+ def string_rep(v) rep(v) end
124
+ end.new
125
+ end
126
+ end
127
+
128
+ writer = Writer.new(:json, io, :handlers => {phone_class => handler.new})
129
+ writer.write(phone_class.new(123456789))
130
+ assert { JSON.parse(io.string) == ["~#phone", 123456789] }
131
+
132
+ io.rewind
133
+
134
+ writer = Writer.new(:json_verbose, io, :handlers => {phone_class => handler.new})
135
+ writer.write(phone_class.new(123456789))
136
+ assert { JSON.parse(io.string) == {"~#phone" => "PHONE: 123456789"} }
137
+ end
138
+ end
139
+
140
+ describe "formats" do
141
+ describe "JSON" do
142
+ let(:writer) { Writer.new(:json, io) }
143
+
144
+ it "writes a map as an array prefixed with '^ '" do
145
+ writer.write({:a => :b, 3 => 4})
146
+ assert { JSON.parse(io.string) == ["^ ", "~:a", "~:b", "~i3", 4] }
147
+ end
148
+
149
+ it "writes a single-char tagged-value as a string" do
150
+ writer.write([TaggedValue.new("a","bc")])
151
+ assert { JSON.parse(io.string) == ["~abc"] }
152
+ end
153
+
154
+ it "writes a multi-char tagged-value as a 2-element array" do
155
+ writer.write(TaggedValue.new("abc","def"))
156
+ assert { JSON.parse(io.string) == ["~#abc", "def"] }
157
+ end
158
+
159
+ it "writes a Date as an encoded hash with ms" do
160
+ writer.write([Date.new(2014,1,2)])
161
+ assert { JSON.parse(io.string) == ["~m1388620800000"] }
162
+ end
163
+
164
+ it "writes a Time as an encoded hash with ms" do
165
+ writer.write([(Time.at(1388631845) + 0.678)])
166
+ assert { JSON.parse(io.string) == ["~m1388631845678"] }
167
+ end
168
+
169
+ it "writes a DateTime as an encoded hash with ms" do
170
+ writer.write([(Time.at(1388631845) + 0.678).to_datetime])
171
+ assert { JSON.parse(io.string) == ["~m1388631845678"] }
172
+ end
173
+
174
+ it "writes a quote as a tagged array" do
175
+ writer.write("this")
176
+ assert { JSON.parse(io.string) == ["~#'", "this"] }
177
+ end
178
+
179
+ it "writes an int map-key as an encoded string" do
180
+ writer.write({1 => :one})
181
+ assert { io.string =~ /~i1/ }
182
+ end
183
+ end
184
+
185
+ describe "JSON_VERBOSE" do
186
+ let(:writer) { Writer.new(:json_verbose, io) }
187
+
188
+ it "does not use the cache" do
189
+ writer.write([{"this" => "that"}, {"this" => "the other"}])
190
+ assert { JSON.parse(io.string) == [{"this" => "that"}, {"this" => "the other"}] }
191
+ end
192
+
193
+ it "writes a single-char tagged-value as a string" do
194
+ writer.write([TaggedValue.new("a","bc")])
195
+ assert { JSON.parse(io.string) == ["~abc"] }
196
+ end
197
+
198
+ it "writes a multi-char tagged-value as a map" do
199
+ writer.write(TaggedValue.new("abc","def"))
200
+ assert { JSON.parse(io.string) == {"~#abc" => "def"} }
201
+ end
202
+
203
+ it "writes a Date as an encoded human-readable strings" do
204
+ writer.write([Date.new(2014,1,2)])
205
+ assert { JSON.parse(io.string) == ["~t2014-01-02T00:00:00.000Z"] }
206
+ end
207
+
208
+ it "writes a Time as an encoded human-readable strings" do
209
+ writer.write([(Time.at(1388631845) + 0.678)])
210
+ assert { JSON.parse(io.string) == ["~t2014-01-02T03:04:05.678Z"] }
211
+ end
212
+
213
+ it "writes a DateTime as an encoded human-readable strings" do
214
+ writer.write([(Time.at(1388631845) + 0.678).to_datetime])
215
+ assert { JSON.parse(io.string) == ["~t2014-01-02T03:04:05.678Z"] }
216
+ end
217
+
218
+ it "writes a quote as a tagged map" do
219
+ writer.write("this")
220
+ assert { JSON.parse(io.string) == {"~#'" => "this"} }
221
+ end
222
+
223
+ it "writes an int map-key as an encoded string" do
224
+ writer.write({1 => :one})
225
+ assert { io.string =~ /~i1/ }
226
+ end
227
+ end
228
+
229
+ # JRuby skips these 3 examples since they use raw massage pack
230
+ # api. Also, JRuby doesn't have good counterpart.
231
+ describe "MESSAGE_PACK", :unless => Transit::jruby? do
232
+ let(:writer) { Writer.new(:msgpack, io) }
233
+
234
+ it "writes a single-char tagged-value as a 2-element array" do
235
+ writer.write(TaggedValue.new("a","bc"))
236
+ assert { MessagePack::Unpacker.new(StringIO.new(io.string)).read == ["~#'", "~abc"] }
237
+ end
238
+
239
+ it "writes a multi-char tagged-value as a 2-element array" do
240
+ writer.write(TaggedValue.new("abc","def"))
241
+ assert { MessagePack::Unpacker.new(StringIO.new(io.string)).read == ["~#abc", "def"] }
242
+ end
243
+
244
+ it "writes a top-level scalar as a quote-tagged value" do
245
+ writer.write("this")
246
+ assert { MessagePack::Unpacker.new(StringIO.new(io.string)).read == ["~#'", "this"] }
247
+ end
248
+
249
+ it "writes an int map-key as an int" do
250
+ writer.write({1 => :one})
251
+ assert { io.string.each_char.drop(1).first == "\u0001" }
252
+ end
253
+ end
254
+
255
+ describe "ints" do
256
+ it "encodes ints <= max signed 64 bit with 'i'" do
257
+ 1.upto(5).to_a.reverse.each do |n|
258
+ io.rewind
259
+ writer.write([(2**63) - n])
260
+ assert { JSON.parse(io.string).first[1] == "i" }
261
+ end
262
+ end
263
+
264
+ it "encodes ints > max signed 64 bit with 'n'" do
265
+ 0.upto(4).each do |n|
266
+ io.rewind
267
+ writer.write([(2**63) + n])
268
+ assert { JSON.parse(io.string).first[1] == "n" }
269
+ end
270
+ end
271
+ end
272
+
273
+ describe "escaped strings" do
274
+ [ESC, SUB, RES, "#{SUB} "].each do |c|
275
+ it "escapes a String starting with #{c}" do
276
+ writer.write("#{c}whatever")
277
+ assert { JSON.parse(io.string) == {"#{TAG}#{QUOTE}" => "~#{c}whatever"}}
278
+ end
279
+ end
280
+ end
281
+
282
+ describe "edge cases" do
283
+ it 'writes correct json for TaggedValues in a map-as-array (json)' do
284
+ writer = Writer.new(:json, io)
285
+ v = {7924023966712353515692932 => TaggedValue.new("ratio", [1, 3]),
286
+ 100 => TaggedValue.new("ratio", [1, 2])}
287
+ writer.write(v)
288
+ expected = ["^ ",
289
+ "~n7924023966712353515692932", ["~#ratio", [1,3]],
290
+ "~i100",["^1", [1,2]]]
291
+ actual = io.string
292
+ assert { JSON.parse(io.string) == expected }
293
+ end
294
+
295
+ it 'writes out strings starting with `' do
296
+ v = "`~hello"
297
+ writer.write([v])
298
+ assert { JSON.parse(io.string).first == "~`~hello" }
299
+ end
300
+
301
+ it 'raises when there is no handler for the type at the top level' do
302
+ if Transit::jruby?
303
+ assert { rescuing { writer.write(Class.new.new) }.message =~ /Not supported/ }
304
+ else
305
+ assert { rescuing { writer.write(Class.new.new) }.message =~ /Can not find a Write Handler/ }
306
+ end
307
+ end
308
+
309
+ it 'raises when there is no handler for the type' do
310
+ if Transit::jruby?
311
+ assert { rescuing { writer.write([Class.new.new]) }.message =~ /Not supported/ }
312
+ else
313
+ assert { rescuing { writer.write([Class.new.new]) }.message =~ /Can not find a Write Handler/ }
314
+ end
315
+ end
316
+ end
317
+ end
318
+ end
319
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xnlogic-transit-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.572
5
+ platform: java
6
+ authors:
7
+ - Russ Olsen
8
+ - David Chelimsky
9
+ - Yoko Harada
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-03-03 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: lock_jar
17
+ version_requirements: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.10.0
22
+ requirement: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.10.0
27
+ prerelease: false
28
+ type: :runtime
29
+ - !ruby/object:Gem::Dependency
30
+ name: rake-compiler
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 0.9.2
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.2
41
+ prerelease: false
42
+ type: :development
43
+ - !ruby/object:Gem::Dependency
44
+ name: addressable
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ~>
48
+ - !ruby/object:Gem::Version
49
+ version: 2.3.6
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.3.6
55
+ prerelease: false
56
+ type: :runtime
57
+ - !ruby/object:Gem::Dependency
58
+ name: rake
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '10.1'
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '10.1'
69
+ prerelease: false
70
+ type: :development
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '3.0'
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ prerelease: false
84
+ type: :development
85
+ - !ruby/object:Gem::Dependency
86
+ name: wrong
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ~>
90
+ - !ruby/object:Gem::Version
91
+ version: 0.7.1
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 0.7.1
97
+ prerelease: false
98
+ type: :development
99
+ description: Transit marshalling for Ruby
100
+ email:
101
+ - russ@cognitect.com
102
+ - dchelimsky@cognitect.com
103
+ - yoko@cognitect.com
104
+ executables: []
105
+ extensions: []
106
+ extra_rdoc_files: []
107
+ files:
108
+ - .yard_redcarpet_ext
109
+ - .yardopts
110
+ - CHANGELOG.md
111
+ - Jarfile
112
+ - LICENSE
113
+ - README.md
114
+ - lib/transit.jar
115
+ - lib/transit.rb
116
+ - lib/transit/date_time_util.rb
117
+ - lib/transit/decoder.rb
118
+ - lib/transit/marshaler/base.rb
119
+ - lib/transit/marshaler/jruby/json.rb
120
+ - lib/transit/marshaler/jruby/messagepack.rb
121
+ - lib/transit/read_handlers.rb
122
+ - lib/transit/reader.rb
123
+ - lib/transit/rolling_cache.rb
124
+ - lib/transit/transit_types.rb
125
+ - lib/transit/write_handlers.rb
126
+ - lib/transit/writer.rb
127
+ - spec/spec_helper.rb
128
+ - spec/transit/date_time_util_spec.rb
129
+ - spec/transit/decoder_spec.rb
130
+ - spec/transit/exemplar_spec.rb
131
+ - spec/transit/marshaler_spec.rb
132
+ - spec/transit/reader_spec.rb
133
+ - spec/transit/rolling_cache_spec.rb
134
+ - spec/transit/round_trip_spec.rb
135
+ - spec/transit/transit_types_spec.rb
136
+ - spec/transit/writer_spec.rb
137
+ homepage: http://github.com/cognitect/transit-ruby
138
+ licenses:
139
+ - Apache License 2.0
140
+ metadata: {}
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - '>='
148
+ - !ruby/object:Gem::Version
149
+ version: 1.9.3
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 2.4.5
158
+ signing_key:
159
+ specification_version: 4
160
+ summary: Transit marshalling for Ruby
161
+ test_files:
162
+ - spec/spec_helper.rb
163
+ - spec/transit/date_time_util_spec.rb
164
+ - spec/transit/decoder_spec.rb
165
+ - spec/transit/exemplar_spec.rb
166
+ - spec/transit/marshaler_spec.rb
167
+ - spec/transit/reader_spec.rb
168
+ - spec/transit/rolling_cache_spec.rb
169
+ - spec/transit/round_trip_spec.rb
170
+ - spec/transit/transit_types_spec.rb
171
+ - spec/transit/writer_spec.rb