From 55400052186c3b3cb15c86f38ee266e5dafed696 Mon Sep 17 00:00:00 2001
From: Dan Croak and Sean Griffin <dan+sean@thoughtbot.com>
Date: Wed, 21 May 2014 17:16:01 -0700
Subject: Move `extract_precision` onto type objects

---
 .../lib/active_record/connection_adapters/column.rb         |  6 +-----
 .../active_record/connection_adapters/postgresql/column.rb  | 13 -------------
 .../connection_adapters/postgresql/oid/money.rb             |  2 ++
 .../active_record/connection_adapters/postgresql_adapter.rb |  2 +-
 .../lib/active_record/connection_adapters/type/date_time.rb |  4 ++++
 .../lib/active_record/connection_adapters/type/numeric.rb   |  4 ++++
 .../lib/active_record/connection_adapters/type/value.rb     |  3 +++
 7 files changed, 15 insertions(+), 19 deletions(-)

diff --git a/activerecord/lib/active_record/connection_adapters/column.rb b/activerecord/lib/active_record/connection_adapters/column.rb
index a718756b93..522fa57822 100644
--- a/activerecord/lib/active_record/connection_adapters/column.rb
+++ b/activerecord/lib/active_record/connection_adapters/column.rb
@@ -69,15 +69,11 @@ module ActiveRecord
       end
 
       private
-        delegate :extract_scale, to: :cast_type
+        delegate :extract_scale, :extract_precision, to: :cast_type
 
         def extract_limit(sql_type)
           $1.to_i if sql_type =~ /\((.*)\)/
         end
-
-        def extract_precision(sql_type)
-          $2.to_i if sql_type =~ /^(numeric|decimal|number)\((\d+)(,\d+)?\)/i
-        end
     end
   end
   # :startdoc:
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/column.rb b/activerecord/lib/active_record/connection_adapters/postgresql/column.rb
index 80c79642f3..302eb8a114 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/column.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/column.rb
@@ -35,8 +35,6 @@ module ActiveRecord
           require 'active_record/connection_adapters/postgresql/array_parser'
           include PostgreSQL::ArrayParser
         end
-
-        attr_accessor :money_precision
       end
       # :startdoc:
 
@@ -121,17 +119,6 @@ module ActiveRecord
           else super
           end
         end
-
-        # Extracts the precision from PostgreSQL-specific data types.
-        def extract_precision(sql_type)
-          if sql_type == 'money'
-            self.class.money_precision
-          elsif sql_type =~ /timestamp/i
-            $1.to_i if sql_type =~ /\((\d+)\)/
-          else
-            super
-          end
-        end
     end
   end
 end
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb b/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb
index 1e34c09c88..74e8f30457 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb
@@ -5,6 +5,8 @@ module ActiveRecord
         class Money < Type::Decimal
           include Infinity
 
+          class_attribute :precision
+
           def extract_scale(sql_type)
             2
           end
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
index 7d1fa0dd08..b0cbccb7ba 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -713,7 +713,7 @@ module ActiveRecord
           # Money type has a fixed precision of 10 in PostgreSQL 8.2 and below, and as of
           # PostgreSQL 8.3 it has a fixed precision of 19. PostgreSQLColumn.extract_precision
           # should know about this but can't detect it there, so deal with it here.
-          PostgreSQLColumn.money_precision = (postgresql_version >= 80300) ? 19 : 10
+          OID::Money.precision = (postgresql_version >= 80300) ? 19 : 10
 
           configure_connection
         rescue ::PG::Error => error
diff --git a/activerecord/lib/active_record/connection_adapters/type/date_time.rb b/activerecord/lib/active_record/connection_adapters/type/date_time.rb
index c34f4c5a53..43203a4cd4 100644
--- a/activerecord/lib/active_record/connection_adapters/type/date_time.rb
+++ b/activerecord/lib/active_record/connection_adapters/type/date_time.rb
@@ -8,6 +8,10 @@ module ActiveRecord
           :datetime
         end
 
+        def extract_precision(sql_type)
+          $1.to_i if sql_type =~ /\((\d+)\)/
+        end
+
         private
 
         def cast_value(string)
diff --git a/activerecord/lib/active_record/connection_adapters/type/numeric.rb b/activerecord/lib/active_record/connection_adapters/type/numeric.rb
index a3379831cb..15081daf8d 100644
--- a/activerecord/lib/active_record/connection_adapters/type/numeric.rb
+++ b/activerecord/lib/active_record/connection_adapters/type/numeric.rb
@@ -14,6 +14,10 @@ module ActiveRecord
           else super
           end
         end
+
+        def extract_precision(sql_type)
+          $1.to_i if sql_type =~ /\((\d+)(,\d+)?\)/
+        end
       end
     end
   end
diff --git a/activerecord/lib/active_record/connection_adapters/type/value.rb b/activerecord/lib/active_record/connection_adapters/type/value.rb
index 52d9ed9bc0..6687c9a2a4 100644
--- a/activerecord/lib/active_record/connection_adapters/type/value.rb
+++ b/activerecord/lib/active_record/connection_adapters/type/value.rb
@@ -3,8 +3,11 @@ module ActiveRecord
     module Type
       class Value # :nodoc:
         def type; end
+
         def extract_scale(sql_type); end
 
+        def extract_precision(sql_type); end
+
         def type_cast(value)
           cast_value(value) unless value.nil?
         end
-- 
cgit v1.2.3