activerecord-jdbc-adapter 1.3.3 → 1.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: afad2b1bdef2eebe2358aa5de395923a306d3485
4
- data.tar.gz: 467e05b0176a944fa16b3011e902e549629ae222
3
+ metadata.gz: 928b3af97782b45db074f63a7c5a3242e7223ea9
4
+ data.tar.gz: ad5a1f8133f58957d7ab2f9678367523b85c29a9
5
5
  SHA512:
6
- metadata.gz: c23850d472d6e6cb0ced6a598ec119cef76c6d1e34257682b37ace3fac27e50488e5bc8629e96bf3d9f7acaafdb0fe22d58179d4a6ad1f9efdf2dccda54abeac
7
- data.tar.gz: 36092c2ad04aaa6b1f2da21f6dce1f6fe69ee937b02e68a9db189a97506ff5f2f4ae9e6cff69bd8e80d2125f4d6bcc187dc0b96c436789f2f292419a3649e13c
6
+ metadata.gz: be7f8bbb664f74030fc79097e8f6b673b5ed93acfc348271ccfe6fa9b1e3c3098f34afbb071d597bdb8dad561828c0912a443516848a43dfd56f19653fbe7c4a
7
+ data.tar.gz: 60516ac2d7c14bb124b8215400368152014ff00e32a8a9b4c7790cdbcb4eaf8fe9c3ffc3510d23e20277850469e9d41a2ab23d8e2640a0ba0206ea41e1bd81c4
data/Appraisals CHANGED
@@ -12,12 +12,12 @@ appraise "rails31" do
12
12
  end
13
13
 
14
14
  appraise "rails32" do
15
- gem "activerecord", "~> 3.2.15", :require => false
15
+ gem "activerecord", "~> 3.2.16", :require => false
16
16
  end
17
17
 
18
18
  appraise "rails40" do
19
19
  # NOTE: make sure you're using --1.9 with AR-4.0
20
- gem "activerecord", "~> 4.0.0", :require => false
20
+ gem "activerecord", "~> 4.0.2", :require => false
21
21
  end
22
22
 
23
23
  appraise "rails41" do
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gem 'activerecord', :require => nil
4
- gem 'thread_safe', :require => nil
4
+ gem 'thread_safe', :require => nil # "optional" - we can roll without it
5
5
  if defined?(JRUBY_VERSION) && JRUBY_VERSION < '1.7.0'
6
6
  gem 'jruby-openssl', :platform => :jruby
7
7
  end
