database_cleaner 1.7.0 → 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.
- checksums.yaml +4 -4
- data/lib/database_cleaner.rb +1 -12
- metadata +17 -417
- data/CONTRIBUTE.markdown +0 -28
- data/Gemfile.lock +0 -286
- data/History.rdoc +0 -453
- data/LICENSE +0 -20
- data/README.markdown +0 -541
- data/Rakefile +0 -40
- data/TODO +0 -3
- data/VERSION.yml +0 -4
- data/cucumber.yml +0 -1
- data/lib/database_cleaner/active_record/base.rb +0 -92
- data/lib/database_cleaner/active_record/deletion.rb +0 -108
- data/lib/database_cleaner/active_record/transaction.rb +0 -59
- data/lib/database_cleaner/active_record/truncation.rb +0 -275
- data/lib/database_cleaner/base.rb +0 -166
- data/lib/database_cleaner/configuration.rb +0 -131
- data/lib/database_cleaner/couch_potato/base.rb +0 -7
- data/lib/database_cleaner/couch_potato/truncation.rb +0 -28
- data/lib/database_cleaner/cucumber.rb +0 -3
- data/lib/database_cleaner/data_mapper/base.rb +0 -21
- data/lib/database_cleaner/data_mapper/transaction.rb +0 -28
- data/lib/database_cleaner/data_mapper/truncation.rb +0 -172
- data/lib/database_cleaner/generic/base.rb +0 -29
- data/lib/database_cleaner/generic/transaction.rb +0 -11
- data/lib/database_cleaner/generic/truncation.rb +0 -40
- data/lib/database_cleaner/mongo/base.rb +0 -16
- data/lib/database_cleaner/mongo/truncation.rb +0 -62
- data/lib/database_cleaner/mongo/truncation_mixin.rb +0 -26
- data/lib/database_cleaner/mongo2/base.rb +0 -16
- data/lib/database_cleaner/mongo2/truncation_mixin.rb +0 -39
- data/lib/database_cleaner/mongo_mapper/base.rb +0 -20
- data/lib/database_cleaner/mongo_mapper/truncation.rb +0 -19
- data/lib/database_cleaner/mongoid/base.rb +0 -20
- data/lib/database_cleaner/mongoid/truncation.rb +0 -49
- data/lib/database_cleaner/moped/base.rb +0 -39
- data/lib/database_cleaner/moped/truncation.rb +0 -9
- data/lib/database_cleaner/moped/truncation_base.rb +0 -40
- data/lib/database_cleaner/neo4j/base.rb +0 -62
- data/lib/database_cleaner/neo4j/deletion.rb +0 -16
- data/lib/database_cleaner/neo4j/transaction.rb +0 -35
- data/lib/database_cleaner/neo4j/truncation.rb +0 -9
- data/lib/database_cleaner/null_strategy.rb +0 -20
- data/lib/database_cleaner/ohm/truncation.rb +0 -15
- data/lib/database_cleaner/redis/base.rb +0 -37
- data/lib/database_cleaner/redis/truncation.rb +0 -26
- data/lib/database_cleaner/safeguard.rb +0 -72
- data/lib/database_cleaner/sequel/base.rb +0 -22
- data/lib/database_cleaner/sequel/deletion.rb +0 -47
- data/lib/database_cleaner/sequel/transaction.rb +0 -40
- data/lib/database_cleaner/sequel/truncation.rb +0 -78
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'database_cleaner/generic/base'
|
2
|
-
module DatabaseCleaner
|
3
|
-
module Neo4j
|
4
|
-
def self.available_strategies
|
5
|
-
%w[transaction truncation deletion]
|
6
|
-
end
|
7
|
-
|
8
|
-
module Base
|
9
|
-
include ::DatabaseCleaner::Generic::Base
|
10
|
-
|
11
|
-
def db=(desired_db)
|
12
|
-
@db = desired_db == :default ? nil : desired_db
|
13
|
-
end
|
14
|
-
|
15
|
-
def db
|
16
|
-
@db ||= nil
|
17
|
-
end
|
18
|
-
|
19
|
-
def start
|
20
|
-
if db_type == :embedded_db and not session.running?
|
21
|
-
session.start
|
22
|
-
else
|
23
|
-
session
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def database
|
28
|
-
db && default_db.merge(db) || default_db
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def default_db
|
34
|
-
{:type => default_db_type, :path => default_db_path}
|
35
|
-
end
|
36
|
-
|
37
|
-
def default_db_type
|
38
|
-
:server_db
|
39
|
-
end
|
40
|
-
|
41
|
-
def default_db_path(type = default_db_type)
|
42
|
-
type == :server_db ? 'http://localhost:7475/' : './db/test'
|
43
|
-
end
|
44
|
-
|
45
|
-
def db_type
|
46
|
-
database[:type]
|
47
|
-
end
|
48
|
-
|
49
|
-
def db_path
|
50
|
-
database[:path]
|
51
|
-
end
|
52
|
-
|
53
|
-
def db_params
|
54
|
-
database.reject!{|key, value| [:type, :path].include? key }
|
55
|
-
end
|
56
|
-
|
57
|
-
def session
|
58
|
-
@session ||= ::Neo4j::Session.open(db_type, db_path, db_params)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'database_cleaner/neo4j/base'
|
2
|
-
require 'neo4j-core'
|
3
|
-
|
4
|
-
module DatabaseCleaner
|
5
|
-
module Neo4j
|
6
|
-
class Deletion
|
7
|
-
include ::DatabaseCleaner::Neo4j::Base
|
8
|
-
|
9
|
-
def clean
|
10
|
-
::Neo4j::Transaction.run do
|
11
|
-
session._query('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r')
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'database_cleaner/neo4j/base'
|
2
|
-
require 'database_cleaner/generic/transaction'
|
3
|
-
require 'neo4j-core'
|
4
|
-
|
5
|
-
module DatabaseCleaner
|
6
|
-
module Neo4j
|
7
|
-
class Transaction
|
8
|
-
include ::DatabaseCleaner::Generic::Transaction
|
9
|
-
include ::DatabaseCleaner::Neo4j::Base
|
10
|
-
|
11
|
-
attr_accessor :tx
|
12
|
-
|
13
|
-
def start
|
14
|
-
super
|
15
|
-
rollback
|
16
|
-
self.tx = ::Neo4j::Transaction.new
|
17
|
-
end
|
18
|
-
|
19
|
-
def clean
|
20
|
-
rollback
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def rollback
|
26
|
-
if tx
|
27
|
-
tx.failure
|
28
|
-
tx.close
|
29
|
-
end
|
30
|
-
ensure
|
31
|
-
self.tx = nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'database_cleaner/generic/base'
|
2
|
-
|
3
|
-
module DatabaseCleaner
|
4
|
-
module Redis
|
5
|
-
def self.available_strategies
|
6
|
-
%w{truncation}
|
7
|
-
end
|
8
|
-
|
9
|
-
module Base
|
10
|
-
include ::DatabaseCleaner::Generic::Base
|
11
|
-
|
12
|
-
def db=(desired_db)
|
13
|
-
@db = desired_db
|
14
|
-
end
|
15
|
-
|
16
|
-
def db
|
17
|
-
@db ||= :default
|
18
|
-
end
|
19
|
-
|
20
|
-
alias url db
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def connection
|
25
|
-
@connection ||= begin
|
26
|
-
if url == :default
|
27
|
-
::Redis.new
|
28
|
-
elsif db.is_a?(::Redis) # pass directly the connection
|
29
|
-
db
|
30
|
-
else
|
31
|
-
::Redis.new(:url => url)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'database_cleaner/redis/base'
|
2
|
-
require 'database_cleaner/generic/truncation'
|
3
|
-
|
4
|
-
module DatabaseCleaner
|
5
|
-
module Redis
|
6
|
-
class Truncation
|
7
|
-
include ::DatabaseCleaner::Redis::Base
|
8
|
-
include ::DatabaseCleaner::Generic::Truncation
|
9
|
-
|
10
|
-
def clean
|
11
|
-
if @only
|
12
|
-
@only.each do |term|
|
13
|
-
connection.keys(term).each { |k| connection.del k }
|
14
|
-
end
|
15
|
-
elsif @tables_to_exclude
|
16
|
-
keys_except = []
|
17
|
-
@tables_to_exclude.each { |term| keys_except += connection.keys(term) }
|
18
|
-
connection.keys.each { |k| connection.del(k) unless keys_except.include?(k) }
|
19
|
-
else
|
20
|
-
connection.flushdb
|
21
|
-
end
|
22
|
-
connection.quit unless url == :default
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module DatabaseCleaner
|
2
|
-
class Safeguard
|
3
|
-
class Error < Exception
|
4
|
-
class RemoteDatabaseUrl < Error
|
5
|
-
def initialize
|
6
|
-
super("ENV['DATABASE_URL'] is set to a remote URL. Please refer to https://github.com/DatabaseCleaner/database_cleaner#safeguards")
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class ProductionEnv < Error
|
11
|
-
def initialize(env)
|
12
|
-
super("ENV['#{env}'] is set to production. Please refer to https://github.com/DatabaseCleaner/database_cleaner#safeguards")
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class RemoteDatabaseUrl
|
18
|
-
LOCAL = %w(localhost 127.0.0.1)
|
19
|
-
|
20
|
-
def run
|
21
|
-
raise Error::RemoteDatabaseUrl if !skip? && given?
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def given?
|
27
|
-
remote?(ENV['DATABASE_URL'])
|
28
|
-
end
|
29
|
-
|
30
|
-
def remote?(url)
|
31
|
-
url && !LOCAL.any? { |str| url.include?(str) }
|
32
|
-
end
|
33
|
-
|
34
|
-
def skip?
|
35
|
-
ENV['DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL'] ||
|
36
|
-
DatabaseCleaner.allow_remote_database_url
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class Production
|
41
|
-
KEYS = %w(ENV RACK_ENV RAILS_ENV)
|
42
|
-
|
43
|
-
def run
|
44
|
-
raise Error::ProductionEnv.new(key) if !skip? && given?
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def given?
|
50
|
-
!!key
|
51
|
-
end
|
52
|
-
|
53
|
-
def key
|
54
|
-
@key ||= KEYS.detect { |key| ENV[key] == 'production' }
|
55
|
-
end
|
56
|
-
|
57
|
-
def skip?
|
58
|
-
ENV['DATABASE_CLEANER_ALLOW_PRODUCTION'] ||
|
59
|
-
DatabaseCleaner.allow_production
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
CHECKS = [
|
64
|
-
RemoteDatabaseUrl,
|
65
|
-
Production
|
66
|
-
]
|
67
|
-
|
68
|
-
def run
|
69
|
-
CHECKS.each { |const| const.new.run }
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'database_cleaner/generic/base'
|
2
|
-
module DatabaseCleaner
|
3
|
-
module Sequel
|
4
|
-
def self.available_strategies
|
5
|
-
%w(truncation transaction deletion)
|
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
|
-
return @db if @db && @db != :default
|
17
|
-
raise "As you have more than one active sequel database you have to specify the one to use manually!" if ::Sequel::DATABASES.count > 1
|
18
|
-
::Sequel::DATABASES.first || :default
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'database_cleaner/sequel/base'
|
2
|
-
require 'database_cleaner/generic/truncation'
|
3
|
-
require 'database_cleaner/sequel/truncation'
|
4
|
-
|
5
|
-
module DatabaseCleaner::Sequel
|
6
|
-
class Deletion < Truncation
|
7
|
-
def disable_referential_integrity(tables)
|
8
|
-
case db.database_type
|
9
|
-
when :postgres
|
10
|
-
db.run('SET CONSTRAINTS ALL DEFERRED')
|
11
|
-
tables_to_truncate(db).each do |table|
|
12
|
-
db.run("ALTER TABLE \"#{table}\" DISABLE TRIGGER ALL")
|
13
|
-
end
|
14
|
-
when :mysql
|
15
|
-
old = db.fetch('SELECT @@FOREIGN_KEY_CHECKS').first[:@@FOREIGN_KEY_CHECKS]
|
16
|
-
db.run('SET FOREIGN_KEY_CHECKS = 0')
|
17
|
-
end
|
18
|
-
yield
|
19
|
-
ensure
|
20
|
-
case db.database_type
|
21
|
-
when :postgres
|
22
|
-
tables.each do |table|
|
23
|
-
db.run("ALTER TABLE \"#{table}\" ENABLE TRIGGER ALL")
|
24
|
-
end
|
25
|
-
when :mysql
|
26
|
-
db.run("SET FOREIGN_KEY_CHECKS = #{old}")
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def delete_tables(db, tables)
|
31
|
-
tables.each do |table|
|
32
|
-
db[table.to_sym].delete
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def clean
|
37
|
-
return unless dirty?
|
38
|
-
|
39
|
-
tables = tables_to_truncate(db)
|
40
|
-
db.transaction do
|
41
|
-
disable_referential_integrity(tables) do
|
42
|
-
delete_tables(db, tables)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'database_cleaner/sequel/base'
|
2
|
-
module DatabaseCleaner
|
3
|
-
module Sequel
|
4
|
-
class Transaction
|
5
|
-
include ::DatabaseCleaner::Sequel::Base
|
6
|
-
|
7
|
-
def self.check_fiber_brokenness
|
8
|
-
if !@checked_fiber_brokenness && Fiber.new { Thread.current }.resume != Thread.current
|
9
|
-
raise RuntimeError, "This ruby engine's Fibers are not compatible with Sequel's connection pool. " +
|
10
|
-
"To work around this, please use DatabaseCleaner.cleaning with a block instead of " +
|
11
|
-
"DatabaseCleaner.start and DatabaseCleaner.clean"
|
12
|
-
end
|
13
|
-
@checked_fiber_brokenness = true
|
14
|
-
end
|
15
|
-
|
16
|
-
def start
|
17
|
-
self.class.check_fiber_brokenness
|
18
|
-
|
19
|
-
@fibers ||= []
|
20
|
-
db = self.db
|
21
|
-
f = Fiber.new do
|
22
|
-
db.transaction(:rollback => :always, :savepoint => true) do
|
23
|
-
Fiber.yield
|
24
|
-
end
|
25
|
-
end
|
26
|
-
f.resume
|
27
|
-
@fibers << f
|
28
|
-
end
|
29
|
-
|
30
|
-
def clean
|
31
|
-
f = @fibers.pop
|
32
|
-
f.resume
|
33
|
-
end
|
34
|
-
|
35
|
-
def cleaning
|
36
|
-
self.db.transaction(:rollback => :always, :savepoint => true) { yield }
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'database_cleaner/generic/truncation'
|
2
|
-
require 'database_cleaner/sequel/base'
|
3
|
-
|
4
|
-
module DatabaseCleaner
|
5
|
-
module Sequel
|
6
|
-
class Truncation
|
7
|
-
include ::DatabaseCleaner::Sequel::Base
|
8
|
-
include ::DatabaseCleaner::Generic::Truncation
|
9
|
-
|
10
|
-
def start
|
11
|
-
@last_txid = txid
|
12
|
-
end
|
13
|
-
|
14
|
-
def clean
|
15
|
-
return unless dirty?
|
16
|
-
|
17
|
-
case db.database_type
|
18
|
-
when :postgres
|
19
|
-
# PostgreSQL requires all tables with FKs to be truncates in the same command, or have the CASCADE keyword
|
20
|
-
# appended. Bulk truncation without CASCADE is:
|
21
|
-
# * Safer. Tables outside of tables_to_truncate won't be affected.
|
22
|
-
# * Faster. Less roundtrips to the db.
|
23
|
-
unless (tables = tables_to_truncate(db)).empty?
|
24
|
-
all_tables = tables.map { |t| %("#{t}") }.join(',')
|
25
|
-
db.run "TRUNCATE TABLE #{all_tables};"
|
26
|
-
end
|
27
|
-
else
|
28
|
-
tables = tables_to_truncate(db)
|
29
|
-
|
30
|
-
if pre_count?
|
31
|
-
# Count rows before truncating
|
32
|
-
pre_count_truncate_tables(db, tables)
|
33
|
-
else
|
34
|
-
# Truncate each table normally
|
35
|
-
truncate_tables(db, tables)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def pre_count_truncate_tables(db, tables)
|
43
|
-
tables = tables.reject { |table| db[table.to_sym].count == 0 }
|
44
|
-
truncate_tables(db, tables)
|
45
|
-
end
|
46
|
-
|
47
|
-
def truncate_tables(db, tables)
|
48
|
-
tables.each do |table|
|
49
|
-
db[table.to_sym].truncate
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def dirty?
|
54
|
-
@last_txid != txid || @last_txid.nil?
|
55
|
-
end
|
56
|
-
|
57
|
-
def txid
|
58
|
-
case db.database_type
|
59
|
-
when :postgres
|
60
|
-
db.fetch('SELECT txid_snapshot_xmax(txid_current_snapshot()) AS txid').first[:txid]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def tables_to_truncate(db)
|
65
|
-
(@only || db.tables.map(&:to_s)) - @tables_to_exclude
|
66
|
-
end
|
67
|
-
|
68
|
-
# overwritten
|
69
|
-
def migration_storage_names
|
70
|
-
%w(schema_info schema_migrations)
|
71
|
-
end
|
72
|
-
|
73
|
-
def pre_count?
|
74
|
-
@pre_count == true
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|