acts_as_archive 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_archive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
5
11
  platform: ruby
6
12
  authors:
7
13
  - Winton Welsh
@@ -9,55 +15,130 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-05-07 00:00:00 -07:00
18
+ date: 2011-01-04 00:00:00 -08:00
13
19
  default_executable:
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
- name: require
22
+ name: also_migrate
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: 19
30
+ segments:
31
+ - 0
32
+ - 2
33
+ - 2
34
+ version: 0.2.2
17
35
  type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: mover
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - "="
44
+ - !ruby/object:Gem::Version
45
+ hash: 25
46
+ segments:
47
+ - 0
48
+ - 3
49
+ - 5
50
+ version: 0.3.5
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: active_wrapper-solo
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - "="
60
+ - !ruby/object:Gem::Version
61
+ hash: 13
62
+ segments:
63
+ - 0
64
+ - 4
65
+ - 1
66
+ version: 0.4.1
67
+ type: :development
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: externals
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
20
74
  requirements:
21
75
  - - "="
22
76
  - !ruby/object:Gem::Version
23
- version: 0.2.1
24
- version:
25
- description:
77
+ hash: 19
78
+ segments:
79
+ - 1
80
+ - 0
81
+ - 2
82
+ version: 1.0.2
83
+ type: :development
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: framework_fixture
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - "="
92
+ - !ruby/object:Gem::Version
93
+ hash: 29
94
+ segments:
95
+ - 0
96
+ - 1
97
+ - 3
98
+ version: 0.1.3
99
+ type: :development
100
+ version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ name: rake
103
+ prerelease: false
104
+ requirement: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ hash: 49
110
+ segments:
111
+ - 0
112
+ - 8
113
+ - 7
114
+ version: 0.8.7
115
+ type: :development
116
+ version_requirements: *id006
117
+ - !ruby/object:Gem::Dependency
118
+ name: rspec
119
+ prerelease: false
120
+ requirement: &id007 !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ hash: 15
126
+ segments:
127
+ - 1
128
+ - 0
129
+ version: "1.0"
130
+ type: :development
131
+ version_requirements: *id007
132
+ description: Don't delete your records, move them to a different table. Like acts_as_paranoid, but doesn't mess with your SQL queries.
26
133
  email: mail@wintoni.us
27
- executables:
28
- - acts_as_archive
134
+ executables: []
135
+
29
136
  extensions: []
30
137
 
31
- extra_rdoc_files:
32
- - README.markdown
33
- files:
34
- - bin/acts_as_archive
35
- - init.rb
36
- - lib/acts_as_archive/base/adapters/mysql.rb
37
- - lib/acts_as_archive/base/adapters/postgresql.rb
38
- - lib/acts_as_archive/base/destroy.rb
39
- - lib/acts_as_archive/base/restore.rb
40
- - lib/acts_as_archive/base/table.rb
41
- - lib/acts_as_archive/base.rb
42
- - lib/acts_as_archive/migration.rb
43
- - lib/acts_as_archive.rb
44
- - MIT-LICENSE
45
- - rails/init.rb
46
- - Rakefile
47
- - README.markdown
48
- - require.rb
49
- - spec/acts_as_archive/base/destroy_spec.rb
50
- - spec/acts_as_archive/base/restore_spec.rb
51
- - spec/acts_as_archive/base/table_spec.rb
52
- - spec/acts_as_archive/base_spec.rb
53
- - spec/acts_as_archive/migration_spec.rb
54
- - spec/db/config/database.mysql.yml
55
- - spec/db/config/database.postgresql.yml
56
- - spec/db/migrate/001_add_to_articles.rb
57
- - spec/db/migrate_2/001_add_to_articles.rb
58
- - spec/db/models/article.rb
59
- - spec/spec.opts
60
- - spec/spec_helper.rb
138
+ extra_rdoc_files: []
139
+
140
+ files: []
141
+
61
142
  has_rdoc: true
62
143
  homepage: http://github.com/winton/acts_as_archive
63
144
  licenses: []
@@ -68,21 +149,27 @@ rdoc_options: []
68
149
  require_paths:
69
150
  - lib
70
151
  required_ruby_version: !ruby/object:Gem::Requirement
152
+ none: false
71
153
  requirements:
72
154
  - - ">="
