aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/active_relation/.DS_Storebin6148 -> 6148 bytes
-rw-r--r--lib/active_relation/extensions/object.rb10
-rw-r--r--lib/active_relation/primitives/attribute.rb5
-rw-r--r--lib/active_relation/relations/relation.rb4
-rw-r--r--lib/active_relation/relations/table.rb2
-rw-r--r--spec/active_relation/unit/primitives/attribute_spec.rb7
-rw-r--r--spec/active_relation/unit/relations/table_spec.rb5
-rw-r--r--spec/matchers/hash_the_same_as.rb26
-rw-r--r--spec/spec_helper.rb2
9 files changed, 47 insertions, 14 deletions
diff --git a/lib/active_relation/.DS_Store b/lib/active_relation/.DS_Store
index 2a449ff62e..9918127870 100644
--- a/lib/active_relation/.DS_Store
+++ b/lib/active_relation/.DS_Store
Binary files differ
diff --git a/lib/active_relation/extensions/object.rb b/lib/active_relation/extensions/object.rb
index d13cf9aabb..c1269ee37b 100644
--- a/lib/active_relation/extensions/object.rb
+++ b/lib/active_relation/extensions/object.rb
@@ -1,4 +1,12 @@
-class Object
+class Object
+ def self.hash_on(delegatee)
+ def eql?(other)
+ self == other
+ end
+
+ delegate :hash, :to => delegatee
+ end
+
def bind(relation)
ActiveRelation::Scalar.new(self, relation)
end
diff --git a/lib/active_relation/primitives/attribute.rb b/lib/active_relation/primitives/attribute.rb
index baaae1973c..20677f824b 100644
--- a/lib/active_relation/primitives/attribute.rb
+++ b/lib/active_relation/primitives/attribute.rb
@@ -48,10 +48,7 @@ module ActiveRelation
module Congruence
def self.included(klass)
- klass.class_eval do
- alias_method :eql?, :==
- delegate :hash, :to => :name
- end
+ klass.hash_on :name
end
def history
diff --git a/lib/active_relation/relations/relation.rb b/lib/active_relation/relations/relation.rb
index 1c97cc7035..f9823bf92d 100644
--- a/lib/active_relation/relations/relation.rb
+++ b/lib/active_relation/relations/relation.rb
@@ -102,10 +102,6 @@ module ActiveRelation
false
end
- def eql?(other)
- self == other
- end
-
def to_sql(strategy = Sql::Relation.new(engine))
strategy.select [
"SELECT #{attributes.collect{ |a| a.to_sql(Sql::Projection.new(engine)) }.join(', ')}",
diff --git a/lib/active_relation/relations/table.rb b/lib/active_relation/relations/table.rb
index 84eb1213ee..4682298608 100644
--- a/lib/active_relation/relations/table.rb
+++ b/lib/active_relation/relations/table.rb
@@ -3,7 +3,7 @@ module ActiveRelation
cattr_accessor :engine
attr_reader :name, :engine
- delegate :hash, :to => :name
+ hash_on :name
def initialize(name, engine = Table.engine)
@name, @engine = name.to_s, engine
diff --git a/spec/active_relation/unit/primitives/attribute_spec.rb b/spec/active_relation/unit/primitives/attribute_spec.rb
index 95c972d814..d424bf4dff 100644
--- a/spec/active_relation/unit/primitives/attribute_spec.rb
+++ b/spec/active_relation/unit/primitives/attribute_spec.rb
@@ -68,6 +68,13 @@ module ActiveRelation
Attribute.new(@relation, :name).should =~ Attribute.new(@relation, :name, :ancestor => Attribute.new(@relation, :name))
end
end
+
+ describe 'hashing' do
+ it "implements hash equality" do
+ Attribute.new(@relation, 'name').should hash_the_same_as(Attribute.new(@relation, 'name'))
+ Attribute.new(@relation, 'name').should_not hash_the_same_as(Attribute.new(@relation, 'id'))
+ end
+ end
end
describe '#to_sql' do
diff --git a/spec/active_relation/unit/relations/table_spec.rb b/spec/active_relation/unit/relations/table_spec.rb
index 95ad7133db..41ed2dc404 100644
--- a/spec/active_relation/unit/relations/table_spec.rb
+++ b/spec/active_relation/unit/relations/table_spec.rb
@@ -75,9 +75,8 @@ module ActiveRelation
describe 'hashing' do
it "implements hash equality" do
- hash = {}
- hash[Table.new(:users)] = 1
- hash[Table.new(:users)].should == 1
+ Table.new(:users).should hash_the_same_as(Table.new(:users))
+ Table.new(:users).should_not hash_the_same_as(Table.new(:photos))
end
end
diff --git a/spec/matchers/hash_the_same_as.rb b/spec/matchers/hash_the_same_as.rb
new file mode 100644
index 0000000000..86e98f31a3
--- /dev/null
+++ b/spec/matchers/hash_the_same_as.rb
@@ -0,0 +1,26 @@
+module HashTheSameAsMatcher
+ class HashTheSameAs
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(target)
+ @target = target
+ hash = {}
+ hash[@expected] = :some_arbitrary_value
+ hash[@target] == :some_arbitrary_value
+ end
+
+ def failure_message
+ "expected #{@target} to hash the same as #{@expected}; they must be `eql?` and have the same `#hash` value"
+ end
+
+ def negative_failure_message
+ "expected #{@target} to hash differently than #{@expected}; they must not be `eql?` or have a differing `#hash` values"
+ end
+ end
+
+ def hash_the_same_as(expected)
+ HashTheSameAs.new(expected)
+ end
+end \ No newline at end of file
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index cd9c8e96cb..6d00064e81 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -26,7 +26,7 @@ class Hash
end
Spec::Runner.configure do |config|
- config.include(BeLikeMatcher)
+ config.include(BeLikeMatcher, HashTheSameAsMatcher)
config.mock_with :rr
config.before do
ActiveRelation::Table.engine = ActiveRecord::Base.connection