From 0ea001008a2435df68e103ecebf7f27092d0dc83 Mon Sep 17 00:00:00 2001 From: Jon Rowe Date: Mon, 31 May 2010 14:57:52 +0100 Subject: [PATCH] move datamapper stuff back to its rightful place, fiddle with the gemfile slightly --- Gemfile | 30 +++-- Gemfile.lock | 34 ++++-- lib/database_cleaner/data_mapper/base.rb | 115 ------------------ .../data_mapper/truncation.rb | 112 +++++++++++++++++ spec/spec_helper.rb | 2 + 5 files changed, 157 insertions(+), 136 deletions(-) diff --git a/Gemfile b/Gemfile index 44c8667..af35e30 100644 --- a/Gemfile +++ b/Gemfile @@ -1,20 +1,30 @@ source "http://rubygems.org" group :development do gem "mysql" - gem 'sqlite3-ruby' + gem "rspec", "1.3.0" gem "cucumber" - gem "jeweler" - gem "mongo" - gem "mongo_ext" - gem "bson_ext" - gem "mongo_mapper" - gem "datamapper" - gem "data_objects" - gem "do_sqlite3" - gem "couch_potato" + gem "activerecord" + + gem "datamapper" + gem "data_objects" + gem "do_sqlite3" + + gem "mongo_mapper" + gem "mongo" + gem "mongo_ext" + + gem "couch_potato" + gem "bson_ext" + gem "rake" gem "ruby-debug" + gem 'sqlite3-ruby' + + gem "ZenTest" + + gem "bundler" + gem "jeweler" end diff --git a/Gemfile.lock b/Gemfile.lock index ea0374f..40a2a3a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,19 +4,19 @@ dependencies: group: - :development version: ">= 0" - datamapper: - group: - - :development - version: ">= 0" bson_ext: group: - :development version: ">= 0" + datamapper: + group: + - :development + version: ">= 0" mongo: group: - :development version: ">= 0" - activerecord: + ZenTest: group: - :development version: ">= 0" @@ -24,11 +24,7 @@ dependencies: group: - :development version: ">= 0" - sqlite3-ruby: - group: - - :development - version: ">= 0" - mysql: + activerecord: group: - :development version: ">= 0" @@ -40,10 +36,18 @@ dependencies: group: - :development version: ">= 0" + mysql: + group: + - :development + version: ">= 0" rake: group: - :development version: ">= 0" + sqlite3-ruby: + group: + - :development + version: ">= 0" rspec: group: - :development @@ -56,6 +60,10 @@ dependencies: group: - :development version: ">= 0" + bundler: + group: + - :development + version: ">= 0" cucumber: group: - :development @@ -67,6 +75,8 @@ dependencies: specs: - rake: version: 0.8.7 +- ZenTest: + version: 4.3.1 - activesupport: version: 2.3.8 - activerecord: @@ -79,6 +89,8 @@ specs: version: 1.0.1 - builder: version: 2.1.2 +- bundler: + version: 0.9.25 - columnize: version: 0.3.1 - mime-types: @@ -157,7 +169,7 @@ specs: version: 0.10.3 - sqlite3-ruby: version: 1.2.5 -hash: c37ee43fed255276a87c138cb08b2024ac62ae38 +hash: e757b477472957856d90c7fa4141c6a69b4ad296 sources: - Rubygems: uri: http://rubygems.org diff --git a/lib/database_cleaner/data_mapper/base.rb b/lib/database_cleaner/data_mapper/base.rb index 8a7a52e..7481e7c 100644 --- a/lib/database_cleaner/data_mapper/base.rb +++ b/lib/database_cleaner/data_mapper/base.rb @@ -1,119 +1,4 @@ require 'database_cleaner/generic/base' - -module DataMapper - module Adapters - - class DataObjectsAdapter - - def storage_names(repository = :default) - raise NotImplementedError - end - - end - - class MysqlAdapter < DataObjectsAdapter - - # taken from http://github.com/godfat/dm-mapping/tree/master - def storage_names(repository = :default) - select 'SHOW TABLES' - end - - def truncate_table(table_name) - execute("TRUNCATE TABLE #{quote_name(table_name)};") - end - - # copied from activerecord - def disable_referential_integrity - old = select("SELECT @@FOREIGN_KEY_CHECKS;") - begin - execute("SET FOREIGN_KEY_CHECKS = 0;") - yield - ensure - execute("SET FOREIGN_KEY_CHECKS = #{old};") - end - end - - end - - class Sqlite3Adapter < DataObjectsAdapter - - # taken from http://github.com/godfat/dm-mapping/tree/master - def storage_names(repository = :default) - # activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 177 - sql = <<-SQL.compress_lines - SELECT name - FROM sqlite_master - WHERE type = 'table' AND NOT name = 'sqlite_sequence' - SQL - # activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 181 - select sql - end - - def truncate_table(table_name) - execute("DELETE FROM #{quote_name(table_name)};") - end - - # this is a no-op copied from activerecord - # i didn't find out if/how this is possible - # activerecord also doesn't do more here - def disable_referential_integrity - yield - end - - end - - - # FIXME - # i don't know if this works - # i basically just copied activerecord code to get a rough idea what they do. - # i don't have postgres available, so i won't be the one to write this. - # maybe codes below gets some postgres/datamapper user going, though. - class PostgresAdapter < DataObjectsAdapter - - # taken from http://github.com/godfat/dm-mapping/tree/master - def storage_names(repository = :default) - sql = <<-SQL.compress_lines - SELECT table_name FROM "information_schema"."tables" - WHERE table_schema = current_schema() - SQL - select(sql) - end - - def truncate_table(table_name) - execute("TRUNCATE TABLE #{quote_name(table_name)} CASCADE;") - end - - # FIXME - # copied from activerecord - def supports_disable_referential_integrity? - version = select("SHOW server_version")[0][0].split('.') - (version[0].to_i >= 8 && version[1].to_i >= 1) ? true : false - rescue - return false - end - - # FIXME - # copied unchanged from activerecord - def disable_referential_integrity(repository = :default) - if supports_disable_referential_integrity? then - execute(storage_names(repository).collect do |name| - "ALTER TABLE #{quote_name(name)} DISABLE TRIGGER ALL" - end.join(";")) - end - yield - ensure - if supports_disable_referential_integrity? then - execute(storage_names(repository).collect do |name| - "ALTER TABLE #{quote_name(name)} ENABLE TRIGGER ALL" - end.join(";")) - end - end - - end - - end -end - module DatabaseCleaner module DataMapper def self.available_strategies diff --git a/lib/database_cleaner/data_mapper/truncation.rb b/lib/database_cleaner/data_mapper/truncation.rb index f54e1c9..bef01c7 100644 --- a/lib/database_cleaner/data_mapper/truncation.rb +++ b/lib/database_cleaner/data_mapper/truncation.rb @@ -1,7 +1,119 @@ require "database_cleaner/generic/truncation" require 'database_cleaner/data_mapper/base' +module DataMapper + module Adapters + class DataObjectsAdapter + + def storage_names(repository = :default) + raise NotImplementedError + end + + end + + class MysqlAdapter < DataObjectsAdapter + + # taken from http://github.com/godfat/dm-mapping/tree/master + def storage_names(repository = :default) + select 'SHOW TABLES' + end + + def truncate_table(table_name) + execute("TRUNCATE TABLE #{quote_name(table_name)};") + end + + # copied from activerecord + def disable_referential_integrity + old = select("SELECT @@FOREIGN_KEY_CHECKS;") + begin + execute("SET FOREIGN_KEY_CHECKS = 0;") + yield + ensure + execute("SET FOREIGN_KEY_CHECKS = #{old};") + end + end + + end + + class Sqlite3Adapter < DataObjectsAdapter + + # taken from http://github.com/godfat/dm-mapping/tree/master + def storage_names(repository = :default) + # activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 177 + sql = <<-SQL.compress_lines + SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL + # activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 181 + select(sql) + end + + def truncate_table(table_name) + execute("DELETE FROM #{quote_name(table_name)};") + end + + # this is a no-op copied from activerecord + # i didn't find out if/how this is possible + # activerecord also doesn't do more here + def disable_referential_integrity + yield + end + + end + + + # FIXME + # i don't know if this works + # i basically just copied activerecord code to get a rough idea what they do. + # i don't have postgres available, so i won't be the one to write this. + # maybe codes below gets some postgres/datamapper user going, though. + class PostgresAdapter < DataObjectsAdapter + + # taken from http://github.com/godfat/dm-mapping/tree/master + def storage_names(repository = :default) + sql = <<-SQL.compress_lines + SELECT table_name FROM "information_schema"."tables" + WHERE table_schema = current_schema() + SQL + select(sql) + end + + def truncate_table(table_name) + execute("TRUNCATE TABLE #{quote_name(table_name)} CASCADE;") + end + + # FIXME + # copied from activerecord + def supports_disable_referential_integrity? + version = select("SHOW server_version")[0][0].split('.') + (version[0].to_i >= 8 && version[1].to_i >= 1) ? true : false + rescue + return false + end + + # FIXME + # copied unchanged from activerecord + def disable_referential_integrity(repository = :default) + if supports_disable_referential_integrity? then + execute(storage_names(repository).collect do |name| + "ALTER TABLE #{quote_name(name)} DISABLE TRIGGER ALL" + end.join(";")) + end + yield + ensure + if supports_disable_referential_integrity? then + execute(storage_names(repository).collect do |name| + "ALTER TABLE #{quote_name(name)} ENABLE TRIGGER ALL" + end.join(";")) + end + end + + end + + end +end module DatabaseCleaner diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 351be18..b1ac769 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,7 +1,9 @@ require "rubygems" + require "bundler" Bundler.setup + require 'spec' #require 'active_record' #require 'mongo_mapper'