database_cleaner 1.8.5 → 2.0.2

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/lib/database_cleaner.rb +1 -47
  3. metadata +19 -480
  4. data/CONTRIBUTE.markdown +0 -27
  5. data/Gemfile.lock +0 -325
  6. data/History.rdoc +0 -497
  7. data/LICENSE +0 -20
  8. data/README.markdown +0 -389
  9. data/Rakefile +0 -44
  10. data/TODO +0 -3
  11. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/base.rb +0 -101
  12. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/deletion.rb +0 -108
  13. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/transaction.rb +0 -59
  14. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/truncation.rb +0 -280
  15. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/version.rb +0 -5
  16. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record.rb +0 -6
  17. data/adapters/database_cleaner-active_record/lib/database_cleaner-active_record.rb +0 -1
  18. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/base.rb +0 -7
  19. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/truncation.rb +0 -28
  20. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/version.rb +0 -5
  21. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato.rb +0 -11
  22. data/adapters/database_cleaner-couch_potato/lib/database_cleaner-couch_potato.rb +0 -1
  23. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/base.rb +0 -25
  24. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/transaction.rb +0 -28
  25. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/truncation.rb +0 -173
  26. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/version.rb +0 -5
  27. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper.rb +0 -4
  28. data/adapters/database_cleaner-data_mapper/lib/database_cleaner-data_mapper.rb +0 -1
  29. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/base.rb +0 -16
  30. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/truncation.rb +0 -64
  31. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/truncation_mixin.rb +0 -26
  32. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/version.rb +0 -5
  33. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo.rb +0 -10
  34. data/adapters/database_cleaner-mongo/lib/database_cleaner-mongo.rb +0 -1
  35. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/base.rb +0 -24
  36. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/truncation.rb +0 -35
  37. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/version.rb +0 -5
  38. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper.rb +0 -4
  39. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner-mongo_mapper.rb +0 -1
  40. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/base.rb +0 -20
  41. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongo1_truncation_mixin.rb +0 -26
  42. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongo2_truncation_mixin.rb +0 -38
  43. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongoid_truncation_mixin.rb +0 -65
  44. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/truncation.rb +0 -49
  45. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/version.rb +0 -5
  46. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid.rb +0 -10
  47. data/adapters/database_cleaner-mongoid/lib/database_cleaner-mongoid.rb +0 -1
  48. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/base.rb +0 -39
  49. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/truncation.rb +0 -9
  50. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/truncation_base.rb +0 -44
  51. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/version.rb +0 -5
  52. data/adapters/database_cleaner-moped/lib/database_cleaner/moped.rb +0 -10
  53. data/adapters/database_cleaner-moped/lib/database_cleaner-moped.rb +0 -1
  54. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/base.rb +0 -66
  55. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/deletion.rb +0 -16
  56. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/transaction.rb +0 -35
  57. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/truncation.rb +0 -9
  58. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/version.rb +0 -5
  59. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j.rb +0 -6
  60. data/adapters/database_cleaner-neo4j/lib/database_cleaner-neo4j.rb +0 -1
  61. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm/truncation.rb +0 -24
  62. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm/version.rb +0 -5
  63. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm.rb +0 -12
  64. data/adapters/database_cleaner-ohm/lib/database_cleaner-ohm.rb +0 -1
  65. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/base.rb +0 -41
  66. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/truncation.rb +0 -26
  67. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/version.rb +0 -5
  68. data/adapters/database_cleaner-redis/lib/database_cleaner/redis.rb +0 -4
  69. data/adapters/database_cleaner-redis/lib/database_cleaner-redis.rb +0 -1
  70. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/base.rb +0 -26
  71. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/deletion.rb +0 -47
  72. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/transaction.rb +0 -40
  73. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/truncation.rb +0 -79
  74. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/version.rb +0 -5
  75. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel.rb +0 -6
  76. data/adapters/database_cleaner-sequel/lib/database_cleaner-sequel.rb +0 -1
  77. data/cucumber.yml +0 -1
  78. data/lib/database_cleaner/base.rb +0 -153
  79. data/lib/database_cleaner/configuration.rb +0 -135
  80. data/lib/database_cleaner/cucumber.rb +0 -3
  81. data/lib/database_cleaner/deprecation.rb +0 -26
  82. data/lib/database_cleaner/generic/base.rb +0 -29
  83. data/lib/database_cleaner/generic/transaction.rb +0 -11
  84. data/lib/database_cleaner/generic/truncation.rb +0 -40
  85. data/lib/database_cleaner/null_strategy.rb +0 -20
  86. data/lib/database_cleaner/orm_autodetector.rb +0 -41
  87. data/lib/database_cleaner/safeguard.rb +0 -107
  88. data/lib/database_cleaner/spec/database_helper.rb +0 -82
  89. data/lib/database_cleaner/spec/shared_examples.rb +0 -15
  90. data/lib/database_cleaner/spec.rb +0 -2
  91. data/lib/database_cleaner/version.rb +0 -3
