effective_resources 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6df84b754524ec505a90063610dcff9af6e4e24e0cb2e0ada087d5420dbe4fe
4
- data.tar.gz: fc0be89c03c109066c49f87778eb85ba2ac0a38309f72bb2f668e8e4bcc1201a
3
+ metadata.gz: eddc7cf600ae3743cb4a686c5ddbff6251f70660568de4f6754a2e13e52b3ea9
4
+ data.tar.gz: 1d571d8f411aa63166f677446ced8b5d5f3f40f96c3aa2b47d29f08c704655c5
5
5
  SHA512:
6
- metadata.gz: 339825fdc0ed4abb28094c5fe83e4f2dd2fa426447f8f1ee3933e909f58b4600958e647dae712dbd47fb7aed155af7eae027f0dfb61ace74418535691de463f0
7
- data.tar.gz: 7b4b5ad7565dd0ea09728af5d2769fa6ce51a0ed7c4e6c7c68d594a66861e975cb23af87b3334d5481cd984c0e62c8bd10ef47b6b49f4c56de1fd4bdc758f0fe
6
+ metadata.gz: 71aa4be47daebc507cf4136e0deadcf74ec0ed60399a5ec5200ea1ef31c215e2767e7a323ae060ce4d350bf1ca3d25bad64a66f2defa0b531e91e5ab9c009887
7
+ data.tar.gz: 1d5df0cc8e833a2a89dffb13ba65aaa8f84930ac203007912076545c4e431b43e4cd00fb081bcb20528137352bd6e2f0a83290932ba8c8d2f66d12ef341312e7
@@ -82,7 +82,7 @@ module Effective
82
82
  # Returns an ActiveRecord relation based on the computed value of `resource_scope` dsl method
83
83
  def resource_scope # Thing
