database_cleaner 1.8.4 → 2.0.0

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 +12 -479
  4. data/CONTRIBUTE.markdown +0 -27
  5. data/Gemfile.lock +0 -325
  6. data/History.rdoc +0 -492
  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.rb +0 -1
  12. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record.rb +0 -6
  13. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/base.rb +0 -101
  14. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/deletion.rb +0 -108
  15. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/transaction.rb +0 -59
  16. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/truncation.rb +0 -280
  17. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/version.rb +0 -5
  18. data/adapters/database_cleaner-couch_potato/lib/database_cleaner-couch_potato.rb +0 -1
  19. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato.rb +0 -11
  20. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/base.rb +0 -7
  21. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/truncation.rb +0 -28
  22. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/version.rb +0 -5
  23. data/adapters/database_cleaner-data_mapper/lib/database_cleaner-data_mapper.rb +0 -1
  24. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper.rb +0 -4
  25. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/base.rb +0 -25
  26. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/transaction.rb +0 -28
  27. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/truncation.rb +0 -173
  28. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/version.rb +0 -5
  29. data/adapters/database_cleaner-mongo/lib/database_cleaner-mongo.rb +0 -1
  30. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo.rb +0 -10
  31. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/base.rb +0 -16
  32. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/truncation.rb +0 -62
  33. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/truncation_mixin.rb +0 -26
  34. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/version.rb +0 -5
  35. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner-mongo_mapper.rb +0 -1
  36. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper.rb +0 -4
  37. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/base.rb +0 -24
  38. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/truncation.rb +0 -35
  39. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/version.rb +0 -5
  40. data/adapters/database_cleaner-mongoid/lib/database_cleaner-mongoid.rb +0 -1
  41. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid.rb +0 -10
  42. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/base.rb +0 -20
  43. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongo1_truncation_mixin.rb +0 -26
  44. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongo2_truncation_mixin.rb +0 -38
  45. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongoid_truncation_mixin.rb +0 -65
  46. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/truncation.rb +0 -49
  47. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/version.rb +0 -5
  48. data/adapters/database_cleaner-moped/lib/database_cleaner-moped.rb +0 -1
  49. data/adapters/database_cleaner-moped/lib/database_cleaner/moped.rb +0 -10
  50. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/base.rb +0 -39
  51. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/truncation.rb +0 -9
  52. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/truncation_base.rb +0 -44
  53. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/version.rb +0 -5
  54. data/adapters/database_cleaner-neo4j/lib/database_cleaner-neo4j.rb +0 -1
  55. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j.rb +0 -6
  56. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/base.rb +0 -66
  57. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/deletion.rb +0 -16
  58. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/transaction.rb +0 -35
  59. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/truncation.rb +0 -9
  60. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/version.rb +0 -5
  61. data/adapters/database_cleaner-ohm/lib/database_cleaner-ohm.rb +0 -1
  62. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm.rb +0 -12
  63. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm/truncation.rb +0 -24
  64. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm/version.rb +0 -5
  65. data/adapters/database_cleaner-redis/lib/database_cleaner-redis.rb +0 -1
  66. data/adapters/database_cleaner-redis/lib/database_cleaner/redis.rb +0 -4
  67. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/base.rb +0 -41
  68. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/truncation.rb +0 -26
  69. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/version.rb +0 -5
  70. data/adapters/database_cleaner-sequel/lib/database_cleaner-sequel.rb +0 -1
  71. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel.rb +0 -6
  72. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/base.rb +0 -26
  73. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/deletion.rb +0 -47
  74. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/transaction.rb +0 -40
  75. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/truncation.rb +0 -79
  76. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/version.rb +0 -5
  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 -40
  87. data/lib/database_cleaner/safeguard.rb +0 -107
  88. data/lib/database_cleaner/spec.rb +0 -2
  89. data/lib/database_cleaner/spec/database_helper.rb +0 -82
  90. data/lib/database_cleaner/spec/shared_examples.rb +0 -15
  91. data/lib/database_cleaner/version.rb +0 -3
