activerecord_unload_all_fixtures 0.1.0 → 0.1.3

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/README.rdoc CHANGED
@@ -2,7 +2,15 @@
2
2
 
3
3
  deletes all rows in all tables associated with active record models
4
4
 
5
- ActiveRecord::
5
+ ActiveRecord::UnloadAllFixtures::unload_all_fixtures
6
+
7
+ if you have some models you don't want to be mercilessly deleted, mark them with a "skip_unload_fixtures"
8
+ attribute on the model Class
9
+
10
+ class Foo < ActiveRecord::Base
11
+ class << self ; attr_accessor :skip_unload_fixtures ; end
12
+ Foo::skip_unload_fixtures = true
13
+ end
6
14
 
7
15
  == Install
8
16
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.3
@@ -1,59 +1,103 @@
1
1
  require 'set'
2
2
 
3
- module Spec
4
- module Scenarios
3
+ module ActiveRecord
4
+ module UnloadAllFixtures
5
5
 
6
6
  class << self
7
- attr_accessor :ordered_active_record_classes
7
+ attr_accessor :ordered_active_record_table_names
8
8
  attr_accessor :table_name_set
9
9
 
10
10
  # iterate over all ActiveRecord models associated with db tables, deleting all rows
11
11
  # if we're inside a transaction, use delete, otherwise use truncate
12
12
  def unload_all_fixtures()
13
- if ordered_active_record_classes.nil? || ordered_active_record_classes.empty?
14
- Spec::Scenarios::ordered_active_record_classes = ActiveRecord::Base.connection.tables.map {|t|
15
- t.downcase.singularize.camelize.constantize rescue nil
16
- }.compact.select {|cls| cls.ancestors.include?(ActiveRecord::Base)}
17
-
18
- # offline lock causes problems when running specs in jruby
19
- # (offline lock table will get locked, so insert lock from other thread will block)
20
- Spec::Scenarios::ordered_active_record_classes -= [ 'OfflineLock'.constantize ] if RUBY_PLATFORM =~ /java/
13
+ if ActiveRecord::UnloadAllFixtures::ordered_active_record_table_names.nil? ||
14
+ ActiveRecord::UnloadAllFixtures::ordered_active_record_table_names.empty?
15
+ klasses = ActiveRecord::Base.send(:subclasses).reject{ |klass| klass.skip_unload_fixtures if klass.respond_to?(:skip_unload_fixtures) }
16
+ ActiveRecord::UnloadAllFixtures::ordered_active_record_table_names = klasses.map do |klass|
17
+ if defined?(ActiveRecord::WormTable) && klass.ancestors.include?(ActiveRecord::WormTable)
18
+ [klass.switch_table_name] + klass.table_version_names
19
+ else
20
+ klass.table_name
21
+ end
22
+ end.flatten.to_set.to_a
21
23
  end
22
24
 
23
- Spec::Scenarios::table_name_set = ActiveRecord::Base::connection.tables.to_set
25
+ ActiveRecord::UnloadAllFixtures::table_name_set = ActiveRecord::Base::connection.tables.to_set
24
26
 
25
27
  # start with the last successful delete ordering, only re-ordering if new foreign key dependencies are found
26
- Spec::Scenarios::ordered_active_record_classes = unload_fixtures( Spec::Scenarios::ordered_active_record_classes, ActiveRecord::Base.connection.open_transactions == 0 )
28
+ ActiveRecord::Base::without_foreign_key_checks do
29
+ ActiveRecord::UnloadAllFixtures::ordered_active_record_table_names = delete_rows( ActiveRecord::UnloadAllFixtures::ordered_active_record_table_names,
30
+ ActiveRecord::Base.connection.open_transactions == 0 )
31
+ end
32
+
27
33
  true
28
34
  end
29
35
 
30
- def unload_fixtures(classes, truncate=false)
36
+ def delete_rows(table_names, truncate=false, shift_counter=table_names.size)
31
37
  processed = []
32
- classes.each_with_index{ |c,i|
33
- if defined?(ActiveRecord::WormTable) && c.ancestors.include?(ActiveRecord::WormTable)
34
- tables = [c.switch_table_name,c.table_version_names]
35
- else
36
- tables = [c.table_name]
37
- end
38
-
38
+ table_names.each_with_index{ |table_name,i|
39
39
  begin
40
- tables.each do |table_name|
41
- if table_name_set.include?(table_name)
42
- if truncate
43
- ActiveRecord::Base.connection.execute("truncate table #{table_name}")
44
- else
45
- ActiveRecord::Base.connection.execute("delete from #{table_name}")
46
- end
40
+ if ActiveRecord::UnloadAllFixtures::table_name_set.include?(table_name)
41
+ if truncate
42
+ ActiveRecord::Base.connection.execute("truncate table #{table_name}")
43
+ else
44
+ ActiveRecord::Base.connection.execute("delete from #{table_name}")
47
45
  end
48
46
  end
49
- processed << c
50
- rescue
51
- raise "can't remove all tables. tables remaining: #{classes.map(&:table_name).join(', ')}" unless i>0
52
- processed += unload_fixtures( classes[i..-1].reverse )
47
+ processed << table_name
48
+ rescue Exception=>e
49
+ $stderr << e.message << "\n"
50
+ $stderr << e.backtrace << "\n"
51
+ remaining = table_names[i..-1]
52
+ raise "can't remove all tables. tables remaining: #{remaining.join(', ')}" unless shift_counter>0
53
+ processed += delete_rows( remaining.unshift(remaining.pop), truncate, shift_counter-1 )
53
54
  end
54
55
  }
55
56
  end
56
57
  end
58
+
59
+ module MySQL
60
+ def disable_foreign_key_checks
61
+ execute "set foreign_key_checks=0"
62
+ end
63
+
64
+ def enable_foreign_key_checks
65
+ execute "set foreign_key_checks=1"
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ module JdbcSpec
72
+ module MySQL
73
+ include ActiveRecord::UnloadAllFixtures::MySQL
57
74
  end
58
75
  end
59
76
 
77
+ module ActiveRecord
78
+ module ConnectionAdapters
79
+ class AbstractAdapter
80
+ def disable_foreign_key_checks
81
+ end
82
+
83
+ def enable_foreign_key_checks
84
+ end
85
+
86
+ end
87
+
88
+ class MysqlAdapter
89
+ include ActiveRecord::UnloadAllFixtures::MySQL
90
+ end
91
+ end
92
+
93
+ class Base
94
+ def self.without_foreign_key_checks
95
+ begin
96
+ connection.disable_foreign_key_checks
97
+ yield
98
+ ensure
99
+ connection.enable_foreign_key_checks
100
+ end
101
+ end
102
+ end
103
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 0
9
- version: 0.1.0
8
+ - 3
9
+ version: 0.1.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - mccraig mccraig of the clan mccraig
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-05 00:00:00 +01:00
17
+ date: 2010-05-06 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency