vertica 0.9.0.beta2 → 0.9.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
1
  source :rubygems
2
- gemspec
2
+
3
+ gem 'rake'
4
+ gem 'jeweler'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vertica (0.9.0.beta1)
4
+ vertica (0.9.0.beta2)
5
5
  vertica
6
6
 
7
7
  GEM
data/Rakefile CHANGED
@@ -10,15 +10,12 @@ begin
10
10
 
11
11
  gem.email = 'sprsquish@gmail.com'
12
12
  gem.homepage = 'http://github.com/sprsquish/vertica'
13
- gem.authors = ['Jeff Smick', 'Matt Bauer']
13
+ gem.authors = ['Jeff Smick', 'Matt Bauer', 'Willem van Bergen']
14
14
 
15
15
  gem.files = FileList["[A-Z]*", 'lib/**/*.rb'].to_a
16
16
 
17
17
  gem.test_files = FileList['test/**/*.rb']
18
18
 
19
- gem.add_development_dependency 'jeweler'
20
- gem.add_development_dependency 'rake'
21
-
22
19
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
23
20
  end
24
21
 
@@ -34,21 +31,6 @@ Rake::TestTask.new(:test) do |test|
34
31
  test.verbose = true
35
32
  end
36
33
 
37
- # begin
38
- # require 'rcov/rcovtask'
39
- # Rcov::RcovTask.new do |test|
40
- # test.libs << 'spec'
41
- # test.pattern = 'spec/**/*_spec.rb'
42
- # test.rcov_opts += ['--exclude \/Library\/Ruby,spec\/', '--xrefs']
43
- # test.verbose = true
44
- # end
45
- # rescue LoadError
46
- # task :rcov do
47
- # abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
48
- # end
49
- # end
50
-
51
-
52
34
  begin
53
35
  require 'yard'
54
36
  YARD::Rake::YardocTask.new do |t|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.0.beta2
1
+ 0.9.0.beta3
@@ -13,7 +13,7 @@ module Vertica
13
13
  [:record, nil],
14
14
  [:unknown, nil],
15
15
  [:bool, lambda { |s| s == 't' }],
16
- [:in, lambda { |s| s.to_i }],
16
+ [:integer, lambda { |s| s.to_i }],
17
17
  [:float, lambda { |s| s.to_f }],
18
18
  [:char, nil],
19
19
  [:varchar, nil],
@@ -23,7 +23,7 @@ module Vertica
23
23
  [:timestamp_tz, lambda { |s| DateTime.parse(s, true) }],
24
24
  [:interval, nil],
25
25
  [:time_tz, nil],
26
- [:numeric, lambda { |s| s.to_d }],
26
+ [:numeric, lambda { |s| BigDecimal.new(s) }],
27
27
  [:bytea, nil],
28
28
  [:rle_tuple, nil]
29
29
  ]
@@ -1,3 +1,5 @@
1
+ require 'socket'
2
+
1
3
  module Vertica
2
4
  class Connection
3
5
 
@@ -9,7 +11,7 @@ module Vertica
9
11
 
10
12
  attr_reader :options, :notices, :transaction_status, :backend_pid, :backend_key, :notifications, :parameters
11
13
 
12
- attr_accessor :row_style
14
+ attr_accessor :row_style, :debug
13
15
 
14
16
  def self.cancel(existing_conn)
15
17
  conn = self.new(existing_conn.options.merge(:skip_startup => true))
@@ -21,7 +23,9 @@ module Vertica
21
23
  def initialize(options = {})
22
24
  reset_values
23
25
 
24
- @options = options
26
+ @options = {}
27
+ options.each { |key, value| @options[key.to_s.to_sym] = value }
28
+
25
29
  @notices = []
26
30
 
27
31
  @row_style = @options[:row_style] ? @options[:row_style] : :hash
@@ -37,19 +41,20 @@ module Vertica
37
41
 
38
42
  def socket
39
43
  @socket ||= begin
40
- conn = TCPSocket.new(@options[:host], @options[:port].to_s)
44
+ raw_socket = TCPSocket.new(@options[:host], @options[:port].to_s)
41
45
  if @options[:ssl]
