acts_as_archive 0.3.1 → 0.3.2
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/.gitignore +9 -0
- data/LICENSE +18 -0
- data/README.md +112 -0
- data/Rakefile +90 -0
- data/acts_as_archive.gemspec +32 -0
- data/bin/acts_as_archive +2 -0
- data/config/externals.yml +12 -0
- data/config/gemsets.yml +10 -0
- data/config/gemspec.yml +17 -0
- data/init.rb +1 -0
- data/lib/acts_as_archive.rb +192 -0
- data/lib/acts_as_archive/gems.rb +154 -0
- data/rails/init.rb +1 -0
- data/spec/Rakefile +9 -0
- data/spec/acts_as_archive/gems_spec.rb +249 -0
- data/spec/acts_as_archive_spec.rb +113 -0
- data/spec/fixtures/config/database.yml.example +6 -0
- data/spec/fixtures/db/migrate/001_belongs_tos.rb +14 -0
- data/spec/fixtures/db/migrate/002_records.rb +15 -0
- data/spec/fixtures/db/migrate/003_has_ones.rb +15 -0
- data/spec/fixtures/db/migrate/004_has_manies.rb +15 -0
- data/spec/fixtures/db/migrate/005_has_many_through_throughs.rb +16 -0
- data/spec/fixtures/db/migrate/006_has_many_throughs.rb +14 -0
- data/spec/fixtures/db/migrate/007_has_one_through_throughs.rb +15 -0
- data/spec/fixtures/db/migrate/008_has_one_throughs.rb +15 -0
- data/spec/fixtures/frameworks.yml +36 -0
- data/spec/fixtures/frameworks/rails2/application_controller.rb +58 -0
- data/spec/fixtures/frameworks/rails2/database.yml +12 -0
- data/spec/fixtures/frameworks/rails2/init.rb +1 -0
- data/spec/fixtures/frameworks/rails2/routes.rb +46 -0
- data/spec/fixtures/frameworks/rails3/Gemfile +34 -0
- data/spec/fixtures/frameworks/rails3/application_controller.rb +51 -0
- data/spec/fixtures/frameworks/rails3/database.yml +12 -0
- data/spec/fixtures/frameworks/rails3/routes.rb +60 -0
- data/spec/fixtures/frameworks/sinatra/application.rb +58 -0
- data/spec/fixtures/gemsets.yml +9 -0
- data/spec/fixtures/gemspec.yml +15 -0
- data/spec/fixtures/helpers/spec_helper.rb +210 -0
- data/spec/fixtures/models/belongs_to.rb +6 -0
- data/spec/fixtures/models/has_many.rb +6 -0
- data/spec/fixtures/models/has_many_through.rb +7 -0
- data/spec/fixtures/models/has_many_through_through.rb +7 -0
- data/spec/fixtures/models/has_one.rb +6 -0
- data/spec/fixtures/models/has_one_through.rb +6 -0
- data/spec/fixtures/models/has_one_through_through.rb +7 -0
- data/spec/fixtures/models/record.rb +16 -0
- data/spec/run +27 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +73 -0
- metadata +96 -13
    
        data/.gitignore
    ADDED
    
    
    
        data/LICENSE
    ADDED
    
    | @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            Copyright (c) 2010
         | 
| 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.md
    ADDED
    
    | @@ -0,0 +1,112 @@ | |
| 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 | 
            +
            gem install acts_as_archive
         | 
| 13 | 
            +
            </pre>
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            ### Rails 2
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            #### config/environment.rb
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            <pre>
         | 
| 20 | 
            +
            config.gem 'acts_as_archive'
         | 
| 21 | 
            +
            </pre>
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            ### Rails 3
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            #### Gemfile
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            <pre>
         | 
| 28 | 
            +
            gem 'acts_as_archive'
         | 
| 29 | 
            +
            </pre>
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            ### Sinatra
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            <pre>
         | 
