database_cleaner 1.7.0 → 1.8.0.beta

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTE.markdown +1 -2
  3. data/Gemfile.lock +130 -91
  4. data/History.rdoc +1 -1
  5. data/README.markdown +71 -226
  6. data/Rakefile +12 -8
  7. data/adapters/database_cleaner-active_record/lib/database_cleaner-active_record.rb +1 -0
  8. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record.rb +6 -0
  9. data/{lib → adapters/database_cleaner-active_record/lib}/database_cleaner/active_record/base.rb +13 -4
  10. data/{lib → adapters/database_cleaner-active_record/lib}/database_cleaner/active_record/deletion.rb +19 -19
  11. data/{lib → adapters/database_cleaner-active_record/lib}/database_cleaner/active_record/transaction.rb +0 -0
  12. data/{lib → adapters/database_cleaner-active_record/lib}/database_cleaner/active_record/truncation.rb +22 -19
  13. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/version.rb +5 -0
  14. data/adapters/database_cleaner-couch_potato/lib/database_cleaner-couch_potato.rb +1 -0
  15. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato.rb +11 -0
  16. data/{lib → adapters/database_cleaner-couch_potato/lib}/database_cleaner/couch_potato/base.rb +0 -0
  17. data/{lib → adapters/database_cleaner-couch_potato/lib}/database_cleaner/couch_potato/truncation.rb +0 -0
  18. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/version.rb +5 -0
  19. data/adapters/database_cleaner-data_mapper/lib/database_cleaner-data_mapper.rb +1 -0
  20. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper.rb +4 -0
  21. data/{lib → adapters/database_cleaner-data_mapper/lib}/database_cleaner/data_mapper/base.rb +4 -0
  22. data/{lib → adapters/database_cleaner-data_mapper/lib}/database_cleaner/data_mapper/transaction.rb +0 -0
  23. data/{lib → adapters/database_cleaner-data_mapper/lib}/database_cleaner/data_mapper/truncation.rb +4 -3
  24. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/version.rb +5 -0
  25. data/adapters/database_cleaner-mongo/lib/database_cleaner-mongo.rb +1 -0
  26. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo.rb +10 -0
  27. data/{lib → adapters/database_cleaner-mongo/lib}/database_cleaner/mongo/base.rb +0 -0
  28. data/{lib → adapters/database_cleaner-mongo/lib}/database_cleaner/mongo/truncation.rb +0 -0
  29. data/{lib → adapters/database_cleaner-mongo/lib}/database_cleaner/mongo/truncation_mixin.rb +0 -0
  30. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/version.rb +5 -0
  31. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner-mongo_mapper.rb +1 -0
  32. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper.rb +4 -0
  33. data/{lib → adapters/database_cleaner-mongo_mapper/lib}/database_cleaner/mongo_mapper/base.rb +4 -0
  34. data/{lib → adapters/database_cleaner-mongo_mapper/lib}/database_cleaner/mongo_mapper/truncation.rb +0 -0
  35. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/version.rb +5 -0
  36. data/adapters/database_cleaner-mongoid/lib/database_cleaner-mongoid.rb +1 -0
  37. data/{lib → adapters/database_cleaner-mongoid/lib}/database_cleaner/mongo2/truncation_mixin.rb +0 -0
  38. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid.rb +10 -0
  39. data/{lib → adapters/database_cleaner-mongoid/lib}/database_cleaner/mongoid/base.rb +0 -0
  40. data/{lib → adapters/database_cleaner-mongoid/lib}/database_cleaner/mongoid/truncation.rb +0 -0
  41. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/version.rb +5 -0
  42. data/adapters/database_cleaner-moped/lib/database_cleaner-moped.rb +1 -0
  43. data/adapters/database_cleaner-moped/lib/database_cleaner/moped.rb +10 -0
  44. data/{lib → adapters/database_cleaner-moped/lib}/database_cleaner/moped/base.rb +1 -1
  45. data/{lib → adapters/database_cleaner-moped/lib}/database_cleaner/moped/truncation.rb +0 -0
  46. data/{lib → adapters/database_cleaner-moped/lib}/database_cleaner/moped/truncation_base.rb +4 -0
  47. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/version.rb +5 -0
  48. data/adapters/database_cleaner-neo4j/lib/database_cleaner-neo4j.rb +1 -0
  49. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j.rb +6 -0
  50. data/{lib → adapters/database_cleaner-neo4j/lib}/database_cleaner/neo4j/base.rb +4 -0
  51. data/{lib → adapters/database_cleaner-neo4j/lib}/database_cleaner/neo4j/deletion.rb +0 -0
  52. data/{lib → adapters/database_cleaner-neo4j/lib}/database_cleaner/neo4j/transaction.rb +0 -0
  53. data/{lib → adapters/database_cleaner-neo4j/lib}/database_cleaner/neo4j/truncation.rb +0 -0
  54. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/version.rb +5 -0
  55. data/adapters/database_cleaner-ohm/lib/database_cleaner-ohm.rb +1 -0
  56. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm.rb +10 -0
  57. data/{lib → adapters/database_cleaner-ohm/lib}/database_cleaner/ohm/truncation.rb +4 -0
  58. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm/version.rb +5 -0
  59. data/adapters/database_cleaner-redis/lib/database_cleaner-redis.rb +1 -0
  60. data/adapters/database_cleaner-redis/lib/database_cleaner/redis.rb +4 -0
  61. data/{lib → adapters/database_cleaner-redis/lib}/database_cleaner/redis/base.rb +4 -0
  62. data/{lib → adapters/database_cleaner-redis/lib}/database_cleaner/redis/truncation.rb +0 -0
  63. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/version.rb +5 -0
  64. data/adapters/database_cleaner-sequel/lib/database_cleaner-sequel.rb +1 -0
  65. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel.rb +6 -0
  66. data/{lib → adapters/database_cleaner-sequel/lib}/database_cleaner/sequel/base.rb +4 -0
  67. data/{lib → adapters/database_cleaner-sequel/lib}/database_cleaner/sequel/deletion.rb +0 -0
  68. data/{lib → adapters/database_cleaner-sequel/lib}/database_cleaner/sequel/transaction.rb +0 -0
  69. data/{lib → adapters/database_cleaner-sequel/lib}/database_cleaner/sequel/truncation.rb +16 -15
  70. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/version.rb +5 -0
  71. data/lib/database_cleaner.rb +36 -1
  72. data/lib/database_cleaner/base.rb +85 -103
  73. data/lib/database_cleaner/configuration.rb +93 -83
  74. data/lib/database_cleaner/deprecation.rb +21 -0
  75. data/lib/database_cleaner/null_strategy.rb +6 -6
  76. data/lib/database_cleaner/orm_autodetector.rb +31 -0
  77. data/lib/database_cleaner/safeguard.rb +38 -3
  78. data/lib/database_cleaner/spec.rb +2 -0
  79. data/lib/database_cleaner/spec/database_helper.rb +82 -0
  80. data/lib/database_cleaner/spec/shared_examples.rb +15 -0
  81. data/lib/database_cleaner/version.rb +3 -0
  82. metadata +111 -46
  83. data/VERSION.yml +0 -4
  84. data/lib/database_cleaner/mongo2/base.rb +0 -16
