database_cleaner 1.8.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/lib/database_cleaner.rb +1 -47
  3. metadata +11 -478
  4. data/CONTRIBUTE.markdown +0 -27
  5. data/Gemfile.lock +0 -325
  6. data/History.rdoc +0 -497
  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 -64
  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 -41
  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,41 +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
- mongo: "Mongo",
9
- couch_potato: "CouchPotato",
10
- sequel: "Sequel",
11
- moped: "Moped",
12
- ohm: "Ohm",
13
- redis: "Redis",
14
- neo4j: "Neo4j",
15
- }
16
-
17
- def orm
18
- @autodetected = true
19
- autodetected_orm or raise no_orm_detected_error
20
- ORMS.key(autodetected_orm.to_s)
21
- end
22
-
23
- def autodetected?
24
- !!@autodetected
25
- end
26
-
27
- private
28
-
29
- def autodetected_orm
30
- ORMS.values.find do |orm|
31
- Kernel.const_get(orm) rescue next
32
- end
33
- end
34
-
35
- def no_orm_detected_error
36
- orm_list = ORMS.values.join(", ").sub(ORMS.values.last, "or #{ORMS.values.last}")
37
- NoORMDetected.new("No known ORM was detected! Is #{orm_list} loaded?")
38
- end
39
- end
40
- private_constant :ORMAutodetector
41
- 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