| 34 | 
            +
            require 'acts_as_archive'
         | 
| 35 | 
            +
            </pre>
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            Add to models
         | 
| 38 | 
            +
            -------------
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            Add <code>acts\_as\_archive</code> to your models:
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            <pre>
         | 
| 43 | 
            +
            class Article < ActiveRecord::Base
         | 
| 44 | 
            +
              acts_as_archive
         | 
| 45 | 
            +
            end
         | 
| 46 | 
            +
            </pre>
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            Migrate
         | 
| 49 | 
            +
            -------
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            Next time you run <code>rake db:migrate</code>, your archive tables will be created automatically.
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            That's it!
         | 
| 54 | 
            +
            ----------
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            Use <code>destroy</code>, <code>destroy\_all</code>, <code>delete</code>, and <code>delete_all</code> like you normally would.
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            Records move into the archive table instead of being destroyed.
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            What if my schema changes?
         | 
| 61 | 
            +
            --------------------------
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            New migrations are automatically applied to the archive table.
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            No action is necessary on your part.
         | 
| 66 | 
            +
             | 
| 67 | 
            +
            Query the archive
         | 
| 68 | 
            +
            -----------------
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            Add <code>::Archive</code> to your ActiveRecord class:
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            <pre>
         | 
| 73 | 
            +
            Article::Archive.first
         | 
| 74 | 
            +
            </pre>
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            Delete records without archiving
         | 
| 77 | 
            +
            --------------------------------
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            Use any of the destroy methods, but add a bang (!):
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            <pre>
         | 
| 82 | 
            +
            Article::Archive.find(:first).destroy!
         | 
| 83 | 
            +
            Article.delete_all!([ "id in (?)", [ 1, 2, 3 ] ])
         | 
| 84 | 
            +
            </pre>
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            Restore from the archive
         | 
| 87 | 
            +
            ------------------------
         | 
| 88 | 
            +
             | 
| 89 | 
            +
            Use any of the destroy/delete methods on the archived record to move it back to its original table:
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            <pre>
         | 
| 92 | 
            +
            Article::Archive.first.destroy
         | 
| 93 | 
            +
            Article::Archive.delete_all([ "id in (?)", [ 1, 2, 3 ] ])
         | 
| 94 | 
            +
            </pre>
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            Magic columns
         | 
| 97 | 
            +
            -------------
         | 
| 98 | 
            +
             | 
| 99 | 
            +
            You will find an extra <code>deleted_at</code> datetime column on the archive table.
         | 
| 100 | 
            +
             | 
| 101 | 
            +
            You may manually add a <code>restored_at</code> datetime column to the origin table if you wish to store restoration time as well.
         | 
| 102 | 
            +
             | 
| 103 | 
            +
            Migrate from acts\_as\_paranoid
         | 
| 104 | 
            +
            -------------------------------
         | 
| 105 | 
            +
             | 
| 106 | 
            +
            Add this line to a migration, or run it via <code>script/console</code>:
         | 
| 107 | 
            +
             | 
| 108 | 
            +
            <pre>
         | 
| 109 | 
            +
            Article.migrate_from_acts_as_paranoid
         | 
| 110 | 
            +
            </pre>
         | 
| 111 | 
            +
             | 
| 112 | 
            +
            This copies all records with non-null <code>deleted_at</code> values to the archive.
         | 
    
        data/Rakefile
    ADDED
    
    | @@ -0,0 +1,90 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/lib/acts_as_archive/gems'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ActsAsArchive::Gems.activate %w(rake rspec)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'rake'
         | 
| 6 | 
            +
            require 'spec/rake/spectask'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            def gemspec
         | 
| 9 | 
            +
              @gemspec ||= begin
         | 
| 10 | 
            +
                file = File.expand_path('../acts_as_archive.gemspec', __FILE__)
         | 
| 11 | 
            +
                eval(File.read(file), binding, file)
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            if defined?(Spec::Rake::SpecTask)
         | 
