aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Dalessio <mike@csa.net>2010-08-16 23:33:41 -0400
committerMike Dalessio <mike@csa.net>2010-08-19 01:37:18 -0400
commit788f33fb59af40e8cb29a233a8d6be9941b52ea7 (patch)
treec01ff24842c2194a4b51ef9fce0cec3ba68401da
parent0403efa4c6ad926a61dd0d134d63d962238e2c4f (diff)
downloadrails-788f33fb59af40e8cb29a233a8d6be9941b52ea7.tar.gz
rails-788f33fb59af40e8cb29a233a8d6be9941b52ea7.tar.bz2
rails-788f33fb59af40e8cb29a233a8d6be9941b52ea7.zip
TreeManager classes deep-copy their statements.
-rw-r--r--lib/arel/tree_manager.rb5
-rw-r--r--spec/arel/insert_manager_spec.rb11
-rw-r--r--spec/arel/select_manager_spec.rb11
-rw-r--r--spec/arel/update_manager_spec.rb12
-rw-r--r--spec/spec_helper.rb1
-rw-r--r--spec/support/shared/tree_manager_shared.rb9
6 files changed, 49 insertions, 0 deletions
diff --git a/lib/arel/tree_manager.rb b/lib/arel/tree_manager.rb
index d2027bedfa..24df5e0c09 100644
--- a/lib/arel/tree_manager.rb
+++ b/lib/arel/tree_manager.rb
@@ -15,5 +15,10 @@ module Arel
viz = Visitors::ToSql.new @engine
viz.accept @head
end
+
+ def initialize_copy other
+ super
+ @head = @head.clone
+ end
end
end
diff --git a/spec/arel/insert_manager_spec.rb b/spec/arel/insert_manager_spec.rb
index 14cb749b25..ed0725e79d 100644
--- a/spec/arel/insert_manager_spec.rb
+++ b/spec/arel/insert_manager_spec.rb
@@ -110,5 +110,16 @@ module Arel
}
end
end
+
+ describe "TreeManager" do
+ subject do
+ table = Table.new(:users)
+ Arel::InsertManager.new(Table.engine).tap do |manager|
+ manager.insert [[table[:id], nil]]
+ end
+ end
+
+ it_should_behave_like "TreeManager"
+ end
end
end
diff --git a/spec/arel/select_manager_spec.rb b/spec/arel/select_manager_spec.rb
index 01d1b35004..3984bec3fd 100644
--- a/spec/arel/select_manager_spec.rb
+++ b/spec/arel/select_manager_spec.rb
@@ -166,5 +166,16 @@ module Arel
manager.to_sql.should be_like 'SELECT "users"."id" FROM "users"'
end
end
+
+ describe "TreeManager" do
+ subject do
+ table = Table.new :users
+ Arel::SelectManager.new(Table.engine).tap do |manager|
+ manager.from(table).project(table['id'])
+ end
+ end
+
+ it_should_behave_like "TreeManager"
+ end
end
end
diff --git a/spec/arel/update_manager_spec.rb b/spec/arel/update_manager_spec.rb
index 8c4c4f93b8..4aeb15bb14 100644
--- a/spec/arel/update_manager_spec.rb
+++ b/spec/arel/update_manager_spec.rb
@@ -73,5 +73,17 @@ module Arel
um.where(table[:id].eq(1)).should == um
end
end
+
+ describe "TreeManager" do
+ subject do
+ table = Table.new :users
+ Arel::UpdateManager.new(Table.engine).tap do |manager|
+ manager.table table
+ manager.where table[:id].eq(1)
+ end
+ end
+
+ it_should_behave_like "TreeManager"
+ end
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 12cbe0170e..4ea3071515 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -5,6 +5,7 @@ require 'arel'
require 'support/matchers/be_like'
require 'support/check'
+Dir[File.join(File.dirname(__FILE__),'support/shared/*')].each { |f| require f }
if adapter = ENV['ADAPTER']
require "support/connections/#{adapter}_connection.rb"
diff --git a/spec/support/shared/tree_manager_shared.rb b/spec/support/shared/tree_manager_shared.rb
new file mode 100644
index 0000000000..48b561e1fb
--- /dev/null
+++ b/spec/support/shared/tree_manager_shared.rb
@@ -0,0 +1,9 @@
+shared_examples_for "TreeManager" do
+ describe "clone" do
+ it "clones the insert statement" do
+ subject.instance_variable_get("@head").should_receive(:clone).and_return(:foo) # TODO: ick.
+ dolly = subject.clone
+ dolly.instance_variable_get("@head").should == :foo
+ end
+ end
+end