From 68812bf4a7c638a0d97f594354603b2f04d759e1 Mon Sep 17 00:00:00 2001 From: Nikita Shilnikov Date: Wed, 25 Dec 2024 21:01:35 +0100 Subject: [PATCH] Fix test failing under fresh Sequel by guessing types It's not clear what changed across c. 50 (!) releases of Sequel but it no longer returns :datetime for columns with altered precision. This commits fixes the issue by mapping raw DB types to the known symbols. It should not backfire. --- lib/rom/sql/schema/type_builder.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/rom/sql/schema/type_builder.rb b/lib/rom/sql/schema/type_builder.rb index 8f3cd4c9..d517c561 100644 --- a/lib/rom/sql/schema/type_builder.rb +++ b/lib/rom/sql/schema/type_builder.rb @@ -37,6 +37,10 @@ def self.[](db_type) numeric_pk_type Types::Serial + TYPE_GUESSES = { + /datetime\((\d+)\)/ => :datetime + }.freeze + def call(primary_key:, db_type:, type:, allow_null:, **rest) if primary_key map_pk_type(type, db_type, **rest) @@ -64,7 +68,7 @@ def map_pk_type(_ruby_type, _db_type, **) # @api private def map_type(ruby_type, db_type, **kw) - type = self.class.ruby_type_mapping[ruby_type] + type = self.class.ruby_type_mapping[ruby_type || guess_type(db_type)] if (db_type.is_a?(String) && db_type.include?("numeric")) || db_type.include?("decimal") map_decimal_type(db_type) @@ -75,6 +79,15 @@ def map_type(ruby_type, db_type, **kw) end end + # @api private + def guess_type(db_type) + TYPE_GUESSES.find do |regex, type| + if db_type.is_a?(String) && db_type.match(regex) + break type + end + end + end + # @api private def map_decimal_type(type) precision = DECIMAL_REGEX.match(type)