42
- conn.write Messages::SslRequest.new.to_bytes
43
- if conn.read(1) == 'S'
44
- conn = OpenSSL::SSL::SSLSocket.new(conn, OpenSSL::SSL::SSLContext.new)
45
- conn.sync = true
46
- conn.connect
46
+ require 'openssl/ssl'
47
+ raw_socket.write Messages::SslRequest.new.to_bytes
48
+ if raw_socket.read(1) == 'S'
49
+ raw_socket = OpenSSL::SSL::SSLSocket.new(raw_socket, OpenSSL::SSL::SSLContext.new)
50
+ raw_socket.sync = true
51
+ raw_socket.connect
47
52
  else
48
53
  raise Error::ConnectionError.new("SSL requested but server doesn't support it.")
49
54
  end
50
55
  end
51
56
 
52
- conn
57
+ raw_socket
53
58
  end
54
59
  end
55
60
 
@@ -67,6 +72,7 @@ module Vertica
67
72
 
68
73
  def write(message)
69
74
  raise ArgumentError, "invalid message: (#{message.inspect})" unless message.respond_to?(:to_bytes)
75
+ puts "=> #{message.inspect}" if @debug
70
76
  socket.write message.to_bytes
71
77
  end
72
78
 
@@ -139,7 +145,9 @@ module Vertica
139
145
  type = read_bytes(1)
140
146
  size = read_bytes(4).unpack('N').first
141
147
  raise Vertica::Error::MessageError.new("Bad message size: #{size}.") unless size >= 4
142
- Messages::BackendMessage.factory type, read_bytes(size - 4)
148
+ msg = Messages::BackendMessage.factory type, read_bytes(size - 4)
149
+ puts "<= #{msg.inspect}" if @debug
150
+ return msg
143
151
  end
144
152
 
145
153
 
@@ -220,6 +228,9 @@ module Vertica
220
228
  @field_descriptions = []
221
229
  @field_values = []
222
230
  end
223
-
224
231
  end
225
232
  end
233
+
234
+ require 'vertica/column'
235
+ require 'vertica/result'
236
+ require 'vertica/messages/message'
@@ -40,6 +40,38 @@ module Vertica
40
40
  message_string ''
41
41
  end
42
42
  end
43
-
44
43
  end
45
44
  end
45
+
46
+ require 'vertica/messages/backend_messages/authentication'
47
+ require 'vertica/messages/backend_messages/backend_key_data'
48
+ require 'vertica/messages/backend_messages/bind_complete'
49
+ require 'vertica/messages/backend_messages/close_complete'
50
+ require 'vertica/messages/backend_messages/command_complete'
51
+ require 'vertica/messages/backend_messages/data_row'
52
+ require 'vertica/messages/backend_messages/empty_query_response'
53
+ require 'vertica/messages/backend_messages/notice_response'
54
+ require 'vertica/messages/backend_messages/error_response'
55
+ require 'vertica/messages/backend_messages/no_data'
56
+ require 'vertica/messages/backend_messages/notification_response'
57
+ require 'vertica/messages/backend_messages/parameter_description'
58
+ require 'vertica/messages/backend_messages/parameter_status'
59
+ require 'vertica/messages/backend_messages/parse_complete'
60
+ require 'vertica/messages/backend_messages/portal_suspended'
61
+ require 'vertica/messages/backend_messages/ready_for_query'
62
+ require 'vertica/messages/backend_messages/row_description'
63
+ require 'vertica/messages/backend_messages/unknown'
64
+
65
+ require 'vertica/messages/frontend_messages/bind'
66
+ require 'vertica/messages/frontend_messages/cancel_request'
67
+ require 'vertica/messages/frontend_messages/close'
68
+ require 'vertica/messages/frontend_messages/describe'
69
+ require 'vertica/messages/frontend_messages/execute'
70
+ require 'vertica/messages/frontend_messages/flush'
71
+ require 'vertica/messages/frontend_messages/parse'
72
+ require 'vertica/messages/frontend_messages/password'
73
+ require 'vertica/messages/frontend_messages/query'
74
+ require 'vertica/messages/frontend_messages/ssl_request'
75
+ require 'vertica/messages/frontend_messages/startup'
76
+ require 'vertica/messages/frontend_messages/sync'
77
+ require 'vertica/messages/frontend_messages/terminate'
data/lib/vertica.rb CHANGED
@@ -1,4 +1,8 @@
1
+ require 'date'
2
+ require 'bigdecimal'
3
+
1
4
  module Vertica
