diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2010-08-19 10:38:07 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2010-08-19 10:38:07 -0700 |
commit | 3283adc6d0edcc873256c78842f8ddd233577d08 (patch) | |
tree | a92d64c67ea987f65a465dbac97195cde4fbc820 | |
parent | 6451188abf647d6aa855d22db8d2d62a2b2c4542 (diff) | |
parent | 06c92a8557f5171704a121d0f4412e4c1e9a9c2b (diff) | |
download | rails-3283adc6d0edcc873256c78842f8ddd233577d08.tar.gz rails-3283adc6d0edcc873256c78842f8ddd233577d08.tar.bz2 rails-3283adc6d0edcc873256c78842f8ddd233577d08.zip |
Merge branch 'v1' of github.com:flavorjones/arel into v1
* 'v1' of github.com:flavorjones/arel:
DeleteStatement deep copy
cleaning up describe/it block names
SelectCore deep copies attributes
Statement nodes deep-copy AST nodes
TreeManager classes deep-copy their statements.
-rw-r--r-- | lib/arel/nodes/delete_statement.rb | 5 | ||||
-rw-r--r-- | lib/arel/nodes/insert_statement.rb | 6 | ||||
-rw-r--r-- | lib/arel/nodes/select_core.rb | 7 | ||||
-rw-r--r-- | lib/arel/nodes/select_statement.rb | 5 | ||||
-rw-r--r-- | lib/arel/nodes/update_statement.rb | 6 | ||||
-rw-r--r-- | lib/arel/tree_manager.rb | 5 | ||||
-rw-r--r-- | spec/arel/insert_manager_spec.rb | 11 | ||||
-rw-r--r-- | spec/arel/nodes/delete_statement_spec.rb | 17 | ||||
-rw-r--r-- | spec/arel/nodes/insert_statement_spec.rb | 22 | ||||
-rw-r--r-- | spec/arel/nodes/select_core_spec.rb | 23 | ||||
-rw-r--r-- | spec/arel/nodes/select_statement_spec.rb | 16 | ||||
-rw-r--r-- | spec/arel/nodes/update_statement_spec.rb | 22 | ||||
-rw-r--r-- | spec/arel/select_manager_spec.rb | 11 | ||||
-rw-r--r-- | spec/arel/update_manager_spec.rb | 12 | ||||
-rw-r--r-- | spec/spec_helper.rb | 1 | ||||
-rw-r--r-- | spec/support/shared/tree_manager_shared.rb | 9 |
16 files changed, 178 insertions, 0 deletions
diff --git a/lib/arel/nodes/delete_statement.rb b/lib/arel/nodes/delete_statement.rb index 54bf513c2b..b65177af05 100644 --- a/lib/arel/nodes/delete_statement.rb +++ b/lib/arel/nodes/delete_statement.rb @@ -7,6 +7,11 @@ module Arel @from = nil @wheres = [] end + + def initialize_copy other + super + @wheres = @wheres.map { |o| o.clone } + end end end end diff --git a/lib/arel/nodes/insert_statement.rb b/lib/arel/nodes/insert_statement.rb index ed601aa841..8c6e1234d0 100644 --- a/lib/arel/nodes/insert_statement.rb +++ b/lib/arel/nodes/insert_statement.rb @@ -8,6 +8,12 @@ module Arel @columns = [] @values = [] end + + def initialize_copy other + super + @columns = @columns.map { |o| o.clone } + @values = @values.map { |o| o.clone } + end end end end diff --git a/lib/arel/nodes/select_core.rb b/lib/arel/nodes/select_core.rb index 39145de697..7ebdab315d 100644 --- a/lib/arel/nodes/select_core.rb +++ b/lib/arel/nodes/select_core.rb @@ -8,6 +8,13 @@ module Arel @projections = [] @wheres = [] end + + def initialize_copy other + super + @froms = @froms.map { |o| o.clone } + @projections = @projections.map { |o| o.clone } + @wheres = @wheres.map { |o| o.clone } + end end end end diff --git a/lib/arel/nodes/select_statement.rb b/lib/arel/nodes/select_statement.rb index 122f6275fe..50fef776f6 100644 --- a/lib/arel/nodes/select_statement.rb +++ b/lib/arel/nodes/select_statement.rb @@ -8,6 +8,11 @@ module Arel @cores = cores @limit = nil end + + def initialize_copy other + super + @cores = @cores.map { |o| o.clone } + end end end end diff --git a/lib/arel/nodes/update_statement.rb b/lib/arel/nodes/update_statement.rb index 9f069cddb3..27e3e4e6ac 100644 --- a/lib/arel/nodes/update_statement.rb +++ b/lib/arel/nodes/update_statement.rb @@ -8,6 +8,12 @@ module Arel @wheres = [] @values = [] end + + def initialize_copy other + super + @wheres = @wheres.map { |o| o.clone } + @values = @values.map { |o| o.clone } + end end end end 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/nodes/delete_statement_spec.rb b/spec/arel/nodes/delete_statement_spec.rb new file mode 100644 index 0000000000..dd43b70d35 --- /dev/null +++ b/spec/arel/nodes/delete_statement_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Arel::Nodes::SelectStatement do + describe "#clone" do + it "clones where" do + statement = Arel::Nodes::DeleteStatement.new + statement.wheres = %w[a b c] + + statement.wheres.each_with_index do |o, j| + o.should_receive(:clone).and_return("#{o}#{j}") + end + + dolly = statement.clone + dolly.wheres.should == %w[a0 b1 c2] + end + end +end diff --git a/spec/arel/nodes/insert_statement_spec.rb b/spec/arel/nodes/insert_statement_spec.rb new file mode 100644 index 0000000000..644e3fb192 --- /dev/null +++ b/spec/arel/nodes/insert_statement_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe Arel::Nodes::InsertStatement do + describe "#clone" do + it "clones columns and values" do + statement = Arel::Nodes::InsertStatement.new + statement.columns = %w[a b c] + statement.values = %w[x y z] + + statement.columns.each_with_index do |o, j| + o.should_receive(:clone).and_return("#{o}#{j}") + end + statement.values.each_with_index do |o, j| + o.should_receive(:clone).and_return("#{o}#{j}") + end + + dolly = statement.clone + dolly.columns.should == %w[a0 b1 c2] + dolly.values.should == %w[x0 y1 z2] + end + end +end diff --git a/spec/arel/nodes/select_core_spec.rb b/spec/arel/nodes/select_core_spec.rb new file mode 100644 index 0000000000..cf717a3904 --- /dev/null +++ b/spec/arel/nodes/select_core_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Arel::Nodes::SelectCore do + describe "#clone" do + it "clones froms, projections and wheres" do + core = Arel::Nodes::SelectCore.new + core.instance_variable_set "@froms", %w[a b c] + core.instance_variable_set "@projections", %w[d e f] + core.instance_variable_set "@wheres", %w[g h i] + + [:froms, :projections, :wheres].each do |array_attr| + core.send(array_attr).each_with_index do |o, j| + o.should_receive(:clone).and_return("#{o}#{j}") + end + end + + dolly = core.clone + dolly.froms.should == %w[a0 b1 c2] + dolly.projections.should == %w[d0 e1 f2] + dolly.wheres.should == %w[g0 h1 i2] + end + end +end diff --git a/spec/arel/nodes/select_statement_spec.rb b/spec/arel/nodes/select_statement_spec.rb new file mode 100644 index 0000000000..a024710c78 --- /dev/null +++ b/spec/arel/nodes/select_statement_spec.rb @@ -0,0 +1,16 @@ +require 'spec_helper' + +describe Arel::Nodes::SelectStatement do + describe "#clone" do + it "clones cores" do + statement = Arel::Nodes::SelectStatement.new %w[a b c] + + statement.cores.each_with_index do |o, j| + o.should_receive(:clone).and_return("#{o}#{j}") + end + + dolly = statement.clone + dolly.cores.should == %w[a0 b1 c2] + end + end +end diff --git a/spec/arel/nodes/update_statement_spec.rb b/spec/arel/nodes/update_statement_spec.rb new file mode 100644 index 0000000000..8cbca1fd73 --- /dev/null +++ b/spec/arel/nodes/update_statement_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe Arel::Nodes::UpdateStatement do + describe "#clone" do + it "clones wheres and values" do + statement = Arel::Nodes::UpdateStatement.new + statement.wheres = %w[a b c] + statement.values = %w[x y z] + + statement.wheres.each_with_index do |o, j| + o.should_receive(:clone).and_return("#{o}#{j}") + end + statement.values.each_with_index do |o, j| + o.should_receive(:clone).and_return("#{o}#{j}") + end + + dolly = statement.clone + dolly.wheres.should == %w[a0 b1 c2] + dolly.values.should == %w[x0 y1 z2] + end + end +end diff --git a/spec/arel/select_manager_spec.rb b/spec/arel/select_manager_spec.rb index 331d9714a7..bf4ce2e13f 100644 --- a/spec/arel/select_manager_spec.rb +++ b/spec/arel/select_manager_spec.rb @@ -208,5 +208,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 e70ae2cef3..016b6f69b1 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 |