data/History.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 1.3.4 (12/12/13)
2
+
3
+ - [postgres] unwrap connection instead of casting when adding custom types (#515)
4
+ - [postgres] allow returning string values for (JDBC) arrays with (#510)
5
+ - allow for symbol keys with custom JDBC properties in `config[:properties]`
6
+ - replacing use of AR::ConnectionFailed with AR::ConnectionNotEstablished (#513)
7
+ - [firebird] fix for missing args when visit_Arel_Nodes_SelectCore is called
8
+ - [postgres] better column compatibility with 3.x (avoid array/oid_type)
9
+ - [postgres] backport array-parser due `Column#extract_default` (#504)
10
+ - [postgres] backported "Correctly parse bigint defaults in PostgreSQL"
11
+ - [postgres] 4.0 compat - detect default_function just like on MRI
12
+ - [postgres] backport support for negative money values (in parenthesis)
13
+ - [postgres] support :login_timeout as a standalone config option
14
+ - [firebird] align `prefetch_primary_key?` with Oracle (only for simple PKs)
15
+ - [oracle] do not pre-fetch the primary key if multiple primary keys exist (#498)
16
+
17
+ Code Contributors: @andfx, Gavin Stark, Ray Zane, @chapmajs
18
+
1
19
  ## 1.3.3 (11/12/13)
2
20
 
3
21
  - [mysql] allow encoding to be server-detected (using `encoding: false`)
@@ -24,7 +24,8 @@ Gem::Specification.new do |gem|
24
24
 
25
25
  gem.files = `git ls-files`.split("\n").
26
26
  reject { |f| f =~ /^(activerecord-jdbc[^-]|jdbc-)/ }. # gem directories
27
- reject { |f| f =~ /^(bench|test)/ } # not sure if including tests is useful
27
+ reject { |f| f =~ /^(bench|test)/ }. # not sure if including tests is useful
28
+ reject { |f| f =~ /^(gemfiles)/ } # no tests - no Gemfile_s appraised ...
28
29
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
29
30
  gem.test_files = gem.files.grep(%r{^test/})
30
31
 
@@ -11,7 +11,7 @@ module Arel
11
11
  ].compact.join(' ').strip
12
12
 
13
13
  sql = [
14
- o.cores.map { |x| visit_Arel_Nodes_SelectCore x }.join,
14
+ o.cores.map { |x| do_visit_select_core x, a }.join,
15
15
  ("ORDER BY #{o.orders.map { |x| do_visit x, a }.join(', ')}" unless o.orders.empty?),
16
16
  ].compact.join ' '
17
17
 
@@ -96,7 +96,7 @@ module ArJdbc
96
96
  md = jdbc_connection.meta_data
97
97
  major_version = md.database_major_version; minor_version = md.database_minor_version
98
98
  if major_version < 10 || (major_version == 10 && minor_version < 5)
99
- raise ::ActiveRecord::ConnectionFailed, "Derby adapter requires Derby >= 10.5"
99
+ raise ::ActiveRecord::ConnectionNotEstablished, "Derby adapter requires Derby >= 10.5"
100
100
  end
101
101
  if major_version == 10 && minor_version < 8 # 10.8 ~ supports JDBC 4.1
102
102
  config[:connection_alive_sql] ||=
@@ -166,11 +166,13 @@ module ArJdbc
166
166
  end
167
167
 
168
168
  # Should primary key values be selected from their corresponding
169
- # sequence before the insert statement? If true, next_sequence_value
170
- # is called before each insert to set the record's primary key.
171
- # This is false for all adapters but Firebird.
169
+ # sequence before the insert statement?
170
+ # @see #next_sequence_value
171
+ # @override
172
172
  def prefetch_primary_key?(table_name = nil)
173
- true
173
+ return true if table_name.nil?
174
+ table_name = table_name.to_s
175
+ columns(table_name).count { |column| column.primary } == 1
174
176
  end
175
177
 
176
178
  def default_sequence_name(table_name, column=nil)
@@ -16,8 +16,7 @@ module ActiveRecord
16
16
  default = args.shift
17
17
  else # for extending classes allow ignoring first argument :
18
18
  if ! config.nil? && ! config.is_a?(Hash)
19
- # initialize(name, default, *args)
20
- default = name; name = config
19
+ default = name; name = config # initialize(name, default, *args)
21
20
  else
22
21
  default = args.shift
23
22
  end
@@ -2,7 +2,7 @@ module ActiveRecord
2
2
  module ConnectionAdapters
3
3
  class JdbcDriver
4
4
  attr_reader :name, :properties
5
-
5
+
6
6
  def initialize(name, properties = {})
7
7
  @name = name
8
8
  @driver = driver_class.new
@@ -10,10 +10,10 @@ module ActiveRecord
10
10
  @properties = properties # allow programmatically set properties
11
11
  else
12
12
  @properties = Java::JavaUtil::Properties.new
13
- properties.each { |key, val| @properties[key] = val.to_s } if properties
13
+ properties.each { |key, val| @properties[key.to_s] = val.to_s } if properties
14
14
  end
15
15
  end
16
-
16
+
17
17
  def driver_class
18
18
  @driver_class ||= begin
19
19
  driver_class_const = (@name[0...1].capitalize + @name[1..@name.length]).gsub(/\./, '_')
@@ -20,7 +20,7 @@ module ArJdbc
20
20
  def init_connection(jdbc_connection)
21
21
  meta = jdbc_connection.meta_data
22
22
  if meta.driver_major_version < 5
23
- raise ::ActiveRecord::ConnectionFailed,
23
+ raise ::ActiveRecord::ConnectionNotEstablished,
24
24
  "MySQL adapter requires driver >= 5.0 got: '#{meta.driver_version}'"
25
25
  elsif meta.driver_major_version == 5 && meta.driver_minor_version < 1
26
26
  config[:connection_alive_sql] ||= 'SELECT 1' # need 5.1 for JDBC 4.0
@@ -508,7 +508,7 @@ module ArJdbc
508
508
  def prefetch_primary_key?(table_name = nil)
509
509
  return true if table_name.nil?
510
510
  table_name = table_name.to_s
511
- columns(table_name).detect { |column| column.primary }
511
+ columns(table_name).count { |column| column.primary } == 1
512
512
  end
513
513
 
514
514
  # @override
@@ -147,7 +147,7 @@ module ArJdbc
147
147
  end
148
148
 
149
149
  def type_cast(value, column, array_member = false)
150
- return super unless column
150
+ return super(value, nil) unless column
151
151
 
152
152
  case value
153
153
  when String
@@ -243,6 +243,7 @@ module ArJdbc
243
243
  def prepare_column_options(column, types)
244
244
  spec = super
245
245
  spec[:array] = 'true' if column.respond_to?(:array) && column.array
246
+ spec[:default] = "\"#{column.default_function}\"" if column.default_function
246
247
  spec
247
248
  end if AR4_COMPAT
248
249
 
@@ -1237,16 +1238,25 @@ module ActiveRecord::ConnectionAdapters
1237
1238
  include ::ArJdbc::PostgreSQL::Column
1238
1239
 
1239
1240
  def initialize(name, default, oid_type = nil, sql_type = nil, null = true)
1240
- # NOTE: we support AR <= 3.2 : (name, default, sql_type = nil, null = true)
1241
- null, sql_type, oid_type = !! sql_type, oid_type, nil unless oid_type.is_a?(Integer)
1242
- @oid_type = oid_type
1243
- if sql_type =~ /\[\]$/
1241
+ if oid_type.is_a?(Integer) then @oid_type = oid_type
1242
+ else # NOTE: AR <= 3.2 : (name, default, sql_type = nil, null = true)
1243
+ null, sql_type, oid_type = !! sql_type, oid_type, nil
1244
+ end
1245
+ if sql_type =~ /\[\]$/ && ArJdbc::PostgreSQL::AR4_COMPAT
1244
1246
  @array = true if respond_to?(:array)
1245
1247
  super(name, default, sql_type[0..sql_type.length - 3], null)
1246
1248
  else
1247
1249
  @array = false if respond_to?(:array)
1248
1250
  super(name, default, sql_type, null)
1249
1251
  end
1252
+
1253
+ @default_function = default if has_default_function?(@default, default)
1254
+ end
1255
+
1256
+ private
1257
+
1258
+ def has_default_function?(default_value, default)
1259
+ ! default_value && ( %r{\w+\(.*\)} === default )
1250
1260
  end
1251
1261
 
1252
1262
  end
@@ -1344,7 +1354,7 @@ module ActiveRecord::ConnectionAdapters
1344
1354
 
1345
1355
  def primary_key(name, type = :primary_key, options = {})
1346
1356
  return super unless type == :uuid
1347
- options[:default] ||= 'uuid_generate_v4()'
1357
+ options[:default] = options.fetch(:default, 'uuid_generate_v4()')
1348
1358
  options[:primary_key] = true
1349
1359
  column name, type, options
1350
1360
  end if ActiveRecord::VERSION::MAJOR > 3 # 3.2 super expects (name)
@@ -1402,6 +1412,7 @@ module ActiveRecord::ConnectionAdapters
1402
1412
  end
1403
1413
 
1404
1414
  if ActiveRecord::VERSION::MAJOR < 4 # Rails 3.x compatibility
1415
+ PostgreSQLJdbcConnection.raw_array_type = true if PostgreSQLJdbcConnection.raw_array_type? == nil
1405
1416
  PostgreSQLJdbcConnection.raw_hstore_type = true if PostgreSQLJdbcConnection.raw_hstore_type? == nil
1406
1417
  end
1407
1418
 
@@ -0,0 +1,89 @@
1
+ module ArJdbc
2
+ module PostgreSQL
3
+ module ArrayParser
4
+
5
+ def parse_pg_array(string)
6
+ parse_data(string, 0)
7
+ end
8
+
9
+ private
10
+
11
+ def parse_data(string, index)
12
+ local_index = index
13
+ array = []
14
+ while(local_index < string.length)
15
+ case string[local_index]
16
+ when '{'
17
+ local_index,array = parse_array_contents(array, string, local_index + 1)
18
+ when '}'
19
+ return array
20
+ end
21
+ local_index += 1
22
+ end
23
+
24
+ array
25
+ end
26
+
27
+ def parse_array_contents(array, string, index)
28
+ is_escaping = false
29
+ is_quoted = false
30
+ was_quoted = false
31
+ current_item = ''
32
+
33
+ local_index = index
34
+ while local_index
35
+ token = string[local_index]
36
+ if is_escaping
37
+ current_item << token
38
+ is_escaping = false
39
+ else
40
+ if is_quoted
41
+ case token
42
+ when '"'
43
+ is_quoted = false
44
+ was_quoted = true
45
+ when "\\"
46
+ is_escaping = true
47
+ else
48
+ current_item << token
49
+ end
50
+ else
51
+ case token
52
+ when "\\"
53
+ is_escaping = true
54
+ when ','
55
+ add_item_to_array(array, current_item, was_quoted)
56
+ current_item = ''
57
+ was_quoted = false
58
+ when '"'
59
+ is_quoted = true
60
+ when '{'
61
+ internal_items = []
62
+ local_index,internal_items = parse_array_contents(internal_items, string, local_index + 1)
63
+ array.push(internal_items)
64
+ when '}'
65
+ add_item_to_array(array, current_item, was_quoted)
66
+ return local_index,array
67
+ else
68
+ current_item << token
69
+ end
70
+ end
71
+ end
72
+
73
+ local_index += 1
74
+ end
75
+ return local_index,array
76
+ end
77
+
78
+ def add_item_to_array(array, current_item, quoted)
79
+ if current_item.length == 0
80
+ elsif !quoted && current_item == 'NULL'
81
+ array.push nil
82
+ else
83
+ array.push current_item
84
+ end
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -13,13 +13,27 @@ module ArJdbc
13
13
  def self.included(base)
14
14
  # NOTE: assumes a standalone PostgreSQLColumn class
15
15
  class << base
16
- include Cast
16
+
17
17
  attr_accessor :money_precision
18
+
19
+ # Loads pg_array_parser if available. String parsing can be
20
+ # performed quicker by a native extension, which will not create
21
+ # a large amount of Ruby objects that will need to be garbage
22
+ # collected. pg_array_parser has a C and Java extension
23
+ begin
24
+ require 'pg_array_parser'
25
+ include PgArrayParser
26
+ rescue LoadError
27
+ require 'arjdbc/postgresql/array_parser'
28
+ include ArrayParser
29
+ end if AR4_COMPAT
30
+
31
+ include Cast
32
+
18
33
  end
19
34
  end
20
35
 
21
- attr_accessor :array
22
- def array?; array; end # in case we remove the array reader
36
+ ( attr_accessor :array; def array?; array; end ) if AR4_COMPAT
23
37
 
24
38
  # Extracts the value from a PostgreSQL column default definition.
25
39
  #
@@ -38,7 +52,7 @@ module ArJdbc
38
52
  when /\A'(.*)'::(num|date|tstz|ts|int4|int8)range\z/m
39
53
  $1
40
54
  # Numeric types
41
- when /\A\(?(-?\d+(\.\d*)?\)?)\z/
55
+ when /\A\(?(-?\d+(\.\d*)?\)?(::bigint)?)\z/
42
56
  $1
43
57
  # Character types
44
58
  when /\A\(?'(.*)'::.*\b(?:character varying|bpchar|text)\z/m
@@ -90,16 +104,29 @@ module ArJdbc
90
104
  end
91
105
 
92
106
  # Casts value (which is a String) to an appropriate instance.
93
- def type_cast(value)
107
+ # @private
108
+ def type_cast(value) # AR < 4.0 version
109
+ return if value.nil?
110
+ return super if respond_to?(:encoded?) && encoded? # since AR-3.2
111
+
112
+ case sql_type
113
+ when 'money'
114
+ self.class.string_to_money(value)
115
+ else super
116
+ end
117
+ end
118
+
119
+ # Casts value (which is a String) to an appropriate instance.
120
+ def type_cast(value, type = false) # AR >= 4.0 version
94
121
  return if value.nil?
95
- return super if encoded? # respond_to?(:encoded?) only since AR-3.2
122
+ return super(value) if encoded?
96
123
 
97
124
  # NOTE: we do not use OID::Type
98
125
  # @oid_type.type_cast value
99
126
 
100
- return value if array? # handled on the connection (JDBC) side
127
+ return self.class.string_to_array(value, self) if array? && type == false
101
128
 
102
- case type
129
+ case type ||= self.type
103
130
  when :hstore then self.class.string_to_hstore value
104
131
  when :json then self.class.string_to_json value
105
132
  when :cidr, :inet then self.class.string_to_cidr value
@@ -109,18 +136,7 @@ module ArJdbc
109
136
  else
110
137
  case sql_type
111
138
  when 'money'
112
- # Because money output is formatted according to the locale, there
113
- # are two cases to consider (note the decimal separators) :
114
- # (1) $12,345,678.12
115
- # (2) $12.345.678,12
116
- case value
117
- when /^-?\D+[\d,]+\.\d{2}$/ # (1)
118
- value.gsub!(/[^-\d.]/, '')
119
- when /^-?\D+[\d.]+,\d{2}$/ # (2)
120
- value.gsub!(/[^-\d,]/, '')
121
- value.sub!(/,/, '.')
122
- end
123
- self.class.value_to_decimal value
139
+ self.class.string_to_money(value)
124
140
  when /^point/
125
141
  value.is_a?(String) ? self.class.string_to_point(value) : value
126
142
  when /^(bit|varbit)/
@@ -152,7 +168,7 @@ module ArJdbc
152
168
  end
153
169
 
154
170
  ::Range.new(from, to, extracted[:exclude_end])
155
- else super
171
+ else super(value)
156
172
  end
157
173
  end
158
174
  end if AR4_COMPAT
@@ -299,6 +315,27 @@ module ArJdbc
299
315
  # @note Based on *active_record/connection_adapters/postgresql/cast.rb* (4.0).
300
316
  module Cast
301
317
 
318
+ def string_to_money(string)
319
+ return string unless String === string
320
+
321
+ # Because money output is formatted according to the locale, there
322
+ # are two cases to consider (note the decimal separators) :
323
+ # (1) $12,345,678.12
324
+ # (2) $12.345.678,12
325
+ # Negative values are represented as follows:
326
+ # (3) -$2.55
327
+ # (4) ($2.55)
328
+ string = string.sub(/^\((.+)\)$/, '-\1') # (4)
329
+ case string
330
+ when /^-?\D+[\d,]+\.\d{2}$/ # (1)
331
+ string.gsub!(/[^-\d.]/, '')
332
+ when /^-?\D+[\d.]+,\d{2}$/ # (2)
333
+ string.gsub!(/[^-\d,]/, '')
334
+ string.sub!(/,/, '.')
335
+ end
336
+ value_to_decimal string
337
+ end
338
+
302
339
  def point_to_string(point)
303
340
  "(#{point[0]},#{point[1]})"
304
341
  end
@@ -416,10 +453,11 @@ module ArJdbc
416
453
  end
417
454
  end
418
455
 
419
- # NOTE: not used - we get "parsed" array value from connection
420
- #def string_to_array(string, oid)
421
- # parse_pg_array(string).map { |val| oid.type_cast val }
422
- #end
456
+ # @note Only used for default values - we get a "parsed" array from JDBC.
457
+ def string_to_array(string, column)
458
+ return string unless String === string
459
+ parse_pg_array(string).map { |val| column.type_cast(val, column.type) }
460
+ end
423
461
 
424
462
  private
425
463
 
@@ -19,7 +19,9 @@ ArJdbc::ConnectionMethods.module_eval do
19
19
  # PG :connect_timeout - maximum time to wait for connection to succeed
20
20
  if connect_timeout = ( config[:connect_timeout] || ENV['PGCONNECT_TIMEOUT'] )
21
21
  properties['socketTimeout'] ||= connect_timeout
22
- # NOTE: maybe set options['loginTimeout'] as well?
22
+ end
23
+ if login_timeout = config[:login_timeout]
24
+ properties['loginTimeout'] ||= login_timeout
23
25
  end
24
26
  sslmode = config.key?(:sslmode) ? config[:sslmode] : config[:requiressl]
25
27
  # NOTE: makes not much sense since this needs some JVM options :
@@ -42,7 +42,7 @@ namespace :db do
42
42
  end
43
43
 
44
44
  if defined? adapt_jdbc_config
45
- puts "ArJdbc: double loading #{__FILE__} please delete lib/rasks/jdbc.rake if present!"
45
+ puts "ArJdbc: double loading #{__FILE__} please delete lib/tasks/jdbc.rake if present!"
46
46
  end
47
47
 
48
48
  def adapt_jdbc_config(config)
@@ -1,5 +1,5 @@
1
1
  module ArJdbc
2
- VERSION = "1.3.3"
2
+ VERSION = "1.3.4"
3
3
  # @deprecated
4
4
  module Version
5
5
  # @private 1.2.x compatibility
@@ -444,7 +444,7 @@ public class RubyJdbcConnection extends RubyObject {
444
444
  * @return connection
445
445
  */
446
446
  @JRubyMethod(name = "init_connection")
447
- public IRubyObject init_connection(final ThreadContext context) throws SQLException {
447
+ public synchronized IRubyObject init_connection(final ThreadContext context) throws SQLException {
448
448
  final IRubyObject jdbcConnection = setConnection( newConnection() );
449
449
  final IRubyObject adapter = callMethod("adapter"); // self.adapter
450
450
  if ( ! adapter.isNil() ) {
@@ -482,7 +482,7 @@ public class RubyJdbcConnection extends RubyObject {
482
482
  }
483
483
 
484
484
  @JRubyMethod(name = "disconnect!")
485
- public IRubyObject disconnect(final ThreadContext context) {
485
+ public synchronized IRubyObject disconnect(final ThreadContext context) {
486
486
  // TODO: only here to try resolving multi-thread issues :
487
487
  // https://github.com/jruby/activerecord-jdbc-adapter/issues/197
488
488
  // https://github.com/jruby/activerecord-jdbc-adapter/issues/198
@@ -499,7 +499,7 @@ public class RubyJdbcConnection extends RubyObject {
499
499
  }
500
500
 
501
501
  @JRubyMethod(name = "reconnect!")
502
- public IRubyObject reconnect(final ThreadContext context) {
502
+ public synchronized IRubyObject reconnect(final ThreadContext context) {
503
503
  try {
504
504
  final Connection connection = newConnection();
505
505
  final IRubyObject result = setConnection( connection );
@@ -1162,7 +1162,7 @@ public class RubyJdbcConnection extends RubyObject {
1162
1162
  String _tableName = caseConvertIdentifierForJdbc(connection, tableName);
1163
1163
  String _schemaName = caseConvertIdentifierForJdbc(connection, schemaName);
1164
1164
  final TableName table = extractTableName(connection, _schemaName, _tableName);
1165
-
1165
+
1166
1166
  final List<RubyString> primaryKeys = primaryKeys(context, connection, table);
1167
1167
 
1168
1168
  ResultSet indexInfoSet = null;
@@ -2662,7 +2662,7 @@ public class RubyJdbcConnection extends RubyObject {
2662
2662
  }
2663
2663
 
2664
2664
  protected Connection getConnection(boolean error) {
2665
- final Connection connection = (Connection) dataGetStruct();
2665
+ final Connection connection = (Connection) dataGetStruct(); // synchronized
2666
2666
  if ( connection == null && error ) {
2667
2667
  final RubyClass errorClass = getConnectionNotEstablished( getRuntime() );
2668
2668
  throw new RaiseException(getRuntime(), errorClass, "no connection available", false);
@@ -2670,7 +2670,7 @@ public class RubyJdbcConnection extends RubyObject {
2670
2670
  return connection;
2671
2671
  }
2672
2672
 
2673
- private synchronized IRubyObject setConnection(final Connection connection) {
2673
+ private IRubyObject setConnection(final Connection connection) {
2674
2674
  close( getConnection(false) ); // close previously open connection if there is one
2675
2675
 
2676
2676
  final IRubyObject rubyConnectionObject =
@@ -119,18 +119,22 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
119
119
  }
120
120
 
121
121
  @Override
122
- protected void setStatementParameters(final ThreadContext context,
123
- final Connection connection, final PreparedStatement statement,
124
- final List<?> binds) throws SQLException {
125
-
126
- ((PGConnection) connection).addDataType("daterange", DateRangeType.class);
127
- ((PGConnection) connection).addDataType("tsrange", TsRangeType.class);
128
- ((PGConnection) connection).addDataType("tstzrange", TstzRangeType.class);
129
- ((PGConnection) connection).addDataType("int4range", Int4RangeType.class);
130
- ((PGConnection) connection).addDataType("int8range", Int8RangeType.class);
131
- ((PGConnection) connection).addDataType("numrange", NumRangeType.class);
132
-
133
- super.setStatementParameters(context, connection, statement, binds);
122
+ protected Connection newConnection() throws SQLException {
123
+ final Connection connection = getConnectionFactory().newConnection();
124
+ final PGConnection pgConnection;
125
+ if ( connection instanceof PGConnection ) {
126
+ pgConnection = (PGConnection) connection;
127
+ }
128
+ else {
129
+ pgConnection = connection.unwrap(PGConnection.class);
130
+ }
131
+ pgConnection.addDataType("daterange", DateRangeType.class);
132
+ pgConnection.addDataType("tsrange", TsRangeType.class);
133
+ pgConnection.addDataType("tstzrange", TstzRangeType.class);
134
+ pgConnection.addDataType("int4range", Int4RangeType.class);
135
+ pgConnection.addDataType("int8range", Int8RangeType.class);
136
+ pgConnection.addDataType("numrange", NumRangeType.class);
137
+ return connection;
134
138
  }
135
139
 
136
140
  @Override // due statement.setNull(index, Types.BLOB) not working :
@@ -458,6 +462,9 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
458
462
  protected IRubyObject arrayToRuby(final ThreadContext context,
459
463
  final Ruby runtime, final ResultSet resultSet, final int column)
460
464
  throws SQLException {
465
+ if ( rawArrayType == Boolean.TRUE ) { // pre AR 4.0 compatibility
466
+ return runtime.newString( resultSet.getString(column) );
467
+ }
461
468
  // NOTE: avoid `finally { array.free(); }` on PostgreSQL due :
462
469
  // java.sql.SQLFeatureNotSupportedException:
463
470
  // Method org.postgresql.jdbc4.Jdbc4Array.free() is not yet implemented.
@@ -552,6 +559,29 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
552
559
  return str.toString();
553
560
  }
554
561
 
562
+ protected static Boolean rawArrayType;
563
+ static {
564
+ final String arrayRaw = System.getProperty("arjdbc.postgresql.array.raw");
565
+ if ( arrayRaw != null ) rawArrayType = Boolean.parseBoolean(arrayRaw);
566
+ }
567
+
568
+ @JRubyMethod(name = "raw_array_type?", meta = true)
569
+ public static IRubyObject useRawArrayType(final ThreadContext context, final IRubyObject self) {
570
+ if ( rawArrayType == null ) return context.getRuntime().getNil();
571
+ return context.getRuntime().newBoolean(rawArrayType);
572
+ }
573
+
574
+ @JRubyMethod(name = "raw_array_type=", meta = true)
575
+ public static IRubyObject setRawArrayType(final IRubyObject self, final IRubyObject value) {
576
+ if ( value instanceof RubyBoolean ) {
577
+ rawArrayType = ((RubyBoolean) value).isTrue() ? Boolean.TRUE : Boolean.FALSE;
578
+ }
579
+ else {
580
+ rawArrayType = value.isNil() ? null : Boolean.TRUE;
581
+ }
582
+ return value;
583
+ }
584
+
555
585
  protected static Boolean rawHstoreType;
556
586
  static {
557
587
  final String hstoreRaw = System.getProperty("arjdbc.postgresql.hstore.raw");
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-jdbc-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sieger, Ola Bini and JRuby contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-12 00:00:00.000000000 Z
11
+ date: 2013-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -50,18 +50,6 @@ files:
50
50
  - Rakefile
51
51
  - Rakefile.jdbc
52
52
  - activerecord-jdbc-adapter.gemspec
53
- - gemfiles/rails23.gemfile
54
- - gemfiles/rails23.gemfile.lock
55
- - gemfiles/rails30.gemfile
56
- - gemfiles/rails30.gemfile.lock
57
- - gemfiles/rails31.gemfile
58
- - gemfiles/rails31.gemfile.lock
59
- - gemfiles/rails32.gemfile
60
- - gemfiles/rails32.gemfile.lock
61
- - gemfiles/rails40.gemfile
62
- - gemfiles/rails40.gemfile.lock
63
- - gemfiles/rails41.gemfile
64
- - gemfiles/rails41.gemfile.lock
65
53
  - lib/active_record/connection_adapters/as400_adapter.rb
66
54
  - lib/active_record/connection_adapters/db2_adapter.rb
67
55
  - lib/active_record/connection_adapters/derby_adapter.rb
@@ -153,6 +141,7 @@ files:
153
141
  - lib/arjdbc/oracle/connection_methods.rb
154
142
  - lib/arjdbc/postgresql.rb
155
143
  - lib/arjdbc/postgresql/adapter.rb
144
+ - lib/arjdbc/postgresql/array_parser.rb
156
145
  - lib/arjdbc/postgresql/column.rb
157
146
  - lib/arjdbc/postgresql/connection_methods.rb
158
147
  - lib/arjdbc/postgresql/explain_support.rb
@@ -1,18 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "thread_safe", :require=>nil
6
- gem "rake", :require=>nil
7
- gem "appraisal", :require=>nil
8
- gem "test-unit", "2.5.4", :group=>:test
9
- gem "test-unit-context", ">= 0.3.0", :group=>:test
10
- gem "mocha", "~> 0.13.1", :require=>nil, :group=>:test
11
- gem "simplecov", :require=>nil, :group=>:test
12
- gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
13
- gem "mysql2", :require=>nil, :platform=>:mri, :group=>:test
14
- gem "pg", :require=>nil, :platform=>:mri, :group=>:test
15
- gem "sqlite3", :require=>nil, :platform=>:mri, :group=>:test
16
- gem "activerecord", "~> 2.3.18", :require=>false
17
- gem "rails", "~> 2.3.18"
18
-
@@ -1,63 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- actionmailer (2.3.18)
5
- actionpack (= 2.3.18)
6
- actionpack (2.3.18)
7
- activesupport (= 2.3.18)
8
- rack (~> 1.1.0)
9
- activerecord (2.3.18)
10
- activesupport (= 2.3.18)
11
- activeresource (2.3.18)
12
- activesupport (= 2.3.18)
13
- activesupport (2.3.18)
14
- appraisal (0.5.2)
15
- bundler
16
- rake
17
- atomic (1.1.10)
18
- atomic (1.1.10-java)
19
- bcrypt-ruby (3.0.1)
20
- bcrypt-ruby (3.0.1-java)
21
- metaclass (0.0.1)
22
- mocha (0.13.3)
23
- metaclass (~> 0.0.1)
24
- multi_json (1.7.7)
25
- rack (1.1.6)
26
- rails (2.3.18)
27
- actionmailer (= 2.3.18)
28
- actionpack (= 2.3.18)
29
- activerecord (= 2.3.18)
30
- activeresource (= 2.3.18)
31
- activesupport (= 2.3.18)
32
- rake (>= 0.8.3)
33
- rake (10.1.0)
34
- simplecov (0.7.1)
35
- multi_json (~> 1.0)
36
- simplecov-html (~> 0.7.1)
37
- simplecov-html (0.7.1)
38
- test-unit (2.5.4)
39
- test-unit-context (0.3.1)
40
- test-unit (>= 2.4.0)
41
- thread_safe (0.1.2)
42
- atomic
43
- thread_safe (0.1.2-java)
44
- atomic
45
-
46
- PLATFORMS
47
- java
48
- ruby
49
-
50
- DEPENDENCIES
51
- activerecord (~> 2.3.18)
52
- appraisal
53
- bcrypt-ruby (~> 3.0.0)
54
- mocha (~> 0.13.1)
55
- mysql2
56
- pg
57
- rails (~> 2.3.18)
58
- rake
59
- simplecov
60
- sqlite3
61
- test-unit (= 2.5.4)
62
- test-unit-context (>= 0.3.0)
63
- thread_safe
@@ -1,17 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "thread_safe", :require=>nil
6
- gem "rake", :require=>nil
7
- gem "appraisal", :require=>nil
8
- gem "test-unit", "2.5.4", :group=>:test
9
- gem "test-unit-context", ">= 0.3.0", :group=>:test
10
- gem "mocha", "~> 0.13.1", :require=>nil, :group=>:test
11
- gem "simplecov", :require=>nil, :group=>:test
12
- gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
13
- gem "mysql2", :require=>nil, :platform=>:mri, :group=>:test
14
- gem "pg", :require=>nil, :platform=>:mri, :group=>:test
15
- gem "sqlite3", :require=>nil, :platform=>:mri, :group=>:test
16
- gem "activerecord", "~> 3.0.20", :require=>false
17
-
@@ -1,61 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- activemodel (3.0.20)
5
- activesupport (= 3.0.20)
6
- builder (~> 2.1.2)
7
- i18n (~> 0.5.0)
8
- activerecord (3.0.20)
9
- activemodel (= 3.0.20)
10
- activesupport (= 3.0.20)
11
- arel (~> 2.0.10)
12
- tzinfo (~> 0.3.23)
13
- activesupport (3.0.20)
14
- appraisal (0.5.2)
15
- bundler
16
- rake
17
- arel (2.0.10)
18
- atomic (1.1.10)
19
- atomic (1.1.10-java)
20
- bcrypt-ruby (3.0.1)
21
- bcrypt-ruby (3.0.1-java)
22
- builder (2.1.2)
23
- i18n (0.5.0)
24
- metaclass (0.0.1)
25
- mocha (0.13.3)
26
- metaclass (~> 0.0.1)
27
- multi_json (1.7.7)
28
- mysql2 (0.3.13)
29
- pg (0.16.0)
30
- rake (10.1.0)
31
- simplecov (0.7.1)
32
- multi_json (~> 1.0)
33
- simplecov-html (~> 0.7.1)
34
- simplecov-html (0.7.1)
35
- sqlite3 (1.3.8)
36
- test-unit (2.5.4)
37
- test-unit-context (0.3.1)
38
- test-unit (>= 2.4.0)
39
- thread_safe (0.1.2)
40
- atomic
41
- thread_safe (0.1.2-java)
42
- atomic
43
- tzinfo (0.3.37)
44
-
45
- PLATFORMS
46
- java
47
- ruby
48
-
49
- DEPENDENCIES
50
- activerecord (~> 3.0.20)
51
- appraisal
52
- bcrypt-ruby (~> 3.0.0)
53
- mocha (~> 0.13.1)
54
- mysql2
55
- pg
56
- rake
57
- simplecov
58
- sqlite3
59
- test-unit (= 2.5.4)
60
- test-unit-context (>= 0.3.0)
61
- thread_safe
@@ -1,17 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "thread_safe", :require=>nil
6
- gem "rake", :require=>nil
7
- gem "appraisal", :require=>nil
8
- gem "test-unit", "2.5.4", :group=>:test
9
- gem "test-unit-context", ">= 0.3.0", :group=>:test
10
- gem "mocha", "~> 0.13.1", :require=>nil, :group=>:test
11
- gem "simplecov", :require=>nil, :group=>:test
12
- gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
13
- gem "mysql2", :require=>nil, :platform=>:mri, :group=>:test
14
- gem "pg", :require=>nil, :platform=>:mri, :group=>:test
15
- gem "sqlite3", :require=>nil, :platform=>:mri, :group=>:test
16
- gem "activerecord", "~> 3.1.12", :require=>false
17
-
@@ -1,59 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- activemodel (3.1.12)
5
- activesupport (= 3.1.12)
6
- builder (~> 3.0.0)
7
- i18n (~> 0.6)
8
- activerecord (3.1.12)
9
- activemodel (= 3.1.12)
10
- activesupport (= 3.1.12)
11
- arel (~> 2.2.3)
12
- tzinfo (~> 0.3.29)
13
- activesupport (3.1.12)
14
- multi_json (~> 1.0)
15
- appraisal (0.5.2)
16
- bundler
17
- rake
18
- arel (2.2.3)
19
- atomic (1.1.10)
20
- atomic (1.1.10-java)
21
- bcrypt-ruby (3.0.1)
22
- bcrypt-ruby (3.0.1-java)
23
- builder (3.0.4)
24
- i18n (0.6.4)
25
- metaclass (0.0.1)
26
- mocha (0.13.3)
27
- metaclass (~> 0.0.1)
28
- multi_json (1.7.7)
29
- rake (10.1.0)
30
- simplecov (0.7.1)
31
- multi_json (~> 1.0)
32
- simplecov-html (~> 0.7.1)
33
- simplecov-html (0.7.1)
34
- test-unit (2.5.4)
35
- test-unit-context (0.3.1)
36
- test-unit (>= 2.4.0)
37
- thread_safe (0.1.2)
38
- atomic
39
- thread_safe (0.1.2-java)
40
- atomic
41
- tzinfo (0.3.37)
42
-
43
- PLATFORMS
44
- java
45
- ruby
46
-
47
- DEPENDENCIES
48
- activerecord (~> 3.1.12)
49
- appraisal
50
- bcrypt-ruby (~> 3.0.0)
51
- mocha (~> 0.13.1)
52
- mysql2
53
- pg
54
- rake
55
- simplecov
56
- sqlite3
57
- test-unit (= 2.5.4)
58
- test-unit-context (>= 0.3.0)
59
- thread_safe
@@ -1,17 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "thread_safe", :require=>nil
6
- gem "rake", :require=>nil
7
- gem "appraisal", :require=>nil
8
- gem "test-unit", "2.5.4", :group=>:test
9
- gem "test-unit-context", ">= 0.3.0", :group=>:test
10
- gem "mocha", "~> 0.13.1", :require=>nil, :group=>:test
11
- gem "simplecov", :require=>nil, :group=>:test
12
- gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
13
- gem "mysql2", :require=>nil, :platform=>:mri, :group=>:test
14
- gem "pg", :require=>nil, :platform=>:mri, :group=>:test
15
- gem "sqlite3", :require=>nil, :platform=>:mri, :group=>:test
16
- gem "activerecord", "~> 3.2.15", :require=>false
17
-
@@ -1,62 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- activemodel (3.2.15)
5
- activesupport (= 3.2.15)
6
- builder (~> 3.0.0)
7
- activerecord (3.2.15)
8
- activemodel (= 3.2.15)
9
- activesupport (= 3.2.15)
10
- arel (~> 3.0.2)
11
- tzinfo (~> 0.3.29)
12
- activesupport (3.2.15)
13
- i18n (~> 0.6, >= 0.6.4)
14
- multi_json (~> 1.0)
15
- appraisal (0.5.2)
16
- bundler
17
- rake
18
- arel (3.0.2)
19
- atomic (1.1.14)
20
- atomic (1.1.14-java)
21
- bcrypt-ruby (3.0.1)
22
- bcrypt-ruby (3.0.1-java)
23
- builder (3.0.4)
24
- i18n (0.6.5)
25
- metaclass (0.0.1)
26
- mocha (0.13.3)
27
- metaclass (~> 0.0.1)
28
- multi_json (1.7.7)
29
- mysql2 (0.3.13)
30
- pg (0.16.0)
31
- rake (10.1.0)
32
- simplecov (0.7.1)
33
- multi_json (~> 1.0)
34
- simplecov-html (~> 0.7.1)
35
- simplecov-html (0.7.1)
36
- sqlite3 (1.3.8)
37
- test-unit (2.5.4)
38
- test-unit-context (0.3.1)
39
- test-unit (>= 2.4.0)
40
- thread_safe (0.1.3)
41
- atomic
42
- thread_safe (0.1.3-java)
43
- atomic
44
- tzinfo (0.3.38)
45
-
46
- PLATFORMS
47
- java
48
- ruby
49
-
50
- DEPENDENCIES
51
- activerecord (~> 3.2.15)
52
- appraisal
53
- bcrypt-ruby (~> 3.0.0)
54
- mocha (~> 0.13.1)
55
- mysql2
56
- pg
57
- rake
58
- simplecov
59
- sqlite3
60
- test-unit (= 2.5.4)
61
- test-unit-context (>= 0.3.0)
62
- thread_safe
@@ -1,17 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "thread_safe", :require=>nil
6
- gem "rake", :require=>nil
7
- gem "appraisal", :require=>nil
8
- gem "test-unit", "2.5.4", :group=>:test
9
- gem "test-unit-context", ">= 0.3.0", :group=>:test
10
- gem "mocha", "~> 0.13.1", :require=>nil, :group=>:test
11
- gem "simplecov", :require=>nil, :group=>:test
12
- gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
13
- gem "mysql2", :require=>nil, :platform=>:mri, :group=>:test
14
- gem "pg", :require=>nil, :platform=>:mri, :group=>:test
15
- gem "sqlite3", :require=>nil, :platform=>:mri, :group=>:test
16
- gem "activerecord", "~> 4.0.0", :require=>false
17
-
@@ -1,59 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- activemodel (4.0.0)
5
- activesupport (= 4.0.0)
6
- builder (~> 3.1.0)
7
- activerecord (4.0.0)
8
- activemodel (= 4.0.0)
9
- activerecord-deprecated_finders (~> 1.0.2)
10
- activesupport (= 4.0.0)
11
- arel (~> 4.0.0)
12
- activerecord-deprecated_finders (1.0.3)
13
- activesupport (4.0.0)
14
- i18n (~> 0.6, >= 0.6.4)
15
- minitest (~> 4.2)
16
- multi_json (~> 1.3)
17
- thread_safe (~> 0.1)
18
- tzinfo (~> 0.3.37)
19
- appraisal (0.5.2)
20
- bundler
21
- rake
22
- arel (4.0.1)
23
- atomic (1.1.14-java)
24
- bcrypt-ruby (3.0.1-java)
25
- builder (3.1.4)
26
- i18n (0.6.5)
27
- metaclass (0.0.1)
28
- minitest (4.7.5)
29
- mocha (0.13.3)
30
- metaclass (~> 0.0.1)
31
- multi_json (1.8.2)
32
- rake (10.1.0)
33
- simplecov (0.7.1)
34
- multi_json (~> 1.0)
35
- simplecov-html (~> 0.7.1)
36
- simplecov-html (0.7.1)
37
- test-unit (2.5.4)
38
- test-unit-context (0.3.1)
39
- test-unit (>= 2.4.0)
40
- thread_safe (0.1.3-java)
41
- atomic
42
- tzinfo (0.3.38)
43
-
44
- PLATFORMS
45
- java
46
-
47
- DEPENDENCIES
48
- activerecord (~> 4.0.0)
49
- appraisal
50
- bcrypt-ruby (~> 3.0.0)
51
- mocha (~> 0.13.1)
52
- mysql2
53
- pg
54
- rake
55
- simplecov
56
- sqlite3
57
- test-unit (= 2.5.4)
58
- test-unit-context (>= 0.3.0)
59
- thread_safe
@@ -1,18 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "thread_safe", :require=>nil
6
- gem "rake", :require=>nil
7
- gem "appraisal", :require=>nil
8
- gem "test-unit", "2.5.4", :group=>:test
9
- gem "test-unit-context", ">= 0.3.0", :group=>:test
10
- gem "mocha", "~> 0.13.1", :require=>nil, :group=>:test
11
- gem "simplecov", :require=>nil, :group=>:test
12
- gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
13
- gem "mysql2", :require=>nil, :platform=>:mri, :group=>:test
14
- gem "pg", :require=>nil, :platform=>:mri, :group=>:test
15
- gem "sqlite3", :require=>nil, :platform=>:mri, :group=>:test
16
- gem "activerecord", :github=>"rails/rails", :branch=>"master", :require=>false
17
- gem "rails", :github=>"rails/rails", :branch=>"master"
18
-
@@ -1,117 +0,0 @@
1
- GIT
2
- remote: git://github.com/rails/rails.git
3
- revision: 094e31ce6700993759c6f36db52afb0a43bfa71f
4
- branch: master
5
- specs:
6
- actionmailer (4.1.0.beta)
7
- actionpack (= 4.1.0.beta)
8
- actionview (= 4.1.0.beta)
9
- mail (~> 2.5.4)
10
- actionpack (4.1.0.beta)
11
- activesupport (= 4.1.0.beta)
12
- rack (~> 1.5.2)
13
- rack-test (~> 0.6.2)
14
- actionview (4.1.0.beta)
15
- activemodel (= 4.1.0.beta)
16
- activesupport (= 4.1.0.beta)
17
- builder (~> 3.1.0)
18
- erubis (~> 2.7.0)
19
- activemodel (4.1.0.beta)
20
- activesupport (= 4.1.0.beta)
21
- builder (~> 3.1.0)
22
- activerecord (4.1.0.beta)
23
- activemodel (= 4.1.0.beta)
24
- activesupport (= 4.1.0.beta)
25
- arel (~> 4.0.0)
26
- activesupport (4.1.0.beta)
27
- i18n (~> 0.6, >= 0.6.4)
28
- json (~> 1.7)
29
- minitest (~> 5.0)
30
- thread_safe (~> 0.1)
31
- tzinfo (~> 0.3.37)
32
- rails (4.1.0.beta)
33
- actionmailer (= 4.1.0.beta)
34
- actionpack (= 4.1.0.beta)
35
- actionview (= 4.1.0.beta)
36
- activemodel (= 4.1.0.beta)
37
- activerecord (= 4.1.0.beta)
38
- activesupport (= 4.1.0.beta)
39
- bundler (>= 1.3.0, < 2.0)
40
- railties (= 4.1.0.beta)
41
- sprockets-rails (~> 2.0.0)
42
- railties (4.1.0.beta)
43
- actionpack (= 4.1.0.beta)
44
- activesupport (= 4.1.0.beta)
45
- rake (>= 0.8.7)
46
- thor (>= 0.18.1, < 2.0)
47
-
48
- GEM
49
- remote: https://rubygems.org/
50
- specs:
51
- appraisal (0.5.2)
52
- bundler
53
- rake
54
- arel (4.0.1)
55
- atomic (1.1.14-java)
56
- bcrypt-ruby (3.0.1-java)
57
- builder (3.1.4)
58
- erubis (2.7.0)
59
- hike (1.2.3)
60
- i18n (0.6.5)
61
- json (1.8.1-java)
62
- mail (2.5.4)
63
- mime-types (~> 1.16)
64
- treetop (~> 1.4.8)
65
- metaclass (0.0.1)
66
- mime-types (1.25)
67
- minitest (5.0.8)
68
- mocha (0.13.3)
69
- metaclass (~> 0.0.1)
70
- multi_json (1.8.2)
71
- polyglot (0.3.3)
72
- rack (1.5.2)
73
- rack-test (0.6.2)
74
- rack (>= 1.0)
75
- rake (10.1.0)
76
- simplecov (0.7.1)
77
- multi_json (~> 1.0)
78
- simplecov-html (~> 0.7.1)
79
- simplecov-html (0.7.1)
80
- sprockets (2.10.0)
81
- hike (~> 1.2)
82
- multi_json (~> 1.0)
83
- rack (~> 1.0)
84
- tilt (~> 1.1, != 1.3.0)
85
- sprockets-rails (2.0.1)
86
- actionpack (>= 3.0)
87
- activesupport (>= 3.0)
88
- sprockets (~> 2.8)
89
- test-unit (2.5.4)
90
- test-unit-context (0.3.1)
91
- test-unit (>= 2.4.0)
92
- thor (0.18.1)
93
- thread_safe (0.1.3-java)
94
- atomic
95
- tilt (1.4.1)
96
- treetop (1.4.15)
97
- polyglot
98
- polyglot (>= 0.3.1)
99
- tzinfo (0.3.38)
100
-
101
- PLATFORMS
102
- java
103
-
104
- DEPENDENCIES
105
- activerecord!
106
- appraisal
107
- bcrypt-ruby (~> 3.0.0)
108
- mocha (~> 0.13.1)
109
- mysql2
110
- pg
111
- rails!
112
- rake
113
- simplecov
114
- sqlite3
115
- test-unit (= 2.5.4)
116
- test-unit-context (>= 0.3.0)
117
- thread_safe