5
+
2
6
  class Error < StandardError
3
7
  class ConnectionError < Error; end
4
8
  class MessageError < Error; end
@@ -11,52 +15,26 @@ module Vertica
11
15
  def self.connect(*args)
12
16
  Connection.new(*args)
13
17
  end
18
+
19
+ def self.quote(value)
20
+ case value
21
+ when nil then 'NULL'
22
+ when false then 'FALSE'
23
+ when true then 'TRUE'
24
+ when DateTime then value.strftime("'%Y-%m-%d %H:%M:%S'::timestamp")
25
+ when Time then value.strftime("'%Y-%m-%d %H:%M:%S'::timestamp")
26
+ when Date then value.strftime("'%Y-%m-%d'::date")
27
+ when String then "'#{value.gsub(/'/, "''")}'"
28
+ when BigDecimal then value.to_s('F')
29
+ when Numeric then value.to_s
30
+ when Array then value.map { |v| self.quote(v) }.join(', ')
31
+ else self.quote(value.to_s)
32
+ end
33
+ end
34
+
35
+ def self.quote_identifier(identifier)
36
+ "\"#{identifier.to_s.gsub(/"/, '""')}\""
37
+ end
14
38
  end
15
39
 
16
- %w[
17
- socket
18
- uri
19
- openssl/ssl
20
- bigdecimal
21
- bigdecimal/util
22
- date
23
-
24
- vertica/column
25
- vertica/result
26
- vertica/connection
27
-
28
- vertica/messages/message
29
-
30
- vertica/messages/backend_messages/authentication
31
- vertica/messages/backend_messages/backend_key_data
32
- vertica/messages/backend_messages/bind_complete
33
- vertica/messages/backend_messages/close_complete
34
- vertica/messages/backend_messages/command_complete
35
- vertica/messages/backend_messages/data_row
36
- vertica/messages/backend_messages/empty_query_response
37
- vertica/messages/backend_messages/notice_response
38
- vertica/messages/backend_messages/error_response
39
- vertica/messages/backend_messages/no_data
40
- vertica/messages/backend_messages/notification_response
41
- vertica/messages/backend_messages/parameter_description
42
- vertica/messages/backend_messages/parameter_status
43
- vertica/messages/backend_messages/parse_complete
44
- vertica/messages/backend_messages/portal_suspended
45
- vertica/messages/backend_messages/ready_for_query
46
- vertica/messages/backend_messages/row_description
47
- vertica/messages/backend_messages/unknown
48
-
49
- vertica/messages/frontend_messages/bind
50
- vertica/messages/frontend_messages/cancel_request
51
- vertica/messages/frontend_messages/close
52
- vertica/messages/frontend_messages/describe
53
- vertica/messages/frontend_messages/execute
54
- vertica/messages/frontend_messages/flush
55
- vertica/messages/frontend_messages/parse
56
- vertica/messages/frontend_messages/password
57
- vertica/messages/frontend_messages/query
58
- vertica/messages/frontend_messages/ssl_request
59
- vertica/messages/frontend_messages/startup
60
- vertica/messages/frontend_messages/sync
61
- vertica/messages/frontend_messages/terminate
62
- ].each { |r| require r }
40
+ require 'vertica/connection'
@@ -20,7 +20,7 @@ class QueryTest < Test::Unit::TestCase
20
20
  r = @connection.query("SELECT * FROM test_table")
21
21
  assert_equal 1, r.row_count
22
22
  assert_equal 2, r.columns.length
