database_cleaner 0.6.0 → 0.6.1.rc
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.
- data/History.txt +11 -1
- data/README.textile +10 -5
- data/VERSION.yml +3 -3
- data/examples/config/database.yml +7 -0
- data/examples/db/activerecord_one.db +0 -0
- data/examples/db/activerecord_two.db +0 -0
- data/examples/db/datamapper_default.db +0 -0
- data/examples/db/datamapper_one.db +0 -0
- data/examples/db/datamapper_two.db +0 -0
- data/examples/features/support/env.rb +2 -2
- data/features/cleaning_default_strategy.feature +19 -0
- data/lib/database_cleaner/active_record/base.rb +9 -3
- data/lib/database_cleaner/active_record/truncation.rb +4 -1
- data/lib/database_cleaner/base.rb +14 -7
- data/lib/database_cleaner/configuration.rb +0 -1
- data/lib/database_cleaner/mongo_mapper/truncation.rb +1 -1
- data/lib/database_cleaner/mongoid/truncation.rb +1 -1
- data/lib/database_cleaner/null_strategy.rb +15 -0
- data/spec/database_cleaner/active_record/base_spec.rb +13 -2
- data/spec/database_cleaner/active_record/truncation_spec.rb +12 -0
- data/spec/database_cleaner/base_spec.rb +43 -6
- metadata +14 -5
data/History.txt
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
== 0.6.
|
1
|
+
== 0.6.1 (in git)
|
2
|
+
|
3
|
+
=== New Features
|
4
|
+
* Default strategies for all ORM libs are defined. (GH-36, GH-38 Prem Sichanugrist)
|
5
|
+
* Add a NullStrategy. (GH-6 Ben Mabey)
|
6
|
+
|
7
|
+
=== Bugfixes
|
8
|
+
* Exclude database views from tables_to_truncate, if the connection adapter
|
9
|
+
supports reading from the ANSI standard information_schema views. (GH-25 Samer Abukhait)
|
10
|
+
* ORM types can be specified in string format and not mysteriously blowup. (GH-26 Ben Mabey)
|
11
|
+
* Do not remove MongoDB reserved system collections. (GH-24 Ches Martin)
|
2
12
|
|
3
13
|
== 0.6.0 2010-10-25 - The Multi-ORM/Connection Release
|
4
14
|
|
data/README.textile
CHANGED
@@ -10,16 +10,21 @@ ActiveRecord, DataMapper, MongoMapper, Mongoid, and CouchPotato are supported.
|
|
10
10
|
Here is an overview of the strategies supported for each library:
|
11
11
|
|
12
12
|
|_. ORM |_. Truncation |_. Transaction |_. Deletion |
|
13
|
-
| ActiveRecord | Yes | Yes
|
14
|
-
| DataMapper | Yes | Yes
|
15
|
-
| CouchPotato | Yes
|
16
|
-
| MongoMapper | Yes
|
17
|
-
|
|
13
|
+
| ActiveRecord | Yes | **Yes** | Yes |
|
14
|
+
| DataMapper | Yes | **Yes** | No |
|
15
|
+
| CouchPotato | **Yes** | No | No |
|
16
|
+
| MongoMapper | **Yes** | No | No |
|
17
|
+
| Mongoid | **Yes** | No | No |
|
18
|
+
|
19
|
+
(Default strategy for each library is denoted in bold)
|
18
20
|
|
19
21
|
The ActiveRecord @:deletion@ strategy is only useful for when the @:truncation@ strategy causes
|
20
22
|
locks (as reported by some Oracle DB users). The @:truncation@ strategy is the preferred option
|
21
23
|
since it is much faster.
|
22
24
|
|
25
|
+
Database Cleaner also includes a @null@ strategy (that does no cleaning at all) which can be used
|
26
|
+
with any ORM library. You can also explicitly use it by setting your strategy to @nil@.
|
27
|
+
|
23
28
|
h2. How to use
|
24
29
|
|
25
30
|
<pre>
|
data/VERSION.yml
CHANGED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
two:
|
3
|
+
adapter: sqlite3
|
4
|
+
database: /Users/bmabey/Programming/ruby/database_cleaner/examples/features/support/../../db/activerecord_two.db
|
5
|
+
one:
|
6
|
+
adapter: sqlite3
|
7
|
+
database: /Users/bmabey/Programming/ruby/database_cleaner/examples/features/support/../../db/activerecord_one.db
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -54,9 +54,9 @@ if orm && strategy
|
|
54
54
|
DatabaseCleaner[ orm.gsub(/(.)([A-Z]+)/,'\1_\2').downcase.to_sym ].strategy = strategy.to_sym
|
55
55
|
DatabaseCleaner[ another_orm.gsub(/(.)([A-Z]+)/,'\1_\2').downcase.to_sym ].strategy = strategy.to_sym
|
56
56
|
else
|
57
|
-
DatabaseCleaner.strategy = strategy.to_sym
|
57
|
+
DatabaseCleaner.strategy = strategy.to_sym unless strategy == "default"
|
58
58
|
end
|
59
59
|
|
60
60
|
else
|
61
|
-
raise "Run 'ORM=ActiveRecord|DataMapper|MongoMapper|CouchPotato [ANOTHER_ORM=...] [MULTIPLE_DBS=true] STRATEGY=transaction|truncation cucumber examples/features'"
|
61
|
+
raise "Run 'ORM=ActiveRecord|DataMapper|MongoMapper|CouchPotato [ANOTHER_ORM=...] [MULTIPLE_DBS=true] STRATEGY=transaction|truncation|default cucumber examples/features'"
|
62
62
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: database cleaning
|
2
|
+
In order to ease example and feature writing
|
3
|
+
As a developer
|
4
|
+
I want to have my database in a clean state with default strategy
|
5
|
+
|
6
|
+
Scenario Outline: ruby app
|
7
|
+
Given I am using <ORM>
|
8
|
+
And the default cleaning strategy
|
9
|
+
|
10
|
+
When I run my scenarios that rely on a clean database
|
11
|
+
Then I should see all green
|
12
|
+
|
13
|
+
Examples:
|
14
|
+
| ORM |
|
15
|
+
| ActiveRecord |
|
16
|
+
| DataMapper |
|
17
|
+
| MongoMapper |
|
18
|
+
| Mongoid |
|
19
|
+
| CouchPotato |
|
@@ -7,9 +7,13 @@ module DatabaseCleaner
|
|
7
7
|
def self.available_strategies
|
8
8
|
%w[truncation transaction deletion]
|
9
9
|
end
|
10
|
+
|
11
|
+
def self.config_file_location=(path)
|
12
|
+
@config_file_location = path
|
13
|
+
end
|
10
14
|
|
11
15
|
def self.config_file_location
|
12
|
-
"#{DatabaseCleaner.app_root}/config/database.yml"
|
16
|
+
@config_file_location ||= "#{DatabaseCleaner.app_root}/config/database.yml"
|
13
17
|
end
|
14
18
|
|
15
19
|
module Base
|
@@ -27,8 +31,10 @@ module DatabaseCleaner
|
|
27
31
|
end
|
28
32
|
|
29
33
|
def load_config
|
30
|
-
|
31
|
-
|
34
|
+
if File.file?(ActiveRecord.config_file_location)
|
35
|
+
connection_details = YAML::load(ERB.new(IO.read(ActiveRecord.config_file_location)).result)
|
36
|
+
self.connection_hash = connection_details[self.db.to_s]
|
37
|
+
end
|
32
38
|
end
|
33
39
|
|
34
40
|
def create_connection_klass
|
@@ -9,6 +9,9 @@ module ActiveRecord
|
|
9
9
|
USE_ARJDBC_WORKAROUND = defined?(ArJdbc)
|
10
10
|
|
11
11
|
class AbstractAdapter
|
12
|
+
def views
|
13
|
+
@views ||= select_values("select table_name from information_schema.views where table_schema = '#{current_database}'") rescue []
|
14
|
+
end
|
12
15
|
end
|
13
16
|
|
14
17
|
unless USE_ARJDBC_WORKAROUND
|
@@ -99,7 +102,7 @@ module DatabaseCleaner::ActiveRecord
|
|
99
102
|
private
|
100
103
|
|
101
104
|
def tables_to_truncate
|
102
|
-
(@only || connection.tables) - @tables_to_exclude
|
105
|
+
(@only || connection.tables) - @tables_to_exclude - connection.views
|
103
106
|
end
|
104
107
|
|
105
108
|
def connection
|
@@ -1,13 +1,15 @@
|
|
1
|
+
require 'database_cleaner/null_strategy'
|
1
2
|
module DatabaseCleaner
|
2
3
|
class Base
|
3
4
|
|
4
5
|
def initialize(desired_orm = nil,opts = {})
|
5
|
-
if
|
6
|
+
if [:autodetect, nil, "autodetect"].include?(desired_orm)
|
6
7
|
autodetect
|
7
8
|
else
|
8
9
|
self.orm = desired_orm
|
9
10
|
end
|
10
11
|
self.db = opts[:connection] if opts.has_key? :connection
|
12
|
+
set_default_orm_strategy
|
11
13
|
end
|
12
14
|
|
13
15
|
def db=(desired_db)
|
@@ -21,9 +23,6 @@ module DatabaseCleaner
|
|
21
23
|
elsif desired_db!= :default
|
22
24
|
raise ArgumentError, "You must provide a strategy object that supports non default databases when you specify a database"
|
23
25
|
end
|
24
|
-
rescue NoStrategySetError
|
25
|
-
#handle NoStrategySetError by doing nothing at all
|
26
|
-
desired_db
|
27
26
|
end
|
28
27
|
|
29
28
|
def db
|
@@ -59,12 +58,11 @@ module DatabaseCleaner
|
|
59
58
|
end
|
60
59
|
|
61
60
|
def strategy
|
62
|
-
|
63
|
-
raise NoStrategySetError, "Please set a strategy with DatabaseCleaner.strategy=."
|
61
|
+
@strategy || NullStrategy
|
64
62
|
end
|
65
63
|
|
66
64
|
def orm=(desired_orm)
|
67
|
-
@orm = desired_orm
|
65
|
+
@orm = desired_orm.to_sym
|
68
66
|
end
|
69
67
|
|
70
68
|
def orm
|
@@ -125,5 +123,14 @@ module DatabaseCleaner
|
|
125
123
|
end
|
126
124
|
end
|
127
125
|
end
|
126
|
+
|
127
|
+
def set_default_orm_strategy
|
128
|
+
case orm
|
129
|
+
when :active_record, :data_mapper
|
130
|
+
self.strategy = :transaction
|
131
|
+
when :mongo_mapper, :mongoid, :couch_potato
|
132
|
+
self.strategy = :truncation
|
133
|
+
end
|
134
|
+
end
|
128
135
|
end
|
129
136
|
end
|
@@ -11,6 +11,7 @@ module DatabaseCleaner
|
|
11
11
|
subject { ActiveRecord.config_file_location }
|
12
12
|
|
13
13
|
it "should default to DatabaseCleaner.root / config / database.yml" do
|
14
|
+
ActiveRecord.config_file_location=nil
|
14
15
|
DatabaseCleaner.should_receive(:app_root).and_return("/path/to")
|
15
16
|
subject.should == '/path/to/config/database.yml'
|
16
17
|
end
|
@@ -24,8 +25,11 @@ module DatabaseCleaner
|
|
24
25
|
end
|
25
26
|
|
26
27
|
describe ExampleStrategy do
|
28
|
+
let :config_location do
|
29
|
+
'/path/to/config/database.yml'
|
30
|
+
end
|
27
31
|
|
28
|
-
before { ::DatabaseCleaner::ActiveRecord.stub(:config_file_location).and_return(
|
32
|
+
before { ::DatabaseCleaner::ActiveRecord.stub(:config_file_location).and_return(config_location) }
|
29
33
|
|
30
34
|
it_should_behave_like "a generic strategy"
|
31
35
|
|
@@ -58,7 +62,8 @@ module DatabaseCleaner
|
|
58
62
|
my_db:
|
59
63
|
database: <%= "ONE".downcase %>
|
60
64
|
Y
|
61
|
-
|
65
|
+
File.stub(:file?).with(config_location).and_return(true)
|
66
|
+
IO.stub(:read).with(config_location).and_return(yaml)
|
62
67
|
end
|
63
68
|
|
64
69
|
it "should parse the config" do
|
@@ -80,6 +85,12 @@ my_db:
|
|
80
85
|
subject.load_config
|
81
86
|
subject.connection_hash.should == {"database" => "one"}
|
82
87
|
end
|
88
|
+
|
89
|
+
it "should skip config if config file is not available" do
|
90
|
+
File.should_receive(:file?).with(config_location).and_return(false)
|
91
|
+
subject.load_config
|
92
|
+
subject.connection_hash.should be_blank
|
93
|
+
end
|
83
94
|
end
|
84
95
|
|
85
96
|
describe "connection_hash" do
|
@@ -22,6 +22,7 @@ module DatabaseCleaner
|
|
22
22
|
|
23
23
|
before(:each) do
|
24
24
|
connection.stub!(:disable_referential_integrity).and_yield
|
25
|
+
connection.stub!(:views).and_return([])
|
25
26
|
::ActiveRecord::Base.stub!(:connection).and_return(connection)
|
26
27
|
end
|
27
28
|
|
@@ -62,6 +63,17 @@ module DatabaseCleaner
|
|
62
63
|
it "should raise an error when invalid options are provided" do
|
63
64
|
running { Truncation.new(:foo => 'bar') }.should raise_error(ArgumentError)
|
64
65
|
end
|
66
|
+
|
67
|
+
it "should not truncate views" do
|
68
|
+
connection.stub!(:tables).and_return(%w[widgets dogs])
|
69
|
+
connection.stub!(:views).and_return(["widgets"])
|
70
|
+
|
71
|
+
connection.should_receive(:truncate_table).with('dogs')
|
72
|
+
connection.should_not_receive(:truncate_table).with('widgets')
|
73
|
+
|
74
|
+
Truncation.new.clean
|
75
|
+
end
|
76
|
+
|
65
77
|
end
|
66
78
|
end
|
67
79
|
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
require 'database_cleaner/active_record/transaction'
|
3
3
|
require 'database_cleaner/data_mapper/transaction'
|
4
|
+
require 'database_cleaner/mongo_mapper/truncation'
|
5
|
+
require 'database_cleaner/mongoid/truncation'
|
6
|
+
require 'database_cleaner/couch_potato/truncation'
|
4
7
|
|
5
8
|
module DatabaseCleaner
|
6
9
|
describe Base do
|
@@ -138,13 +141,18 @@ module DatabaseCleaner
|
|
138
141
|
cleaner.orm.should == :a_orm
|
139
142
|
end
|
140
143
|
|
141
|
-
it "
|
144
|
+
it "converts string to symbols" do
|
145
|
+
cleaner = ::DatabaseCleaner::Base.new "mongoid"
|
146
|
+
cleaner.orm.should == :mongoid
|
147
|
+
end
|
148
|
+
|
149
|
+
it "is autodetected if orm is not provided" do
|
142
150
|
cleaner = ::DatabaseCleaner::Base.new
|
143
151
|
cleaner.should be_auto_detected
|
144
152
|
end
|
145
153
|
|
146
|
-
it "
|
147
|
-
cleaner = ::DatabaseCleaner::Base.new
|
154
|
+
it "is autodetected if you specify :autodetect" do
|
155
|
+
cleaner = ::DatabaseCleaner::Base.new "autodetect"
|
148
156
|
cleaner.should be_auto_detected
|
149
157
|
end
|
150
158
|
|
@@ -305,12 +313,14 @@ module DatabaseCleaner
|
|
305
313
|
end
|
306
314
|
|
307
315
|
describe "strategy" do
|
308
|
-
|
316
|
+
subject { ::DatabaseCleaner::Base.new :a_orm }
|
317
|
+
|
318
|
+
it "returns a null strategy when strategy no set and undetectable" do
|
309
319
|
subject.instance_values["@strategy"] = nil
|
310
|
-
|
320
|
+
subject.strategy.should == DatabaseCleaner::NullStrategy
|
311
321
|
end
|
312
322
|
|
313
|
-
it "
|
323
|
+
it "returns the set strategy" do
|
314
324
|
strategum = mock("strategy")
|
315
325
|
subject.strategy = strategum
|
316
326
|
subject.strategy.should == strategum
|
@@ -437,5 +447,32 @@ module DatabaseCleaner
|
|
437
447
|
|
438
448
|
end
|
439
449
|
|
450
|
+
describe 'set_default_orm_strategy' do
|
451
|
+
it 'sets strategy to :transaction for ActiveRecord' do
|
452
|
+
cleaner = DatabaseCleaner::Base.new(:active_record)
|
453
|
+
cleaner.strategy.should be_instance_of DatabaseCleaner::ActiveRecord::Transaction
|
454
|
+
end
|
455
|
+
|
456
|
+
it 'sets strategy to :transaction for DataMapper' do
|
457
|
+
cleaner = DatabaseCleaner::Base.new(:data_mapper)
|
458
|
+
cleaner.strategy.should be_instance_of DatabaseCleaner::DataMapper::Transaction
|
459
|
+
end
|
460
|
+
|
461
|
+
it 'sets strategy to :truncation for MongoMapper' do
|
462
|
+
cleaner = DatabaseCleaner::Base.new(:mongo_mapper)
|
463
|
+
cleaner.strategy.should be_instance_of DatabaseCleaner::MongoMapper::Truncation
|
464
|
+
end
|
465
|
+
|
466
|
+
it 'sets strategy to :truncation for Mongoid' do
|
467
|
+
cleaner = DatabaseCleaner::Base.new(:mongoid)
|
468
|
+
cleaner.strategy.should be_instance_of DatabaseCleaner::Mongoid::Truncation
|
469
|
+
end
|
470
|
+
|
471
|
+
it 'sets strategy to :truncation for CouchPotato' do
|
472
|
+
cleaner = DatabaseCleaner::Base.new(:couch_potato)
|
473
|
+
cleaner.strategy.should be_instance_of DatabaseCleaner::CouchPotato::Truncation
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
440
477
|
end
|
441
478
|
end
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: database_cleaner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 7712046
|
5
|
+
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
|
9
|
+
- 1
|
10
|
+
- rc
|
11
|
+
version: 0.6.1.rc
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- Ben Mabey
|
@@ -15,7 +16,7 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date:
|
19
|
+
date: 2011-01-16 00:00:00 -07:00
|
19
20
|
default_executable:
|
20
21
|
dependencies: []
|
21
22
|
|
@@ -38,7 +39,13 @@ files:
|
|
38
39
|
- cucumber.yml
|
39
40
|
- examples/Gemfile
|
40
41
|
- examples/Gemfile.lock
|
42
|
+
- examples/config/database.yml
|
41
43
|
- examples/config/database.yml.example
|
44
|
+
- examples/db/activerecord_one.db
|
45
|
+
- examples/db/activerecord_two.db
|
46
|
+
- examples/db/datamapper_default.db
|
47
|
+
- examples/db/datamapper_one.db
|
48
|
+
- examples/db/datamapper_two.db
|
42
49
|
- examples/db/sqlite_databases_go_here
|
43
50
|
- examples/features/example.feature
|
44
51
|
- examples/features/example_multiple_db.feature
|
@@ -56,6 +63,7 @@ files:
|
|
56
63
|
- examples/lib/mongoid_models.rb
|
57
64
|
- examples/lib/mongomapper_models.rb
|
58
65
|
- features/cleaning.feature
|
66
|
+
- features/cleaning_default_strategy.feature
|
59
67
|
- features/cleaning_multiple_dbs.feature
|
60
68
|
- features/cleaning_multiple_orms.feature
|
61
69
|
- features/step_definitions/database_cleaner_steps.rb
|
@@ -80,6 +88,7 @@ files:
|
|
80
88
|
- lib/database_cleaner/mongo_mapper/truncation.rb
|
81
89
|
- lib/database_cleaner/mongoid/base.rb
|
82
90
|
- lib/database_cleaner/mongoid/truncation.rb
|
91
|
+
- lib/database_cleaner/null_strategy.rb
|
83
92
|
- spec/database_cleaner/active_record/base_spec.rb
|
84
93
|
- spec/database_cleaner/active_record/transaction_spec.rb
|
85
94
|
- spec/database_cleaner/active_record/truncation_spec.rb
|