@@ -0,0 +1,5 @@
1
+ module DatabaseCleaner
2
+ module Moped
3
+ VERSION = "1.8.0.beta"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require "database_cleaner/neo4j"
@@ -0,0 +1,6 @@
1
+ require "database_cleaner/neo4j/version"
2
+ require "database_cleaner"
3
+ require "database_cleaner/neo4j/transaction"
4
+ require "database_cleaner/neo4j/truncation"
5
+ require "database_cleaner/neo4j/deletion"
6
+
@@ -5,6 +5,10 @@ module DatabaseCleaner
5
5
  %w[transaction truncation deletion]
6
6
  end
7
7
 
8
+ def self.default_strategy
9
+ :transaction
10
+ end
11
+
8
12
  module Base
9
13
  include ::DatabaseCleaner::Generic::Base
10
14
 
@@ -0,0 +1,5 @@
1
+ module DatabaseCleaner
2
+ module Neo4j
3
+ VERSION = "1.8.0.beta"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require "database_cleaner/ohm"
@@ -0,0 +1,10 @@
1
+ require "database_cleaner/ohm/version"
2
+ require "database_cleaner"
3
+ require "database_cleaner/ohm/truncation"
4
+
5
+ module DatabaseCleaner::Ohm
6
+ def self.default_strategy
7
+ :truncation
8
+ end
9
+ end
10
+
@@ -2,6 +2,10 @@ require 'database_cleaner/redis/truncation'
2
2
 
