activerecord-jdbc-adapter 1.3.3 → 1.3.4

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.
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