database_cleaner 0.6.7 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/lib/database_cleaner.rb +1 -3
  3. metadata +48 -154
  4. data/Gemfile.lock +0 -161
  5. data/History.txt +0 -173
  6. data/LICENSE +0 -20
  7. data/README.textile +0 -165
  8. data/Rakefile +0 -65
  9. data/TODO +0 -3
  10. data/VERSION.yml +0 -5
  11. data/cucumber.yml +0 -1
  12. data/examples/Gemfile +0 -48
  13. data/examples/Gemfile.lock +0 -161
  14. data/examples/config/database.yml.example +0 -8
  15. data/examples/db/sqlite_databases_go_here +0 -0
  16. data/examples/features/example.feature +0 -11
  17. data/examples/features/example_multiple_db.feature +0 -23
  18. data/examples/features/example_multiple_orm.feature +0 -22
  19. data/examples/features/step_definitions/activerecord_steps.rb +0 -31
  20. data/examples/features/step_definitions/couchpotato_steps.rb +0 -31
  21. data/examples/features/step_definitions/datamapper_steps.rb +0 -37
  22. data/examples/features/step_definitions/mongoid_steps.rb +0 -23
  23. data/examples/features/step_definitions/mongomapper_steps.rb +0 -31
  24. data/examples/features/step_definitions/translation_steps.rb +0 -55
  25. data/examples/features/support/env.rb +0 -62
  26. data/examples/lib/activerecord_models.rb +0 -41
  27. data/examples/lib/couchpotato_models.rb +0 -61
  28. data/examples/lib/datamapper_models.rb +0 -50
  29. data/examples/lib/mongoid_models.rb +0 -49
  30. data/examples/lib/mongomapper_models.rb +0 -51
  31. data/features/cleaning.feature +0 -22
  32. data/features/cleaning_default_strategy.feature +0 -19
  33. data/features/cleaning_multiple_dbs.feature +0 -21
  34. data/features/cleaning_multiple_orms.feature +0 -29
  35. data/features/step_definitions/database_cleaner_steps.rb +0 -32
  36. data/features/support/env.rb +0 -7
  37. data/features/support/feature_runner.rb +0 -39
  38. data/lib/database_cleaner/active_record/#transaction.rb# +0 -34
  39. data/lib/database_cleaner/active_record/base.rb +0 -53
  40. data/lib/database_cleaner/active_record/deletion.rb +0 -64
  41. data/lib/database_cleaner/active_record/transaction.rb +0 -26
  42. data/lib/database_cleaner/active_record/truncation.rb +0 -134
  43. data/lib/database_cleaner/base.rb +0 -136
  44. data/lib/database_cleaner/configuration.rb +0 -92
  45. data/lib/database_cleaner/couch_potato/base.rb +0 -7
  46. data/lib/database_cleaner/couch_potato/truncation.rb +0 -28
  47. data/lib/database_cleaner/cucumber.rb +0 -11
  48. data/lib/database_cleaner/data_mapper/base.rb +0 -21
  49. data/lib/database_cleaner/data_mapper/transaction.rb +0 -28
  50. data/lib/database_cleaner/data_mapper/truncation.rb +0 -175
  51. data/lib/database_cleaner/generic/base.rb +0 -23
  52. data/lib/database_cleaner/generic/truncation.rb +0 -43
  53. data/lib/database_cleaner/mongo/truncation.rb +0 -22
  54. data/lib/database_cleaner/mongo_mapper/base.rb +0 -20
  55. data/lib/database_cleaner/mongo_mapper/truncation.rb +0 -19
  56. data/lib/database_cleaner/mongoid/base.rb +0 -20
  57. data/lib/database_cleaner/mongoid/truncation.rb +0 -20
  58. data/lib/database_cleaner/null_strategy.rb +0 -15
  59. data/spec/database_cleaner/active_record/base_spec.rb +0 -141
  60. data/spec/database_cleaner/active_record/transaction_spec.rb +0 -65
  61. data/spec/database_cleaner/active_record/truncation_spec.rb +0 -82
  62. data/spec/database_cleaner/base_spec.rb +0 -478
  63. data/spec/database_cleaner/configuration_spec.rb +0 -294
  64. data/spec/database_cleaner/couch_potato/truncation_spec.rb +0 -41
  65. data/spec/database_cleaner/data_mapper/base_spec.rb +0 -30
  66. data/spec/database_cleaner/data_mapper/transaction_spec.rb +0 -23
  67. data/spec/database_cleaner/data_mapper/truncation_spec.rb +0 -11
  68. data/spec/database_cleaner/generic/base_spec.rb +0 -22
  69. data/spec/database_cleaner/generic/truncation_spec.rb +0 -78
  70. data/spec/database_cleaner/mongo_mapper/base_spec.rb +0 -33
  71. data/spec/database_cleaner/mongo_mapper/mongo_examples.rb +0 -8
  72. data/spec/database_cleaner/mongo_mapper/truncation_spec.rb +0 -74
  73. data/spec/database_cleaner/shared_strategy_spec.rb +0 -13
  74. data/spec/rcov.opts +0 -1
  75. data/spec/spec.opts +0 -7
  76. data/spec/spec_helper.rb +0 -19
