diff options
-rw-r--r-- | .travis.yml | 1 | ||||
-rw-r--r-- | History.txt | 4 | ||||
-rw-r--r-- | lib/arel.rb | 2 | ||||
-rw-r--r-- | lib/arel/table.rb | 12 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 49 | ||||
-rw-r--r-- | test/attributes/test_attribute.rb | 8 | ||||
-rw-r--r-- | test/helper.rb | 2 | ||||
-rw-r--r-- | test/support/fake_record.rb | 15 | ||||
-rw-r--r-- | test/visitors/test_to_sql.rb | 87 |
9 files changed, 23 insertions, 157 deletions
diff --git a/.travis.yml b/.travis.yml index ee72f36a89..32aeb83ea9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,7 @@ rvm: - 2.1 - 2.2.5 - 2.3.1 + - 2.4.0 - ruby-head matrix: fast_finish: true diff --git a/History.txt b/History.txt index ccc170c4a2..aacf6d7a16 100644 --- a/History.txt +++ b/History.txt @@ -1,3 +1,7 @@ +* Enhancements + + * Remove deprecated type casting support in Arel + === 7.1.1 / 2016-07-27 * Bug Fixes diff --git a/lib/arel.rb b/lib/arel.rb index 2069cec7ce..e04999ed92 100644 --- a/lib/arel.rb +++ b/lib/arel.rb @@ -21,7 +21,7 @@ require 'arel/delete_manager' require 'arel/nodes' module Arel - VERSION = '7.2.0' + VERSION = '8.0.0' def self.sql raw_sql Arel::Nodes::SqlLiteral.new raw_sql diff --git a/lib/arel/table.rb b/lib/arel/table.rb index 0e7214f269..3e06f94272 100644 --- a/lib/arel/table.rb +++ b/lib/arel/table.rb @@ -13,7 +13,6 @@ module Arel def initialize(name, as: nil, type_caster: nil) @name = name.to_s - @columns = nil @type_caster = type_caster # Sometime AR sends an :as parameter to table, to let the table know @@ -106,16 +105,5 @@ module Arel protected attr_reader :type_caster - - private - - def attributes_for columns - return nil unless columns - - columns.map do |column| - Attributes.for(column).new self, column.name.to_sym - end - end - end end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 506b33f4b6..ad2666fb10 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -76,10 +76,6 @@ module Arel private - def schema_cache - @connection.schema_cache - end - def visit_Arel_Nodes_DeleteStatement o, collector collector << 'DELETE FROM ' collector = visit o.relation, collector @@ -170,24 +166,6 @@ module Arel collector << "FALSE" end - def table_exists? name - schema_cache.data_source_exists?(name) - end - - def column_for attr - return unless attr - name = attr.name.to_s - table = attr.relation.table_name - - return nil unless table_exists? table - - column_cache(table)[name] - end - - def column_cache(table) - schema_cache.columns_hash(table) - end - def visit_Arel_Nodes_Values o, collector collector << "VALUES (" @@ -197,7 +175,7 @@ module Arel when Nodes::SqlLiteral, Nodes::BindParam collector = visit value, collector else - collector << quote(value, attr && column_for(attr)).to_s + collector << quote(value).to_s end unless i == len collector << COMMA @@ -653,7 +631,7 @@ module Arel else collector = visit o.left, collector collector << " = " - collector << quote(o.right, column_for(o.left)).to_s + collector << quote(o.right).to_s end end @@ -749,7 +727,7 @@ module Arel if a && a.able_to_type_cast? quote(a.type_cast_for_database(o)) else - quote(o, column_for(a)) + quote(o) end end @@ -793,12 +771,9 @@ module Arel end alias :visit_Set :visit_Array - def quote value, column = nil + def quote value return value if Arel::Nodes::SqlLiteral === value - if column - print_type_cast_deprecation - end - @connection.quote value, column + @connection.quote value end def quote_table_name name @@ -847,20 +822,6 @@ module Arel collector end end - - def print_type_cast_deprecation - unless defined?($arel_silence_type_casting_deprecation) && $arel_silence_type_casting_deprecation - warn <<-eowarn -Arel performing automatic type casting is deprecated, and will be removed in Arel 8.0. If you are seeing this, it is because you are manually passing a value to an Arel predicate, and the `Arel::Table` object was constructed manually. The easiest way to remove this warning is to use an `Arel::Table` object returned from calling `arel_table` on an ActiveRecord::Base subclass. - -If you're certain the value is already of the right type, change `attribute.eq(value)` to `attribute.eq(Arel::Nodes::Quoted.new(value))` (you will be able to remove that in Arel 8.0, it is only required to silence this deprecation warning). - -You can also silence this warning globally by setting `$arel_silence_type_casting_deprecation` to `true`. (Do NOT do this if you are a library author) - -If you are passing user input to a predicate, you must either give an appropriate type caster object to the `Arel::Table`, or manually cast the value before passing it to Arel. - eowarn - end - end end end end diff --git a/test/attributes/test_attribute.rb b/test/attributes/test_attribute.rb index f6b73adf6a..928b23ed7b 100644 --- a/test/attributes/test_attribute.rb +++ b/test/attributes/test_attribute.rb @@ -996,14 +996,6 @@ module Arel assert table.able_to_type_cast? condition.to_sql.must_equal %("foo"."id" = 1 AND "foo"."other_id" = '2') end - - it 'falls back to using the connection adapter for type casting' do - table = Table.new(:users) - condition = table["id"].eq("1") - - refute table.able_to_type_cast? - condition.to_sql.must_equal %("users"."id" = 1) - end end end end diff --git a/test/helper.rb b/test/helper.rb index 87f5756d24..6e8ac836fc 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -6,8 +6,6 @@ require 'arel' require 'support/fake_record' Arel::Table.engine = FakeRecord::Base.new -$arel_silence_type_casting_deprecation = true - class Object def must_be_like other gsub(/\s+/, ' ').strip.must_equal other.gsub(/\s+/, ' ').strip diff --git a/test/support/fake_record.rb b/test/support/fake_record.rb index 3d4c7d5630..4867dad5dc 100644 --- a/test/support/fake_record.rb +++ b/test/support/fake_record.rb @@ -59,16 +59,7 @@ module FakeRecord self end - def quote thing, column = nil - if column && !thing.nil? - case column.type - when :integer - thing = thing.to_i - when :string - thing = thing.to_s - end - end - + def quote thing case thing when DateTime "'#{thing.strftime("%Y-%m-%d %H:%M:%S")}'" @@ -116,8 +107,8 @@ module FakeRecord connection end - def quote thing, column = nil - connection.quote thing, column + def quote thing + connection.quote thing end end diff --git a/test/visitors/test_to_sql.rb b/test/visitors/test_to_sql.rb index 6833d4e8f5..e31d60366b 100644 --- a/test/visitors/test_to_sql.rb +++ b/test/visitors/test_to_sql.rb @@ -120,19 +120,6 @@ module Arel sql.must_be_like %{ 'f' = 'f' } end - it 'should use the column to quote' do - table = Table.new(:users) - val = Nodes.build_quoted('1-fooo', table[:id]) - sql = compile Nodes::Equality.new(table[:id], val) - sql.must_be_like %{ "users"."id" = 1 } - end - - it 'should use the column to quote integers' do - table = Table.new(:users) - sql = compile table[:name].eq(0) - sql.must_be_like %{ "users"."name" = '0' } - end - it 'should handle nil' do sql = compile Nodes::Equality.new(@table[:name], nil) sql.must_be_like %{ "users"."name" IS NULL } @@ -191,24 +178,15 @@ module Arel it "should quote LIMIT without column type coercion" do table = Table.new(:users) sc = table.where(table[:name].eq(0)).take(1).ast - assert_match(/WHERE "users"."name" = '0' LIMIT 1/, compile(sc)) + assert_match(/WHERE "users"."name" = 0 LIMIT 1/, compile(sc)) end it "should visit_DateTime" do - called_with = nil - @conn.connection.extend(Module.new { - define_method(:quote) do |thing, column| - called_with = column - super(thing, column) - end - }) - dt = DateTime.now table = Table.new(:users) test = table[:created_at].eq dt sql = compile test - assert_equal "created_at", called_with.name sql.must_be_like %{"users"."created_at" = '#{dt.strftime("%Y-%m-%d %H:%M:%S")}'} end @@ -252,20 +230,11 @@ module Arel end it "should visit_Date" do - called_with = nil - @conn.connection.extend(Module.new { - define_method(:quote) do |thing, column| - called_with = column - super(thing, column) - end - }) - dt = Date.today table = Table.new(:users) test = table[:created_at].eq dt sql = compile test - assert_equal "created_at", called_with.name sql.must_be_like %{"users"."created_at" = '#{dt.strftime("%Y-%m-%d")}'} end @@ -298,14 +267,14 @@ module Arel end it "should visit_Arel_Nodes_Assignment" do - column = @table["id"] - node = Nodes::Assignment.new( - Nodes::UnqualifiedColumn.new(column), - Nodes::UnqualifiedColumn.new(column) - ) + column = @table["id"] + node = Nodes::Assignment.new( + Nodes::UnqualifiedColumn.new(column), + Nodes::UnqualifiedColumn.new(column) + ) compile(node).must_be_like %{ - "id" = "id" - } + "id" = "id" + } end it "should visit visit_Arel_Attributes_Time" do @@ -427,25 +396,6 @@ module Arel "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" = 'Aaron') } end - - it 'uses the same column for escaping values' do - @attr = Table.new(:users)[:name] - visitor = Class.new(ToSql) do - attr_accessor :expected - - def quote value, column = nil - raise unless column == expected - super - end - end - vals = %w{ a b c }.map { |x| Nodes.build_quoted(x, @attr) } - in_node = Nodes::In.new @attr, vals - visitor = visitor.new(Table.engine.connection) - visitor.expected = Table.engine.connection.columns(:users).find { |x| - x.name == 'name' - } - visitor.accept(in_node, Collectors::SQLString.new).value.must_equal %("users"."name" IN ('a', 'b', 'c')) - end end describe "Nodes::InfixOperation" do @@ -574,25 +524,6 @@ module Arel "users"."id" NOT IN (SELECT id FROM "users" WHERE "users"."name" = 'Aaron') } end - - it 'uses the same column for escaping values' do - @attr = Table.new(:users)[:name] - visitor = Class.new(ToSql) do - attr_accessor :expected - - def quote value, column = nil - raise unless column == expected - super - end - end - vals = %w{ a b c }.map { |x| Nodes.build_quoted(x, @attr) } - in_node = Nodes::NotIn.new @attr, vals - visitor = visitor.new(Table.engine.connection) - visitor.expected = Table.engine.connection.columns(:users).find { |x| - x.name == 'name' - } - compile(in_node).must_equal %("users"."name" NOT IN ('a', 'b', 'c')) - end end describe 'Constants' do @@ -615,7 +546,7 @@ module Arel it "should use the underlying table for checking columns" do test = Table.new(:users).alias('zomgusers')[:id].eq '3' compile(test).must_be_like %{ - "zomgusers"."id" = 3 + "zomgusers"."id" = '3' } end end |