acts_as_archival 0.5.2 → 0.5.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/CHANGELOG.md +3 -0
- data/README.md +8 -3
- data/acts_as_archival.gemspec +6 -2
- data/lib/acts_as_archival.rb +4 -0
- data/lib/acts_as_archival/version.rb +1 -1
- data/lib/expected_behavior/acts_as_archival.rb +2 -33
- data/lib/expected_behavior/association_operation/archive.rb +21 -0
- data/lib/expected_behavior/association_operation/base.rb +51 -0
- data/lib/expected_behavior/association_operation/unarchive.rb +17 -0
- metadata +8 -1
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -16,10 +16,14 @@ Additionally, other plugins generally screw with how | |
| 16 16 | 
             
            to destroy records.
         | 
| 17 17 |  | 
| 18 18 | 
             
            ## Install
         | 
| 19 | 
            -
            Rails 3.2 | 
| 19 | 
            +
            Rails 3.2 and up
         | 
| 20 20 |  | 
| 21 21 | 
             
            `gem install acts_as_archival`
         | 
| 22 22 |  | 
| 23 | 
            +
            or in your Gemfile
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            `gem "acts_as_archival"`
         | 
| 26 | 
            +
             | 
| 23 27 | 
             
            Rails 3.0x:
         | 
| 24 28 |  | 
| 25 29 | 
             
            `rails plugin install http://github.com/expectedbehavior/acts_as_archival.git -r rails3.0x`
         | 
| @@ -97,8 +101,8 @@ postgres and if not, submit a patch / let us know about it! | |
| 97 101 |  | 
| 98 102 | 
             
            ## Thanks
         | 
| 99 103 |  | 
| 100 | 
            -
            ActsAsParanoid and PermanentRecords were both inspirations for this: | 
| 101 | 
            -
            http://github.com/technoweenie/acts_as_paranoid | 
| 104 | 
            +
            ActsAsParanoid and PermanentRecords were both inspirations for this:
         | 
| 105 | 
            +
            http://github.com/technoweenie/acts_as_paranoid
         | 
| 102 106 | 
             
            http://github.com/fastestforward/permanent_records
         | 
| 103 107 |  | 
| 104 108 | 
             
            ## Contributors
         | 
| @@ -111,6 +115,7 @@ http://github.com/fastestforward/permanent_records | |
| 111 115 | 
             
            * Dave Woodward
         | 
| 112 116 | 
             
            * Miles Sterrett
         | 
| 113 117 | 
             
            * James Hill
         | 
| 118 | 
            +
            * Marten Claes
         | 
| 114 119 |  | 
| 115 120 | 
             
            Thanks!
         | 
| 116 121 |  | 
    
        data/acts_as_archival.gemspec
    CHANGED
    
    | @@ -13,10 +13,14 @@ Gem::Specification.new do |gem| | |
| 13 13 | 
             
                                 "David Jones",
         | 
| 14 14 | 
             
                                 "Dave Woodward",
         | 
| 15 15 | 
             
                                 "Miles Sterrett",
         | 
| 16 | 
            -
                                 "James Hill" | 
| 16 | 
            +
                                 "James Hill",
         | 
| 17 | 
            +
                                 "Marten Claes"]
         | 
| 17 18 | 
             
              gem.email       = ["joel@expectedbehavior.com",
         | 
| 18 19 | 
             
                                 "michael@expectedbehavior.com",
         | 
| 19 | 
            -
                                 "matt@expectedbehavior.com" | 
| 20 | 
            +
                                 "matt@expectedbehavior.com",
         | 
| 21 | 
            +
                                 "jason@expectedbehavior.com",
         | 
| 22 | 
            +
                                 "tyler@expectedbehavior.com",
         | 
| 23 | 
            +
                                 "nathan@expectedbehavior.com"]
         | 
| 20 24 | 
             
              gem.homepage    = "http://github.com/expectedbehavior/acts_as_archival"
         | 
| 21 25 |  | 
| 22 26 | 
             
              gem.files         = `git ls-files`.split("\n")
         | 
    
        data/lib/acts_as_archival.rb
    CHANGED
    
    | @@ -1,5 +1,9 @@ | |
| 1 1 | 
             
            require "acts_as_archival/version"
         | 
| 2 2 |  | 
| 3 | 
            +
            require "expected_behavior/association_operation/base"
         | 