| 16 | 
            +
              desc "Run specs"
         | 
| 17 | 
            +
              Spec::Rake::SpecTask.new do |t|
         | 
| 18 | 
            +
                t.spec_files = FileList['spec/**/*_spec.rb']
         | 
| 19 | 
            +
                t.spec_opts = %w(-fs --color)
         | 
| 20 | 
            +
                t.warning = true
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
              task :spec
         | 
| 23 | 
            +
              task :default => :spec
         | 
| 24 | 
            +
            end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            desc "Build gem(s)"
         | 
| 27 | 
            +
            task :gem do
         | 
| 28 | 
            +
              old_gemset = ENV['GEMSET']
         | 
| 29 | 
            +
              root = File.expand_path('../', __FILE__)
         | 
| 30 | 
            +
              pkg = "#{root}/pkg"
         | 
| 31 | 
            +
              system "rm -Rf #{pkg}"
         | 
| 32 | 
            +
              ActsAsArchive::Gems.gemset_names.each do |gemset|
         | 
| 33 | 
            +
                ENV['GEMSET'] = gemset.to_s
         | 
| 34 | 
            +
                system "cd #{root} && gem build acts_as_archive.gemspec"
         | 
| 35 | 
            +
                system "mkdir -p #{pkg} && mv *.gem pkg"
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
              ENV['GEMSET'] = old_gemset
         | 
| 38 | 
            +
            end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            namespace :gem do
         | 
| 41 | 
            +
              desc "Install gem(s)"
         | 
| 42 | 
            +
              task :install do
         | 
| 43 | 
            +
                Rake::Task['gem'].invoke
         | 
| 44 | 
            +
                Dir["#{File.dirname(__FILE__)}/pkg/*.gem"].each do |pkg|
         | 
| 45 | 
            +
                  system "gem install #{pkg} --no-ri --no-rdoc"
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
              
         | 
| 49 | 
            +
              desc "Push gem(s)"
         | 
| 50 | 
            +
              task :push do
         | 
| 51 | 
            +
                Rake::Task['gem'].invoke
         | 
| 52 | 
            +
                Dir["#{File.dirname(__FILE__)}/pkg/*.gem"].each do |pkg|
         | 
| 53 | 
            +
                  system "gem push #{pkg}"
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
            end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            namespace :gems do
         | 
| 59 | 
            +
              desc "Install gem dependencies (DEV=0 DOCS=0 GEMSPEC=default SUDO=0)"
         | 
| 60 | 
            +
              task :install do
         | 
| 61 | 
            +
                dev = ENV['DEV'] == '1'
         | 
| 62 | 
            +
                docs = ENV['DOCS'] == '1' ? '' : '--no-ri --no-rdoc'
         | 
| 63 | 
            +
                gemset = ENV['GEMSET']
         | 
| 64 | 
            +
                sudo = ENV['SUDO'] == '1' ? 'sudo' : ''
         | 
| 65 | 
            +
                
         | 
| 66 | 
            +
                ActsAsArchive::Gems.gemset = gemset if gemset
         | 
| 67 | 
            +
                
         | 
| 68 | 
            +
                if dev
         | 
| 69 | 
            +
                  gems = ActsAsArchive::Gems.gemspec.development_dependencies
         | 
| 70 | 
            +
                else
         | 
| 71 | 
            +
                  gems = ActsAsArchive::Gems.gemspec.dependencies
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
                
         | 
| 74 | 
            +
                gems.each do |name|
         | 
| 75 | 
            +
                  name = name.to_s
         | 
| 76 | 
            +
                  version = ActsAsArchive::Gems.versions[name]
         | 
| 77 | 
            +
                  if Gem.source_index.find_name(name, version).empty?
         | 
| 78 | 
            +
                    version = version ? "-v #{version}" : ''
         | 
| 79 | 
            +
                    system "#{sudo} gem install #{name} #{version} #{docs}"
         | 