@@ -1,59 +0,0 @@
1
- require 'database_cleaner/active_record/base'
2
- require 'database_cleaner/generic/transaction'
3
-
4
- module DatabaseCleaner::ActiveRecord
5
- class Transaction
6
- include ::DatabaseCleaner::ActiveRecord::Base
7
- include ::DatabaseCleaner::Generic::Transaction
8
-
9
- def start
10
- # Hack to make sure that the connection is properly setup for
11
- # the clean code.
12
- connection_class.connection.transaction{ }
13
-
14
- if connection_maintains_transaction_count?
15
- if connection_class.connection.respond_to?(:increment_open_transactions)
16
- connection_class.connection.increment_open_transactions
17
- else
18
- connection_class.__send__(:increment_open_transactions)
19
- end
20
- end
21
- if connection_class.connection.respond_to?(:begin_transaction)
22
- connection_class.connection.begin_transaction :joinable => false
23
- else
24
- connection_class.connection.begin_db_transaction
25
- end
26
- end
27
-
28
-
29
- def clean
30
- connection_class.connection_pool.connections.each do |connection|
31
- next unless connection.open_transactions > 0
32
-
33
- if connection.respond_to?(:rollback_transaction)
34
- connection.rollback_transaction
35
- else
36
- connection.rollback_db_transaction
37
- end
38
-
39
- # The below is for handling after_commit hooks.. see https://github.com/bmabey/database_cleaner/issues/99
40
- if connection.respond_to?(:rollback_transaction_records, true)
41
- connection.send(:rollback_transaction_records, true)
42
- end
43
-
44
- if connection_maintains_transaction_count?
45
- if connection.respond_to?(:decrement_open_transactions)
46
- connection.decrement_open_transactions
47
- else
48
- connection_class.__send__(:decrement_open_transactions)
49
- end
50
- end
51
- end
52
- end
53
-
54
- def connection_maintains_transaction_count?
55
- ActiveRecord::VERSION::MAJOR < 4
56
- end
57
-
58
- end
59
- end
@@ -1,280 +0,0 @@
1
- require 'active_record/base'
2
- require 'database_cleaner/active_record/base'
3
- require 'active_record/connection_adapters/abstract_adapter'
4
-
5
- #Load available connection adapters
6
- %w(
7
- abstract_mysql_adapter postgresql_adapter sqlite3_adapter mysql_adapter mysql2_adapter oracle_enhanced_adapter
8
- ).each do |known_adapter|
9
- begin
10
- require "active_record/connection_adapters/#{known_adapter}"
11
- rescue LoadError
12
- end
13
- end
14
-
15
- require "database_cleaner/generic/truncation"
16
- require 'database_cleaner/active_record/base'
17
-
18
- module DatabaseCleaner
19
- module ConnectionAdapters
20
-
21
- module AbstractAdapter
22
- # used to be called views but that can clash with gems like schema_plus
23
- # this gem is not meant to be exposing such an extra interface any way
24
- def database_cleaner_view_cache
25
- @views ||= select_values("select table_name from information_schema.views where table_schema = '#{current_database}'") rescue []
26
- end
27
-
28
- def database_cleaner_table_cache
29
- # the adapters don't do caching (#130) but we make the assumption that the list stays the same in tests
30
- @database_cleaner_tables ||= database_tables
31
- end
32
-
33
- def database_tables
34
- ::ActiveRecord::VERSION::MAJOR >= 5 ? data_sources : tables
35
- end
36
-
37
- def truncate_table(table_name)
38
- raise NotImplementedError
39
- end
40
-
41
- def truncate_tables(tables)
42
- tables.each do |table_name|
43
- self.truncate_table(table_name)
44
- end
45
- end
46
- end
47
-
48
- module AbstractMysqlAdapter
49
- def truncate_table(table_name)
50
- execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
51
- end
52
-
53
- def truncate_tables(tables)
54
- tables.each { |t| truncate_table(t) }
55
- end
56
-
57
- def pre_count_truncate_tables(tables, options = {:reset_ids => true})
58
- filter = options[:reset_ids] ? method(:has_been_used?) : method(:has_rows?)
59
- truncate_tables(tables.select(&filter))
60
- end
61
-
62
- private
63
-
64
- def row_count(table)
65
- # Patch for MysqlAdapter with ActiveRecord 3.2.7 later
66
- # select_value("SELECT 1") #=> "1"
67
- select_value("SELECT EXISTS (SELECT 1 FROM #{quote_table_name(table)} LIMIT 1)").to_i
68
- end
69
-
70
- def auto_increment_value(table)
71
- select_value(<<-SQL).to_i
72
- SELECT auto_increment
73
- FROM information_schema.tables
74
- WHERE table_name = '#{table}'
75
- AND table_schema = database()
76
- SQL
77
- end
78
-
79
- # This method tells us if the given table has been inserted into since its
80
- # last truncation. Note that the table might have been populated, which
81
- # increased the auto-increment counter, but then cleaned again such that
82
- # it appears empty now.
83
- def has_been_used?(table)
84
- has_rows?(table) || auto_increment_value(table) > 1
85
- end
86
-
87
- def has_rows?(table)
88
- row_count(table) > 0
89
- end
90
- end
91
-
92
- module IBM_DBAdapter
93
- def truncate_table(table_name)
94
- execute("TRUNCATE #{quote_table_name(table_name)} IMMEDIATE")
95
- end
96
- end
97
-
98
- module SQLiteAdapter
99
- def delete_table(table_name)
100
- execute("DELETE FROM #{quote_table_name(table_name)};")
101
- if uses_sequence
102
- execute("DELETE FROM sqlite_sequence where name = '#{table_name}';")
103
- end
104
- end
105
- alias truncate_table delete_table
106
-
107
- def truncate_tables(tables)
108
- tables.each { |t| truncate_table(t) }
109
- end
110
-
111
- private
112
-
113
- # Returns a boolean indicating if the SQLite database is using the sqlite_sequence table.
114
- def uses_sequence
115
- select_value("SELECT name FROM sqlite_master WHERE type='table' AND name='sqlite_sequence';")
116
- end
117
- end
118
-
119
- module TruncateOrDelete
120
- def truncate_table(table_name)
121
- begin
122
- execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
123
- rescue ::ActiveRecord::StatementInvalid
124
- execute("DELETE FROM #{quote_table_name(table_name)};")
125
- end
126
- end
127
- end
128
-
129
- module OracleAdapter
130
- def truncate_table(table_name)
131
- execute("TRUNCATE TABLE #{quote_table_name(table_name)}")
132
- end
133
- end
134
-
135
- module PostgreSQLAdapter
136
- def db_version
137
- @db_version ||= postgresql_version
138
- end
139
-
140
- def cascade
141
- @cascade ||= db_version >= 80200 ? 'CASCADE' : ''
142
- end
143
-
144
- def restart_identity
145
- @restart_identity ||= db_version >= 80400 ? 'RESTART IDENTITY' : ''
146
- end
147
-
148
- def truncate_table(table_name)
149
- truncate_tables([table_name])
150
- end
151
-
152
- def truncate_tables(table_names)
153
- return if table_names.nil? || table_names.empty?
154
- execute("TRUNCATE TABLE #{table_names.map{|name| quote_table_name(name)}.join(', ')} #{restart_identity} #{cascade};")
155
- end
156
-
157
- def pre_count_truncate_tables(tables, options = {:reset_ids => true})
158
- filter = options[:reset_ids] ? method(:has_been_used?) : method(:has_rows?)
159
- truncate_tables(tables.select(&filter))
160
- end
161
-
162
- def database_cleaner_table_cache
163
- # AR returns a list of tables without schema but then returns a
164
- # migrations table with the schema. There are other problems, too,
165
- # with using the base list. If a table exists in multiple schemas
166
- # within the search path, truncation without the schema name could
167
- # result in confusing, if not unexpected results.
168
- @database_cleaner_tables ||= tables_with_schema
169
- end
170
-
171
- private
172
-
173
- # Returns a boolean indicating if the given table has an auto-inc number higher than 0.
174
- # Note, this is different than an empty table since an table may populated, the index increased,
175
- # but then the table is cleaned. In other words, this function tells us if the given table
176
- # was ever inserted into.
177
- def has_been_used?(table)
178
- return has_rows?(table) unless has_sequence?(table)
179
-
180
- cur_val = select_value("SELECT currval('#{table}_id_seq');").to_i rescue 0
181
- cur_val > 0
182
- end
183
-
184
- def has_sequence?(table)
185
- select_value("SELECT true FROM pg_class WHERE relname = '#{table}_id_seq';")
186
- end
187
-
188
- def has_rows?(table)
189
- select_value("SELECT true FROM #{table} LIMIT 1;")
190
- end
191
-
192
- def tables_with_schema
193
- rows = select_rows <<-_SQL
194
- SELECT schemaname || '.' || tablename
195
- FROM pg_tables
196
- WHERE
197
- tablename !~ '_prt_' AND
198
- #{::DatabaseCleaner::ActiveRecord::Base.exclusion_condition('tablename')} AND
199
- schemaname = ANY (current_schemas(false))
200
- _SQL
201
- rows.collect { |result| result.first }
202
- end
203
- end
204
- end
205
- end
206
-
207
- module ActiveRecord
208
- module ConnectionAdapters
209
- #Apply adapter decoraters where applicable (adapter should be loaded)
210
- AbstractAdapter.class_eval { include DatabaseCleaner::ConnectionAdapters::AbstractAdapter }
211
-
212
- if defined?(JdbcAdapter)
213
- if defined?(OracleJdbcConnection)
214
- JdbcAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::OracleAdapter }
215
- else
216
- JdbcAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::TruncateOrDelete }
217
- end
218
- end
219
- AbstractMysqlAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::AbstractMysqlAdapter } if defined?(AbstractMysqlAdapter)
220
- Mysql2Adapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::AbstractMysqlAdapter } if defined?(Mysql2Adapter)
221
- MysqlAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::AbstractMysqlAdapter } if defined?(MysqlAdapter)
222
- SQLiteAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::SQLiteAdapter } if defined?(SQLiteAdapter)
223
- SQLite3Adapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::SQLiteAdapter } if defined?(SQLite3Adapter)
224
- PostgreSQLAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::PostgreSQLAdapter } if defined?(PostgreSQLAdapter)
225
- IBM_DBAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::IBM_DBAdapter } if defined?(IBM_DBAdapter)
226
- SQLServerAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::TruncateOrDelete } if defined?(SQLServerAdapter)
227
- OracleEnhancedAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::OracleAdapter } if defined?(OracleEnhancedAdapter)
228
- end
229
- end
230
-
231
- module DatabaseCleaner::ActiveRecord
232
- class Truncation
233
- include ::DatabaseCleaner::ActiveRecord::Base
234
- include ::DatabaseCleaner::Generic::Truncation
235
-
236
- def clean
237
- connection = connection_class.connection
238
- connection.disable_referential_integrity do
239
- if pre_count? && connection.respond_to?(:pre_count_truncate_tables)
240
- connection.pre_count_truncate_tables(tables_to_truncate(connection), {:reset_ids => reset_ids?})
241
- else
242
- connection.truncate_tables(tables_to_truncate(connection))
243
- end
244
- end
245
- end
246
-
247
- private
248
-
249
- def tables_to_truncate(connection)
250
- tables_in_db = cache_tables? ? connection.database_cleaner_table_cache : connection.database_tables
251
- to_reject = (@tables_to_exclude + connection.database_cleaner_view_cache)
252
- (@only || tables_in_db).reject do |table|
253
- if ( m = table.match(/([^.]+)$/) )
254
- to_reject.include?(m[1])
255
- else
256
- false
257
- end
258
- end
259
- end
260
-
261
- # overwritten
262
- def migration_storage_names
263
- result = [::DatabaseCleaner::ActiveRecord::Base.migration_table_name]
264
- result << ::ActiveRecord::Base.internal_metadata_table_name if ::ActiveRecord::VERSION::MAJOR >= 5
265
- result
266
- end
267
-
268
- def cache_tables?
269
- !!@cache_tables
270
- end
271
-
272
- def pre_count?
273
- @pre_count == true
274
- end
275
-
276
- def reset_ids?
277
- @reset_ids != false
278
- end
279
- end
280
- end
@@ -1,5 +0,0 @@
1
- module DatabaseCleaner
2
- module ActiveRecord
3
- VERSION = "1.8.0"
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- require 'database_cleaner/active_record/version'
2
- require 'database_cleaner'
3
- require 'database_cleaner/active_record/deletion'
4
- require 'database_cleaner/active_record/transaction'
5
- require 'database_cleaner/active_record/truncation'
6
-
@@ -1 +0,0 @@
1
- require "database_cleaner/active_record"
@@ -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,5 +0,0 @@
1
- module DatabaseCleaner
2
- module CouchPotato
3
- VERSION = "1.8.0"
4
- end
5
- end
@@ -1,11 +0,0 @@
1
- require "database_cleaner/couch_potato/version"
2
- require "database_cleaner"
3
- require "database_cleaner/couch_potato/base"
4
- require "database_cleaner/couch_potato/truncation"
5
-
6
- module DatabaseCleaner::CouchPotato
7
- def self.default_strategy
8
- :truncation
9
- end
10
- end
11
-
@@ -1 +0,0 @@
1
- require "database_cleaner/couch_potato"
@@ -1,25 +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
- def self.default_strategy
9
- :transaction
10
- end
11
-
12
- module Base
13
- include ::DatabaseCleaner::Generic::Base
14
-
15
- def db=(desired_db)
16
- @db = desired_db
17
- end
18
-
19
- def db
20
- @db ||= :default
21
- end
22
-
23
- end
24
- end
25
- end
@@ -1,28 +0,0 @@
1
- require 'database_cleaner/data_mapper/base'
2
- require 'database_cleaner/generic/transaction'
3
-
4
- module DatabaseCleaner::DataMapper
5
- class Transaction
6
- include ::DatabaseCleaner::DataMapper::Base
7
- include ::DatabaseCleaner::Generic::Transaction
8
-
9
- def start(repository = self.db)
10
- ::DataMapper.repository(repository) do |r|
11
- transaction = DataMapper::Transaction.new(r)
12
- transaction.begin
13
- r.adapter.push_transaction(transaction)
14
- end
15
- end
16
-
17
- def clean(repository = self.db)
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
@@ -1,173 +0,0 @@
1
- require "database_cleaner/generic/truncation"
2
- require 'database_cleaner/data_mapper/base'
3
- require 'data_mapper'
4
-
5
- module DataMapper
6
- module Adapters
7
-
8
- class DataObjectsAdapter
9
-
10
- def storage_names(repository = :default)
11
- raise NotImplementedError
12
- end
13
-
14
- def truncate_tables(table_names)
15
- table_names.each do |table_name|
16
- truncate_table table_name
17
- end
18
- end
19
-
20
- end
21
-
22
- class MysqlAdapter < DataObjectsAdapter
23
-
24
- # taken from https://github.com/godfat/dm-mapping/tree/master
25
- def storage_names(repository = :default)
26
- select 'SHOW TABLES'
27
- end
28
-
29
- def truncate_table(table_name)
30
- execute("TRUNCATE TABLE #{quote_name(table_name)};")
31
- end
32
-
33
- # copied from activerecord
34
- def disable_referential_integrity
35
- old = select("SELECT @@FOREIGN_KEY_CHECKS;")
36
- begin
37
- execute("SET FOREIGN_KEY_CHECKS = 0;")
38
- yield
39
- ensure
40
- execute("SET FOREIGN_KEY_CHECKS = ?", *old)
41
- end
42
- end
43
-
44
- end
45
-
46
- module SqliteAdapterMethods
47
-
48
- # taken from https://github.com/godfat/dm-mapping/tree/master
49
- def storage_names(repository = :default)
50
- # activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 177
51
- sql = <<-SQL
52
- SELECT name
53
- FROM sqlite_master
54
- WHERE type = 'table' AND NOT name = 'sqlite_sequence'
55
- SQL
56
- # activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 181
57
- select(sql)
58
- end
59
-
60
- def truncate_table(table_name)
61
- execute("DELETE FROM #{quote_name(table_name)};")
62
- if uses_sequence?
63
- execute("DELETE FROM sqlite_sequence where name = '#{table_name}';")
64
- end
65
- end
66
-
67
- # this is a no-op copied from activerecord
68
- # i didn't find out if/how this is possible
69
- # activerecord also doesn't do more here
70
- def disable_referential_integrity
71
- yield
72
- end
73
-
74
- private
75
-
76
- # Returns a boolean indicating if the SQLite database is using the sqlite_sequence table.
77
- def uses_sequence?
78
- sql = <<-SQL
79
- SELECT name FROM sqlite_master
80
- WHERE type='table' AND name='sqlite_sequence'
81
- SQL
82
- select(sql).first
83
- end
84
- end
85
-
86
- class SqliteAdapter; include SqliteAdapterMethods; end
87
- class Sqlite3Adapter; include SqliteAdapterMethods; end
88
-
89
- # FIXME
90
- # i don't know if this works
91
- # i basically just copied activerecord code to get a rough idea what they do.
92
- # i don't have postgres available, so i won't be the one to write this.
93
- # maybe codes below gets some postgres/datamapper user going, though.
94
- class PostgresAdapter < DataObjectsAdapter
95
-
96
- # taken from https://github.com/godfat/dm-mapping/tree/master
97
- def storage_names(repository = :default)
98
- sql = <<-SQL
99
- SELECT table_name FROM "information_schema"."tables"
100
- WHERE table_schema = current_schema() and table_type = 'BASE TABLE'
101
- SQL
102
- select(sql)
103
- end
104
-
105
- def truncate_table(table_name)
106
- execute("TRUNCATE TABLE #{quote_name(table_name)} RESTART IDENTITY CASCADE;")
107
- end
108
-
109
- # override to use a single statement
110
- def truncate_tables(table_names)
111
- quoted_names = table_names.collect { |n| quote_name(n) }.join(', ')
112
- execute("TRUNCATE TABLE #{quoted_names} RESTART IDENTITY;")
113
- end
114
-
115
- # FIXME
116
- # copied from activerecord
117
- def supports_disable_referential_integrity?
118
- version = select("SHOW server_version")[0][0].split('.')
119
- (version[0].to_i >= 8 && version[1].to_i >= 1) ? true : false
120
- rescue
121
- return false
122
- end
123
-
124
- # FIXME
125
- # copied unchanged from activerecord
126
- def disable_referential_integrity(repository = :default)
127
- if supports_disable_referential_integrity? then
128
- execute(storage_names(repository).collect do |name|
129
- "ALTER TABLE #{quote_name(name)} DISABLE TRIGGER ALL"
130
- end.join(";"))
131
- end
132
- yield
133
- ensure
134
- if supports_disable_referential_integrity? then
135
- execute(storage_names(repository).collect do |name|
136
- "ALTER TABLE #{quote_name(name)} ENABLE TRIGGER ALL"
137
- end.join(";"))
138
- end
139
- end
140
-
141
- end
142
-
143
- end
144
- end
145
-
146
-
147
- module DatabaseCleaner
148
- module DataMapper
149
- class Truncation
150
- include ::DatabaseCleaner::DataMapper::Base
151
- include ::DatabaseCleaner::Generic::Truncation
152
-
153
- def clean(repository = self.db)
154
- adapter = ::DataMapper.repository(repository).adapter
155
- adapter.disable_referential_integrity do
156
- adapter.truncate_tables(tables_to_truncate(repository))
157
- end
158
- end
159
-
160
- private
161
-
162
- def tables_to_truncate(repository = self.db)
163
- (@only || ::DataMapper.repository(repository).adapter.storage_names(repository)) - @tables_to_exclude
164
- end
165
-
166
- # overwritten
167
- def migration_storage_names
168
- %w[migration_info]
169
- end
170
-
171
- end
172
- end
173
- end
@@ -1,5 +0,0 @@
1
- module DatabaseCleaner
2
- module DataMapper
3
- VERSION = "1.8.0"
4
- end
5
- end
@@ -1,4 +0,0 @@
1
- require "database_cleaner/data_mapper/version"
2
- require "database_cleaner"
3
- require "database_cleaner/data_mapper/transaction"
4
- require "database_cleaner/data_mapper/truncation"
@@ -1 +0,0 @@
1
- require "database_cleaner/data_mapper"
@@ -1,16 +0,0 @@
1
- module DatabaseCleaner
2
- module Mongo
3
- def self.available_strategies
4
- %w[truncation]
5
- end
6
- module Base
7
- def db=(desired_db)
8
- @db = desired_db
9
- end
10
-
11
- def db
12
- @db || raise("You have not specified a database. (see Mongo::Database)")
13
- end
14
- end
15
- end
16
- end