Module | DataMapper::Adapters::Sql::Coersion |
In: |
lib/data_mapper/adapters/sql/coersion.rb
lib/data_mapper/adapters/sql/coersion.rb |
Coersion is a mixin that allows for coercing database values to Ruby Types.
DESIGN: Probably should handle the opposite scenario here too. I believe that‘s currently in DataMapper::Database, which is obviously not a very good spot for it.
TRUE_ALIASES | = | ['true'.freeze, 'TRUE'.freeze, '1'.freeze, 1] |
FALSE_ALIASES | = | [nil, '0'.freeze, 0] |
TRUE_ALIASES | = | ['true'.freeze, 'TRUE'.freeze, '1'.freeze, 1] |
FALSE_ALIASES | = | [nil, '0'.freeze, 0] |
# File lib/data_mapper/adapters/sql/coersion.rb, line 20 20: def self.included(base) 21: base.const_set('TRUE_ALIASES', TRUE_ALIASES.dup) 22: base.const_set('FALSE_ALIASES', FALSE_ALIASES.dup) 23: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 20 20: def self.included(base) 21: base.const_set('TRUE_ALIASES', TRUE_ALIASES.dup) 22: base.const_set('FALSE_ALIASES', FALSE_ALIASES.dup) 23: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 25 25: def type_cast_boolean(raw_value) 26: return nil if raw_value.nil? || (raw_value.respond_to?(:empty?) && raw_value.empty?) 27: case raw_value 28: when TrueClass, FalseClass then raw_value 29: when *self::class::TRUE_ALIASES then true 30: when *self::class::FALSE_ALIASES then false 31: else raise CoersionError.new("Can't type-cast #{raw_value.inspect} to a boolean") 32: end 33: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 25 25: def type_cast_boolean(raw_value) 26: return nil if raw_value.nil? || (raw_value.respond_to?(:empty?) && raw_value.empty?) 27: case raw_value 28: when TrueClass, FalseClass then raw_value 29: when *self::class::TRUE_ALIASES then true 30: when *self::class::FALSE_ALIASES then false 31: else raise CoersionError.new("Can't type-cast #{raw_value.inspect} to a boolean") 32: end 33: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 47 47: def type_cast_class(raw_value) 48: return nil if raw_value.blank? 49: Object::recursive_const_get(raw_value) 50: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 47 47: def type_cast_class(raw_value) 48: return nil if raw_value.blank? 49: Object::recursive_const_get(raw_value) 50: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 87 87: def type_cast_date(raw_value) 88: return nil if raw_value.blank? 89: 90: case raw_value 91: when Date then raw_value 92: when DateTime, Time then Date::civil(raw_value.year, raw_value.month, raw_value.day) 93: when String then Date::parse(raw_value) 94: else raise CoersionError.new("Can't type-cast #{raw_value.inspect} to a date") 95: end 96: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 87 87: def type_cast_date(raw_value) 88: return nil if raw_value.blank? 89: 90: case raw_value 91: when Date then raw_value 92: when DateTime, Time then Date::civil(raw_value.year, raw_value.month, raw_value.day) 93: when String then Date::parse(raw_value) 94: else raise CoersionError.new("Can't type-cast #{raw_value.inspect} to a date") 95: end 96: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 75 75: def type_cast_datetime(raw_value) 76: return nil if raw_value.blank? 77: 78: case raw_value 79: when "0000-00-00 00:00:00" then nil 80: when DateTime then raw_value 81: when Date then DateTime.new(raw_value) rescue nil 82: when String then DateTime::parse(raw_value) rescue nil 83: else raise CoersionError.new("Can't type-cast #{raw_value.inspect} to a datetime") 84: end 85: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 75 75: def type_cast_datetime(raw_value) 76: return nil if raw_value.blank? 77: 78: case raw_value 79: when "0000-00-00 00:00:00" then nil 80: when DateTime then raw_value 81: when Date then DateTime.new(raw_value) rescue nil 82: when String then DateTime::parse(raw_value) rescue nil 83: else raise CoersionError.new("Can't type-cast #{raw_value.inspect} to a datetime") 84: end 85: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 59 59: def type_cast_decimal(raw_value) 60: return nil if raw_value.blank? 61: raw_value.to_d 62: rescue ArgumentError 63: nil 64: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 59 59: def type_cast_decimal(raw_value) 60: return nil if raw_value.blank? 61: raw_value.to_d 62: rescue ArgumentError 63: nil 64: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 66 66: def type_cast_float(raw_value) 67: return nil if raw_value.blank? 68: case raw_value 69: when Float then raw_value 70: when Numeric, String then raw_value.to_f 71: else CoersionError.new("Can't type-cast #{raw_value.inspect} to a float") 72: end 73: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 66 66: def type_cast_float(raw_value) 67: return nil if raw_value.blank? 68: case raw_value 69: when Float then raw_value 70: when Numeric, String then raw_value.to_f 71: else CoersionError.new("Can't type-cast #{raw_value.inspect} to a float") 72: end 73: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 52 52: def type_cast_integer(raw_value) 53: return nil if raw_value.blank? 54: raw_value.to_i 55: rescue ArgumentError 56: nil 57: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 52 52: def type_cast_integer(raw_value) 53: return nil if raw_value.blank? 54: raw_value.to_i 55: rescue ArgumentError 56: nil 57: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 98 98: def type_cast_object(raw_value) 99: return nil if raw_value.blank? 100: 101: begin 102: YAML.load(raw_value) 103: rescue 104: raise CoersionError.new("Can't type-cast #{raw_value.inspect} to an object") 105: end 106: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 98 98: def type_cast_object(raw_value) 99: return nil if raw_value.blank? 100: 101: begin 102: YAML.load(raw_value) 103: rescue 104: raise CoersionError.new("Can't type-cast #{raw_value.inspect} to an object") 105: end 106: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 35 35: def type_cast_string(raw_value) 36: return nil if raw_value.blank? 37: # type-cast values should be immutable for memory conservation 38: raw_value 39: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 35 35: def type_cast_string(raw_value) 36: return nil if raw_value.blank? 37: # type-cast values should be immutable for memory conservation 38: raw_value 39: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 41 41: def type_cast_text(raw_value) 42: return nil if raw_value.blank? 43: # type-cast values should be immutable for memory conservation 44: raw_value 45: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 41 41: def type_cast_text(raw_value) 42: return nil if raw_value.blank? 43: # type-cast values should be immutable for memory conservation 44: raw_value 45: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 108 108: def type_cast_value(type, raw_value) 109: return nil if raw_value.blank? 110: 111: case type 112: when :string then type_cast_string(raw_value) 113: when :text then type_cast_text(raw_value) 114: when :boolean then type_cast_boolean(raw_value) 115: when :class then type_cast_class(raw_value) 116: when :integer then type_cast_integer(raw_value) 117: when :decimal then type_cast_decimal(raw_value) 118: when :float then type_cast_float(raw_value) 119: when :datetime then type_cast_datetime(raw_value) 120: when :date then type_cast_date(raw_value) 121: when :object then type_cast_object(raw_value) 122: else 123: if respond_to?("type_cast_#{type}") 124: send("type_cast_#{type}", raw_value) 125: else 126: raise "Don't know how to type-cast #{{ type => raw_value }.inspect }" 127: end 128: end 129: end
# File lib/data_mapper/adapters/sql/coersion.rb, line 108 108: def type_cast_value(type, raw_value) 109: return nil if raw_value.blank? 110: 111: case type 112: when :string then type_cast_string(raw_value) 113: when :text then type_cast_text(raw_value) 114: when :boolean then type_cast_boolean(raw_value) 115: when :class then type_cast_class(raw_value) 116: when :integer then type_cast_integer(raw_value) 117: when :decimal then type_cast_decimal(raw_value) 118: when :float then type_cast_float(raw_value) 119: when :datetime then type_cast_datetime(raw_value) 120: when :date then type_cast_date(raw_value) 121: when :object then type_cast_object(raw_value) 122: else 123: if respond_to?("type_cast_#{type}") 124: send("type_cast_#{type}", raw_value) 125: else 126: raise "Don't know how to type-cast #{{ type => raw_value }.inspect }" 127: end 128: end 129: end