| 80 | 
            +
                  else
         | 
| 81 | 
            +
                    puts "already installed: #{name} #{version}"
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
            end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
            desc "Validate the gemspec"
         | 
| 88 | 
            +
            task :gemspec do
         | 
| 89 | 
            +
              gemspec.validate
         | 
| 90 | 
            +
            end
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            root = File.expand_path('../', __FILE__)
         | 
| 3 | 
            +
            lib = "#{root}/lib"
         | 
| 4 | 
            +
            $:.unshift lib unless $:.include?(lib)
         | 
| 5 | 
            +
             
         | 
| 6 | 
            +
            require 'acts_as_archive/gems'
         | 
| 7 | 
            +
            ActsAsArchive::Gems.gemset ||= ENV['GEMSET'] || :default
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            Gem::Specification.new do |s|
         | 
| 10 | 
            +
              ActsAsArchive::Gems.gemspec.hash.each do |key, value|
         | 
| 11 | 
            +
                if key == 'name' && ActsAsArchive::Gems.gemset != :default
         | 
| 12 | 
            +
                  s.name = "#{value}-#{ActsAsArchive::Gems.gemset}"
         | 
| 13 | 
            +
                elsif key == 'summary' && ActsAsArchive::Gems.gemset == :solo
         | 
| 14 | 
            +
                  s.summary = value + " (no dependencies)"
         | 
| 15 | 
            +
                elsif !%w(dependencies development_dependencies).include?(key)
         | 
| 16 | 
            +
                  s.send "#{key}=", value
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              ActsAsArchive::Gems.dependencies.each do |g|
         | 
| 21 | 
            +
                s.add_dependency g.to_s, ActsAsArchive::Gems.versions[g]
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
              
         | 
| 24 | 
            +
              ActsAsArchive::Gems.development_dependencies.each do |g|
         | 
| 25 | 
            +
                s.add_development_dependency g.to_s, ActsAsArchive::Gems.versions[g]
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              s.executables = `cd #{root} && git ls-files -- {bin}/*`.split("\n").collect { |f| File.basename(f) }
         | 
| 29 | 
            +
              s.files = `cd #{root} && git ls-files`.split("\n")
         | 
| 30 | 
            +
              s.require_paths = %w(lib)
         | 
| 31 | 
            +
              s.test_files = `cd #{root} && git ls-files -- {features,test,spec}/*`.split("\n")
         | 
| 32 | 
            +
            end
         | 
    
        data/bin/acts_as_archive
    ADDED
    
    
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            active_wrapper-solo:
         | 
| 2 | 
            +
              repo: git@github.com:winton/active_wrapper.git
         | 
| 3 | 
            +
              path: vendor
         | 
| 4 | 
            +
            also_migrate:
         | 
| 5 | 
            +
              repo: git@github.com:winton/also_migrate.git
         | 
| 6 | 
            +
              path: vendor
         | 
| 7 | 
            +
            framework_fixture:
         | 
| 8 | 
            +
              repo: git@github.com:winton/framework_fixture.git
         | 
| 9 | 
            +
              path: vendor
         | 
| 10 | 
            +
            mover:
         | 
| 11 | 
            +
              repo: git@github.com:winton/mover.git
         | 
| 12 | 
            +
              path: vendor
         | 
    
        data/config/gemsets.yml
    ADDED
    
    
    
        data/config/gemspec.yml
    ADDED
    
    | @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            name: acts_as_archive
         | 
| 2 | 
            +
            version: 0.3.2
         | 
| 3 | 
            +
            authors:
         | 
| 4 | 
            +
              - Winton Welsh
         | 
| 5 | 
            +
            email: mail@wintoni.us
         | 
| 6 | 
            +
            homepage: http://github.com/winton/acts_as_archive
         | 
| 7 | 
            +
            summary: Don't delete your records, move them to a different table
         | 