| 4 | 
            +
            require "expected_behavior/association_operation/archive"
         | 
| 5 | 
            +
            require "expected_behavior/association_operation/unarchive"
         | 
| 6 | 
            +
             | 
| 3 7 | 
             
            require "expected_behavior/acts_as_archival"
         | 
| 4 8 | 
             
            require "expected_behavior/acts_as_archival_active_record_methods"
         | 
| 5 9 |  | 
| @@ -103,42 +103,11 @@ module ExpectedBehavior | |
| 103 103 | 
             
                  end
         | 
| 104 104 |  | 
| 105 105 | 
             
                  def archive_associations(head_archive_number)
         | 
| 106 | 
            -
                     | 
| 107 | 
            -
                    act_on_all_archival_associations(head_archive_number, :archive => true, :association_options => act_only_on_dependent_destroy_associations)
         | 
| 106 | 
            +
                    AssociationOperation::Archive.new(self, head_archive_number).execute
         | 
| 108 107 | 
             
                  end
         | 
| 109 108 |  | 
| 110 109 | 
             
                  def unarchive_associations(head_archive_number)
         | 
| 111 | 
            -
                     | 
| 112 | 
            -
                  end
         | 
| 113 | 
            -
             | 
| 114 | 
            -
                  def act_on_all_archival_associations(head_archive_number, options={})
         | 
| 115 | 
            -
                    return if options.length == 0
         | 
| 116 | 
            -
                    options[:association_options] ||= Proc.new { true }
         | 
| 117 | 
            -
                    self.class.reflect_on_all_associations.each do |association|
         | 
| 118 | 
            -
                      if (association.macro.to_s =~ /^has/ && association.klass.is_archival? &&
         | 
| 119 | 
            -
                          options[:association_options].call(association) &&
         | 
| 120 | 
            -
                          association.options[:through].nil?)
         | 
| 121 | 
            -
                        association_key = association.respond_to?(:foreign_key) ? association.foreign_key : association.primary_key_name
         | 
| 122 | 
            -
                        act_on_a_related_archival(association.klass, association_key, id, head_archive_number, options)
         | 
| 123 | 
            -
                      end
         | 
| 124 | 
            -
                    end
         | 
| 125 | 
            -
                  end
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                  def act_on_a_related_archival(klass, key_name, id, head_archive_number, options={})
         | 
| 128 | 
            -
                    return if options.length == 0 || (!options[:archive] && !options[:unarchive])
         | 
| 129 | 
            -
                    if options[:archive]
         | 
| 130 | 
            -
                      klass.unarchived.where(["#{key_name} = ?", id]).each do |related_record|
         | 
| 131 | 
            -
                        unless related_record.archive(head_archive_number)
         | 
| 132 | 
            -
                          raise ActiveRecord::Rollback
         | 
| 133 | 
            -
                        end
         | 
| 134 | 
            -
                      end
         | 
| 135 | 
            -
                    else
         | 
| 136 | 
            -
                      klass.archived.where(["#{key_name} = ? AND archive_number = ?", id, head_archive_number]).each do |related_record|
         | 
| 137 | 
            -
                        unless related_record.unarchive(head_archive_number)
         | 
| 138 | 
            -
                          raise ActiveRecord::Rollback
         | 
| 139 | 
            -
                        end
         | 
| 140 | 
            -
                      end
         | 
| 141 | 
            -
                    end
         | 
| 110 | 
            +
                    AssociationOperation::Unarchive.new(self, head_archive_number).execute
         | 
| 142 111 | 
             
                  end
         | 
| 143 112 | 
             
                end
         | 
| 144 113 | 
             
              end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module ExpectedBehavior
         | 
| 2 | 
            +
              module ActsAsArchival
         | 
| 3 | 
            +
                module AssociationOperation
         | 
| 4 | 
            +
                  class Archive < Base
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    protected
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    def act_on_archivals(archivals)
         | 
| 9 | 
            +
                      archivals.unarchived.find_each do |related_record|
         | 
| 10 | 
            +
                        raise ActiveRecord::Rollback unless related_record.archive(head_archive_number)
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def association_conditions_met?(association)
         | 
| 15 | 
            +
                      association.options[:dependent] == :destroy
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            module ExpectedBehavior
         | 