@@ -1,64 +0,0 @@
1
- require 'active_record/base'
2
- require 'active_record/connection_adapters/abstract_adapter'
3
- require "database_cleaner/generic/truncation"
4
- require 'database_cleaner/active_record/base'
5
- require 'database_cleaner/active_record/truncation'
6
- # This file may seem to have duplication with that of truncation, but by keeping them separate
7
- # we avoiding loading this code when it is not being used (which is the common case).
8
-
9
- module ActiveRecord
10
- module ConnectionAdapters
11
-
12
- class MysqlAdapter < MYSQL_ADAPTER_PARENT
13
- def delete_table(table_name)
14
- execute("DELETE FROM #{quote_table_name(table_name)};")
15
- end
16
- end
17
-
18
- class Mysql2Adapter < AbstractAdapter
19
- def delete_table(table_name)
20
- execute("DELETE FROM #{quote_table_name(table_name)};")
21
- end
22
- end
23
-
24
- class JdbcAdapter < AbstractAdapter
25
- def delete_table(table_name)
26
- execute("DELETE FROM #{quote_table_name(table_name)};")
27
- end
28
- end
29
-
30
- class PostgreSQLAdapter < AbstractAdapter
31
- def delete_table(table_name)
32
- execute("DELETE FROM #{quote_table_name(table_name)};")
33
- end
34
- end
35
-
36
- class SQLServerAdapter < AbstractAdapter
37
- def delete_table(table_name)
38
- execute("DELETE FROM #{quote_table_name(table_name)};")
39
- end
40
- end
41
-
42
- class OracleEnhancedAdapter < AbstractAdapter
43
- def delete_table(table_name)
44
- execute("DELETE FROM #{quote_table_name(table_name)}")
45
- end
46
- end
47
-
48
- end
49
- end
50
-
51
-
52
- module DatabaseCleaner::ActiveRecord
53
- class Deletion < Truncation
54
-
55
- def clean
56
- each_table do |connection, table_name|
57
- connection.delete_table table_name
58
- end
59
- end
60
-
61
- end
62
- end
63
-
64
-
@@ -1,26 +0,0 @@
1
- require 'database_cleaner/active_record/base'
2
- module DatabaseCleaner::ActiveRecord
3
- class Transaction
4
- include ::DatabaseCleaner::ActiveRecord::Base
5
-
6
- def start
7
- if connection_klass.connection.respond_to?(:increment_open_transactions)
8
- connection_klass.connection.increment_open_transactions
9
- else
10
- connection_klass.__send__(:increment_open_transactions)
11
- end
12
- connection_klass.connection.begin_db_transaction
13
- end
14
-
15
-
16
- def clean
17
- connection_klass.connection.rollback_db_transaction
18
-
19
- if connection_klass.connection.respond_to?(:decrement_open_transactions)
20
- connection_klass.connection.decrement_open_transactions
21
- else
22
- connection_klass.__send__(:decrement_open_transactions)
23
- end
24
- end
25
- end
26
- end
@@ -1,134 +0,0 @@
1
- require 'active_record/base'
2
- require 'active_record/connection_adapters/abstract_adapter'
3
- require "database_cleaner/generic/truncation"
4
- require 'database_cleaner/active_record/base'
5
-
6
- module ActiveRecord
7
- module ConnectionAdapters
8
- # Activerecord-jdbc-adapter defines class dependencies a bit differently - if it is present, confirm to ArJdbc hierarchy to avoid 'superclass mismatch' errors.
9
- USE_ARJDBC_WORKAROUND = defined?(ArJdbc)
10
-
11
- class AbstractAdapter
12
- def views
13
- @views ||= select_values("select table_name from information_schema.views where table_schema = '#{current_database}'") rescue []
14
- end
15
- end
16
-
17
- unless USE_ARJDBC_WORKAROUND
18
- class SQLiteAdapter < AbstractAdapter
19
- end
20
- end
21
-
22
- MYSQL_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : AbstractAdapter
23
- SQLITE_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : SQLiteAdapter
24
-
25
- class MysqlAdapter < MYSQL_ADAPTER_PARENT
26
- def truncate_table(table_name)
27
- execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
28
- end
29
- end
30
-
31
- class Mysql2Adapter < AbstractAdapter
32
- def truncate_table(table_name)
33
- execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
34
- end
35
- end
36
-
37
- class IBM_DBAdapter < AbstractAdapter
38
- def truncate_table(table_name)
39
- execute("TRUNCATE #{quote_table_name(table_name)} IMMEDIATE")
40
- end
41
- end
42
-
43
- class SQLite3Adapter < SQLITE_ADAPTER_PARENT
44
- def delete_table(table_name)
45
- execute("DELETE FROM #{quote_table_name(table_name)};")
46
- end
47
- alias truncate_table delete_table
48
- end
49
-
50
- class JdbcAdapter < AbstractAdapter
51
- def truncate_table(table_name)
52
- begin
53
- execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
54
- rescue ActiveRecord::StatementInvalid
55
- execute("DELETE FROM #{quote_table_name(table_name)};")
56
- end
57
- end
58
- end
59
-
60
- class PostgreSQLAdapter < AbstractAdapter
61
-
62
- def db_version
63
- @db_version ||= postgresql_version
64
- end
65
-
66
- def cascade
67
- @cascade ||= db_version >= 80200 ? 'CASCADE' : ''
68
- end
69
-
70
- def restart_identity
71
- @restart_identity ||= db_version >= 80400 ? 'RESTART IDENTITY' : ''
72
- end
73
-
74
- def truncate_table(table_name)
75
- execute("TRUNCATE TABLE #{quote_table_name(table_name)} #{restart_identity} #{cascade};")
76
- end
77
-
78
- end
79
-
80
- class SQLServerAdapter < AbstractAdapter
81
- def truncate_table(table_name)
82
- begin
83
- execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
84
- rescue ActiveRecord::StatementInvalid
85
- execute("DELETE FROM #{quote_table_name(table_name)};")
86
- end
87
- end
88
- end
89
-
90
- class OracleEnhancedAdapter < AbstractAdapter
91
- def truncate_table(table_name)
92
- execute("TRUNCATE TABLE #{quote_table_name(table_name)}")
93
- end
94
- end
95
-
96
- end
97
- end
98
-
99
-
100
- module DatabaseCleaner::ActiveRecord
101
- class Truncation
102
- include ::DatabaseCleaner::ActiveRecord::Base
103
- include ::DatabaseCleaner::Generic::Truncation
104
-
105
- def clean
106
- each_table do |connection, table_name|
107
- connection.truncate_table table_name
108
- end
109
- end
110
-
111
- def each_table
112
- connection = connection_klass.connection
113
- connection.disable_referential_integrity do
114
- tables_to_truncate(connection).each do |table_name|
115
- yield connection, table_name
116
- end
117
- end
118
- end
119
-
120
- private
121
-
122
- def tables_to_truncate(connection)
123
- (@only || connection.tables) - @tables_to_exclude - connection.views
124
- end
125
-
126
- # overwritten
127
- def migration_storage_name
128
- 'schema_migrations'
129
- end
130
-
131
- end
132
- end
133
-
134
-
@@ -1,136 +0,0 @@
1
- require 'database_cleaner/null_strategy'
2
- module DatabaseCleaner
3
- class Base
4
-
5
- def initialize(desired_orm = nil,opts = {})
6
- if [:autodetect, nil, "autodetect"].include?(desired_orm)
7
- autodetect
8
- else
9
- self.orm = desired_orm
10
- end
11
- self.db = opts[:connection] if opts.has_key? :connection
12
- set_default_orm_strategy
13
- end
14
-
15
- def db=(desired_db)
16
- self.strategy_db = desired_db
17
- @db = desired_db
18
- end
19
-
20
- def strategy_db=(desired_db)
21
- if strategy.respond_to? :db=
22
- strategy.db = desired_db
23
- elsif desired_db!= :default
24
- raise ArgumentError, "You must provide a strategy object that supports non default databases when you specify a database"
25
- end
26
- end
27
-
28
- def db
29
- @db || :default
30
- end
31
-
32
- def create_strategy(*args)
33
- strategy, *strategy_args = args
34
- orm_strategy(strategy).new(*strategy_args)
35
- end
36
-
37
- def clean_with(*args)
38
- strategy = create_strategy(*args)
39
- strategy.clean
40
- strategy
41
- end
42
-
43
- alias clean_with! clean_with
44
-
45
- def strategy=(args)
46
- strategy, *strategy_args = args
47
- if strategy.is_a?(Symbol)
48
- @strategy = create_strategy(*args)
49
- elsif strategy_args.empty?
50
- @strategy = strategy
51
- else
52
- raise ArgumentError, "You must provide a strategy object, or a symbol for a known strategy along with initialization params."
53
- end
54
-
55
- self.strategy_db = self.db
56
-
57
- @strategy
58
- end
59
-
60
- def strategy
61
- @strategy || NullStrategy
62
- end
63
-
64
- def orm=(desired_orm)
65
- @orm = desired_orm.to_sym
66
- end
67
-
68
- def orm
69
- @orm || autodetect
70
- end
71
-
72
- def start
73
- strategy.start
74
- end
75
-
76
- def clean
77
- strategy.clean
78
- end
79
-
80
- alias clean! clean
81
-
82
- def auto_detected?
83
- return true unless @autodetected.nil?
84
- end
85
-
86
- #TODO make strategies directly comparable
87
- def ==(other)
88
- self.orm == other.orm && self.db == other.db && self.strategy.class == other.strategy.class
89
- end
90
-
91
- private
92
-
93
- def orm_module
94
- ::DatabaseCleaner.orm_module(orm)
95
- end
96
-
97
- def orm_strategy(strategy)
98
- require "database_cleaner/#{orm.to_s}/#{strategy.to_s}"
99
- orm_module.const_get(strategy.to_s.capitalize)
100
- rescue LoadError => e
101
- if orm_module.respond_to? :available_strategies
102
- raise UnknownStrategySpecified, "The '#{strategy}' strategy does not exist for the #{orm} ORM! Available strategies: #{orm_module.available_strategies.join(', ')}"
103
- else
104
- raise UnknownStrategySpecified, "The '#{strategy}' strategy does not exist for the #{orm} ORM!"
105
- end
106
- end
107
-
108
- def autodetect
109
- @orm ||= begin
110
- @autodetected = true
111
- if defined? ::ActiveRecord
112
- :active_record
113
- elsif defined? ::DataMapper
114
- :data_mapper
115
- elsif defined? ::MongoMapper
116
- :mongo_mapper
117
- elsif defined? ::Mongoid
118
- :mongoid
119
- elsif defined? ::CouchPotato
120
- :couch_potato
121
- else
122
- raise NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, MongoMapper, Mongoid, or CouchPotato loaded?"
123
- end
124
- end
125
- end
126
-
127
- def set_default_orm_strategy
128
- case orm
129
- when :active_record, :data_mapper
130
- self.strategy = :transaction
131
- when :mongo_mapper, :mongoid, :couch_potato
132
- self.strategy = :truncation
133
- end
134
- end
135
- end
136
- end
@@ -1,92 +0,0 @@
1
- require 'database_cleaner/base'
2
-
3
- module DatabaseCleaner
4
-
5
- class NoORMDetected < StandardError; end
6
- class UnknownStrategySpecified < ArgumentError; end
7
-
8
- class << self
9
- def [](orm,opts = {})
10
- raise NoORMDetected if orm.nil?
11
- @connections ||= []
12
- cleaner = DatabaseCleaner::Base.new(orm,opts)
13
- connections.push cleaner
14
- cleaner
15
- end
16
-
17
- def app_root=(desired_root)
18
- @app_root = desired_root
19
- end
20
-
21
- def app_root
22
- @app_root || Dir.pwd
23
- end
24
-
25
- def connections
26
- @connections ||= [::DatabaseCleaner::Base.new]
27
- end
28
-
29
- def logger=(log_source)
30
- @logger = log_source
31
- end
32
-
33
- def logger
34
- return @logger if @logger
35
-
36
- @logger = Logger.new(STDOUT)
37
- @logger.level = Logger::ERROR
38
- @logger
39
- end
40
-
41
- def strategy=(stratagem)
42
- self.connections.each { |connect| connect.strategy = stratagem }
43
- remove_duplicates
44
- end
45
-
46
- def orm=(orm)
47
- self.connections.each { |connect| connect.orm = orm }
48
- remove_duplicates
49
- end
50
-
51
- def start
52
- self.connections.each { |connection| connection.start }
53
- end
54
-
55
- def clean
56
- self.connections.each { |connection| connection.clean }
57
- end
58
-
59
- alias clean! clean
60
-
61
- def clean_with(*args)
62
- self.connections.each { |connection| connection.clean_with(*args) }
63
- end
64
-
65
- alias clean_with! clean_with
66
-
67
- def remove_duplicates
68
- temp = []
69
- self.connections.each do |connect|
70
- temp.push connect unless temp.include? connect
71
- end
72
- @connections = temp
73
- end
74
-
75
- def orm_module(symbol)
76
- case symbol
77
- when :active_record
78
- DatabaseCleaner::ActiveRecord
79
- when :data_mapper
80
- DatabaseCleaner::DataMapper
81
- when :mongo
82
- DatabaseCleaner::Mongo
83
- when :mongoid
84
- DatabaseCleaner::Mongoid
85
- when :mongo_mapper
86
- DatabaseCleaner::MongoMapper
87
- when :couch_potato
88
- DatabaseCleaner::CouchPotato
89
- end
90
- end
91
- end
92
- end
@@ -1,7 +0,0 @@
1
- module DatabaseCleaner
2
- module CouchPotato
3
- def self.available_strategies
4
- %w[truncation]
5
- end
6
- end
7
- end
@@ -1,28 +0,0 @@
1
- require 'database_cleaner/generic/truncation'
2
-
3
- module DatabaseCleaner
4
- module CouchPotato
5
- class Truncation
6
- include ::DatabaseCleaner::Generic::Truncation
7
-
8
- def initialize(options = {})
9
- if options.has_key?(:only) || options.has_key?(:except)
10
- raise ArgumentError, "The :only and :except options are not available for use with CouchPotato/CouchDB."
11
- elsif !options.empty?
12
- raise ArgumentError, "Unsupported option. You specified #{options.keys.join(',')}."
13
- end
14
- super
15
- end
16
-
17
- def clean
18
- database.recreate!
19
- end
20
-
21
- private
22
-
23
- def database
24
- ::CouchPotato.couchrest_database
25
- end
26
- end
27
- end
28
- end
@@ -1,11 +0,0 @@
1
- Before do
2
- DatabaseCleaner.start
3
- end
4
-
5
- After do
6
- begin
7
- DatabaseCleaner.clean
8
- rescue Exception => e
9
- DatabaseCleaner.logger.error "Exception encountered by DatabaseCleaner in Cucumber After block: #{e}"
10
- end
11
- end
@@ -1,21 +0,0 @@
1
- require 'database_cleaner/generic/base'
2
- module DatabaseCleaner
3
- module DataMapper
4
- def self.available_strategies
5
- %w[truncation transaction]
6
- end
7
-
8
- module Base
9
- include ::DatabaseCleaner::Generic::Base
10
-
11
- def db=(desired_db)
12
- @db = desired_db
13
- end
14
-
15
- def db
16
- @db || :default
17
- end
18
-
19
- end
20
- end
21
- end
@@ -1,28 +0,0 @@
1
- require 'database_cleaner/data_mapper/base'
2
-
3
- module DatabaseCleaner::DataMapper
4
- class Transaction
5
- include ::DatabaseCleaner::DataMapper::Base
6
- #TODO Figure out repositories, may have to refactor connection_klass to something more sensible
7
- def start(repository = nil)
8
- repository = self.db if repository.nil?
9
- ::DataMapper.repository(repository) do |r|
10
- transaction = DataMapper::Transaction.new(r)
11
- transaction.begin
12
- r.adapter.push_transaction(transaction)
13
- end
14
- end
15
-
16
- def clean(repository = nil)
17
- repository = self.db if repository.nil?
18
- ::DataMapper.repository(repository) do |r|
19
- adapter = r.adapter
20
- while adapter.current_transaction
21
- adapter.current_transaction.rollback
22
- adapter.pop_transaction
23
- end
24
- end
25
- end
26
-
27
- end
28
- end