23
- assert_equal :in, r.columns[0].data_type
23
+ assert_equal :integer, r.columns[0].data_type
24
24
  assert_equal :id, r.columns[0].name
25
25
  assert_equal :varchar, r.columns[1].data_type
26
26
  assert_equal :name, r.columns[1].name
@@ -33,7 +33,7 @@ class QueryTest < Test::Unit::TestCase
33
33
  r = @connection.query("SELECT * FROM test_table")
34
34
  assert_equal 1, r.row_count
35
35
  assert_equal 2, r.columns.length
36
- assert_equal :in, r.columns[0].data_type
36
+ assert_equal :integer, r.columns[0].data_type
37
37
  assert_equal :id, r.columns[0].name
38
38
  assert_equal :varchar, r.columns[1].data_type
39
39
  assert_equal :name, r.columns[1].name
@@ -46,7 +46,7 @@ class QueryTest < Test::Unit::TestCase
46
46
  r = @connection.query("SELECT * FROM test_table WHERE 1 != 1")
47
47
  assert_equal 0, r.row_count
48
48
  assert_equal 2, r.columns.length
49
- assert_equal :in, r.columns[0].data_type
49
+ assert_equal :integer, r.columns[0].data_type
50
50
  assert_equal :id, r.columns[0].name
51
51
  assert_equal :varchar, r.columns[1].data_type
52
52
  assert_equal :name, r.columns[1].name
@@ -57,7 +57,7 @@ class QueryTest < Test::Unit::TestCase
57
57
  r = @connection.query("INSERT INTO test_table VALUES (2, 'stefanie')")
58
58
  assert_equal 1, r.row_count
59
59
  assert_equal 1, r.columns.length
60
- assert_equal :in, r.columns[0].data_type
60
+ assert_equal :integer, r.columns[0].data_type
61
61
  assert_equal :OUTPUT, r.columns[0].name
62
62
  assert_equal [{:OUTPUT => 1}], r.rows
63
63
  end
@@ -67,7 +67,7 @@ class QueryTest < Test::Unit::TestCase
67
67
  r = @connection.query("DELETE FROM test_table WHERE 1 != 1")
68
68
  assert_equal 1, r.row_count
69
69
  assert_equal 1, r.columns.length
70
- assert_equal :in, r.columns[0].data_type
70
+ assert_equal :integer, r.columns[0].data_type
71
71
  assert_equal :OUTPUT, r.columns[0].name
72
72
  assert_equal [{:OUTPUT => 0}], r.rows
73
73
  end
@@ -76,7 +76,7 @@ class QueryTest < Test::Unit::TestCase
76
76
  r = @connection.query("DELETE FROM test_table WHERE id = 1")
77
77
  assert_equal 1, r.row_count
78
78
  assert_equal 1, r.columns.length
79
- assert_equal :in, r.columns[0].data_type
79
+ assert_equal :integer, r.columns[0].data_type
80
80
  assert_equal :OUTPUT, r.columns[0].name
81
81
  assert_equal [{:OUTPUT => 1}], r.rows
82
82
  end
@@ -113,7 +113,7 @@ class QueryTest < Test::Unit::TestCase
113
113
  # r = @connection.execute_prepared("my_ps")
114
114
  # assert_equal 1, r.row_count
115
115
  # assert_equal 2, r.columns.length
116
- # assert_equal :in, r.columns[0].data_type
116
+ # assert_equal :integer, r.columns[0].data_type
117
117
  # assert_equal :id, r.columns[0].name
118
118
  # assert_equal :varchar, r.columns[1].data_type
119
119
  # assert_equal :name, r.columns[1].name
@@ -126,7 +126,7 @@ class QueryTest < Test::Unit::TestCase
126
126
  # r = c.execute_prepared("my_ps", 1)
127
127
  # assert_equal 1, r.row_count
128
128
  # assert_equal 2, r.columns.length
129
- # assert_equal :in, r.columns[0].data_type
129
+ # assert_equal :integer, r.columns[0].data_type
130
130
  # assert_equal 'id', r.columns[0].name