3
3
  module DatabaseCleaner
4
4
  module Ohm
5
+ def self.available_strategies
6
+ %w(truncation)
7
+ end
8
+
5
9
  class Truncation < ::DatabaseCleaner::Redis::Truncation
6
10
 
7
11
  private
@@ -0,0 +1,5 @@
1
+ module DatabaseCleaner
2
+ module Ohm
3
+ VERSION = "1.8.0.beta"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require "database_cleaner/redis"
@@ -0,0 +1,4 @@
1
+ require "database_cleaner/redis/version"
2
+ require "database_cleaner"
3
+ require "database_cleaner/redis/truncation"
4
+
@@ -6,6 +6,10 @@ module DatabaseCleaner
6
6
  %w{truncation}
7
7
  end
8
8
 
9
+ def self.default_strategy
10
+ :truncation
11
+ end
12
+
9
13
  module Base
10
14
  include ::DatabaseCleaner::Generic::Base
11
15
 
@@ -0,0 +1,5 @@
1
+ module DatabaseCleaner
2
+ module Redis
3
+ VERSION = "1.8.0.beta"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require "database_cleaner/sequel"
@@ -0,0 +1,6 @@
1
+ require "database_cleaner/sequel/version"
2
+ require "database_cleaner"
3
+ require "database_cleaner/sequel/truncation"
4
+ require "database_cleaner/sequel/transaction"
5
+ require "database_cleaner/sequel/deletion"
6
+
@@ -5,6 +5,10 @@ module DatabaseCleaner
5
5
  %w(truncation transaction deletion)
6
6
  end
7
7
 
8
+ def self.default_strategy
9
+ :transaction
10
+ end
11
+
8
12
  module Base
9
13
  include ::DatabaseCleaner::Generic::Base
10
14
 
@@ -14,39 +14,40 @@ module DatabaseCleaner
14
14
  def clean
15
15
  return unless dirty?
16
16
 
17
+ tables = tables_to_truncate(db)
18
+
19
+ # Count rows before truncating
20
+ if pre_count?
21
+ tables = pre_count_tables(tables)
22
+ end
23
+
17
24
  case db.database_type
18
25
  when :postgres
19
26
  # PostgreSQL requires all tables with FKs to be truncates in the same command, or have the CASCADE keyword
20
27
  # appended. Bulk truncation without CASCADE is:
21
28
  # * Safer. Tables outside of tables_to_truncate won't be affected.
22
29
  # * 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};"
30
+ unless tables.empty?
31
+ tables_sql = tables.map { |t| %("#{t}") }.join(',')
32
+ db.run "TRUNCATE TABLE #{tables_sql} RESTART IDENTITY;"
26
33
  end
27
34
  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
35
+ truncate_tables(db, tables)
37
36
  end
38
37
  end
39
38
 
40
39
  private
41
40
 
42
- def pre_count_truncate_tables(db, tables)
43
- tables = tables.reject { |table| db[table.to_sym].count == 0 }
44
- truncate_tables(db, tables)
41
+ def pre_count_tables tables
42
+ tables.reject { |table| db[table.to_sym].count == 0 }
45
43
  end
46
44
 
47
45
  def truncate_tables(db, tables)