| 8 | 
            +
            description: Don't delete your records, move them to a different table. Like acts_as_paranoid, but doesn't mess with your SQL queries.
         | 
| 9 | 
            +
            dependencies:
         | 
| 10 | 
            +
              - also_migrate
         | 
| 11 | 
            +
              - mover
         | 
| 12 | 
            +
            development_dependencies:
         | 
| 13 | 
            +
              - active_wrapper-solo
         | 
| 14 | 
            +
              - externals
         | 
| 15 | 
            +
              - framework_fixture
         | 
| 16 | 
            +
              - rake
         | 
| 17 | 
            +
              - rspec
         | 
    
        data/init.rb
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + "/rails/init"
         | 
| @@ -0,0 +1,192 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/acts_as_archive/gems'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ActsAsArchive::Gems.activate %w(also_migrate mover)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'also_migrate'
         | 
| 6 | 
            +
            require 'mover'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            $:.unshift File.dirname(__FILE__)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            class ActsAsArchive
         | 
| 11 | 
            +
              class <<self
         | 
| 12 | 
            +
                
         | 
| 13 | 
            +
                attr_accessor :configuration, :disabled
         | 
| 14 | 
            +
                
         | 
| 15 | 
            +
                def deprecate(msg)
         | 
| 16 | 
            +
                  if defined?(::ActiveSupport::Deprecation)
         | 
| 17 | 
            +
                    ::ActiveSupport::Deprecation.warn msg
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    $stdout.puts msg
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                def disable(&block)
         | 
| 24 | 
            +
                  @mutex ||= Mutex.new
         | 
| 25 | 
            +
                  @mutex.synchronize do
         | 
| 26 | 
            +
                    self.disabled = true
         | 
| 27 | 
            +
                    block.call
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                ensure
         | 
| 30 | 
            +
                  self.disabled = false
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                
         | 
| 33 | 
            +
                def find(from)
         | 
| 34 | 
            +
                  from = [ from ] unless from.is_a?(::Array)
         | 
| 35 | 
            +
                  (@configuration || []).select do |hash|
         | 
| 36 | 
            +
                    if from[0].is_a?(::String)
         | 
| 37 | 
            +
                      from.include?(hash[:from].table_name)
         | 
| 38 | 
            +
                    else
         | 
| 39 | 
            +
                      from.include?(hash[:from])
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                def move(config, where, merge_options={})
         | 
| 45 | 
            +
                  config[:to].each do |to|
         | 
| 46 | 
            +
                    options = config[:options].dup.merge(merge_options)
         | 
| 47 | 
            +
                    if options[:conditions]
         | 
| 48 | 
            +
                      options[:conditions] += " AND #{where}"
         | 
| 49 | 
            +
                    elsif where
         | 
| 50 | 
            +
                      options[:conditions] = where
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                    config[:from].move_to(to, options)
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
                
         | 
| 56 | 
            +
                def update(*args)
         | 
| 57 | 
            +
                  deprecate "ActsAsArchive.update is deprecated and no longer necessary."
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
              
         | 
| 61 | 
            +
              module Base
         | 
| 62 | 
            +
                def self.included(base)
         | 
| 63 | 
            +
                  unless base.included_modules.include?(InstanceMethods)
         | 
| 64 | 
            +
                    base.extend ClassMethods
         | 
| 65 | 
            +
                    base.send :include, InstanceMethods
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                module ClassMethods
         | 
| 70 | 
            +
                  def acts_as_archive(*args)
         | 
| 71 | 
            +
                    return unless ActsAsArchive.find(self).empty?
         | 
| 72 | 
            +
                    
         | 
| 73 | 
            +
                    ActsAsArchive.configuration ||= []
         | 
| 74 | 
            +
                    ActsAsArchive.configuration << (config = { :from => self })
         | 
| 75 | 
            +
                    
         | 
| 76 | 
            +
                    options = args.last.is_a?(::Hash) ? args.pop : {}
         | 
| 77 | 
            +
                    options[:copy] = true
         | 
