tros 1.7.6.1 → 1.7.6.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  .DS_Store
2
+ /pkg
2
3
  /tmp
3
4
  /interop
4
5
  data.avr
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tros (1.7.6.1)
4
+ tros (1.7.6.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -10,6 +10,7 @@ GEM
10
10
  rake (10.3.2)
11
11
 
12
12
  PLATFORMS
13
+ java
13
14
  ruby
14
15
 
15
16
  DEPENDENCIES
data/lib/tros.rb CHANGED
@@ -22,9 +22,9 @@ require 'stringio'
22
22
  require 'zlib'
23
23
 
24
24
  module Tros
25
- class TrosError < StandardError; end
25
+ class AvroError < StandardError; end
26
26
 
27
- class TrosTypeError < Tros::TrosError
27
+ class AvroTypeError < Tros::AvroError
28
28
  def initialize(schm=nil, datum=nil, msg=nil)
29
29
  msg ||= "Not a #{schm.to_s}: #{datum}"
30
30
  super(msg)
@@ -26,7 +26,7 @@ module Tros
26
26
  META_SCHEMA = Schema.parse('{"type": "map", "values": "bytes"}')
27
27
  VALID_ENCODINGS = ['binary'] # not used yet
28
28
 
29
- class DataFileError < TrosError; end
29
+ class DataFileError < AvroError; end
30
30
 
31
31
  def self.open(file_path, mode='r', schema=nil, codec=nil)
32
32
  schema = Tros::Schema.parse(schema) if schema
data/lib/tros/io.rb CHANGED
@@ -17,14 +17,14 @@
17
17
  module Tros
18
18
  module IO
19
19
  # Raised when datum is not an example of schema
20
- class AvroTypeError < TrosError
20
+ class AvroTypeError < AvroError
21
21
  def initialize(expected_schema, datum)
22
22
  super("The datum #{datum.inspect} is not an example of schema #{expected_schema}")
23
23
  end
24
24
  end
25
25
 
26
26
  # Raised when writer's and reader's schema do not match
27
- class SchemaMatchException < TrosError
27
+ class SchemaMatchException < AvroError
28
28
  def initialize(writers_schema, readers_schema)
29
29
  super("Writer's schema #{writers_schema} and Reader's schema " +
30
30
  "#{readers_schema} do not match.")
@@ -205,7 +205,7 @@ module Tros
205
205
  # A string is encoded as a long followed by that many bytes of
206
206
  # UTF-8 encoded character data
207
207
  def write_string(datum)
208
- write_bytes(datum.encode('UTF-8'))
208
+ write_bytes(datum.encode('UTF-8').force_encoding('binary'))
209
209
  end
210
210
 
211
211
  # Write an arbritary datum.
@@ -304,7 +304,7 @@ module Tros
304
304
  when :union; read_union(writers_schema, readers_schema, decoder)
305
305
  when :record, :error, :request; read_record(writers_schema, readers_schema, decoder)
306
306
  else
307
- raise TrosError, "Cannot read unknown schema type: #{writers_schema.type}"
307
+ raise AvroError, "Cannot read unknown schema type: #{writers_schema.type}"
308
308
  end
309
309
  end
310
310
 
@@ -441,7 +441,7 @@ module Tros
441
441
  return read_record
442
442
  else
443
443
  fail_msg = "Unknown type: #{field_schema.type}"
444
- raise TrosError, fail_msg
444
+ raise AvroError, fail_msg
445
445
  end
446
446
  end
447
447
 
@@ -476,7 +476,7 @@ module Tros
476
476
  when :record, :error, :request
477
477
  skip_record(writers_schema, decoder)
478
478
  else
479
- raise TrosError, "Unknown schema type: #{writers_schema.type}"
479
+ raise AvroError, "Unknown schema type: #{writers_schema.type}"
480
480
  end
481
481
  end
482
482
 
@@ -535,7 +535,7 @@ module Tros
535
535
 
536
536
  def write_data(writers_schema, datum, encoder)
537
537
  unless Schema.validate(writers_schema, datum)
538
- raise TrosTypeError.new(writers_schema, datum)
538
+ raise AvroTypeError.new(writers_schema, datum)
539
539
  end
540
540
 
541
541
  # function dispatch to write datum
@@ -555,7 +555,7 @@ module Tros
555
555
  when :union; write_union(writers_schema, datum, encoder)
556
556
  when :record, :error, :request; write_record(writers_schema, datum, encoder)
557
557
  else
558
- raise TrosError.new("Unknown type: #{writers_schema.type}")
558
+ raise AvroError.new("Unknown type: #{writers_schema.type}")
559
559
  end
560
560
  end
561
561
 
@@ -590,14 +590,12 @@ module Tros
590
590
  end
591
591
 
592
592
  def write_union(writers_schema, datum, encoder)
593
- index_of_schema = -1
594
- found = writers_schema.schemas.
595
- find{|e| index_of_schema += 1; found = Schema.validate(e, datum) }
596
- unless found # Because find_index doesn't exist in 1.8.6
597
- raise TrosTypeError.new(writers_schema, datum)
598
- end
599
- encoder.write_long(index_of_schema)
600
- write_data(writers_schema.schemas[index_of_schema], datum, encoder)
593
+ index = writers_schema.schemas.find_index { |s| Schema.validate_strictly(s, datum) }
594
+ index ||= writers_schema.schemas.find_index { |s| Schema.validate(s, datum) }
595
+ raise AvroTypeError.new(writers_schema, datum) if index.nil?
596
+
597
+ encoder.write_long(index)
598
+ write_data(writers_schema.schemas[index], datum, encoder)
601
599
  end
602
600
 
603
601
  def write_record(writers_schema, datum, encoder)
data/lib/tros/ipc.rb CHANGED
@@ -18,7 +18,7 @@ require "net/http"
18
18
 
19
19
  module Tros::IPC
20
20
 
21
- class TrosRemoteError < Tros::TrosError; end
21
+ class TrosRemoteError < Tros::AvroError; end
22
22
 
23
23
  HANDSHAKE_REQUEST_SCHEMA = Tros::Schema.parse <<-JSON
24
24
  {
@@ -70,9 +70,9 @@ module Tros::IPC
70
70
  BUFFER_SIZE = 8192
71
71
 
72
72
  # Raised when an error message is sent by an Tros requestor or responder.
73
- class TrosRemoteException < Tros::TrosError; end
73
+ class TrosRemoteException < Tros::AvroError; end
74
74
 
75
- class ConnectionClosedException < Tros::TrosError; end
75
+ class ConnectionClosedException < Tros::AvroError; end
76
76
 
77
77
  class Requestor
78
78
  """Base class for the client side of a protocol interaction."""
@@ -149,7 +149,7 @@ module Tros::IPC
149
149
 
150
150
  message = local_protocol.messages[message_name]
151
151
  unless message
152
- raise TrosError, "Unknown message: #{message_name}"
152
+ raise AvroError, "Unknown message: #{message_name}"
153
153
  end
154
154
  encoder.write_string(message.name)
155
155
 
@@ -170,18 +170,18 @@ module Tros::IPC
170
170
  self.send_protocol = false
171
171
  we_have_matching_schema = true
172
172
  when 'CLIENT'
173
- raise TrosError.new('Handshake failure. match == CLIENT') if send_protocol
173
+ raise AvroError.new('Handshake failure. match == CLIENT') if send_protocol
174
174
  self.remote_protocol = Tros::Protocol.parse(handshake_response['serverProtocol'])
175
175
  self.remote_hash = handshake_response['serverHash']
176
176
  self.send_protocol = false
177
177
  we_have_matching_schema = true
178
178
  when 'NONE'
179
- raise TrosError.new('Handshake failure. match == NONE') if send_protocol
179
+ raise AvroError.new('Handshake failure. match == NONE') if send_protocol
180
180
  self.remote_protocol = Tros::Protocol.parse(handshake_response['serverProtocol'])
181
181
  self.remote_hash = handshake_response['serverHash']
182
182
  self.send_protocol = true
183
183
  else
184
- raise TrosError.new("Unexpected match: #{match}")
184
+ raise AvroError.new("Unexpected match: #{match}")
185
185
  end
186
186
 
187
187
  return we_have_matching_schema
@@ -199,12 +199,12 @@ module Tros::IPC
199
199
 
200
200
  # remote response schema
201
201
  remote_message_schema = remote_protocol.messages[message_name]
202
- raise TrosError.new("Unknown remote message: #{message_name}") unless remote_message_schema
202
+ raise AvroError.new("Unknown remote message: #{message_name}") unless remote_message_schema
203
203
 
204
204
  # local response schema
205
205
  local_message_schema = local_protocol.messages[message_name]
206
206
  unless local_message_schema
207
- raise TrosError.new("Unknown local message: #{message_name}")
207
+ raise AvroError.new("Unknown local message: #{message_name}")
208
208
  end
209
209
 
210
210
  # error flag
@@ -264,11 +264,11 @@ module Tros::IPC
264
264
  # schema resolution (one fine day)
265
265
  remote_message = remote_protocol.messages[remote_message_name]
266
266
  unless remote_message
267
- raise TrosError.new("Unknown remote message: #{remote_message_name}")
267
+ raise AvroError.new("Unknown remote message: #{remote_message_name}")
268
268
  end
269
269
  local_message = local_protocol.messages[remote_message_name]
270
270
  unless local_message
271
- raise TrosError.new("Unknown local message: #{remote_message_name}")
271
+ raise AvroError.new("Unknown local message: #{remote_message_name}")
272
272
  end
273
273
  writers_schema = remote_message.request
274
274
  readers_schema = local_message.request
@@ -292,7 +292,7 @@ module Tros::IPC
292
292
  writers_schema = local_message.errors || SYSTEM_ERROR_SCHEMA
293
293
  write_error(writers_schema, error, buffer_encoder)
294
294
  end
295
- rescue Tros::TrosError => e
295
+ rescue Tros::AvroError => e
296
296
  error = TrosRemoteException.new(e.to_s)
297
297
  buffer_encoder = Tros::IO::BinaryEncoder.new(StringIO.new)
298
298
  META_WRITER.write(response_metadata, buffer_encoder)
data/lib/tros/protocol.rb CHANGED
@@ -18,7 +18,7 @@ module Tros
18
18
  class Protocol
19
19
  VALID_TYPE_SCHEMA_TYPES = Set.new(%w[enum record error fixed])
20
20
  VALID_TYPE_SCHEMA_TYPES_SYM = Set.new(VALID_TYPE_SCHEMA_TYPES.map(&:to_sym))
21
- class ProtocolParseError < Tros::TrosError; end
21
+ class ProtocolParseError < Tros::AvroError; end
22
22
 
23
23
  attr_reader :name, :namespace, :types, :messages, :md5
24
24
  def self.parse(protocol_string)
data/lib/tros/schema.rb CHANGED
@@ -93,6 +93,17 @@ module Tros
93
93
 
94
94
  # Determine if a ruby datum is an instance of a schema
95
95
  def self.validate(expected_schema, datum)
96
+ return true if validate_strictly(expected_schema, datum)
97
+ case expected_schema.type_sym
98
+ when :float, :double
99
+ datum.is_a?(Float) || datum.is_a?(Fixnum) || datum.is_a?(Bignum)
100
+ else
101
+ return false
102
+ end
103
+ end
104
+
105
+ # Determine if a ruby datum is an instance of a schema
106
+ def self.validate_strictly(expected_schema, datum)
96
107
  case expected_schema.type_sym
97
108
  when :null
98
109
  datum.nil?
@@ -107,24 +118,24 @@ module Tros
107
118
  (datum.is_a?(Fixnum) || datum.is_a?(Bignum)) &&
108
119
  (LONG_MIN_VALUE <= datum) && (datum <= LONG_MAX_VALUE)
109
120
  when :float, :double
110
- datum.is_a?(Float) || datum.is_a?(Fixnum) || datum.is_a?(Bignum)
121
+ datum.is_a?(Float)
111
122
  when :fixed
112
123
  datum.is_a?(String) && datum.size == expected_schema.size
113
124
  when :enum
114
125
  expected_schema.symbols.include? datum
115
126
  when :array
116
127
  datum.is_a?(Array) &&
117
- datum.all?{|d| validate(expected_schema.items, d) }
128
+ datum.all?{|d| validate_strictly(expected_schema.items, d) }
118
129
  when :map
119
130
  datum.keys.all?{|k| k.is_a? String } &&
120
- datum.values.all?{|v| validate(expected_schema.values, v) }
131
+ datum.values.all?{|v| validate_strictly(expected_schema.values, v) }
121
132
  when :union
122
- expected_schema.schemas.any?{|s| validate(s, datum) }
133
+ expected_schema.schemas.any?{|s| validate_strictly(s, datum) }
123
134
  when :record, :error, :request
124
135
  datum.is_a?(Hash) &&
125
- expected_schema.fields.all?{|f| validate(f.type, datum[f.name]) }
136
+ expected_schema.fields.all?{|f| validate_strictly(f.type, datum[f.name]) }
126
137
  else
127
- raise "you suck #{expected_schema.inspect} is not allowed."
138
+ raise TypeError, "#{expected_schema.inspect} is not recognized as type."
128
139
  end
129
140
  end
130
141
 
@@ -322,7 +333,7 @@ module Tros
322
333
  elsif PRIMITIVE_TYPES.include?(type)
323
334
  super(type.to_sym)
324
335
  else
325
- raise TrosError.new("#{type} is not a valid primitive type.")
336
+ raise AvroError.new("#{type} is not a valid primitive type.")
326
337
  end
327
338
  end
328
339
 
@@ -337,7 +348,7 @@ module Tros
337
348
  def initialize(name, space, size, names=nil)
338
349
  # Ensure valid cto args
339
350
  unless size.is_a?(Fixnum) || size.is_a?(Bignum)
340
- raise TrosError, 'Fixed Schema requires a valid integer for size property.'
351
+ raise AvroError, 'Fixed Schema requires a valid integer for size property.'
341
352
  end
342
353
  super(:fixed, name, space, names)
343
354
  @size = size
@@ -368,7 +379,7 @@ module Tros
368
379
  end
369
380
  end
370
381
 
371
- class SchemaParseError < TrosError; end
382
+ class SchemaParseError < AvroError; end
372
383
 
373
384
  module Name
374
385
  def self.extract_namespace(name, namespace)
data/lib/tros/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tros
2
- VERSION = "1.7.6.1"
2
+ VERSION = "1.7.6.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tros
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.6.1
4
+ version: 1.7.6.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -103,12 +103,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
103
103
  - - ! '>='
104
104
  - !ruby/object:Gem::Version
105
105
  version: '0'
106
+ segments:
107
+ - 0
108
+ hash: 141493864149925103
106
109
  required_rubygems_version: !ruby/object:Gem::Requirement
107
110
  none: false
108
111
  requirements:
109
112
  - - ! '>='
110
113
  - !ruby/object:Gem::Version
111
114
  version: '0'
115
+ segments:
116
+ - 0
117
+ hash: 141493864149925103
112
118
  requirements: []
113
119
  rubyforge_project:
114
120
  rubygems_version: 1.8.23