database_cleaner 0.6.7 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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