131
131
  # assert_equal :varchar, r.columns[1].data_type
132
132
  # assert_equal 'name', r.columns[1].name
@@ -140,7 +140,7 @@ class QueryTest < Test::Unit::TestCase
140
140
  # r = c.execute_prepared("my_ps", 1, 3)
141
141
  # assert_equal 1, r.row_count
142
142
  # assert_equal 2, r.columns.length
143
- # assert_equal :in, r.columns[0].data_type
143
+ # assert_equal :integer, r.columns[0].data_type
144
144
  # assert_equal 'id', r.columns[0].name
145
145
  # assert_equal :varchar, r.columns[1].data_type
146
146
  # assert_equal 'name', r.columns[1].name
@@ -153,7 +153,7 @@ class QueryTest < Test::Unit::TestCase
153
153
  r = @connection.query("SELECT * FROM test_table")
154
154
  assert_equal 1, r.row_count
155
155
  assert_equal 2, r.columns.length
156
- assert_equal :in, r.columns[0].data_type
156
+ assert_equal :integer, r.columns[0].data_type
157
157
  assert_equal :id, r.columns[0].name
158
158
  assert_equal :varchar, r.columns[1].data_type
159
159
  assert_equal :name, r.columns[1].name
data/test/test_helper.rb CHANGED
@@ -6,5 +6,4 @@ require 'test/unit'
6
6
 
7
7
  require 'vertica'
8
8
 
9
- hash = YAML.load(File.read(File.expand_path("../connection.yml", __FILE__)))
10
- TEST_CONNECTION_HASH = hash.inject(Hash.new) { |carry, (k, v)| carry[k.to_sym] = v; carry }
9
+ TEST_CONNECTION_HASH = YAML.load(File.read(File.expand_path("../connection.yml", __FILE__)))
@@ -95,6 +95,9 @@ class BackendMessageTest < Test::Unit::TestCase
95
95
 
96
96
  msg = Vertica::Messages::DataRow.new("\x00\x02\x00\x00\x00\x011\x00\x00\x00\x04matt")
97
97
  assert_equal ['1', 'matt'], msg.values
98
+
99
+ msg = Vertica::Messages::DataRow.new("\x00\a\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF")
100
+ assert_equal [nil,nil,nil,nil,nil,nil,nil], msg.values
98
101
  end
99
102
 
100
103
  def test_command_complete_message
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+
3
+ class QuotingTest < Test::Unit::TestCase
4
+
5
+ def test_quote_identifier
6
+ assert_equal '"test"', Vertica.quote_identifier(:test)
7
+ assert_equal '"te""st"', Vertica.quote_identifier('te"st')
8
+ assert_equal '"te""""st"', Vertica.quote_identifier('te""st')
9
+ end
10
+
11
+ def test_quote
12
+ assert_equal "'test'", Vertica.quote('test')
13
+ assert_equal "'te''st'", Vertica.quote("te'st")
14
+ assert_equal "'te''''st'", Vertica.quote("te''st")
15
+ assert_equal "'test'", Vertica.quote(:test)
16
+
17
+ assert_equal 'NULL', Vertica.quote(nil)
18
+ assert_equal 'TRUE', Vertica.quote(true)
19
+ assert_equal 'FALSE', Vertica.quote(false)
20
+
21
+ assert_equal '1', Vertica.quote(1)
22
+ assert_equal '1.1', Vertica.quote(1.1)
23
+ assert_equal '1.1', Vertica.quote(BigDecimal.new('1.1'))
24
+
25
+ assert_equal "'2010-02-27'::date", Vertica.quote(Date.parse('2010-02-27'))
26
+ assert_equal "'2010-02-27 12:44:25'::timestamp", Vertica.quote(DateTime.parse('2010-02-27 12:44:25'))
27
+ assert_equal "'2010-02-27 12:44:25'::timestamp", Vertica.quote(Time.parse('2010-02-27 12:44:25'))
28
+
29
+ assert_equal "NULL, 1, TRUE, 'test'", Vertica.quote([nil, 1, true, 'test'])
30
+ end
31
+ end
metadata CHANGED
@@ -1,33 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vertica
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: true
5
- segments:
6
- - 0
7
- - 9
8
- - 0
9
- - beta2
10
- version: 0.9.0.beta2
4
+ prerelease: 6
5
+ version: 0.9.0.beta3
11
6
  platform: ruby