48
46
  tables.each do |table|
49
47
  db[table.to_sym].truncate
48
+ if db.database_type == :sqlite && db.table_exists?(:sqlite_sequence)
49
+ db[:sqlite_sequence].where(name: table).delete
50
+ end
50
51
  end
51
52
  end
52
53
 
@@ -0,0 +1,5 @@
1
+ module DatabaseCleaner
2
+ module Sequel
3
+ VERSION = "1.8.0.beta"
4
+ end
5
+ end
@@ -1,12 +1,47 @@
1
1
  $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
2
+ require 'database_cleaner/version'
2
3
  require 'database_cleaner/configuration'
4
+ require 'database_cleaner/deprecation'
5
+ require 'forwardable'
3
6
 
4
7
  module DatabaseCleaner
5
8
  class << self
6
- attr_accessor :allow_remote_database_url, :allow_production
9
+ extend Forwardable
10
+ delegate [
11
+ :[],
12
+ :app_root=,
13
+ :app_root,
14
+ :logger=,
15
+ :logger,
16
+ :cleaners,
17
+ :cleaners=,
18
+ :strategy=,
19
+ :orm=,
20
+ :start,
21
+ :clean,
22
+ :clean_with,
23
+ :cleaning,
24
+
25
+ # TODO remove in 2.0
26
+ :clean!,
27
+ :clean_with!,
28
+ :init_cleaners,
29
+ :add_cleaner,
30
+ :connections,
31
+ :remove_duplicates,
32
+ ] => :configuration
33
+
34
+ attr_accessor :allow_remote_database_url, :allow_production, :url_whitelist
7
35
 
8
36
  def can_detect_orm?
37
+ DatabaseCleaner.deprecate "Calling `DatabaseCleaner.can_detect_orm?` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
9
38
  DatabaseCleaner::Base.autodetect_orm
10
39
  end
40
+
41
+ private
42
+
43
+ def configuration
44
+ @configuration ||= Configuration.new
45
+ end
11
46
  end
12
47
  end
@@ -1,166 +1,148 @@
1
+ require 'database_cleaner/deprecation'
1
2
  require 'database_cleaner/null_strategy'
2
3
  require 'database_cleaner/safeguard'
4
+ require 'database_cleaner/orm_autodetector'
5
+ require 'active_support/core_ext/string/inflections'
6
+ require 'forwardable'
7
+
3
8
  module DatabaseCleaner
4
9
  class Base
5
10
  include Comparable
6
11
 
7
12
  def <=>(other)
8
- (self.orm <=> other.orm) == 0 ? self.db <=> other.db : self.orm <=> other.orm
13
+ [orm, db] <=> [other.orm, other.db]
9
14
  end
10
15
 
11
- def initialize(desired_orm = nil,opts = {})
12
- if [:autodetect, nil, "autodetect"].include?(desired_orm)
13
- autodetect
14
- else
15
- self.orm = desired_orm
16
- end
16
+ def initialize(desired_orm = nil, opts = {})
17
+ @orm_autodetector = ORMAutodetector.new
18
+ self.orm = desired_orm
17
19
  self.db = opts[:connection] || opts[:model] if opts.has_key?(:connection) || opts.has_key?(:model)
18
- set_default_orm_strategy
20
+ self.strategy = orm_module && orm_module.default_strategy
19
21
  Safeguard.new.run
20
22
  end
21
23
 
22
24
  def db=(desired_db)
23
- self.strategy_db = desired_db
24
- @db = desired_db
25
- end
26
-
27
- def strategy_db=(desired_db)
28
- if strategy.respond_to? :db=
29
- strategy.db = desired_db
30
- elsif desired_db!= :default
31
- raise ArgumentError, "You must provide a strategy object that supports non default databases when you specify a database"
32
- end
25
+ @db = self.strategy_db = desired_db
33
26
  end
34
27
 
35
28
  def db
36
29
  @db ||= :default
37
30
  end
38
31
 
39
- def create_strategy(*args)
32
+ def strategy=(args)
40
33
  strategy, *strategy_args = args
