acts_as_archive 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +8 -1
- data/lib/acts_as_archive/base/adapters/postgresql.rb +26 -20
- data/lib/acts_as_archive/base/destroy.rb +1 -0
- data/lib/acts_as_archive/base/table.rb +38 -1
- data/pkg/acts_as_archive-0.2.1.gem +0 -0
- data/require.rb +1 -1
- data/spec/acts_as_archive/base/destroy_spec.rb +5 -0
- data/spec/acts_as_archive/base/table_spec.rb +17 -17
- data/spec/db/config/{database.yml → database.mysql.yml} +0 -0
- data/spec/db/config/database.postgresql.yml +6 -0
- data/spec/spec_helper.rb +6 -2
- metadata +5 -3
data/Rakefile
CHANGED
@@ -2,33 +2,39 @@ module ActsAsArchive
|
|
2
2
|
module Base
|
3
3
|
module Adapters
|
4
4
|
module PostgreSQL
|
5
|
-
|
5
|
+
|
6
6
|
private
|
7
7
|
|
8
8
|
def archive_table_indexed_columns
|
9
|
+
# This query comes courtesy of cope360:
|
10
|
+
# http://stackoverflow.com/questions/2204058/show-which-columns-an-index-is-on-in-postgresql/2213199#2213199
|
9
11
|
index_query = <<-SQL
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
12
|
+
select
|
13
|
+
t.relname as table_name,
|
14
|
+
i.relname as index_name,
|
15
|
+
a.attname as column_name
|
16
|
+
from
|
17
|
+
pg_class t,
|
18
|
+
pg_class i,
|
19
|
+
pg_index ix,
|
20
|
+
pg_attribute a
|
21
|
+
where
|
22
|
+
t.oid = ix.indrelid
|
23
|
+
and i.oid = ix.indexrelid
|
24
|
+
and a.attrelid = t.oid
|
25
|
+
and a.attnum = ANY(ix.indkey)
|
26
|
+
and t.relkind = 'r'
|
27
|
+
and t.relname = 'archived_#{table_name}'
|
28
|
+
order by
|
29
|
+
t.relname,
|
30
|
+
i.relname
|
31
|
+
SQL
|
25
32
|
|
26
|
-
|
27
|
-
|
28
|
-
index.split("_on_").last
|
33
|
+
indexes = connection.select_all(index_query).collect do |r|
|
34
|
+
r["column_name"]
|
29
35
|
end
|
30
36
|
end
|
31
37
|
end
|
32
38
|
end
|
33
39
|
end
|
34
|
-
end
|
40
|
+
end
|
@@ -6,7 +6,7 @@ module ActsAsArchive
|
|
6
6
|
unless base.included_modules.include?(InstanceMethods)
|
7
7
|
base.send :extend, ClassMethods
|
8
8
|
base.send :include, InstanceMethods
|
9
|
-
|
9
|
+
|
10
10
|
if base.connection.class.to_s.include?('Mysql')
|
11
11
|
base.send :extend, ActsAsArchive::Base::Adapters::MySQL
|
12
12
|
elsif base.connection.class.to_s.include?('PostgreSQL')
|
@@ -63,6 +63,43 @@ module ActsAsArchive
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def archive_table_indexed_columns
|
70
|
+
case connection.class.to_s
|
71
|
+
when "ActiveRecord::ConnectionAdapters::MysqlAdapter"
|
72
|
+
index_query = "SHOW INDEX FROM archived_#{table_name}"
|
73
|
+
indexes = connection.select_all(index_query).collect do |r|
|
74
|
+
r["Column_name"]
|
75
|
+
end
|
76
|
+
when "ActiveRecord::ConnectionAdapters::PostgreSQLAdapter"
|
77
|
+
#postgresql is...slightly...more complicated
|
78
|
+
index_query = <<EOS
|
79
|
+
SELECT c2.relname as index_name
|
80
|
+
FROM pg_catalog.pg_class c,
|
81
|
+
pg_catalog.pg_class c2,
|
82
|
+
pg_catalog.pg_index i
|
83
|
+
WHERE c.oid = (SELECT c.oid
|
84
|
+
FROM pg_catalog.pg_class c
|
85
|
+
WHERE c.relname ~ '^(archived_#{table_name})$')
|
86
|
+
AND c.oid = i.indrelid
|
87
|
+
AND i.indexrelid = c2.oid
|
88
|
+
EOS
|
89
|
+
indexes = connection.select_all(index_query).collect do |r|
|
90
|
+
r["index_name"]
|
91
|
+
end
|
92
|
+
|
93
|
+
# HACK: reverse engineer the column name
|
94
|
+
# This sucks, but acts_as_archive only adds indexes on single columns anyway so it should work OK
|
95
|
+
# and getting the columns indexed is INCREDIBLY complicated in PostgreSQL.
|
96
|
+
indexes.map do |index|
|
97
|
+
index.split("_on_").last
|
98
|
+
end
|
99
|
+
else
|
100
|
+
raise "Unsupported Database"
|
101
|
+
end
|
102
|
+
end
|
66
103
|
end
|
67
104
|
|
68
105
|
module InstanceMethods
|
Binary file
|
data/require.rb
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
2
|
|
3
3
|
describe ActsAsArchive::Base::Table do
|
4
|
-
|
4
|
+
|
5
5
|
before(:all) do
|
6
6
|
establish_test_db
|
7
7
|
Article.create_archive_table
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
describe 'create_archive_table' do
|
11
|
-
|
11
|
+
|
12
12
|
before(:all) do
|
13
13
|
@article_columns = connection.columns("articles").collect(&:name)
|
14
14
|
@archive_columns = connection.columns("archived_articles").collect(&:name)
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
it "should create an archive table" do
|
18
18
|
connection.table_exists?("archived_articles").should == true
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it "should create an archive table with the same structure as the original table" do
|
22
22
|
@article_columns.each do |col|
|
23
23
|
@archive_columns.include?(col).should == true
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
it "should add a deleted_at column to the archive table" do
|
28
28
|
(@archive_columns - @article_columns).should == [ 'deleted_at' ]
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
describe 'create_archive_indexes' do
|
33
|
-
|
33
|
+
|
34
34
|
before(:all) do
|
35
35
|
Article.create_archive_indexes
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
it "should create archive indexes" do
|
39
|
-
indexes.should == [ "id", "deleted_at" ]
|
39
|
+
indexes.to_set.should == [ "id", "deleted_at" ].to_set
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
it "should destroy archive indexes" do
|
43
43
|
Article.class_eval { acts_as_archive }
|
44
44
|
Article.create_archive_indexes
|
45
45
|
indexes.should == []
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
describe 'migrate_from_acts_as_paranoid' do
|
50
|
-
|
50
|
+
|
51
51
|
before(:all) do
|
52
52
|
connection.add_column(:articles, :deleted_at, :datetime)
|
53
53
|
Article.reset_column_information
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
before(:each) do
|
57
57
|
connection.execute("DELETE FROM #{Article::Archive.table_name}")
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
it "should move deleted records to the archive" do
|
61
61
|
create_records(Article, :deleted_at => Time.now.utc)
|
62
62
|
Article.migrate_from_acts_as_paranoid
|
63
63
|
Article.count.should == 0
|
64
64
|
Article::Archive.count.should == 5
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
it "should not move non-deleted records to the archive" do
|
68
68
|
create_records
|
69
69
|
Article.migrate_from_acts_as_paranoid
|
@@ -71,4 +71,4 @@ describe ActsAsArchive::Base::Table do
|
|
71
71
|
Article::Archive.count.should == 0
|
72
72
|
end
|
73
73
|
end
|
74
|
-
end
|
74
|
+
end
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,10 @@ Require.spec_helper!
|
|
4
4
|
Spec::Runner.configure do |config|
|
5
5
|
end
|
6
6
|
|
7
|
+
def db_type
|
8
|
+
ENV['DB_TYPE'] ? ENV['DB_TYPE'] : 'mysql'
|
9
|
+
end
|
10
|
+
|
7
11
|
def article_match?(original, copy)
|
8
12
|
copy.id.should == original.id
|
9
13
|
copy.title.should == original.title
|
@@ -49,7 +53,7 @@ end
|
|
49
53
|
def establish_test_db
|
50
54
|
# Establish connection
|
51
55
|
unless ActiveRecord::Base.connected?
|
52
|
-
config = YAML::load(File.open("#{SPEC}/db/config/database.yml"))
|
56
|
+
config = YAML::load(File.open("#{SPEC}/db/config/database.#{db_type}.yml"))
|
53
57
|
ActiveRecord::Base.configurations = config
|
54
58
|
ActiveRecord::Base.establish_connection(config['test'])
|
55
59
|
end
|
@@ -80,4 +84,4 @@ def migrate_up(directory='migrate')
|
|
80
84
|
ActiveRecord::Migrator.migrate("#{SPEC}/db/#{directory}")
|
81
85
|
@new_article_columns = columns("articles")
|
82
86
|
@new_archive_columns = columns("archived_articles")
|
83
|
-
end
|
87
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_archive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Winton Welsh
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-21 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/acts_as_archive/migration.rb
|
43
43
|
- lib/acts_as_archive.rb
|
44
44
|
- MIT-LICENSE
|
45
|
+
- pkg/acts_as_archive-0.2.1.gem
|
45
46
|
- rails/init.rb
|
46
47
|
- Rakefile
|
47
48
|
- README.markdown
|
@@ -51,7 +52,8 @@ files:
|
|
51
52
|
- spec/acts_as_archive/base/table_spec.rb
|
52
53
|
- spec/acts_as_archive/base_spec.rb
|
53
54
|
- spec/acts_as_archive/migration_spec.rb
|
54
|
-
- spec/db/config/database.yml
|
55
|
+
- spec/db/config/database.mysql.yml
|
56
|
+
- spec/db/config/database.postgresql.yml
|
55
57
|
- spec/db/migrate/001_add_to_articles.rb
|
56
58
|
- spec/db/migrate_2/001_add_to_articles.rb
|
57
59
|
- spec/db/models/article.rb
|