@@ -1,135 +0,0 @@
1
- require 'database_cleaner/base'
2
- require 'database_cleaner/deprecation'
3
- require 'forwardable'
4
-
5
- module DatabaseCleaner
6
-
7
- class NoORMDetected < StandardError; end
8
- class UnknownStrategySpecified < ArgumentError; end
9
-
10
- class Cleaners < Hash
11
- # FIXME this method conflates creation with lookup... both a command and a query. yuck.
12
- def [](orm, opts = {})
13
- raise NoORMDetected unless orm
14
- fetch([orm, opts]) { add_cleaner(orm, opts) }
15
- end
16
-
17
- def strategy=(strategy)
18
- add_cleaner(:autodetect) if none?
19
- values.each { |cleaner| cleaner.strategy = strategy }
20
- remove_duplicates
21
- end
22
-
23
- def orm=(orm)
24
- add_cleaner(:autodetect) if none?
25
- values.each { |cleaner| cleaner.orm = orm }
26
- remove_duplicates
27
- end
28
-
29
- # TODO privatize the following methods in 2.0
30
-
31
- def add_cleaner(orm, opts = {})
32
- self[[orm, opts]] = ::DatabaseCleaner::Base.new(orm, opts)
33
- end
34
-
35
- def remove_duplicates
36
- replace(reduce(Cleaners.new) do |cleaners, (key, value)|
37
- cleaners[key] = value unless cleaners.values.include?(value)
38
- cleaners
39
- end)
40
- end
41
- end
42
-
43
- class Configuration
44
- def initialize
45
- @cleaners ||= Cleaners.new
46
- end
47
-
48
- extend Forwardable
49
- delegate [
50
- :[],
51
- :strategy=,
52
- :orm=,
53
- ] => :cleaners
54
-
55
- attr_accessor :cleaners
56
-
57
- def app_root
58
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.app_root` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner::ActiveRecord.config_file_location`, instead."
59
- @app_root ||= Dir.pwd
60
- end
61
-
62
- def app_root= value
63
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.app_root=` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner::ActiveRecord.config_file_location=`, instead."
64
- @app_root = value
65
- end
66
-
67
- def logger
68
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.logger` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
69
- @logger ||= Logger.new(STDOUT).tap { |l| l.level = Logger::ERROR }
70
- end
71
-
72
- def logger= value
73
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.logger=` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
74
- @logger = value
75
- end
76
-
77
- def start
78
- connections.each { |connection| connection.start }
79
- end
80
-
81
- def clean
82
- connections.each { |connection| connection.clean }
83
- end
84
-
85
- def cleaning(&inner_block)
86
- connections.inject(inner_block) do |curr_block, connection|
87
- proc { connection.cleaning(&curr_block) }
88
- end.call
89
- end
90
-
91
- def clean_with(*args)
92
- connections.each { |connection| connection.clean_with(*args) }
93
- end
94
-
95
- # TODO remove the following methods in 2.0
96
-
97
- def clean!
98
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.clean!` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.clean`, instead."
99
- clean
100
- end
101
-
102
- def clean_with!(*args)
103
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.clean_with!` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.clean_with`, instead."
104
- clean_with(*args)
105
- end
106
-
107
- def init_cleaners
108
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.init_cleaners` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
109
- end
110
-
111
- def connections
112
- if DatabaseCleaner.called_externally?(__FILE__, caller)
113
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.connections` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.cleaners`, instead."
114
- end
115
- add_cleaner(:autodetect) if @cleaners.none?
116
- @cleaners.values
117
- end
118
-
119
- # TODO privatize the following methods in 2.0
120
-
121
- def add_cleaner(orm, opts = {})
122
- if DatabaseCleaner.called_externally?(__FILE__, caller)
123
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.add_cleaner` is deprecated, and will be removed in database_cleaner 2.0. Use `DatabaseCleaner.[]`, instead."
124
- end
125
- @cleaners.add_cleaner(orm, opts = {})
126
- end
127
-
128
- def remove_duplicates
129
- if DatabaseCleaner.called_externally?(__FILE__, caller)
130
- DatabaseCleaner.deprecate "Calling `DatabaseCleaner.remove_duplicates` is deprecated, and will be removed in database_cleaner 2.0 with no replacement."
131
- end
132
- @cleaners.remove_duplicates
133
- end
134
- end
135
- end
@@ -1,3 +0,0 @@
1
- Around do |scenario, block|
2
- DatabaseCleaner.cleaning(&block)
3
- end
@@ -1,26 +0,0 @@
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
- def called_externally?(file, caller)
10
- file != caller.first[/^(.+\.rb):\d+/, 1]
11
- end
12
- module_function :called_externally?
13
-
14
- class Deprecator
15
- def initialize
16
- @methods_already_warned = {}
17
- end
18
-
19
- def deprecate method, message
20
- return if @methods_already_warned.key?(method)
21
- $stderr.puts message
22
- @methods_already_warned[method] = true
23
- end
24
- end
25
- end
26
-
@@ -1,29 +0,0 @@
1
- module ::DatabaseCleaner
2
- module Generic
3
- module Base
4
-
5
- def self.included(base)
6
- base.extend(ClassMethods)
7
- end
8
-
9
- def db
10
- :default
11
- end
12
-
13
- def cleaning(&block)
14
- begin
15
- start
16
- yield
17
- ensure
18
- clean
19
- end
20
- end
21
-
22
- module ClassMethods
23
- def available_strategies
24
- %W[]
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,11 +0,0 @@
1
- module DatabaseCleaner
2
- module Generic
3
- module Transaction
4
- def initialize(opts = {})
5
- if !opts.empty?
6
- raise ArgumentError, "Options are not available for transaction strategies."
7
- end
8
- end
9
- end
10
- end
11
- end
@@ -1,40 +0,0 @@
1
- module DatabaseCleaner
2
- module Generic
3
- module Truncation
4
- def initialize(opts={})
5
- if !opts.empty? && !(opts.keys - [:only, :except, :pre_count, :reset_ids, :cache_tables]).empty?
6
- raise ArgumentError, "The only valid options are :only, :except, :pre_count, :reset_ids or :cache_tables. You specified #{opts.keys.join(',')}."
7
- end
8
- if opts.has_key?(:only) && opts.has_key?(:except)
9
- raise ArgumentError, "You may only specify either :only or :except. Doing both doesn't really make sense does it?"
10
- end
11
-
12
- @only = opts[:only]
13
- @tables_to_exclude = Array( (opts[:except] || []).dup ).flatten
14
- @tables_to_exclude += migration_storage_names
15
- @pre_count = opts[:pre_count]
16
- @reset_ids = opts[:reset_ids]
17
- @cache_tables = opts.has_key?(:cache_tables) ? !!opts[:cache_tables] : true
18
- end
19
-
20
- def start
21
- #included for compatability reasons, do nothing if you don't need to
22
- end
23
-
24
- def clean
25
- raise NotImplementedError
26
- end
27
-
28
- private
29
- def tables_to_truncate
30
- raise NotImplementedError
31
- end
32
-
33
- # overwrite in subclasses
34
- # default implementation given because migration storage need not be present
35
- def migration_storage_names
36
- %w[]
37
- end
38
- end
39
- end
40
- end
@@ -1,20 +0,0 @@
1
- module DatabaseCleaner
2
- class NullStrategy
3
- def start
4
- # no-op
5
- end
6
-
7
- def db=(connection)
8
- # no-op
9
- end
10
-
11
- def clean
12
- # no-op
13
- end
14
-
15
- def cleaning(&block)
16
- # no-op
17
- yield
18
- end
19
- end
20
- end
@@ -1,40 +0,0 @@
1
- module DatabaseCleaner
2
- class ORMAutodetector
3
- ORMS = {
4
- active_record: "ActiveRecord",
5
- data_mapper: "DataMapper",
6
- mongo_mapper: "MongoMapper",
7
- mongoid: "Mongoid",
8
- couch_potato: "CouchPotato",
9
- sequel: "Sequel",
10
- moped: "Moped",
11
- ohm: "Ohm",
12
- redis: "Redis",
13
- neo4j: "Neo4j",
14
- }
15
-
16
- def orm
17
- @autodetected = true
18
- autodetected_orm or raise no_orm_detected_error
19
- ORMS.key(autodetected_orm.to_s)
20
- end
21
-
22
- def autodetected?
23
- !!@autodetected
24
- end
25
-
26
- private
27
-
28
- def autodetected_orm
29
- ORMS.values.find do |orm|
30
- Kernel.const_get(orm) rescue next
31
- end
32
- end
33
-
34
- def no_orm_detected_error
35
- orm_list = ORMS.values.join(", ").sub(ORMS.values.last, "or #{ORMS.values.last}")
36
- NoORMDetected.new("No known ORM was detected! Is #{orm_list} loaded?")
37
- end
38
- end
39
- private_constant :ORMAutodetector
40
- end
@@ -1,107 +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
-
16
- class NotWhitelistedUrl < Error
17
- def initialize
18
- super("ENV['DATABASE_URL'] is set to a URL that is not on the whitelist. Please refer to https://github.com/DatabaseCleaner/database_cleaner#safeguards")
19
- end
20
- end
21
- end
22
-
23
- class WhitelistedUrl
24
- def run
25
- return if skip?
26
- raise Error::NotWhitelistedUrl if database_url_not_whitelisted?
27
- end
28
-
29
- private
30
-
31
- def database_url_not_whitelisted?
32
- !DatabaseCleaner.url_whitelist.include?(ENV['DATABASE_URL'])
33
- end
34
-
35
- def skip?
36
- !DatabaseCleaner.url_whitelist
37
- end
38
- end
39
-
40
-
41
- class RemoteDatabaseUrl
42
- LOCAL = %w(localhost 127.0.0.1)
43
-
44
- def run
45
- raise Error::RemoteDatabaseUrl if !skip? && given?
46
- end
47
-
48
- private
49
-
50
- def given?
51
- remote?(ENV['DATABASE_URL'])
52
- end
53
-
54
- def remote?(url)
55
- return false unless url
56
-
57
- parsed = URI.parse(url)
58
- return false if parsed.scheme == 'sqlite3:'
59
-
60
- host = parsed.host
61
- return false unless host
62
- return false if LOCAL.include?(host)
63
- return false if host.end_with? '.local'
64
- true
65
- end
66
-
67
- def skip?
68
- ENV['DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL'] ||
69
- DatabaseCleaner.allow_remote_database_url ||
70
- DatabaseCleaner.url_whitelist
71
- end
72
- end
73
-
74
- class Production
75
- KEYS = %w(ENV RACK_ENV RAILS_ENV)
76
-
77
- def run
78
- raise Error::ProductionEnv.new(key) if !skip? && given?
79
- end
80
-
81
- private
82
-
83
- def given?
84
- !!key
85
- end
86
-
87
- def key
88
- @key ||= KEYS.detect { |key| ENV[key] == 'production' }
89
- end
90
-
91
- def skip?
92
- ENV['DATABASE_CLEANER_ALLOW_PRODUCTION'] ||
93
- DatabaseCleaner.allow_production
94
- end
95
- end
96
-
97
- CHECKS = [
98
- RemoteDatabaseUrl,
99
- Production,
100
- WhitelistedUrl
101
- ]
102
-
103
- def run
104
- CHECKS.each { |const| const.new.run }
105
- end
106
- end
107
- end
@@ -1,2 +0,0 @@
1
- require "database_cleaner/spec/database_helper"
2
- require "database_cleaner/spec/shared_examples"
@@ -1,82 +0,0 @@
1
- require 'yaml'
2
-
3
- module DatabaseCleaner
4
- module Spec
5
- class DatabaseHelper < Struct.new(:db)
6
- def self.with_all_dbs &block
7
- %w[mysql mysql2 sqlite3 postgres].map(&:to_sym).each do |db|
8
- yield new(db)
9
- end
10
- end
11
-
12
- def setup
13
- create_db
14
- establish_connection
15
- load_schema
16
- end
17
-
18
- attr_reader :connection
19
-
20
- def teardown
21
- drop_db
22
- end
23
-
24
- private
25
-
26
- def establish_connection(config = default_config)
27
- raise NotImplementedError
28
- end
29
-
30
- def create_db
31
- if db == :sqlite3
32
- # NO-OP
33
- elsif db == :postgres
34
- establish_connection default_config.merge('database' => 'postgres')
35
- connection.execute "CREATE DATABASE #{default_config['database']}" rescue nil
36
- else
37
- establish_connection default_config.merge("database" => nil)
38
- connection.execute "CREATE DATABASE IF NOT EXISTS #{default_config['database']}"
39
- end
40
- end
41
-
42
- def load_schema
43
- connection.execute <<-SQL
44
- CREATE TABLE IF NOT EXISTS users (
45
- id SERIAL PRIMARY KEY,
46
- name INTEGER
47
- );
48
- SQL
49
-
50
- connection.execute <<-SQL
51
- CREATE TABLE IF NOT EXISTS agents (
52
- name INTEGER
53
- );
54
- SQL
55
- end
56
-
57
- def drop_db
58
- if db == :sqlite3
59
- begin
60
- File.unlink(db_config['sqlite3']['database'])
61
- rescue Errno::ENOENT
62
- end
63
- elsif db == :postgres
64
- # FIXME
65
- connection.execute "DROP TABLE IF EXISTS users"
66
- connection.execute "DROP TABLE IF EXISTS agents"
67
- else
68
- connection.execute "DROP DATABASE IF EXISTS #{default_config['database']}"
69
- end
70
- end
71
-
72
- def db_config
73
- config_path = 'spec/support/config.yml'
74
- @db_config ||= YAML.load(IO.read(config_path))
75
- end
76
-
77
- def default_config
78
- db_config[db.to_s]
79
- end
80
- end
81
- end
82
- end