41
- orm_strategy(strategy).new(*strategy_args)
42
- end
34
+ @strategy = if strategy.is_a?(Symbol)
35
+ create_strategy(*args)
36
+ elsif strategy_args.empty?
37
+ strategy
38
+ else
39
+ raise ArgumentError, "You must provide a strategy object, or a symbol for a known strategy along with initialization params."
40
+ end
43
41
 
44
- def clean_with(*args)
45
- strategy = create_strategy(*args)
46
- set_strategy_db strategy, self.db
42
+ set_strategy_db @strategy, db
43
+ end
47
44
 
48
- strategy.clean
49
- strategy
45
+ def strategy
46
+ @strategy ||= NullStrategy.new
50
47
  end
51
48
 
52
- alias clean_with! clean_with
49
+ attr_reader :orm
53
50
 
54
- def set_strategy_db(strategy, desired_db)
55
- if strategy.respond_to? :db=
56
- strategy.db = desired_db
57
- elsif desired_db != :default
58
- raise ArgumentError, "You must provide a strategy object that supports non default databases when you specify a database"
59
- end
51
+ def orm=(desired_orm)
52
+ @orm = (desired_orm || :autodetect).to_sym
53
+ @orm = @orm_autodetector.orm if @orm == :autodetect
60
54
  end
61
55
 
62
- def strategy=(args)
63
- strategy, *strategy_args = args
64
- if strategy.is_a?(Symbol)
65
- @strategy = create_strategy(*args)
66
- elsif strategy_args.empty?
67
- @strategy = strategy
68
- else
69
- raise ArgumentError, "You must provide a strategy object, or a symbol for a known strategy along with initialization params."
70
- end
56
+ extend Forwardable
57
+ delegate [:start, :clean, :cleaning] => :strategy
71
58
 
72
- set_strategy_db @strategy, self.db
73
-
74
- @strategy
59
+ def clean_with(*args)
60
+ strategy = create_strategy(*args)
61
+ set_strategy_db strategy, db
62
+ strategy.clean
63
+ strategy
75
64
  end
76
65
 
77
- def strategy
78
- @strategy ||= NullStrategy
79
- end
66
+ # TODO remove the following methods in 2.0
80
67
 
81
- def orm=(desired_orm)
82
- @orm = desired_orm.to_sym
68
+ def auto_detected?
69
+ DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].auto_detected?` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
70
+ @orm_autodetector.autodetected?
83
71
  end
84
72
 
85
- def orm
86
- @orm || autodetect
73
+ def autodetect_orm
74
+ DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].autodetect_orm` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
75
+ @orm_autodetector.orm
87
76
  end
88
77
 
89
- def start
90
- strategy.start
78
+ def clean!
79
+ DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].clean!` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner[...].clean instead."
80
+ clean
91
81
  end
92
82
 
93
- def clean
94
- strategy.clean
83
+ def clean_with!
84
+ DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].clean_with!` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner[...].clean_with instead."
85
+ clean_with
95
86
  end
96
87
 
97
- alias clean! clean
88
+ # TODO privatize the following methods in 2.0
98
89
 
99
- def cleaning(&block)
100
- strategy.cleaning(&block)
90
+ def strategy_db=(desired_db)
91
+ if called_externally?(caller)
92
+ DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].strategy_db=` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner[...].db=` instead."
93
+ end
94
+ set_strategy_db(strategy, desired_db)
101
95
  end
102
96
 
103
- def auto_detected?
104
- !!@autodetected
97
+ def set_strategy_db(strategy, desired_db)
98
+ if called_externally?(caller)
99
+ DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].set_strategy_db=` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner[...].db=` instead."
100
+ end
101
+ if strategy.respond_to? :db=
102
+ strategy.db = desired_db
103
+ elsif desired_db != :default
104
+ raise ArgumentError, "You must provide a strategy object that supports non default databases when you specify a database"
105
+ end
105
106
  end
106
107
 