12
7
  authors:
13
8
  - Jeff Smick
14
9
  - Matt Bauer
10
+ - Willem van Bergen
15
11
  autorequire:
16
12
  bindir: bin
17
13
  cert_chain: []
18
14
 
19
- date: 2011-09-09 00:00:00 -04:00
15
+ date: 2011-09-12 00:00:00 -04:00
20
16
  default_executable:
21
17
  dependencies:
22
18
  - !ruby/object:Gem::Dependency
23
- name: vertica
19
+ name: rake
24
20
  requirement: &id001 !ruby/object:Gem::Requirement
25
21
  none: false
26
22
  requirements:
27
23
  - - ">="
28
24
  - !ruby/object:Gem::Version
29
- segments:
30
- - 0
31
25
  version: "0"
32
26
  type: :runtime
33
27
  prerelease: false
@@ -39,64 +33,10 @@ dependencies:
39
33
  requirements:
40
34
  - - ">="
41
35
  - !ruby/object:Gem::Version
42
- segments:
43
- - 0
44
36
  version: "0"
45
- type: :development
37
+ type: :runtime
46
38
  prerelease: false
47
39
  version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: jeweler
50
- requirement: &id003 !ruby/object:Gem::Requirement
51
- none: false
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- segments:
56
- - 0
57
- version: "0"
58
- type: :development
59
- prerelease: false
60
- version_requirements: *id003
61
- - !ruby/object:Gem::Dependency
62
- name: rake
63
- requirement: &id004 !ruby/object:Gem::Requirement
64
- none: false
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- segments:
69
- - 0
70
- version: "0"
71
- type: :development
72
- prerelease: false
73
- version_requirements: *id004
74
- - !ruby/object:Gem::Dependency
75
- name: jeweler
76
- requirement: &id005 !ruby/object:Gem::Requirement
77
- none: false
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- segments:
82
- - 0
83
- version: "0"
84
- type: :development
85
- prerelease: false
86
- version_requirements: *id005
87
- - !ruby/object:Gem::Dependency
88
- name: rake
89
- requirement: &id006 !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- segments:
95
- - 0
96
- version: "0"
97
- type: :development
98
- prerelease: false
99
- version_requirements: *id006
100
40
  description: Query Vertica with ruby
101
41
  email: sprsquish@gmail.com
102
42
  executables: []
@@ -155,6 +95,7 @@ files:
155
95
  - test/functional/value_conversion_test.rb
156
96
  - test/test_helper.rb
157
97
  - test/unit/backend_message_test.rb
98
+ - test/unit/quoting_test.rb
158
99
  has_rdoc: true
159
100
  homepage: http://github.com/sprsquish/vertica
160
101
  licenses: []
@@ -169,23 +110,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
169
110
  requirements:
170
111
  - - ">="
171
112
  - !ruby/object:Gem::Version
172
- segments:
173
- - 0
174
113
  version: "0"
175
114
  required_rubygems_version: !ruby/object:Gem::Requirement
176
115
  none: false
177
116
  requirements:
178
117
  - - ">"
179
118
  - !ruby/object:Gem::Version
180
- segments:
181
- - 1
182
- - 3
183
- - 1
184
119
  version: 1.3.1
185
120
  requirements: []
186
121
 
187
122
  rubyforge_project:
188
- rubygems_version: 1.3.7
123
+ rubygems_version: 1.6.2
189
124
  signing_key:
190
125
  specification_version: 3
191
126
  summary: Pure ruby library for interacting with Vertica
@@ -195,3 +130,4 @@ test_files:
195
130
  - test/functional/value_conversion_test.rb
196
131
  - test/test_helper.rb
197
132
  - test/unit/backend_message_test.rb
133
+ - test/unit/quoting_test.rb