73
155
  - !ruby/object:Gem::Version
156
+ hash: 3
157
+ segments:
158
+ - 0
74
159
  version: "0"
75
- version:
76
160
  required_rubygems_version: !ruby/object:Gem::Requirement
161
+ none: false
77
162
  requirements:
78
163
  - - ">="
79
164
  - !ruby/object:Gem::Version
165
+ hash: 3
166
+ segments:
167
+ - 0
80
168
  version: "0"
81
- version:
82
169
  requirements: []
83
170
 
84
171
  rubyforge_project:
85
- rubygems_version: 1.3.5
172
+ rubygems_version: 1.3.7
86
173
  signing_key:
87
174
  specification_version: 3
88
175
  summary: Don't delete your records, move them to a different table
data/MIT-LICENSE DELETED
@@ -1,18 +0,0 @@
1
- Copyright (c) 2009 Winton Welsh
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of
4
- this software and associated documentation files (the "Software"), to deal in
5
- the Software without restriction, including without limitation the rights to
6
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
- the Software, and to permit persons to whom the Software is furnished to do so,
8
- subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in all
11
- copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown DELETED
@@ -1,119 +0,0 @@
1
- ActsAsArchive
2
- =============
3
-
4
- Don't delete your records, move them to a different table.
5
-
6
- Like <code>acts\_as\_paranoid</code>, but doesn't mess with your SQL queries.
7
-
8
- Install
9
- -------
10
-
11
- <pre>
12
- sudo gem install acts_as_archive
13
- </pre>
14
-
15
- **environment.rb**:
16
-
17
- <pre>
18
- config.gem 'acts_as_archive'
19
- </pre>
20
-
21
- Update models
22
- -------------
23
-
24
- Add <code>acts\_as\_archive</code> to your models:
25
-
26
- <pre>
27
- class Article < ActiveRecord::Base
28
- acts_as_archive
29
- end
30
- </pre>
31
-
32
- <a name="create_archive_tables"></a>
33
-
34
- Create archive tables
35
- ---------------------
36
-
37
- Add this line to a migration:
38
-
39
- <pre>
40
- ActsAsArchive.update Article, Comment
41
- </pre>
42
-
43
- Replace <code>Article, Comment</code> with your own models that use <code>acts_as_archive</code>.
44
-
45
- Archive tables mirror your table's structure, but with an additional <code>deleted_at</code> column.
46
-
47
- There is an [alternate way to create archive tables](http://wiki.github.com/winton/acts_as_archive/alternatives-to-migrations) if you don't like migrations.
48
-
49
- That's it!
50
- ----------
51
-
52
- Use <code>destroy</code>, <code>delete</code>, and <code>delete_all</code> like you normally would.
53
-
54
- Records move into the archive table instead of being destroyed.
55
-
56
- What if my schema changes?
57
- --------------------------
58
-
59
- New migrations are automatically applied to the archive table.
60
-
61
- No action is necessary on your part.
62
-
63
- Query the archive
64
- -----------------
65
-
66
- Add <code>::Archive</code> to your ActiveRecord class:
67
-
68
- <pre>
69
- Article::Archive.find(:first)
70
- </pre>
71
-
72
- Restore from the archive
73
- ------------------------
74
-
75
- Use <code>restore\_all</code> to copy archived records back to your table:
76
-
77
- <pre>
78
- Article.restore_all([ 'id = ?', 1 ])
79
- </pre>
80
-
81
- Auto-migrate from acts\_as\_paranoid
82
- ------------------------------------
83
-
84
- If you previously used <code>acts\_as\_paranoid</code>, the <code>ActsAsArchive.update</code>
85
- call will automatically move your deleted records to the archive table
86
- (see <a href="#create_archive_tables">_Create archive tables_</a>).
87
-
88
- Original <code>deleted_at</code> values are preserved.
89
-
90
- Add indexes to the archive table
91
- --------------------------------
92
-
93
- To keep insertions fast, there are no indexes on your archive table by default.
94
-
95
- If you are querying your archive a lot, you will want to add indexes:
96
-
97
- <pre>
98
- class Article < ActiveRecord::Base
99
- acts_as_archive :indexes => [ :id, :created_at, :deleted_at ]
100
- end
101
- </pre>
102
-
103
- Call <code>ActsAsArchive.update</code> upon adding new indexes
104
- (see <a href="#create_archive_tables">_Create archive tables_</a>).
105
-
106
- Delete records without archiving
107
- --------------------------------
108
-
109
- To destroy a record without archiving:
110
-
111
- <pre>
112
- article.destroy!
113
- </pre>
114
-
115
- To delete multiple records without archiving:
116
-
117
- <pre>
118
- Article.delete_all!(["id in (?)", [1,2,3]])
119
- </pre>
data/Rakefile DELETED
@@ -1,9 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/require"
2
- Require.rakefile!
3
-
4
- desc "Generate gemspec"
5
- task :gemspec do
6
- File.open("#{Rake.original_dir}/acts_as_archive.gemspec", 'w') do |f|
7
- f.write(Require.gemspec.to_ruby)
8
- end
9
- end
data/bin/acts_as_archive DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env ruby
2
- puts `script/runner "ActsAsArchive.update #{ARGV.join ', '}"`
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require File.dirname(__FILE__) + "/rails/init"
@@ -1,19 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../require")
2
- Require.lib!
3
-
4
- module ActsAsArchive
5
-
6
- def self.update(*models)
7
- models.each do |klass|
8
- if klass.respond_to?(:acts_as_archive?) && klass.acts_as_archive?
9
- time = Benchmark.measure do
10
- klass.create_archive_table
11
- klass.migrate_from_acts_as_paranoid
12
- klass.create_archive_indexes
13
- end
14
- $stdout.puts "-- ActsAsArchive.update(#{models.join(', ')})"
15
- $stdout.puts " -> #{"%.4fs" % time.real}"
16
- end
17
- end
18
- end
19
- end
@@ -1,31 +0,0 @@
1
- module ActsAsArchive
2
-
3
- module Base
4
- def self.included(base)
5
- base.extend ActMethods
6
- end
7
-
8
- module ActMethods
9
- def acts_as_archive(options={})
10
- class_eval <<-end_eval
11
-
12
- def self.acts_as_archive?
13
- self.to_s == #{self.to_s.inspect}
14
- end
15
-
16
- def self.archive_indexes
17
- #{Array(options[:indexes]).collect(&:to_s).inspect}
18
- end
19
-
20
- class Archive < ActiveRecord::Base
21
- self.record_timestamps = false
22
- self.table_name = "archived_#{self.table_name}"
23
- end
24
- end_eval
25
- include Destroy
26
- include Restore
27
- include Table
28
- end
29
- end
30
- end
31
- end
@@ -1,17 +0,0 @@
1
- module ActsAsArchive
2
- module Base
3
- module Adapters
4
- module MySQL
5
-
6
- private
7
-
8
- def archive_table_indexed_columns
9
- index_query = "SHOW INDEX FROM archived_#{table_name}"
10
- indexes = connection.select_all(index_query).collect do |r|
11
- r["Column_name"]
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,40 +0,0 @@
1
- module ActsAsArchive
2
- module Base
3
- module Adapters
4
- module PostgreSQL
5
-
6
- private
7
-
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
11
- index_query = <<-SQL
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
32
-
33
- indexes = connection.select_all(index_query).collect do |r|
34
- r["column_name"]
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,71 +0,0 @@
1
- module ActsAsArchive
2
- module Base
3
- module Destroy
4
-
5
- def self.included(base)
6
- unless base.included_modules.include?(InstanceMethods)
7
- base.class_eval do
8
- alias_method :destroy_without_callbacks!, :destroy_without_callbacks
9
- class <<self
10
- alias_method :delete_all!, :delete_all
11
- end
12
- end
13
- base.send :extend, ClassMethods
14
- base.send :include, InstanceMethods
15
- end
16
- end
17
-
18
- module ClassMethods
19
- def copy_to_archive(conditions, import=false)
20
- add_conditions!(where = '', conditions)
21
- insert_cols = column_names.clone
22
- select_cols = column_names.clone
23
- if insert_cols.include?('deleted_at')
24
- unless import
25
- select_cols[select_cols.index('deleted_at')] = "'#{Time.now.utc.to_s(:db)}'"
26
- end
27
- else
28
- insert_cols << 'deleted_at'
29
- select_cols << "'#{Time.now.utc.to_s(:db)}'"
30
- end
31
-
32
- insert_cols.map! { |col| connection.quote_column_name(col) }
33
- select_cols.map! { |col| col =~ /^\'/ ? col : connection.quote_column_name(col) }
34
-
35
- connection.execute(%{
36
- INSERT INTO archived_#{table_name} (#{insert_cols.join(', ')})
37
- SELECT #{select_cols.join(', ')}
38
- FROM #{table_name}
39
- #{where}
40
- })
41
- connection.execute("DELETE FROM #{table_name} #{where}")
42
- end
43
-
44
- def delete_all(conditions=nil)
45
- copy_to_archive(conditions)
46
- end
47
- end
48
-
49
- module InstanceMethods
50
- def destroy_without_callbacks
51
- unless new_record?
52
- self.class.copy_to_archive("#{self.class.primary_key} = #{id}")
53
- end
54
- @destroyed = true
55
- freeze
56
- end
57
-
58
- def destroy!
59
- transaction { destroy_with_callbacks! }
60
- end
61
-
62
- def destroy_with_callbacks!
63
- return false if callback(:before_destroy) == false
64
- result = destroy_without_callbacks!
65
- callback(:after_destroy)
66
- result
67
- end
68
- end
69
- end
70
- end
71
- end
@@ -1,36 +0,0 @@
1
- module ActsAsArchive
2
- module Base
3
- module Restore
4
-
5
- def self.included(base)
6
- unless base.included_modules.include?(InstanceMethods)
7
- base.send :extend, ClassMethods
8
- base.send :include, InstanceMethods
9
- end
10
- end
11
-
12
- module ClassMethods
13
-
14
- def copy_from_archive(conditions)
15
- add_conditions!(where = '', conditions)
16
- col_names = column_names - [ 'deleted_at' ]
17
- col_names.map! { |col| connection.quote_column_name(col) }
18
- connection.execute(%{
19
- INSERT INTO #{table_name} (#{col_names.join(', ')})
20
- SELECT #{col_names.join(', ')}
21
- FROM archived_#{table_name}
22
- #{where}
23
- })
24
- connection.execute("DELETE FROM archived_#{table_name} #{where}")
25
- end
26
-
27
- def restore_all(conditions=nil)
28
- copy_from_archive(conditions)
29
- end
30
- end
31
-
32
- module InstanceMethods
33
- end
34
- end
35
- end
36
- end
@@ -1,109 +0,0 @@
1
- module ActsAsArchive
2
- module Base
3
- module Table
4
-
5
- def self.included(base)
6
- unless base.included_modules.include?(InstanceMethods)
7
- base.send :extend, ClassMethods
8
- base.send :include, InstanceMethods
9
-
10
- if base.connection.class.to_s.include?('Mysql')
11
- base.send :extend, ActsAsArchive::Base::Adapters::MySQL
12
- elsif base.connection.class.to_s.include?('PostgreSQL')
13
- base.send :extend, ActsAsArchive::Base::Adapters::PostgreSQL
14
- else
15
- raise 'acts_as_archive does not support this database adapter'
16
- end
17
- end
18
- end
19
-
20
- module ClassMethods
21
-
22
- def archive_table_exists?
23
- connection.table_exists?("archived_#{table_name}")
24
- end
25
-
26
- def create_archive_table
27
- if table_exists? && !archive_table_exists?
28
- connection.execute(%{
29
- CREATE TABLE archived_#{table_name}
30
- #{"ENGINE=InnoDB" if connection.class.to_s.include?('Mysql')}
31
- AS SELECT * from #{table_name}
32
- WHERE false;
33
- })
34
- columns = connection.columns("archived_#{table_name}").collect(&:name)
35
- unless columns.include?('deleted_at')
36
- connection.add_column("archived_#{table_name}", :deleted_at, :datetime)
37
- end
38
- end
39
- end
40
-
41
- def create_archive_indexes
42
- if archive_table_exists?
43
- indexes = archive_table_indexed_columns
44
-
45
- (archive_indexes - indexes).each do |index|
46
- connection.add_index("archived_#{table_name}", index)
47
- end
48
- (indexes - archive_indexes).each do |index|
49
- connection.remove_index("archived_#{table_name}", index)
50
- end
51
- end
52
- end
53
-
54
-
55
- def migrate_from_acts_as_paranoid
56
- if column_names.include?('deleted_at')
57
- if table_exists? && archive_table_exists?
58
- condition = "deleted_at IS NOT NULL"
59
- if self.count_by_sql("SELECT COUNT(*) FROM #{table_name} WHERE #{condition}") > 0
60
- # Base::Destroy.copy_to_archive
61
- copy_to_archive(condition, true)
62
- end
63
- end
64
- end
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
103
- end
104
-
105
- module InstanceMethods
106
- end
107
- end
108
- end
109
- end
@@ -1,49 +0,0 @@
1
- module ActsAsArchive
2
- module Migration
3
-
4
- def self.included(base)
5
- unless base.included_modules.include?(InstanceMethods)
6
- base.send :extend, ClassMethods
7
- base.class_eval do
8
- class <<self
9
- unless method_defined?(:method_missing_without_archive)
10
- alias_method :method_missing_without_archive, :method_missing
11
- alias_method :method_missing, :method_missing_with_archive
12
- end
13
- end
14
- end
15
- end
16
- end
17
-
18
- module ClassMethods
19
-
20
- def method_missing_with_archive(method, *arguments, &block)
21
- args = Marshal.load(Marshal.dump(arguments))
22
- method_missing_without_archive(method, *arguments, &block)
23
- supported = [
24
- :add_column, :add_timestamps, :change_column,
25
- :change_column_default, :change_table,
26
- :drop_table, :remove_column, :remove_columns,
27
- :remove_timestamps, :rename_column, :rename_table
28
- ]
29
- if args.include?(:deleted_at) || args.include?('deleted_at')
30
- # Don't change the archive's deleted_at column
31
- return
32
- end
33
- if !args.empty? && supported.include?(method)
34
- connection = ActiveRecord::Base.connection
35
- args[0] = "archived_" + ActiveRecord::Migrator.proper_table_name(args[0])
36
- if method == :rename_table
37
- args[1] = "archived_" + args[1].to_s
38
- end
39
- if connection.table_exists?(args[0])
40
- connection.send(method, *args, &block)
41
- end
42
- end
43
- end
44
- end
45
-
46
- module InstanceMethods
47
- end
48
- end
49
- end
data/rails/init.rb DELETED
@@ -1,5 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../require")
2
- Require.rails_init!
3
-
4
- ActiveRecord::Base.send(:include, ActsAsArchive::Base)
5
- ActiveRecord::Migration.send(:include, ActsAsArchive::Migration)
data/require.rb DELETED
@@ -1,49 +0,0 @@
1
- require 'rubygems'
2
- gem 'require'
3
- require 'require'
4
-
5
- Require do
6
- gem(:activerecord) { require 'active_record' }
7
- gem :require, '=0.2.1'
8
- gem(:rake, '=0.8.7') { require 'rake' }
9
- gem :rspec, '=1.3.0'
10
-
11
- gemspec do
12
- author 'Winton Welsh'
13
- dependencies do
14
- gem :require
15
- end
16
- email 'mail@wintoni.us'
17
- name 'acts_as_archive'
18
- homepage "http://github.com/winton/#{name}"
19
- summary "Don't delete your records, move them to a different table"
20
- version '0.2.5'
21
- end
22
-
23
- lib do
24
- require "lib/acts_as_archive/base"
25
- require "lib/acts_as_archive/base/adapters/mysql"
26
- require "lib/acts_as_archive/base/adapters/postgresql"
27
- require "lib/acts_as_archive/base/destroy"
28
- require "lib/acts_as_archive/base/restore"
29
- require "lib/acts_as_archive/base/table"
30
- require "lib/acts_as_archive/migration"
31
- end
32
-
33
- rails_init { require 'lib/acts_as_archive' }
34
-
35
- rakefile do
36
- gem(:rake) { require 'rake/gempackagetask' }
37
- gem(:rspec) { require 'spec/rake/spectask' }
38
- require 'require/tasks'
39
- end
40
-
41
- spec_helper do
42
- require 'require/spec_helper'
43
- gem :activerecord
44
- require 'logger'
45
- require 'yaml'
46
- require 'pp'
47
- require 'rails/init'
48
- end
49
- end
@@ -1,117 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
-
3
- describe ActsAsArchive::Base::Destroy do
4
-
5
- before(:all) do
6
- establish_test_db
7
- Article.create_archive_table
8
- end
9
-
10
- describe 'delete_all!' do
11
-
12
- before(:all) do
13
- create_records
14
- end
15
-
16
- it "should really delete all records" do
17
- Article.delete_all!
18
- Article.count.should == 0
19
- Article::Archive.count.should == 0
20
- end
21
-
22
- end
23
-
24
- describe 'destroy!' do
25
-
26
- before(:all) do
27
- create_records
28
- @article = Article.first
29
- end
30
-
31
- it "should really destroy a records" do
32
- @article.destroy!
33
- Article::Archive.count.should == 0
34
- end
35
-
36
- end
37
-
38
- describe 'delete_all' do
39
-
40
- before(:all) do
41
- @articles = create_records
42
- end
43
-
44
- describe 'with conditions' do
45
-
46
- before(:all) do
47
- # Mini delete_all parameter test
48
- Article.delete_all [ 'id = ?', @articles[0].id ]
49
- Article.delete_all "id = #{@articles[1].id}"
50
- end
51
-
52
- it "should move some records to the archive table" do
53
- Article.count.should == 3
54
- Article::Archive.count.should == 2
55
- end
56
-
57
- it "should preserve record attributes" do
58
- 2.times do |x|
59
- original = @articles[x]
60
- copy = Article::Archive.find(original.id)
61
- article_match?(original, copy)
62
- end
63
- end
64
- end
65
-
66
- describe 'without conditions' do
67
-
68
- before(:all) do
69
- Article.delete_all
70
- end
71
-
72
- it "should move all records to the archive table" do
73
- Article.count.should == 0
74
- Article::Archive.count.should == 5
75
- end
76
-
77
- it "should preserve record attributes" do
78
- 5.times do |x|
79
- original = @articles[x]
80
- copy = Article::Archive.find(original.id)
81
- article_match?(original, copy)
82
- end
83
- end
84
- end
85
- end
86
-
87
- [ :destroy, :delete ].each do |d|
88
-
89
- describe d do
90
-
91
- before(:all) do
92
- @articles = create_records
93
- Article.find(@articles[0..1].collect(&:id)).each do |a|
94
- a.send(d)
95
- end
96
- end
97
-
98
- it "should move some records to the archive table" do
99
- Article.count.should == 3
100
- Article::Archive.count.should == 2
101
- end
102
-
103
- it "should preserve record attributes" do
104
- 2.times do |x|
105
- original = @articles[x]
106
- copy = Article::Archive.find(original.id)
107
- article_match?(original, copy)
108
- end
109
- end
110
-
111
- it "should mark the object as destroyed" do
112
- @articles[3].send(d)
113
- @articles[3].destroyed?.should == true
114
- end
115
- end
116
- end
117
- end
@@ -1,58 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
-
3
- describe ActsAsArchive::Base::Restore do
4
-
5
- before(:all) do
6
- establish_test_db
7
- Article.create_archive_table
8
- end
9
-
10
- describe 'restore_all' do
11
-
12
- before(:all) do
13
- @articles = create_records(Article::Archive)
14
- end
15
-
16
- describe 'with conditions' do
17
-
18
- before(:all) do
19
- # Mini restore parameter test
20
- Article.restore_all [ 'id = ?', @articles[0].id ]
21
- Article.restore_all "id = #{@articles[1].id}"
22
- end
23
-
24
- it "should move some records to the article table" do
25
- Article::Archive.count.should == 3
26
- Article.count.should == 2
27
- end
28
-
29
- it "should preserve record attributes" do
30
- 2.times do |x|
31
- original = @articles[x]
32
- copy = Article.find(original.id)
33
- article_match?(original, copy)
34
- end
35
- end
36
- end
37
-
38
- describe 'without conditions' do
39
-
40
- before(:all) do
41
- Article.restore_all
42
- end
43
-
44
- it "should move all records to the archive table" do
45
- Article::Archive.count.should == 0
46
- Article.count.should == 5
47
- end
48
-
49
- it "should preserve record attributes" do
50
- 5.times do |x|
51
- original = @articles[x]
52
- copy = Article.find(original.id)
53
- article_match?(original, copy)
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,74 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
-
3
- describe ActsAsArchive::Base::Table do
4
-
5
- before(:all) do
6
- establish_test_db
7
- Article.create_archive_table
8
- end
9
-
10
- describe 'create_archive_table' do
11
-
12
- before(:all) do
13
- @article_columns = connection.columns("articles").collect(&:name)
14
- @archive_columns = connection.columns("archived_articles").collect(&:name)
15
- end
16
-
17
- it "should create an archive table" do
18
- connection.table_exists?("archived_articles").should == true
19
- end
20
-
21
- it "should create an archive table with the same structure as the original table" do
22
- @article_columns.each do |col|
23
- @archive_columns.include?(col).should == true
24
- end
25
- end
26
-
27
- it "should add a deleted_at column to the archive table" do
28
- (@archive_columns - @article_columns).should == [ 'deleted_at' ]
29
- end
30
- end
31
-
32
- describe 'create_archive_indexes' do
33
-
34
- before(:all) do
35
- Article.create_archive_indexes
36
- end
37
-
38
- it "should create archive indexes" do
39
- indexes.to_set.should == [ "id", "deleted_at" ].to_set
40
- end
41
-
42
- it "should destroy archive indexes" do
43
- Article.class_eval { acts_as_archive }
44
- Article.create_archive_indexes
45
- indexes.should == []
46
- end
47
- end
48
-
49
- describe 'migrate_from_acts_as_paranoid' do
50
-
51
- before(:all) do
52
- connection.add_column(:articles, :deleted_at, :datetime)
53
- Article.reset_column_information
54
- end
55
-
56
- before(:each) do
57
- connection.execute("DELETE FROM #{Article::Archive.table_name}")
58
- end
59
-
60
- it "should move deleted records to the archive" do
61
- create_records(Article, :deleted_at => Time.now.utc)
62
- Article.migrate_from_acts_as_paranoid
63
- Article.count.should == 0
64
- Article::Archive.count.should == 5
65
- end
66
-
67
- it "should not move non-deleted records to the archive" do
68
- create_records
69
- Article.migrate_from_acts_as_paranoid
70
- Article.count.should == 5
71
- Article::Archive.count.should == 0
72
- end
73
- end
74
- end
@@ -1,24 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
-
3
- describe ActsAsArchive::Base do
4
-
5
- before(:all) do
6
- establish_test_db
7
- end
8
-
9
- describe 'acts_as_archive' do
10
-
11
- it "should add self.acts_as_archive? to the model" do
12
- Article.respond_to?(:acts_as_archive?).should == true
13
- end
14
-
15
- it "should add self.archive_indexes to the model" do
16
- Article.respond_to?(:archive_indexes).should == true
17
- Article.archive_indexes.should == [ 'id', 'deleted_at' ]
18
- end
19
-
20
- it "should add Archive class to the model" do
21
- defined?(Article::Archive).should == "constant"
22
- end
23
- end
24
- end
@@ -1,37 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe ActsAsArchive::Migration do
4
-
5
- before(:each) do
6
- establish_test_db
7
- Article.create_archive_table
8
- end
9
-
10
- describe 'method_missing_with_archive' do
11
-
12
- it 'should migrate both tables up' do
13
- migrate_up
14
- (@new_article_columns - @old_article_columns).should == [ 'permalink' ]
15
- (@new_archive_columns - @old_archive_columns).should == [ 'permalink' ]
16
- end
17
-
18
- it 'should migrate both tables down' do
19
- migrate_up
20
- @old_article_columns = @new_article_columns
21
- @old_archive_columns = @new_archive_columns
22
- ActiveRecord::Migrator.migrate("#{SPEC}/db/migrate", 0)
23
- @new_article_columns = columns("articles")
24
- @new_archive_columns = columns("archived_articles")
25
- (@old_article_columns - @new_article_columns).should == [ 'permalink' ]
26
- (@old_archive_columns - @new_archive_columns).should == [ 'permalink' ]
27
- end
28
-
29
- it "should not touch the archive's deleted_at column" do
30
- connection.add_column(:articles, :deleted_at, :datetime)
31
- Article.reset_column_information
32
- migrate_up("migrate_2")
33
- (@old_article_columns - @new_article_columns).should == [ 'deleted_at' ]
34
- (@old_archive_columns - @new_archive_columns).should == []
35
- end
36
- end
37
- end
@@ -1,6 +0,0 @@
1
- test:
2
- adapter: mysql
3
- database: acts_as_archive
4
- username: root
5
- password:
6
- host: localhost
@@ -1,6 +0,0 @@
1
- test:
2
- adapter: postgresql
3
- database: acts_as_archive
4
- username: postgres
5
- password:
6
- host: localhost
@@ -1,9 +0,0 @@
1
- class AddToArticles < ActiveRecord::Migration
2
- def self.up
3
- add_column :articles, :permalink, :string
4
- end
5
-
6
- def self.down
7
- remove_column :articles, :permalink
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class AddToArticles < ActiveRecord::Migration
2
- def self.up
3
- remove_column :articles, :deleted_at
4
- end
5
-
6
- def self.down
7
- add_column :articles, :deleted_at, :string
8
- end
9
- end
@@ -1,3 +0,0 @@
1
- class Article < ActiveRecord::Base
2
- acts_as_archive :indexes => [ :id, :deleted_at ]
3
- end
data/spec/spec.opts DELETED
@@ -1 +0,0 @@
1
- --color
data/spec/spec_helper.rb DELETED
@@ -1,88 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../require")
2
- Require.spec_helper!
3
-
4
- Spec::Runner.configure do |config|
5
- end
6
-
7
- def db_type
8
- ENV['DB_TYPE'] ? ENV['DB_TYPE'] : 'mysql'
9
- end
10
-
11
- def article_match?(original, copy)
12
- copy.id.should == original.id
13
- copy.title.should == original.title
14
- copy.body.should == original.body
15
- if copy.respond_to?(:deleted_at)
16
- copy.deleted_at.strftime('%j%H%M').should == Time.now.utc.strftime('%j%H%M')
17
- end
18
- end
19
-
20
- def columns(table)
21
- connection.columns(table).collect(&:name)
22
- end
23
-
24
- def connection
25
- ActiveRecord::Base.connection
26
- end
27
-
28
- def create_records(klass=Article, values={})
29
- articles = []
30
- table = klass.table_name
31
- cols = columns(table)
32
- connection.execute("DELETE FROM #{table}")
33
- (1..5).collect do |x|
34
- vals = cols.collect do |c|
35
- if values.keys.include?(c.intern)
36
- values[c.intern] ? "'#{values[c.intern]}'" : "NULL"
37
- else
38
- case c.intern
39
- when :id; x
40
- when :deleted_at; 'NULL'
41
- else "'#{c.capitalize} #{x}'"
42
- end
43
- end
44
- end
45
- connection.execute(%{
46
- INSERT INTO #{table} (#{cols.collect { |c| "#{connection.quote_column_name(c)}" }.join(', ')})
47
- VALUES (#{vals.join(', ')})
48
- })
49
- klass.find(x)
50
- end
51
- end
52
-
53
- def establish_test_db
54
- # Establish connection
55
- unless ActiveRecord::Base.connected?
56
- config = YAML::load(File.open("#{SPEC}/db/config/database.#{db_type}.yml"))
57
- ActiveRecord::Base.configurations = config
58
- ActiveRecord::Base.establish_connection(config['test'])
59
- end
60
- # Establish logger
61
- logger_file = File.open("#{SPEC}/db/log/test.log", 'a')
62
- logger_file.sync = true
63
- @logger = Logger.new(logger_file)
64
- ActiveRecord::Base.logger = @logger
65
- # The database should have only a simple articles table
66
- connection.execute("DROP TABLE IF EXISTS articles")
67
- connection.execute("DROP TABLE IF EXISTS archived_articles")
68
- connection.execute("DROP TABLE IF EXISTS schema_migrations")
69
- connection.create_table(:articles) do |t|
70
- t.string :title
71
- t.string :body
72
- t.boolean :read # break mysql w/o quotation
73
- end
74
- # Load the model
75
- load "#{SPEC}/db/models/article.rb"
76
- end
77
-
78
- def indexes
79
- Article.send(:archive_table_indexed_columns)
80
- end
81
-
82
- def migrate_up(directory='migrate')
83
- @old_article_columns = columns("articles")
84
- @old_archive_columns = columns("archived_articles")
85
- ActiveRecord::Migrator.migrate("#{SPEC}/db/#{directory}")
86
- @new_article_columns = columns("articles")
87
- @new_archive_columns = columns("archived_articles")
88
- end