From aaba48d8d1dd205bc8aad164092b53f44187deac Mon Sep 17 00:00:00 2001 From: Corin Langosch Date: Wed, 30 Mar 2011 10:08:38 +0200 Subject: [PATCH 1/5] add sequel adapter --- lib/database_cleaner/sequel/base.rb | 21 +++++++++++++++ lib/database_cleaner/sequel/transaction.rb | 16 +++++++++++ lib/database_cleaner/sequel/truncation.rb | 31 ++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 lib/database_cleaner/sequel/base.rb create mode 100644 lib/database_cleaner/sequel/transaction.rb create mode 100755 lib/database_cleaner/sequel/truncation.rb diff --git a/lib/database_cleaner/sequel/base.rb b/lib/database_cleaner/sequel/base.rb new file mode 100644 index 00000000..ac126784 --- /dev/null +++ b/lib/database_cleaner/sequel/base.rb @@ -0,0 +1,21 @@ +require 'database_cleaner/generic/base' +module DatabaseCleaner + module Sequel + def self.available_strategies + %w[truncation transaction] + end + + module Base + include ::DatabaseCleaner::Generic::Base + + def db=(desired_db) + @db = desired_db + end + + def db + @db || :default + end + + end + end +end diff --git a/lib/database_cleaner/sequel/transaction.rb b/lib/database_cleaner/sequel/transaction.rb new file mode 100644 index 00000000..76333562 --- /dev/null +++ b/lib/database_cleaner/sequel/transaction.rb @@ -0,0 +1,16 @@ +require 'database_cleaner/sequel/base' +module DatabaseCleaner + module Sequel + class Transaction + include ::DatabaseCleaner::Sequel::Base + + def start + db.begin_transaction + end + + def clean + db.rollback_transaction + end + end + end +end diff --git a/lib/database_cleaner/sequel/truncation.rb b/lib/database_cleaner/sequel/truncation.rb new file mode 100755 index 00000000..d2d60ad3 --- /dev/null +++ b/lib/database_cleaner/sequel/truncation.rb @@ -0,0 +1,31 @@ +require "database_cleaner/generic/truncation" +require 'database_cleaner/sequel/base' + +module DatabaseCleaner + module Sequel + class Truncation + include ::DatabaseCleaner::Sequel::Base + include ::DatabaseCleaner::Generic::Truncation + + def clean + each_table do |db, table| + db[table].truncate + end + end + + def each_table + tables_to_truncate(db).each do |table| + yield db, table + end + end + + private + + def tables_to_truncate(db) + (@only || db.tables) - @tables_to_exclude + end + end + end +end + + From 2c08a1cb29a76ff3b340c1ece0d9f631ccd56df8 Mon Sep 17 00:00:00 2001 From: Corin Langosch Date: Wed, 30 Mar 2011 10:13:23 +0200 Subject: [PATCH 2/5] add orm hooks --- lib/database_cleaner/base.rb | 4 +++- lib/database_cleaner/configuration.rb | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/database_cleaner/base.rb b/lib/database_cleaner/base.rb index 41348d1c..809b3ccb 100644 --- a/lib/database_cleaner/base.rb +++ b/lib/database_cleaner/base.rb @@ -118,6 +118,8 @@ def autodetect :mongoid elsif defined? ::CouchPotato :couch_potato + elsif defined? ::Sequel + :sequel else raise NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, MongoMapper, Mongoid, or CouchPotato loaded?" end @@ -126,7 +128,7 @@ def autodetect def set_default_orm_strategy case orm - when :active_record, :data_mapper + when :active_record, :data_mapper, :sequel self.strategy = :transaction when :mongo_mapper, :mongoid, :couch_potato self.strategy = :truncation diff --git a/lib/database_cleaner/configuration.rb b/lib/database_cleaner/configuration.rb index b324cfe6..c1149f14 100644 --- a/lib/database_cleaner/configuration.rb +++ b/lib/database_cleaner/configuration.rb @@ -86,6 +86,8 @@ def orm_module(symbol) DatabaseCleaner::MongoMapper when :couch_potato DatabaseCleaner::CouchPotato + when :sequel + DatabaseCleaner::Sequel end end end From f1cddeaeabe3366c121090841ec669fe83d968bb Mon Sep 17 00:00:00 2001 From: Corin Langosch Date: Wed, 30 Mar 2011 10:15:17 +0200 Subject: [PATCH 3/5] add sequel to list of supported orms in error string --- lib/database_cleaner/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/database_cleaner/base.rb b/lib/database_cleaner/base.rb index 809b3ccb..8cadba2e 100644 --- a/lib/database_cleaner/base.rb +++ b/lib/database_cleaner/base.rb @@ -121,7 +121,7 @@ def autodetect elsif defined? ::Sequel :sequel else - raise NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, MongoMapper, Mongoid, or CouchPotato loaded?" + raise NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, Sequel, MongoMapper, Mongoid, or CouchPotato loaded?" end end end From 29d70b79ebe58066c5b55c3510b5d6ac4a41d4e0 Mon Sep 17 00:00:00 2001 From: Corin Langosch Date: Wed, 30 Mar 2011 10:27:03 +0200 Subject: [PATCH 4/5] added basic specs --- Gemfile | 1 + Gemfile.lock | 2 ++ spec/database_cleaner/sequel/base_spec.rb | 31 +++++++++++++++++++ .../sequel/transaction_spec.rb | 21 +++++++++++++ .../sequel/truncation_spec.rb | 13 ++++++++ 5 files changed, 68 insertions(+) create mode 100644 spec/database_cleaner/sequel/base_spec.rb create mode 100644 spec/database_cleaner/sequel/transaction_spec.rb create mode 100644 spec/database_cleaner/sequel/truncation_spec.rb diff --git a/Gemfile b/Gemfile index 04fe03e3..67a1c779 100755 --- a/Gemfile +++ b/Gemfile @@ -32,6 +32,7 @@ group :development do gem "tzinfo", "0.3.22" gem "mongo_mapper", "0.8.2" gem "couch_potato", "0.3.0" + gem "sequel", "~>3.21.0" #gem "ibm_db" # I don't want to add this dependency, even as a dev one since it requires DB2 to be installed end diff --git a/Gemfile.lock b/Gemfile.lock index e3b42bad..050ada78 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -127,6 +127,7 @@ GEM linecache (>= 0.3) rubyforge (2.0.4) json_pure (>= 1.1.7) + sequel (3.21.0) sqlite3-ruby (1.3.1) stringex (1.1.0) sys-uname (0.8.4) @@ -157,5 +158,6 @@ DEPENDENCIES rspactor rspec ruby-debug + sequel (~> 3.21.0) sqlite3-ruby tzinfo (= 0.3.22) diff --git a/spec/database_cleaner/sequel/base_spec.rb b/spec/database_cleaner/sequel/base_spec.rb new file mode 100644 index 00000000..7f3b582f --- /dev/null +++ b/spec/database_cleaner/sequel/base_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' +require 'database_cleaner/sequel/base' +require 'database_cleaner/shared_strategy_spec' +require 'sequel' + +module DatabaseCleaner + describe Sequel do + it { should respond_to(:available_strategies) } + end + + module Sequel + class ExampleStrategy + include ::DatabaseCleaner::Sequel::Base + end + + describe ExampleStrategy do + it_should_behave_like "a generic strategy" + it { should respond_to(:db) } + it { should respond_to(:db=) } + + it "should store my desired db" do + subject.db = :my_db + subject.db.should == :my_db + end + + it "should default to :default" do + subject.db.should == :default + end + end + end +end diff --git a/spec/database_cleaner/sequel/transaction_spec.rb b/spec/database_cleaner/sequel/transaction_spec.rb new file mode 100644 index 00000000..1e3c3604 --- /dev/null +++ b/spec/database_cleaner/sequel/transaction_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' +require 'database_cleaner/sequel/transaction' +require 'database_cleaner/shared_strategy_spec' +require 'sequel' + +module DatabaseCleaner + module Sequel + describe Transaction do + it_should_behave_like "a generic strategy" + it_should_behave_like "a generic transaction strategy" + + describe "start" do + it "should start a transaction" + end + + describe "clean" do + it "should finish a transaction" + end + end + end +end diff --git a/spec/database_cleaner/sequel/truncation_spec.rb b/spec/database_cleaner/sequel/truncation_spec.rb new file mode 100644 index 00000000..0bbc660c --- /dev/null +++ b/spec/database_cleaner/sequel/truncation_spec.rb @@ -0,0 +1,13 @@ +require 'spec_helper' +require 'database_cleaner/sequel/truncation' +require 'database_cleaner/shared_strategy_spec' +require 'sequel' + +module DatabaseCleaner + module Sequel + describe Truncation do + it_should_behave_like "a generic strategy" + it_should_behave_like "a generic truncation strategy" + end + end +end From c03ec11f1b7d57a11c775b8c2164ea5e529c5285 Mon Sep 17 00:00:00 2001 From: Corin Langosch Date: Wed, 30 Mar 2011 12:37:03 +0200 Subject: [PATCH 5/5] select proper default database. fix transactional cleaner. --- lib/database_cleaner/sequel/base.rb | 5 +++-- lib/database_cleaner/sequel/transaction.rb | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/database_cleaner/sequel/base.rb b/lib/database_cleaner/sequel/base.rb index ac126784..8cd5e308 100644 --- a/lib/database_cleaner/sequel/base.rb +++ b/lib/database_cleaner/sequel/base.rb @@ -13,9 +13,10 @@ def db=(desired_db) end def db - @db || :default + return @db if @db && @db != :default + raise "As you have more than one active sequel database you have to specify the one to use manually!" if ::Sequel::DATABASES.count > 1 + ::Sequel::DATABASES.first end - end end end diff --git a/lib/database_cleaner/sequel/transaction.rb b/lib/database_cleaner/sequel/transaction.rb index 76333562..7327bb55 100644 --- a/lib/database_cleaner/sequel/transaction.rb +++ b/lib/database_cleaner/sequel/transaction.rb @@ -5,11 +5,15 @@ class Transaction include ::DatabaseCleaner::Sequel::Base def start - db.begin_transaction + @transactions ||= [] + db.send(:add_transaction) + @transactions << db.send(:begin_transaction, db) end def clean - db.rollback_transaction + transaction = @transactions.pop + db.send(:rollback_transaction, transaction) + db.send(:remove_transaction, transaction) end end end