| 78 | 
            +
                    
         | 
| 79 | 
            +
                    if options[:archive]
         | 
| 80 | 
            +
                      options[:magic] = 'restored_at'
         | 
| 81 | 
            +
                    else
         | 
| 82 | 
            +
                      options[:magic] = 'deleted_at' if options[:magic].nil?
         | 
| 83 | 
            +
                      options[:add] = [[ options[:magic], :datetime ]]
         | 
| 84 | 
            +
                      options[:ignore] = options[:magic]
         | 
| 85 | 
            +
                      options[:subtract] = 'restored_at'
         | 
| 86 | 
            +
                      options[:timestamps] = false if options[:timestamps].nil?
         | 
| 87 | 
            +
                      
         | 
| 88 | 
            +
                      if args.empty?
         | 
| 89 | 
            +
                        class_eval <<-EVAL
         | 
| 90 | 
            +
                          class Archive < ActiveRecord::Base
         | 
| 91 | 
            +
                            set_table_name "archived_#{self.table_name}"
         | 
| 92 | 
            +
                          end
         | 
| 93 | 
            +
                        EVAL
         | 
| 94 | 
            +
                        args << self::Archive
         | 
| 95 | 
            +
                      end
         | 
| 96 | 
            +
                    
         | 
| 97 | 
            +
                      args.each do |klass|
         | 
| 98 | 
            +
                        klass.class_eval <<-EVAL
         | 
| 99 | 
            +
                          record_timestamps = #{options[:timestamps].inspect}
         | 
