database_cleaner 0.6.0.rc.3 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -1
- data/README.textile +20 -33
- data/features/cleaning.feature +1 -0
- data/features/cleaning_multiple_dbs.feature +1 -0
- data/lib/database_cleaner/active_record/base.rb +1 -1
- data/lib/database_cleaner/active_record/deletion.rb +66 -0
- data/lib/database_cleaner/active_record/truncation.rb +16 -8
- metadata +5 -6
data/History.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
== 0.6.x (In Git)
|
2
2
|
|
3
|
-
== 0.6.0 2010-
|
3
|
+
== 0.6.0 2010-10-25 - The Multi-ORM/Connection Release
|
4
4
|
|
5
5
|
This release has the often asked for functionality of being able to clean
|
6
6
|
multiple databases within the same project. This involves being able to
|
@@ -19,11 +19,14 @@ of the hours and effort he put into making this feature request a reality.
|
|
19
19
|
* Ability to clean multiple DBs managed by different ORMs in same project. (Jon Rowe)
|
20
20
|
* Allows for the ActiveRecord config file (database.yml) to contain ERB and process it. (Fletcher Nichol)
|
21
21
|
* Mysql2Adapter support. (Kamal Fariz Mahyuddin and John Ferlito)
|
22
|
+
* Deletion strategy for ActiveRecord (Mikl Kurkov)
|
22
23
|
|
23
24
|
=== Bugfixes
|
24
25
|
* Updates the DataMapper truncation strategy to version 0.10.3. (Robert Rouse)
|
25
26
|
* Addresses Ruby 1.9 and 1.8 differences causing a bug in the AR PostgreSQLAdapter truncation strategy. (GH-14, James B. Byrne)
|
26
27
|
* Fixes syntax error that MySQL was throwing during DataMapper truncation. (Blake Gentry)
|
28
|
+
* Fixes truncation for PostgreSQL (Bodaniel Jeanes and Gabriel Sobrinho)
|
29
|
+
* Workaround for superclass mismatches for the ActiveRecord-jdbc-adapter (Toms Mikoss)
|
27
30
|
|
28
31
|
== 0.5.2
|
29
32
|
|
data/README.textile
CHANGED
@@ -7,6 +7,19 @@ that is testing with a database.
|
|
7
7
|
|
8
8
|
ActiveRecord, DataMapper, MongoMapper, Mongoid, and CouchPotato are supported.
|
9
9
|
|
10
|
+
Here is an overview of the strategies supported for each library:
|
11
|
+
|
12
|
+
|_. ORM |_. Truncation |_. Transaction |_. Deletion |
|
13
|
+
| ActiveRecord | Yes | Yes | Yes |
|
14
|
+
| DataMapper | Yes | Yes | No |
|
15
|
+
| CouchPotato | Yes | No | No |
|
16
|
+
| MongoMapper | Yes | No | No |
|
17
|
+
| Mongiod | Yes | No | No |
|
18
|
+
|
19
|
+
The ActiveRecord @:deletion@ strategy is only useful for when the @:truncation@ strategy causes
|
20
|
+
locks (as reported by some Oracle DB users). The @:truncation@ strategy is the preferred option
|
21
|
+
since it is much faster.
|
22
|
+
|
10
23
|
h2. How to use
|
11
24
|
|
12
25
|
<pre>
|
@@ -28,7 +41,6 @@ With the :truncation strategy you can also pass in options, for example:
|
|
28
41
|
|
29
42
|
(I should point out the truncation strategy will never truncate your schema_migrations table.)
|
30
43
|
|
31
|
-
|
32
44
|
Some strategies require that you call DatabaseCleaner.start before calling clean
|
33
45
|
(for example the :transaction one needs to know to open up a transaction). So
|
34
46
|
you would have:
|
@@ -93,38 +105,13 @@ Usage beyond that remains the same with DatabaseCleaner.start calling any setup
|
|
93
105
|
|
94
106
|
Configuration options
|
95
107
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
<td>Active Record</td>
|
104
|
-
<td>DatabaseCleaner[:active_record]</td>
|
105
|
-
<td>Connection specified as :symbol keys, loaded from config/database.yml</td>
|
106
|
-
</th>
|
107
|
-
<tr>
|
108
|
-
<td>Data Mapper</td>
|
109
|
-
<td>DatabaseCleaner[:data_mapper]</td>
|
110
|
-
<td>Connection specified as :symbol keys, loaded via Datamapper repositories</td>
|
111
|
-
</th>
|
112
|
-
<tr>
|
113
|
-
<td>Mongo Mapper</td>
|
114
|
-
<td>DatabaseCleaner[:mongo_mapper]</td>
|
115
|
-
<td>Multiple connections not yet supported</td>
|
116
|
-
</th>
|
117
|
-
<tr>
|
118
|
-
<td>Mongoid</td>
|
119
|
-
<td>DatabaseCleaner[:mongoid]</td>
|
120
|
-
<td>Multiple connections not yet supported</td>
|
121
|
-
</th>
|
122
|
-
<tr>
|
123
|
-
<td>Couch Potato</td>
|
124
|
-
<td>DatabaseCleaner[:couch_potato]</td>
|
125
|
-
<td>Multiple connections not yet supported</td>
|
126
|
-
</tr>
|
127
|
-
</table>
|
108
|
+
|
109
|
+
|_. ORM |_. How to access |_. Notes |
|
110
|
+
| Active Record | DatabaseCleaner[:active_record] | Connection specified as :symbol keys, loaded from config/database.yml |
|
111
|
+
| Data Mapper | DatabaseCleaner[:data_mapper] | Connection specified as :symbol keys, loaded via Datamapper repositories |
|
112
|
+
| Mongo Mapper | DatabaseCleaner[:mongo_mapper] | Multiple connections not yet supported |
|
113
|
+
| Mongoid | DatabaseCleaner[:mongoid] | Multiple connections not yet supported |
|
114
|
+
| Couch Potato | DatabaseCleaner[:couch_potato] | Multiple connections not yet supported |
|
128
115
|
|
129
116
|
h2. Why?
|
130
117
|
|
data/features/cleaning.feature
CHANGED
@@ -0,0 +1,66 @@
|
|
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
|
+
connection.disable_referential_integrity do
|
57
|
+
tables_to_truncate.each do |table_name|
|
58
|
+
connection.delete_table table_name
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
@@ -5,14 +5,21 @@ require 'database_cleaner/active_record/base'
|
|
5
5
|
|
6
6
|
module ActiveRecord
|
7
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)
|
8
10
|
|
9
11
|
class AbstractAdapter
|
10
12
|
end
|
11
13
|
|
12
|
-
|
14
|
+
unless USE_ARJDBC_WORKAROUND
|
15
|
+
class SQLiteAdapter < AbstractAdapter
|
16
|
+
end
|
13
17
|
end
|
14
18
|
|
15
|
-
|
19
|
+
MYSQL_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : AbstractAdapter
|
20
|
+
SQLITE_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : SQLiteAdapter
|
21
|
+
|
22
|
+
class MysqlAdapter < MYSQL_ADAPTER_PARENT
|
16
23
|
def truncate_table(table_name)
|
17
24
|
execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
|
18
25
|
end
|
@@ -24,10 +31,11 @@ module ActiveRecord
|
|
24
31
|
end
|
25
32
|
end
|
26
33
|
|
27
|
-
class SQLite3Adapter <
|
28
|
-
def
|
34
|
+
class SQLite3Adapter < SQLITE_ADAPTER_PARENT
|
35
|
+
def delete_table(table_name)
|
29
36
|
execute("DELETE FROM #{quote_table_name(table_name)};")
|
30
37
|
end
|
38
|
+
alias truncate_table delete_table
|
31
39
|
end
|
32
40
|
|
33
41
|
class JdbcAdapter < AbstractAdapter
|
@@ -42,19 +50,19 @@ module ActiveRecord
|
|
42
50
|
|
43
51
|
class PostgreSQLAdapter < AbstractAdapter
|
44
52
|
|
45
|
-
def
|
46
|
-
@db_version ||=
|
53
|
+
def db_version
|
54
|
+
@db_version ||= select_values(
|
47
55
|
"SELECT CHARACTER_VALUE
|
48
56
|
FROM INFORMATION_SCHEMA.SQL_IMPLEMENTATION_INFO
|
49
57
|
WHERE IMPLEMENTATION_INFO_NAME = 'DBMS VERSION' ").join.to_s
|
50
58
|
end
|
51
59
|
|
52
|
-
def
|
60
|
+
def cascade
|
53
61
|
@cascade ||= db_version >= "08.02" ? "CASCADE" : ""
|
54
62
|
end
|
55
63
|
|
56
64
|
def truncate_table(table_name)
|
57
|
-
execute("TRUNCATE TABLE #{quote_table_name(table_name)} #{
|
65
|
+
execute("TRUNCATE TABLE #{quote_table_name(table_name)} #{cascade};")
|
58
66
|
end
|
59
67
|
|
60
68
|
end
|
metadata
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: database_cleaner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 7
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
9
|
- 0
|
10
|
-
|
11
|
-
- 3
|
12
|
-
version: 0.6.0.rc.3
|
10
|
+
version: 0.6.0
|
13
11
|
platform: ruby
|
14
12
|
authors:
|
15
13
|
- Ben Mabey
|
@@ -17,7 +15,7 @@ autorequire:
|
|
17
15
|
bindir: bin
|
18
16
|
cert_chain: []
|
19
17
|
|
20
|
-
date: 2010-
|
18
|
+
date: 2010-10-25 00:00:00 -06:00
|
21
19
|
default_executable:
|
22
20
|
dependencies: []
|
23
21
|
|
@@ -65,6 +63,7 @@ files:
|
|
65
63
|
- features/support/feature_runner.rb
|
66
64
|
- lib/database_cleaner.rb
|
67
65
|
- lib/database_cleaner/active_record/base.rb
|
66
|
+
- lib/database_cleaner/active_record/deletion.rb
|
68
67
|
- lib/database_cleaner/active_record/transaction.rb
|
69
68
|
- lib/database_cleaner/active_record/truncation.rb
|
70
69
|
- lib/database_cleaner/base.rb
|