| 2 | 
            +
              module ActsAsArchival
         | 
| 3 | 
            +
                module AssociationOperation
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                  class Base
         | 
| 6 | 
            +
                    attr_reader :model, :head_archive_number
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    def initialize(model, head_archive_number)
         | 
| 9 | 
            +
                      @model = model
         | 
| 10 | 
            +
                      @head_archive_number = head_archive_number
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    def execute
         | 
| 14 | 
            +
                      each_archivable_association do |association|
         | 
| 15 | 
            +
                        act_on_association(association) if association_conditions_met? association
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    protected
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    def each_archivable_association
         | 
| 22 | 
            +
                      self.model.class.reflect_on_all_associations.each do |association|
         | 
| 23 | 
            +
                        yield(association) if archivable_association?(association)
         | 
| 24 | 
            +
                      end
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    def archivable_association?(association)
         | 
| 28 | 
            +
                      association.macro.to_s =~ /^has/ &&
         | 
| 29 | 
            +
                        association.klass.is_archival? &&
         | 
| 30 | 
            +
                        association.options[:through].nil?
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    def association_conditions_met?(association)
         | 
| 34 | 
            +
                      true
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    def act_on_association(association)
         | 
| 38 | 
            +
                      key = association.respond_to?(:foreign_key) ? association.foreign_key : association.primary_key_name
         | 
| 39 | 
            +
                      scope = association.klass.where(key => model.id)
         | 
| 40 | 
            +
                      act_on_archivals(scope)
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    def act_on_archivals(scope)
         | 
| 44 | 
            +
                      raise NotImplementedError,
         | 
| 45 | 
            +
                        "The #{self.class} hasn't implemented 'act_on_archivals(scope)'"
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            module ExpectedBehavior
         | 
| 2 | 
            +
              module ActsAsArchival
         | 
| 3 | 
            +
                module AssociationOperation
         | 
| 4 | 
            +
                  class Unarchive < Base
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    protected
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    def act_on_archivals(scope)
         | 
| 9 | 
            +
                      scope.archived.where(:archive_number => head_archive_number).find_each do |related_record|
         | 
| 10 | 
            +
                        raise ActiveRecord::Rollback unless related_record.unarchive(head_archive_number)
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: acts_as_archival
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.5. | 
| 4 | 
            +
              version: 0.5.3
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -13,6 +13,7 @@ authors: | |
| 13 13 | 
             
            - Dave Woodward
         | 
| 14 14 | 
             
            - Miles Sterrett
         | 
| 15 15 | 
             
            - James Hill
         | 
| 16 | 
            +
            - Marten Claes
         | 
| 16 17 | 
             
            autorequire: 
         | 
| 17 18 | 
             
            bindir: bin
         | 
| 18 19 | 
             
            cert_chain: []
         | 
| @@ -158,6 +159,9 @@ email: | |
| 158 159 | 
             
            - joel@expectedbehavior.com
         | 
| 159 160 | 
             
            - michael@expectedbehavior.com
         | 
| 160 161 | 
             
            - matt@expectedbehavior.com
         | 
| 162 | 
            +
            - jason@expectedbehavior.com
         | 
| 163 | 
            +
            - tyler@expectedbehavior.com
         | 
| 164 | 
            +
            - nathan@expectedbehavior.com
         | 
| 161 165 | 
             
            executables: []
         | 
| 162 166 | 
             
            extensions: []
         | 
| 163 167 | 
             
            extra_rdoc_files: []
         | 
| @@ -176,6 +180,9 @@ files: | |
| 176 180 | 
             
            - lib/acts_as_archival/version.rb
         | 
| 177 181 | 
             
            - lib/expected_behavior/acts_as_archival.rb
         | 
| 178 182 | 
             
            - lib/expected_behavior/acts_as_archival_active_record_methods.rb
         | 
| 183 | 
            +
            - lib/expected_behavior/association_operation/archive.rb
         | 
| 184 | 
            +
            - lib/expected_behavior/association_operation/base.rb
         | 
| 185 | 
            +
            - lib/expected_behavior/association_operation/unarchive.rb
         | 
| 179 186 | 
             
            - test/ambiguous_table_test.rb
         | 
| 180 187 | 
             
            - test/associations_test.rb
         | 
| 181 188 | 
             
            - test/basic_test.rb
         |