diff options
| -rw-r--r-- | activerecord/CHANGELOG.md | 11 | ||||
| -rw-r--r-- | activerecord/lib/active_record/attribute_methods.rb | 10 | ||||
| -rw-r--r-- | activerecord/lib/active_record/connection_handling.rb | 8 | ||||
| -rw-r--r-- | activerecord/lib/active_record/query_cache.rb | 10 | ||||
| -rw-r--r-- | activerecord/lib/active_record/runtime_registry.rb | 4 | ||||
| -rw-r--r-- | activerecord/test/cases/adapters/postgresql/array_test.rb | 7 | ||||
| -rw-r--r-- | activerecord/test/cases/attribute_methods_test.rb | 23 | ||||
| -rw-r--r-- | activerecord/test/cases/query_cache_test.rb | 12 | 
8 files changed, 46 insertions, 39 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 0bd3c2e78c..8521d3b07b 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,14 @@ +*   Inspecting an object with an associated array of over 10 elements no longer +    truncates the array, preventing `inspect` from looping infinitely in some +    cases. + +    *Kevin McPhillips* + +*   Removed the unused methods `ActiveRecord::Base.connection_id` and +    `ActiveRecord::Base.connection_id=` + +    *Sean Griffin* +  *   Ensure hashes can be assigned to attributes created using `composed_of`.      Fixes #25210. diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb index 1fb5eb28cd..78bfcf34a9 100644 --- a/activerecord/lib/active_record/attribute_methods.rb +++ b/activerecord/lib/active_record/attribute_methods.rb @@ -279,9 +279,8 @@ module ActiveRecord      # Returns an <tt>#inspect</tt>-like string for the value of the      # attribute +attr_name+. String attributes are truncated up to 50      # characters, Date and Time attributes are returned in the -    # <tt>:db</tt> format, Array attributes are truncated up to 10 values. -    # Other attributes return the value of <tt>#inspect</tt> without -    # modification. +    # <tt>:db</tt> format. Other attributes return the value of +    # <tt>#inspect</tt> without modification.      #      #   person = Person.create!(name: 'David Heinemeier Hansson ' * 3)      # @@ -292,7 +291,7 @@ module ActiveRecord      #   # => "\"2012-10-22 00:15:07\""      #      #   person.attribute_for_inspect(:tag_ids) -    #   # => "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...]" +    #   # => "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]"      def attribute_for_inspect(attr_name)        value = read_attribute(attr_name) @@ -300,9 +299,6 @@ module ActiveRecord          "#{value[0, 50]}...".inspect        elsif value.is_a?(Date) || value.is_a?(Time)          %("#{value.to_s(:db)}") -      elsif value.is_a?(Array) && value.size > 10 -        inspected = value.first(10).inspect -        %(#{inspected[0...-1]}, ...])        else          value.inspect        end diff --git a/activerecord/lib/active_record/connection_handling.rb b/activerecord/lib/active_record/connection_handling.rb index 99fdef67d0..f735bc697b 100644 --- a/activerecord/lib/active_record/connection_handling.rb +++ b/activerecord/lib/active_record/connection_handling.rb @@ -98,14 +98,6 @@ module ActiveRecord        @connection_specification_name      end -    def connection_id -      ActiveRecord::RuntimeRegistry.connection_id ||= Thread.current.object_id -    end - -    def connection_id=(connection_id) -      ActiveRecord::RuntimeRegistry.connection_id = connection_id -    end -      # Returns the configuration of the associated connection as a hash:      #      #  ActiveRecord::Base.connection_config diff --git a/activerecord/lib/active_record/query_cache.rb b/activerecord/lib/active_record/query_cache.rb index 07d863d15e..387dd8e9bd 100644 --- a/activerecord/lib/active_record/query_cache.rb +++ b/activerecord/lib/active_record/query_cache.rb @@ -26,16 +26,12 @@ module ActiveRecord      def self.run        connection    = ActiveRecord::Base.connection        enabled       = connection.query_cache_enabled -      connection_id = ActiveRecord::Base.connection_id        connection.enable_query_cache! -      [enabled, connection_id] +      enabled      end -    def self.complete(state) -      enabled, connection_id = state - -      ActiveRecord::Base.connection_id = connection_id +    def self.complete(enabled)        ActiveRecord::Base.connection.clear_query_cache        ActiveRecord::Base.connection.disable_query_cache! unless enabled      end @@ -44,7 +40,7 @@ module ActiveRecord        executor.register_hook(self)        executor.to_complete do -        unless ActiveRecord::Base.connection.transaction_open? +        unless ActiveRecord::Base.connected? && ActiveRecord::Base.connection.transaction_open?            ActiveRecord::Base.clear_active_connections!          end        end diff --git a/activerecord/lib/active_record/runtime_registry.rb b/activerecord/lib/active_record/runtime_registry.rb index 56e88bc661..9e86999c1b 100644 --- a/activerecord/lib/active_record/runtime_registry.rb +++ b/activerecord/lib/active_record/runtime_registry.rb @@ -12,9 +12,9 @@ module ActiveRecord    class RuntimeRegistry # :nodoc:      extend ActiveSupport::PerThreadRegistry -    attr_accessor :connection_handler, :sql_runtime, :connection_id +    attr_accessor :connection_handler, :sql_runtime -    [:connection_handler, :sql_runtime, :connection_id].each do |val| +    [:connection_handler, :sql_runtime].each do |val|        class_eval %{ def self.#{val}; instance.#{val}; end }, __FILE__, __LINE__        class_eval %{ def self.#{val}=(x); instance.#{val}=x; end }, __FILE__, __LINE__      end diff --git a/activerecord/test/cases/adapters/postgresql/array_test.rb b/activerecord/test/cases/adapters/postgresql/array_test.rb index 380a90d765..70792e937c 100644 --- a/activerecord/test/cases/adapters/postgresql/array_test.rb +++ b/activerecord/test/cases/adapters/postgresql/array_test.rb @@ -189,8 +189,13 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase    end    def test_attribute_for_inspect_for_array_field +    record = PgArray.new { |a| a.ratings = (1..10).to_a } +    assert_equal("[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]", record.attribute_for_inspect(:ratings)) +  end + +  def test_attribute_for_inspect_for_array_field_for_large_array      record = PgArray.new { |a| a.ratings = (1..11).to_a } -    assert_equal("[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...]", record.attribute_for_inspect(:ratings)) +    assert_equal("[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]", record.attribute_for_inspect(:ratings))    end    def test_escaping diff --git a/activerecord/test/cases/attribute_methods_test.rb b/activerecord/test/cases/attribute_methods_test.rb index 1db52af59b..04126e87e4 100644 --- a/activerecord/test/cases/attribute_methods_test.rb +++ b/activerecord/test/cases/attribute_methods_test.rb @@ -27,14 +27,33 @@ class AttributeMethodsTest < ActiveRecord::TestCase      ActiveRecord::Base.send(:attribute_method_matchers).concat(@old_matchers)    end -  def test_attribute_for_inspect +  def test_attribute_for_inspect_string      t = topics(:first)      t.title = "The First Topic Now Has A Title With\nNewlines And More Than 50 Characters" -    assert_equal %("#{t.written_on.to_s(:db)}"), t.attribute_for_inspect(:written_on)      assert_equal '"The First Topic Now Has A Title With\nNewlines And ..."', t.attribute_for_inspect(:title)    end +  def test_attribute_for_inspect_date +    t = topics(:first) + +    assert_equal %("#{t.written_on.to_s(:db)}"), t.attribute_for_inspect(:written_on) +  end + +  def test_attribute_for_inspect_array +    t = topics(:first) +    t.content = [Object.new] + +    assert_match %r(\[#<Object:0x[0-9a-f]+>\]), t.attribute_for_inspect(:content) +  end + +  def test_attribute_for_inspect_long_array +    t = topics(:first) +    t.content = (1..11).to_a + +    assert_equal "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]", t.attribute_for_inspect(:content) +  end +    def test_attribute_present      t = Topic.new      t.title = "hello there!" diff --git a/activerecord/test/cases/query_cache_test.rb b/activerecord/test/cases/query_cache_test.rb index d5c01315c1..03ec063671 100644 --- a/activerecord/test/cases/query_cache_test.rb +++ b/activerecord/test/cases/query_cache_test.rb @@ -39,18 +39,6 @@ class QueryCacheTest < ActiveRecord::TestCase      assert ActiveRecord::Base.connection.query_cache_enabled, 'cache on'    end -  def test_exceptional_middleware_assigns_original_connection_id_on_error -    connection_id = ActiveRecord::Base.connection_id - -    mw = middleware { |env| -      ActiveRecord::Base.connection_id = self.object_id -      raise "lol borked" -    } -    assert_raises(RuntimeError) { mw.call({}) } - -    assert_equal connection_id, ActiveRecord::Base.connection_id -  end -    def test_middleware_delegates      called = false      mw = middleware { |env|  | 