| 100 | 
            +
                          acts_as_archive(#{self}, :archive => true)
         | 
| 101 | 
            +
                        EVAL
         | 
| 102 | 
            +
                        self.reflect_on_all_associations.each do |association|
         | 
| 103 | 
            +
                          if !ActsAsArchive.find(association.klass).empty? && association.options[:dependent]
         | 
| 104 | 
            +
                            opts = association.options.dup
         | 
| 105 | 
            +
                            opts[:class_name] = "::#{association.class_name}::Archive"
         | 
| 106 | 
            +
                            opts[:foreign_key] = association.primary_key_name
         | 
| 107 | 
            +
                            klass.send association.macro, association.name, opts
         | 
| 108 | 
            +
                          end
         | 
| 109 | 
            +
                        end
         | 
| 110 | 
            +
                        unless options[:migrate] == false
         | 
| 111 | 
            +
                          self.also_migrate klass.table_name, options
         | 
| 112 | 
            +
                        end
         | 
| 113 | 
            +
                      end
         | 
| 114 | 
            +
                    end
         | 
| 115 | 
            +
                    
         | 
| 116 | 
            +
                    config[:to] = args
         | 
| 117 | 
            +
                    config[:options] = options
         | 
| 118 | 
            +
                  end
         | 
| 119 | 
            +
                  
         | 
| 120 | 
            +
                  def delete_all!(*args)
         | 
| 121 | 
            +
                    ActsAsArchive.disable { self.delete_all(*args) }
         | 
| 122 | 
            +
                  end
         | 
| 123 | 
            +
                  
         | 
| 124 | 
            +
                  def destroy_all!(*args)
         | 
| 125 | 
            +
                    ActsAsArchive.disable { self.destroy_all(*args) }
         | 
| 126 | 
            +
                  end
         | 
| 127 | 
            +
                  
         | 
| 128 | 
            +
                  def migrate_from_acts_as_paranoid
         | 
| 129 | 
            +
                    time = Benchmark.measure do
         | 
| 130 | 
            +
                      ActsAsArchive.find(self).each do |config|
         | 
| 131 | 
            +
                        config = config.dup
         | 
| 132 | 
            +
                        config[:options][:copy] = false
         | 
| 133 | 
            +
                        ActsAsArchive.move(
         | 
| 134 | 
            +
                          config,
         | 
| 135 | 
            +
                          "`#{config[:options][:magic]}` IS NOT NULL",
         | 
| 136 | 
            +
                          :migrate => true
         | 
| 137 | 
            +
                        )
         | 
| 138 | 
            +
                      end
         | 
| 139 | 
            +
                    end
         | 
| 140 | 
            +
                    $stdout.puts "-- #{self}.migrate_from_acts_as_paranoid"
         | 
| 141 | 
            +
                    $stdout.puts "   -> #{"%.4fs" % time.real}"
         | 
| 142 | 
            +
                  end
         | 
| 143 | 
            +
                  
         | 
| 144 | 
            +
                  def restore_all(*args)
         | 
| 145 | 
            +
                    ActsAsArchive.deprecate "#{self}.restore_all is deprecated, please use #{self}.delete_all."
         | 
| 146 | 
            +
                    self.delete_all *args
         | 
| 147 | 
            +
                  end
         | 
| 148 | 
            +
                end
         | 
| 149 | 
            +
                
         | 
| 150 | 
            +
                module InstanceMethods
         | 
| 151 | 
            +
                  def delete!(*args)
         | 
| 152 | 
            +
                    ActsAsArchive.disable { self.delete(*args) }
         | 
| 153 | 
            +
                  end
         | 
| 154 | 
            +
                  
         | 
| 155 | 
            +
                  def destroy!(*args)
         | 
| 156 | 
            +
                    ActsAsArchive.disable { self.destroy(*args) }
         | 
| 157 | 
            +
                  end
         | 
| 158 | 
            +
                end
         | 
| 159 | 
            +
              end
         | 
| 160 | 
            +
              
         | 
| 161 | 
            +
              module DatabaseStatements
         | 
| 162 | 
            +
                def self.included(base)
         | 
| 163 | 
            +
                  unless base.included_modules.include?(InstanceMethods)
         | 
| 164 | 
            +
                    base.send :include, InstanceMethods
         | 
| 165 | 
            +
                    base.class_eval do
         | 
| 166 | 
            +
                      unless method_defined?(:delete_sql_without_archive)
         | 
| 167 | 
            +
                        alias_method :delete_sql_without_archive, :delete_sql
         | 
| 168 | 
            +
                        alias_method :delete_sql, :delete_sql_with_archive
         | 
| 169 | 
            +
                      end
         | 
| 170 | 
            +
                    end
         | 
| 171 | 
            +
                  end
         | 
| 172 | 
            +
                end
         | 
| 173 | 
            +
                
         | 
| 174 | 
            +
                module InstanceMethods
         | 
| 175 | 
            +
                  def delete_sql_with_archive(sql, name = nil)
         | 
| 176 | 
            +
                    unless ActsAsArchive.disabled
         | 
| 177 | 
            +
                      from, where = /DELETE FROM (.+)/i.match(sql)[1].split(/\s+WHERE\s+/i, 2)
         | 
| 178 | 
            +
                      from = from.strip.gsub(/`/, '').split(/\s*,\s*/)
         | 
| 179 | 
            +
                    
         | 
| 180 | 
            +
                      ActsAsArchive.find(from).each do |config|
         | 
| 181 | 
            +
                        ActsAsArchive.move(config, where)
         | 
| 182 | 
            +
                      end
         | 
| 183 | 
            +
                    end
         | 
| 184 | 
            +
                    
         | 
| 185 | 
            +
                    delete_sql_without_archive(sql, name)
         | 
| 186 | 
            +
                  end
         | 
| 187 | 
            +
                end
         | 
| 188 | 
            +
              end
         | 
| 189 | 
            +
            end
         | 
| 190 | 
            +
             | 
| 191 | 
            +
            ::ActiveRecord::Base.send(:include, ::ActsAsArchive::Base)
         | 
| 192 | 
            +
            ::ActiveRecord::ConnectionAdapters::DatabaseStatements.send(:include, ::ActsAsArchive::DatabaseStatements)
         |