107
- def autodetect_orm
108
- if defined? ::ActiveRecord
109
- :active_record
110
- elsif defined? ::DataMapper
111
- :data_mapper
112
- elsif defined? ::MongoMapper
113
- :mongo_mapper
114
- elsif defined? ::Mongoid
115
- :mongoid
116
- elsif defined? ::CouchPotato
117
- :couch_potato
118
- elsif defined? ::Sequel
119
- :sequel
120
- elsif defined? ::Moped
121
- :moped
122
- elsif defined? ::Ohm
123
- :ohm
124
- elsif defined? ::Redis
125
- :redis
126
- elsif defined? ::Neo4j
127
- :neo4j
108
+ def create_strategy(*args)
109
+ if called_externally?(caller)
110
+ DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].create_strategy` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner[...].strategy=` instead."
128
111
  end
112
+ strategy, *strategy_args = args
113
+ orm_strategy(strategy).new(*strategy_args)
129
114
  end
130
115
 
131
116
  private
132
117
 
133
118
  def orm_module
134
- ::DatabaseCleaner.orm_module(orm)
119
+ return unless [:active_record, :data_mapper, :mongo, :mongoid, :mongo_mapper, :moped, :couch_potato, :sequel, :ohm, :redis, :neo4j].include?(orm)
120
+ $LOAD_PATH.unshift File.expand_path("#{File.dirname(__FILE__)}/../../adapters/database_cleaner-#{orm}/lib")
121
+ require "database_cleaner/#{orm}"
122
+ DatabaseCleaner.const_get(orm.to_s.camelize)
135
123
  end
136
124
 
137
125
  def orm_strategy(strategy)
138
- require "database_cleaner/#{orm.to_s}/#{strategy.to_s}"
139
126
  orm_module.const_get(strategy.to_s.capitalize)
140
- rescue LoadError
141
- if orm_module.respond_to? :available_strategies
142
- raise UnknownStrategySpecified, "The '#{strategy}' strategy does not exist for the #{orm} ORM! Available strategies: #{orm_module.available_strategies.join(', ')}"
143
- else
144
- raise UnknownStrategySpecified, "The '#{strategy}' strategy does not exist for the #{orm} ORM!"
127
+ rescue NameError
128
+ if orm != :active_record
129
+ DatabaseCleaner.deprecate <<-TEXT
130
+ The #{orm_module} adapter has been extracted to its own gem: database_cleaner-#{orm}, and will be removed from database_cleaner in 2.0. To silence this message, please replace `gem "database_cleaner"` with `gem "database_cleaner-#{orm}"` in your Gemfile.
131
+ TEXT
145
132
  end
133
+ require_orm_strategy(orm, strategy)
134
+ retry
146
135
  end
147
136
 
148
- def autodetect
149
- @autodetected = true
150
-
151
- @orm ||= autodetect_orm ||
152
- raise(NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, Sequel, MongoMapper, Mongoid, Moped, or CouchPotato, Redis or Ohm loaded?")
137
+ def require_orm_strategy(orm, strategy)
138
+ $LOAD_PATH.unshift File.expand_path("#{File.dirname(__FILE__)}/../../adapters/database_cleaner-#{orm}/lib")
139
+ require "database_cleaner/#{orm}/#{strategy}"
140
+ rescue LoadError
141
+ raise UnknownStrategySpecified, "The '#{strategy}' strategy does not exist for the #{orm} ORM! Available strategies: #{orm_module.available_strategies.join(', ')}"
153
142
  end
154
143
 
155
- def set_default_orm_strategy
156
- case orm
157
- when :active_record, :data_mapper, :sequel
158
- self.strategy = :transaction
159
- when :mongo_mapper, :mongoid, :couch_potato, :moped, :ohm, :redis
160
- self.strategy = :truncation
161
- when :neo4j
162
- self.strategy = :transaction
163
- end
144
+ def called_externally?(caller)
145
+ __FILE__ != caller.first.split(":").first
164
146
  end
165
147
  end
166
148
  end