Skip to content
This repository was archived by the owner on May 26, 2020. It is now read-only.

Commit 14f8258

Browse files
Merge pull request #603 from DatabaseCleaner/tighten_up_public_api
Tighten up Public API
2 parents 054404f + 3094dcf commit 14f8258

File tree

4 files changed

+104
-47
lines changed

4 files changed

+104
-47
lines changed

lib/database_cleaner.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
22
require 'database_cleaner/configuration'
3+
require 'database_cleaner/deprecation'
34
require 'forwardable'
45

56
module DatabaseCleaner
@@ -20,12 +21,9 @@ class << self
2021
:clean_with,
2122
:cleaning,
2223

23-
# TODO deprecate
24+
# TODO remove in 2.0
2425
:clean!,
2526
:clean_with!,
26-
27-
# TODO deprecate and then privatize the following methods:
28-
2927
:init_cleaners,
3028
:add_cleaner,
3129
:connections,
@@ -35,6 +33,7 @@ class << self
3533
attr_accessor :allow_remote_database_url, :allow_production, :url_whitelist
3634

3735
def can_detect_orm?
36+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner.can_detect_orm?` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
3837
DatabaseCleaner::Base.autodetect_orm
3938
end
4039

lib/database_cleaner/base.rb

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
require 'database_cleaner/deprecation'
12
require 'database_cleaner/null_strategy'
23
require 'database_cleaner/safeguard'
34
require 'database_cleaner/orm_autodetector'
45
require 'active_support/core_ext/string/inflections'
6+
require 'forwardable'
57

68
module DatabaseCleaner
79
class Base
@@ -23,36 +25,10 @@ def db=(desired_db)
2325
@db = self.strategy_db = desired_db
2426
end
2527

26-
def strategy_db=(desired_db)
27-
set_strategy_db(strategy, desired_db)
28-
end
29-
3028
def db
3129
@db ||= :default
3230
end
3331

34-
def create_strategy(*args)
35-
strategy, *strategy_args = args
36-
orm_strategy(strategy).new(*strategy_args)
37-
end
38-
39-
def clean_with(*args)
40-
strategy = create_strategy(*args)
41-
set_strategy_db strategy, db
42-
strategy.clean
43-
strategy
44-
end
45-
46-
alias clean_with! clean_with
47-
48-
def set_strategy_db(strategy, desired_db)
49-
if strategy.respond_to? :db=
50-
strategy.db = desired_db
51-
elsif desired_db != :default
52-
raise ArgumentError, "You must provide a strategy object that supports non default databases when you specify a database"
53-
end
54-
end
55-
5632
def strategy=(args)
5733
strategy, *strategy_args = args
5834
@strategy = if strategy.is_a?(Symbol)
@@ -77,26 +53,64 @@ def orm=(desired_orm)
7753
@orm = @orm_autodetector.orm if @orm == :autodetect
7854
end
7955

56+
extend Forwardable
57+
delegate [:start, :clean, :cleaning] => :strategy
58+
59+
def clean_with(*args)
60+
strategy = create_strategy(*args)
61+
set_strategy_db strategy, db
62+
strategy.clean
63+
strategy
64+
end
65+
66+
# TODO remove the following methods in 2.0
67+
8068
def auto_detected?
69+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].auto_detected?` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
8170
@orm_autodetector.autodetected?
8271
end
8372

8473
def autodetect_orm
74+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner[...].autodetect_orm` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
8575
@orm_autodetector.orm
8676
end
8777

88-
def start
89-
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
9081
end
9182

92-
def clean
93-
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
9486
end
9587

96-
alias clean! clean
88+
# TODO privatize the following methods in 2.0
9789

98-
def cleaning(&block)
99-
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)
95+
end
96+
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
106+
end
107+
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."
111+
end
112+
strategy, *strategy_args = args
113+
orm_strategy(strategy).new(*strategy_args)
100114
end
101115

102116
private
@@ -109,7 +123,7 @@ def orm_module
109123
def orm_strategy(strategy)
110124
orm_module.const_get(strategy.to_s.capitalize)
111125
rescue NameError
112-
$stderr.puts <<-TEXT
126+
DatabaseCleaner.deprecate <<-TEXT
113127
Requiring the `database_cleaner` gem directly is deprecated, and will raise an error in database_cleaner 2.0. Instead, please require the specific gem (or gems) for your ORM.
114128
For example, replace `gem "database_cleaner"` with `gem "database_cleaner-#{orm}"` in your Gemfile.
115129
TEXT
@@ -132,5 +146,9 @@ def default_orm_strategy
132146
:truncation
133147
end
134148
end
149+
150+
def called_externally?(caller)
151+
__FILE__ != caller.first.split(":").first
152+
end
135153
end
136154
end

lib/database_cleaner/configuration.rb

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'database_cleaner/base'
2+
require 'database_cleaner/deprecation'
23
require 'forwardable'
34

45
module DatabaseCleaner
@@ -49,9 +50,6 @@ def initialize
4950
:[],
5051
:strategy=,
5152
:orm=,
52-
53-
:add_cleaner,
54-
:remove_duplicates,
5553
] => :cleaners
5654

5755
attr_accessor :app_root, :logger, :cleaners
@@ -82,25 +80,46 @@ def clean_with(*args)
8280
connections.each { |connection| connection.clean_with(*args) }
8381
end
8482

85-
# TODO deprecate and remove the following aliases:
83+
# TODO remove the following methods in 2.0
8684

87-
alias clean! clean
88-
alias clean_with! clean_with
85+
def clean!
86+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner.clean!` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.clean`, instead."
87+
clean
88+
end
8989

90-
# TODO deprecate and then privatize the following methods:
90+
def clean_with!(*args)
91+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner.clean_with!` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.clean_with`, instead."
92+
clean_with(*args)
93+
end
9194

9295
def init_cleaners
93-
$stderr.puts "Calling `DatabaseCleaner.init_cleaners` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
96+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner.init_cleaners` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
9497
end
9598

9699
def connections
97100
if called_externally?(caller)
98-
$stderr.puts "Calling `DatabaseCleaner.connections` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.cleaners`, instead."
101+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner.connections` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.cleaners`, instead."
99102
end
100103
add_cleaner(:autodetect) if @cleaners.none?
101104
@cleaners.values
102105
end
103106

107+
# TODO privatize the following methods in 2.0
108+
109+
def add_cleaner(orm, opts = {})
110+
if called_externally?(caller)
111+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner.add_cleaner` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.[]`, instead."
112+
end
113+
@cleaners.add_cleaner(orm, opts = {})
114+
end
115+
116+
def remove_duplicates
117+
if called_externally?(caller)
118+
DatabaseCleaner.deprecate "Calling `DatabaseCleaner.remove_duplicates` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
119+
end
120+
@cleaners.remove_duplicates
121+
end
122+
104123
private
105124

106125
def called_externally?(caller)

lib/database_cleaner/deprecation.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module DatabaseCleaner
2+
def deprecate message
3+
method = caller.first[/\d+:in `(.*)'$/, 1].to_sym
4+
@@deprecator ||= Deprecator.new
5+
@@deprecator.deprecate method, message
6+
end
7+
module_function :deprecate
8+
9+
class Deprecator
10+
def initialize
11+
@methods_already_warned = {}
12+
end
13+
14+
def deprecate method, message
15+
return if @methods_already_warned.key?(method)
16+
$stderr.puts message
17+
@methods_already_warned[method] = true
18+
end
19+
end
20+
end
21+

0 commit comments

Comments
 (0)