84
84
  @_effective_resource_relation ||= (
85
- relation = case @_effective_resource_scope # If this was initialized by the resource_scope before_filter
85
+ relation = case @_effective_resource_scope # If this was initialized by the resource_scope before_action
86
86
  when ActiveRecord::Relation
87
87
  @_effective_resource_scope
88
88
  when Hash
@@ -80,7 +80,7 @@ module Effective
80
80
  raise 'expected a proc or block' unless (obj.respond_to?(:call) || block_given?)
81
81
 
82
82
  instance_exec do
83
- before_action(opts) { @_effective_resource_scope ||= instance_exec(&(block_given? ? block : obj)) }
83
+ prepend_before_action(opts) { @_effective_resource_scope ||= instance_exec(&(block_given? ? block : obj)) }
84
84
  end
85
85
  end
86
86
 
@@ -8,6 +8,7 @@
8
8
  # class Thing < ApplicationRecord
9
9
  # has_many :comments
10
10
  # acts_as_archivable cascade: :comments
11
+ # acts_as_archivable cascade: :comments, strategy: :archive|:archive_all|:active_job
11
12
  # end
12
13
 
13
14
  # Each controller needs its own archive and unarchive action.
@@ -28,15 +29,20 @@ module ActsAsArchived
28
29
  extend ActiveSupport::Concern
29
30
 
30
31
  module ActiveRecord
31
- def acts_as_archived(cascade: [])
32
+ def acts_as_archived(cascade: [], strategy: :archive)
32
33
 
33
34
  cascade = Array(cascade).compact
35
+ strategy = strategy
34
36
 
35
37
  if cascade.any? { |obj| !obj.kind_of?(Symbol) }
36
38
  raise 'expected cascade to be an Array of has_many symbols'
37
39
  end
38
40
 
39
- @acts_as_archived_options = { cascade: cascade }
41
+ unless [:archive, :archive_all, :active_job].include?(strategy)
42
+ raise 'expected strategy to be :archive, :archive_all, or :active_job'
43
+ end
44
+
45
+ @acts_as_archived_options = { cascade: cascade, strategy: strategy }
40
46
 
41
47
  include ::ActsAsArchived
42
48
  end
@@ -61,6 +67,8 @@ module ActsAsArchived
61
67
  end
62
68
 
63
69
  included do
70
+ define_callbacks :archive, :unarchive # ActiveSupport::Callbacks
71
+
64
72
  scope :archived, -> { where(archived: true) }
65
73
  scope :unarchived, -> { where(archived: [false, nil]) }
66
74
 
@@ -74,26 +82,96 @@ module ActsAsArchived
74
82
 
75
83
  module ClassMethods
76
84
  def acts_as_archived?; true; end
85
+
86
+ # before_archive(if: -> { persisted? })
87
+ def before_archive(*filters, &blk)
88
+ set_callback(:archive, :before, *filters, &blk)
89
+ end
90
+
91
+ def after_archive(*filters, &blk)
92
+ set_callback(:archive, :after, *filters, &blk)
93
+ end
94
+
95
+ def before_unarchive(*filters, &blk)
96
+ set_callback(:unarchive, :before, *filters, &blk)
97
+ end
98
+
99
+ def after_unarchive(*filters, &blk)
100
+ set_callback(:unarchive, :after, *filters, &blk)
101
+ end
102
+
103
+ # after_commit(if: :just_archived?)
104
+ # after_commit(if: :just_unarchived?)
77
105
  end
78
106
 
79
107
  # Instance methods
80
108
  def archive!
109
+ return true if archived?
110
+
111
+ strategy = acts_as_archived_options[:strategy]
112
+ cascade = acts_as_archived_options[:cascade]
113
+
81
114
  transaction do
82
- update!(archived: true) # Runs validations
83
- acts_as_archived_options[:cascade].each { |obj| public_send(obj).update_all(archived: true) }
115
+ run_callbacks :archive do
116
+ update!(archived: true) # Runs validations
117
+
118
+ if strategy == :archive_all
119
+ cascade.each { |associated| public_send(associated).update_all(archived: true) }
120
+ end
121
+
122
+ if strategy == :archive
123
+ cascade.each { |associated| Array(public_send(associated)).each { |resource| resource.archive! } }
124
+ end
125
+ end
84
126
  end
127
+
128
+ if strategy == :active_job
129
+ ActsAsArchivedArchiveJob.perform_later(self)
130
+ end
131
+
132
+ true
85
133
  end
86
134
 
87
135
  def unarchive!
136
+ return true unless archived?
137
+
138
+ strategy = acts_as_archived_options[:strategy]
139
+ cascade = acts_as_archived_options[:cascade]
140
+
88
141
  transaction do
89
- update!(archived: false)
90
- acts_as_archived_options[:cascade].each { |obj| public_send(obj).update_all(archived: false) }
142
+ run_callbacks :unarchive do
143
+ update!(archived: false) # Runs validations
144
+
145
+ if strategy == :archive_all
146
+ cascade.each { |associated| public_send(associated).update_all(archived: false) }
147
+ end
148
+
149
+ if strategy == :archive
150
+ cascade.each { |associated| Array(public_send(associated)).each { |resource| resource.unarchive! } }
151
+ end
152
+ end
91
153
  end
154
+
155
+ if strategy == :active_job
156
+ ActsAsArchivedUnarchiveJob.perform_later(self)
157
+ end
158
+
159
+ true
92
160
  end
93
161
 
94
162
  def destroy
95
163
  archive!
96
164
  end
97
165
 
166
+ private
167
+
168
+ def just_archived?
169
+ previous_changes[:archived] && archived?
170
+ end
171
+
172
+ def just_unarchived?
173
+ previous_changes[:archived] && !archived?
174
+ end
175
+
98
176
  end
99
177
 
@@ -2,7 +2,7 @@ module EffectiveResources
2
2
  class Engine < ::Rails::Engine
3
3
  engine_name 'effective_resources'
4
4
 
5
- config.autoload_paths += Dir["#{config.root}/lib/", "#{config.root}/app/controllers/concerns/effective/"]
5
+ config.autoload_paths += Dir["#{config.root}/lib/", "#{config.root}/jobs/", "#{config.root}/app/controllers/concerns/effective/"]
6
6
 
7
7
  # Set up our default configuration options.
8
8
  initializer 'effective_resources.defaults', before: :load_config_initializers do |app|
@@ -1,3 +1,3 @@
1
1
  module EffectiveResources
2
- VERSION = '1.3.1'.freeze
2
+ VERSION = '1.3.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-31 00:00:00.000000000 Z
11
+ date: 2019-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails