activeinteractor 1.2.2 → 2.0.0.alpha.1.0.0

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -1
  3. data/LICENSE +1 -1
  4. data/README.md +4 -64
  5. data/lib/active_interactor/base.rb +77 -29
  6. data/lib/active_interactor/errors.rb +12 -0
  7. data/lib/active_interactor/result.rb +73 -0
  8. data/lib/active_interactor.rb +3 -101
  9. data/sig/active_interactor.rbs +3 -0
  10. metadata +23 -86
  11. data/.yardopts +0 -12
  12. data/lib/active_interactor/config.rb +0 -60
  13. data/lib/active_interactor/configurable.rb +0 -53
  14. data/lib/active_interactor/context/attributes.rb +0 -179
  15. data/lib/active_interactor/context/base.rb +0 -333
  16. data/lib/active_interactor/context/errors.rb +0 -57
  17. data/lib/active_interactor/context/loader.rb +0 -50
  18. data/lib/active_interactor/context/status.rb +0 -106
  19. data/lib/active_interactor/error.rb +0 -46
  20. data/lib/active_interactor/interactor/callbacks.rb +0 -293
  21. data/lib/active_interactor/interactor/context.rb +0 -378
  22. data/lib/active_interactor/interactor/perform.rb +0 -260
  23. data/lib/active_interactor/interactor/worker.rb +0 -120
  24. data/lib/active_interactor/models.rb +0 -50
  25. data/lib/active_interactor/organizer/base.rb +0 -18
  26. data/lib/active_interactor/organizer/callbacks.rb +0 -275
  27. data/lib/active_interactor/organizer/interactor_interface.rb +0 -127
  28. data/lib/active_interactor/organizer/interactor_interface_collection.rb +0 -62
  29. data/lib/active_interactor/organizer/organize.rb +0 -67
  30. data/lib/active_interactor/organizer/perform.rb +0 -112
  31. data/lib/active_interactor/rails/orm/active_record.rb +0 -5
  32. data/lib/active_interactor/rails/orm/dynamoid.rb +0 -5
  33. data/lib/active_interactor/rails/orm/mongoid.rb +0 -5
  34. data/lib/active_interactor/rails/railtie.rb +0 -21
  35. data/lib/active_interactor/rails.rb +0 -4
  36. data/lib/active_interactor/version.rb +0 -45
  37. data/lib/rails/generators/active_interactor/application_context_generator.rb +0 -21
  38. data/lib/rails/generators/active_interactor/application_interactor_generator.rb +0 -21
  39. data/lib/rails/generators/active_interactor/application_organizer_generator.rb +0 -21
  40. data/lib/rails/generators/active_interactor/base.rb +0 -29
  41. data/lib/rails/generators/active_interactor/generator.rb +0 -21
  42. data/lib/rails/generators/active_interactor/install_generator.rb +0 -16
  43. data/lib/rails/generators/active_interactor.rb +0 -5
  44. data/lib/rails/generators/interactor/context/rspec_generator.rb +0 -17
  45. data/lib/rails/generators/interactor/context/test_unit_generator.rb +0 -17
  46. data/lib/rails/generators/interactor/context_generator.rb +0 -22
  47. data/lib/rails/generators/interactor/generates_context.rb +0 -28
  48. data/lib/rails/generators/interactor/interactor_generator.rb +0 -25
  49. data/lib/rails/generators/interactor/organizer_generator.rb +0 -39
  50. data/lib/rails/generators/interactor/rspec_generator.rb +0 -15
  51. data/lib/rails/generators/interactor/test_unit_generator.rb +0 -15
  52. data/lib/rails/generators/templates/active_interactor.erb +0 -17
  53. data/lib/rails/generators/templates/application_context.rb +0 -4
  54. data/lib/rails/generators/templates/application_interactor.rb +0 -4
  55. data/lib/rails/generators/templates/application_organizer.rb +0 -4
  56. data/lib/rails/generators/templates/context.erb +0 -7
  57. data/lib/rails/generators/templates/context_spec.erb +0 -7
  58. data/lib/rails/generators/templates/context_test_unit.erb +0 -9
  59. data/lib/rails/generators/templates/interactor.erb +0 -15
  60. data/lib/rails/generators/templates/interactor_spec.erb +0 -7
  61. data/lib/rails/generators/templates/interactor_test_unit.erb +0 -9
  62. data/lib/rails/generators/templates/organizer.erb +0 -13
@@ -1,120 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveInteractor
4
- module Interactor
5
- # A worker class to call {Base interactor} {Interactor::Perform#perform #perform} and
6
- # {Interactor::Perform#rollback #rollback} methods in a thread safe manner.
7
- #
8
- # @api private
9
- # @author Aaron Allen <hello@aaronmallen.me>
10
- # @since 0.1.0
11
- class Worker
12
- # Initialize a new instance of {Worker}
13
- #
14
- # @param interactor [Base] an {Base interactor} instance
15
- # @return [Worker] a new instance of {Worker}
16
- def initialize(interactor)
17
- @interactor = interactor.deep_dup
18
- end
19
-
20
- # Run the {Base interactor} instance's {Interactor::Perform#perform #perform} with callbacks and validation.
21
- #
22
- # @return [Class] a {ActiveInteractor::Context::Base context} instance
23
- def execute_perform
24
- execute_perform!
25
- rescue Error::ContextFailure => e
26
- ActiveInteractor.logger.error("ActiveInteractor: #{e}")
27
- context
28
- end
29
-
30
- # Run the {Base interactor} instance's {Interactor::Perform#perform #perform} with callbacks and validation
31
- # without rescuing {Error::ContextFailure}.
32
- #
33
- # @raise [Error::ContextFailure] if the {Base interactor} fails it's {ActiveInteractor::Context::Base context}
34
- # @return [Class] a {ActiveInteractor::Context::Base context} instance
35
- def execute_perform!
36
- execute_context!
37
- rescue StandardError => e
38
- handle_error(e)
39
- end
40
-
41
- # Run the {Base interactor} instance's {Interactor::Perform#rollback #rollback} with callbacks
42
- #
43
- # @return [Boolean] `true` if context was successfully rolled back
44
- def execute_rollback
45
- return if interactor.options.skip_rollback
46
-
47
- execute_interactor_rollback!
48
- end
49
-
50
- private
51
-
52
- attr_reader :context, :interactor
53
-
54
- def execute_context!
55
- if interactor.options.skip_perform_callbacks
56
- execute_context_with_validation_check!
57
- else
58
- execute_context_with_callbacks!
59
- end
60
- end
61
-
62
- def execute_context_with_callbacks!
63
- result = interactor.run_callbacks :perform do
64
- execute_context_with_validation_check!
65
- @context = interactor.finalize_context!
66
- end
67
-
68
- if context&.success? && interactor.respond_to?(:run_deferred_after_perform_callbacks_on_children)
69
- interactor.run_deferred_after_perform_callbacks_on_children
70
- end
71
-
72
- result
73
- end
74
-
75
- def execute_context_with_validation!
76
- validate_on_calling
77
- interactor.perform
78
- validate_on_called
79
- end
80
-
81
- def execute_context_with_validation_check!
82
- return interactor.perform unless interactor.options.validate
83
-
84
- execute_context_with_validation!
85
- end
86
-
87
- def execute_interactor_rollback!
88
- return interactor.context_rollback! if interactor.options.skip_rollback_callbacks
89
-
90
- interactor.run_callbacks :rollback do
91
- interactor.context_rollback!
92
- end
93
- end
94
-
95
- def handle_error(exception)
96
- @context = interactor.finalize_context!
97
- execute_rollback
98
- raise exception
99
- end
100
-
101
- def validate_context(validation_context = nil)
102
- interactor.run_callbacks :validation do
103
- interactor.context_valid?(validation_context)
104
- end
105
- end
106
-
107
- def validate_on_calling
108
- return unless interactor.options.validate_on_calling
109
-
110
- interactor.context_fail! unless validate_context(:calling)
111
- end
112
-
113
- def validate_on_called
114
- return unless interactor.options.validate_on_called
115
-
116
- interactor.context_fail! unless validate_context(:called)
117
- end
118
- end
119
- end
120
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveInteractor
4
- # Helper methods for using classes that do not inherit from {Context::Base} as {Context::Base context} objects
5
- # for {Base interactors}. Classes should extend {Models}.
6
- #
7
- # @author Aaron Allen <hello@aaronmallen.me>
8
- # @since 1.0.0
9
- module Models
10
- # Instance methods needed for a {Context::Base context} class to function properly.
11
- #
12
- # @private
13
- # @author Aaron Allen <hello@aaronmallen.me>
14
- # @since 1.0.0
15
- module InstanceMethods
16
- def initialize(*)
17
- @attributes = self.class._default_attributes&.deep_dup
18
- super
19
- end
20
- end
21
-
22
- # Include methods needed for a {Context::Base context} class to function properly.
23
- #
24
- # @note You must include ActiveModel::Model and ActiveModel::Attributes or a similar implementation for
25
- # the object to function properly.
26
- #
27
- # @example
28
- # class User
29
- # include ActiveModel::Model
30
- # include ActiveModel::Attributes
31
- # extend ActiveInteractor::Models
32
- # acts_as_context
33
- # end
34
- #
35
- # class MyInteractor < ActiveInteractor::Base
36
- # contextualize_with :user
37
- # end
38
- def acts_as_context
39
- class_eval do
40
- extend ActiveInteractor::Context::Attributes::ClassMethods
41
-
42
- include ActiveInteractor::Context::Attributes
43
- include ActiveInteractor::Context::Errors
44
- include ActiveInteractor::Context::Status
45
- include ActiveInteractor::Models::InstanceMethods
46
- delegate :each_pair, to: :attributes
47
- end
48
- end
49
- end
50
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveInteractor
4
- module Organizer
5
- # The base {Base organizer} class all {Base organizers} should inherit from.
6
- #
7
- # @author Aaron Allen <hello@aaronmallen.me>
8
- # @since 1.0.0
9
- class Base < ActiveInteractor::Base
10
- extend ActiveInteractor::Organizer::Callbacks::ClassMethods
11
- extend ActiveInteractor::Organizer::Organize::ClassMethods
12
- extend ActiveInteractor::Organizer::Perform::ClassMethods
13
-
14
- include ActiveInteractor::Organizer::Callbacks
15
- include ActiveInteractor::Organizer::Perform
16
- end
17
- end
18
- end
@@ -1,275 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveInteractor
4
- module Organizer
5
- # Organizer callback methods. Because {Callbacks} is a module classes should include {Callbacks} rather than
6
- # inherit from it.
7
- #
8
- # @author Aaron Allen <hello@aaronmallen.me>
9
- # @since 1.0.0
10
- # @see https://github.com/aaronmallen/activeinteractor/wiki/Callbacks Callbacks
11
- # @see https://api.rubyonrails.org/classes/ActiveSupport/Callbacks.html ActiveSupport::Callbacks
12
- module Callbacks
13
- # Organizer callback class methods. Because {ClassMethods} is a module classes should extend {ClassMethods}
14
- # rather than inherit from it.
15
- #
16
- # @author Aaron Allen
17
- # @since 1.0.0
18
- module ClassMethods
19
- # Define a callback to call after each {Organizer::Organize::ClassMethods#organized organized}
20
- # {ActiveInteractor::Base interactor's} {Interactor::Perform#perform #perform} method has been called.
21
- #
22
- # @since 0.1.3
23
- #
24
- # @example
25
- # class MyInteractor1 < ActiveInteractor::Base
26
- # def perform
27
- # puts 'MyInteractor1'
28
- # end
29
- # end
30
- #
31
- # class MyInteractor2 < ActiveInteractor::Base
32
- # def perform
33
- # puts 'MyInteractor2'
34
- # end
35
- # end
36
- #
37
- # class MyOrganizer < ActiveInteractor::Organizer
38
- # after_each_perform :print_done
39
- #
40
- # organized MyInteractor1, MyInteractor2
41
- #
42
- # private
43
- #
44
- # def print_done
45
- # puts 'Done'
46
- # end
47
- # end
48
- #
49
- # MyOrganizer.perform
50
- # "MyInteractor1"
51
- # "Done"
52
- # "MyInteractor2"
53
- # "Done"
54
- # #=> <MyOrganizer::Context>
55
- def after_each_perform(*filters, &block)
56
- set_callback(:each_perform, :after, *filters, &block)
57
- end
58
-
59
- # Define a callback to call around each {Organizer::Organize::ClassMethods#organized organized}
60
- # {ActiveInteractor::Base interactor's} {Interactor::Perform#perform #perform} method call.
61
- #
62
- # @since 0.1.3
63
- #
64
- # @example
65
- # class MyInteractor1 < ActiveInteractor::Base
66
- # def perform
67
- # puts 'MyInteractor1'
68
- # sleep(1)
69
- # end
70
- # end
71
- #
72
- # class MyInteractor2 < ActiveInteractor::Base
73
- # def perform
74
- # puts 'MyInteractor2'
75
- # sleep(1)
76
- # end
77
- # end
78
- #
79
- # class MyOrganizer < ActiveInteractor::Organizer
80
- # around_each_perform :print_time
81
- #
82
- # organized MyInteractor1, MyInteractor2
83
- #
84
- # private
85
- #
86
- # def print_time
87
- # puts Time.now.utc
88
- # yield
89
- # puts Time.now.utc
90
- # end
91
- # end
92
- #
93
- # MyOrganizer.perform
94
- # "2019-04-01 00:00:00 UTC"
95
- # "MyInteractor1"
96
- # "2019-04-01 00:00:01 UTC"
97
- # "2019-04-01 00:00:01 UTC"
98
- # "MyInteractor2"
99
- # "2019-04-01 00:00:02 UTC"
100
- # #=> <MyOrganizer::Context>
101
- def around_each_perform(*filters, &block)
102
- set_callback(:each_perform, :around, *filters, &block)
103
- end
104
-
105
- # Define a callback to call before each {Organizer::Organize::ClassMethods#organized organized}
106
- # {ActiveInteractor::Base interactor's} {Interactor::Perform#perform #perform} method has been called.
107
- #
108
- # @since 0.1.3
109
- #
110
- # @example
111
- # class MyInteractor1 < ActiveInteractor::Base
112
- # def perform
113
- # puts 'MyInteractor1'
114
- # end
115
- # end
116
- #
117
- # class MyInteractor2 < ActiveInteractor::Base
118
- # def perform
119
- # puts 'MyInteractor2'
120
- # end
121
- # end
122
- #
123
- # class MyOrganizer < ActiveInteractor::Organizer
124
- # before_each_perform :print_starting
125
- #
126
- # organized MyInteractor1, MyInteractor2
127
- #
128
- # private
129
- #
130
- # def print_starting
131
- # puts 'Starting'
132
- # end
133
- # end
134
- #
135
- # MyOrganizer.perform
136
- # "Starting"
137
- # "MyInteractor1"
138
- # "Starting"
139
- # "MyInteractor2"
140
- # #=> <MyOrganizer::Context>
141
- def before_each_perform(*filters, &block)
142
- set_callback(:each_perform, :before, *filters, &block)
143
- end
144
-
145
- # Define a callback to call after all {Organizer::Organize::ClassMethods#organized organized}
146
- # {ActiveInteractor::Base interactors'} {Interactor::Perform#perform #perform} methods have been called.
147
- #
148
- # @since v1.2.0
149
- #
150
- # @example
151
- # class MyInteractor1 < ActiveInteractor::Base
152
- # def perform
153
- # puts 'MyInteractor1'
154
- # end
155
- # end
156
- #
157
- # class MyInteractor2 < ActiveInteractor::Base
158
- # def perform
159
- # puts 'MyInteractor2'
160
- # end
161
- # end
162
- #
163
- # class MyOrganizer < ActiveInteractor::Organizer
164
- # after_all_perform :print_done
165
- #
166
- # organized MyInteractor1, MyInteractor2
167
- #
168
- # private
169
- #
170
- # def print_done
171
- # puts 'Done'
172
- # end
173
- # end
174
- #
175
- # MyOrganizer.perform
176
- # "MyInteractor1"
177
- # "MyInteractor2"
178
- # "Done"
179
- # #=> <MyOrganizer::Context>
180
- def after_all_perform(*filters, &block)
181
- set_callback(:all_perform, :after, *filters, &block)
182
- end
183
-
184
- # Define a callback to call around all {Organizer::Organize::ClassMethods#organized organized}
185
- # {ActiveInteractor::Base interactors'} {Interactor::Perform#perform #perform} method calls.
186
- #
187
- # @since v1.2.0
188
- #
189
- # @example
190
- # class MyInteractor1 < ActiveInteractor::Base
191
- # def perform
192
- # puts 'MyInteractor1'
193
- # sleep(1)
194
- # end
195
- # end
196
- #
197
- # class MyInteractor2 < ActiveInteractor::Base
198
- # def perform
199
- # puts 'MyInteractor2'
200
- # sleep(1)
201
- # end
202
- # end
203
- #
204
- # class MyOrganizer < ActiveInteractor::Organizer
205
- # around_all_perform :print_time
206
- #
207
- # organized MyInteractor1, MyInteractor2
208
- #
209
- # private
210
- #
211
- # def print_time
212
- # puts Time.now.utc
213
- # yield
214
- # puts Time.now.utc
215
- # end
216
- # end
217
- #
218
- # MyOrganizer.perform
219
- # "2019-04-01 00:00:00 UTC"
220
- # "MyInteractor1"
221
- # "MyInteractor2"
222
- # "2019-04-01 00:00:02 UTC"
223
- # #=> <MyOrganizer::Context>
224
- def around_all_perform(*filters, &block)
225
- set_callback(:all_perform, :around, *filters, &block)
226
- end
227
-
228
- # Define a callback to call before all {Organizer::Organize::ClassMethods#organized organized}
229
- # {ActiveInteractor::Base interactors'} {Interactor::Perform#perform #perform} methods have been called.
230
- #
231
- # @since v1.2.0
232
- #
233
- # @example
234
- # class MyInteractor1 < ActiveInteractor::Base
235
- # def perform
236
- # puts 'MyInteractor1'
237
- # end
238
- # end
239
- #
240
- # class MyInteractor2 < ActiveInteractor::Base
241
- # def perform
242
- # puts 'MyInteractor2'
243
- # end
244
- # end
245
- #
246
- # class MyOrganizer < ActiveInteractor::Organizer
247
- # before_all_perform :print_starting
248
- #
249
- # organized MyInteractor1, MyInteractor2
250
- #
251
- # private
252
- #
253
- # def print_starting
254
- # puts 'Starting'
255
- # end
256
- # end
257
- #
258
- # MyOrganizer.perform
259
- # "Starting"
260
- # "MyInteractor1"
261
- # "MyInteractor2"
262
- # #=> <MyOrganizer::Context>
263
- def before_all_perform(*filters, &block)
264
- set_callback(:all_perform, :before, *filters, &block)
265
- end
266
- end
267
-
268
- def self.included(base)
269
- base.class_eval do
270
- define_callbacks :each_perform, :all_perform
271
- end
272
- end
273
- end
274
- end
275
- end
@@ -1,127 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveInteractor
4
- module Organizer
5
- # An interface object to facilitate conditionally calling {Interactor::Perform::ClassMethods#perform .perform} on
6
- # an {ActiveInteractor::Base interactor}
7
- #
8
- # @api private
9
- # @author Aaron Allen <hello@aaronmallen.me>
10
- # @since 1.0.0
11
- #
12
- # @!attribute [r] filters
13
- # Conditional options for the {ActiveInteractor::Base interactor} class
14
- #
15
- # @return [Hash{Symbol=>Proc, Symbol}] conditional options for the {ActiveInteractor::Base interactor} class
16
- #
17
- # @!attribute [r] callbacks
18
- # Callbacks for the interactor_class
19
- #
20
- # @since 1.1.0
21
- #
22
- # @return [Hash{Symbol=>*}] the interactor callbacks
23
- #
24
- # @!attribute [r] interactor_class
25
- # An {ActiveInteractor::Base interactor} class
26
- #
27
- # @return [Const] an {ActiveInteractor::Base interactor} class
28
- #
29
- # @!attribute [r] perform_options
30
- # {Interactor::Perform::Options} for the {ActiveInteractor::Base interactor} {Interactor::Perform#perform #perform}
31
- #
32
- # @see Interactor::Perform::Options
33
- #
34
- # @return [Hash{Symbol=>*}] {Interactor::Perform::Options} for the {ActiveInteractor::Base interactor}
35
- # {Interactor::Perform#perform #perform}
36
- #
37
- # @!attribute [r] deferred_after_perform_callbacks
38
- # Deffered callbacks for the interactor_class
39
- # @since 1.2.0
40
- #
41
- # @return [Hash{Symbol=>*}] the interactor callbacks
42
- class InteractorInterface
43
- attr_reader :filters, :callbacks, :interactor_class, :perform_options, :deferred_after_perform_callbacks
44
-
45
- # Keywords for conditional filters
46
- # @return [Array<Symbol>]
47
- CONDITIONAL_FILTERS = %i[if unless].freeze
48
- CALLBACKS = %i[before after].freeze
49
-
50
- # Initialize a new instance of {InteractorInterface}
51
- #
52
- # @param interactor_class [Const] an {ActiveInteractor::Base interactor} class
53
- # @param options [Hash] options to use for the {ActiveInteractor::Base interactor's}
54
- # {Interactor::Perform::ClassMethods#perform .perform}. See {Interactor::Perform::Options}.
55
- # @return [InteractorInterface] a new instance of {InteractorInterface}
56
- def initialize(interactor_class, options = {})
57
- @interactor_class = interactor_class.to_s.camelize.safe_constantize
58
- @filters = options.select { |key, _value| CONDITIONAL_FILTERS.include?(key) }
59
- @callbacks = options.select { |key, _value| CALLBACKS.include?(key) }
60
- @perform_options = options.reject { |key, _value| CONDITIONAL_FILTERS.include?(key) || CALLBACKS.include?(key) }
61
- init_deferred_after_perform_callbacks
62
- end
63
-
64
- # Call the {#interactor_class} {Interactor::Perform::ClassMethods#perform .perform} or
65
- # {Interactor::Perform::ClassMethods#perform! .perform!} method if all conditions in {#filters} are properly met.
66
- #
67
- # @param target [Class] the calling {Base organizer} instance
68
- # @param context [Class] an instance of {Context::Base context}
69
- # @param fail_on_error [Boolean] if `true` {Interactor::Perform::ClassMethods#perform! .perform!} will be called
70
- # on the {#interactor_class} other wise {Interactor::Perform::ClassMethods#perform .perform} will be called.
71
- # @param perform_options [Hash] additional {Interactor::Perform::Options} to merge with {#perform_options}
72
- # @raise [Error::ContextFailure] if `fail_on_error` is `true` and the {#interactor_class}
73
- # {Context::Status#fail! fails} its {Context::Base context}.
74
- # @return [Class] an instance of {Context::Base context}
75
- def perform(target, context, fail_on_error = false, perform_options = {})
76
- return if check_conditionals(target, :if) == false
77
- return if check_conditionals(target, :unless) == true
78
-
79
- skip_deferred_after_perform_callbacks
80
-
81
- method = fail_on_error ? :perform! : :perform
82
- options = self.perform_options.merge(perform_options)
83
- interactor_class.send(method, context, options)
84
- end
85
-
86
- def execute_inplace_callback(target, callback)
87
- resolve_option(target, callbacks[callback])
88
- end
89
-
90
- def execute_deferred_after_perform_callbacks(context)
91
- return unless deferred_after_perform_callbacks.present?
92
-
93
- interactor = interactor_class.new(context)
94
- env = ActiveSupport::Callbacks::Filters::Environment.new(interactor, false, nil)
95
- deferred_after_perform_callbacks.compile.invoke_after(env)
96
- interactor.send(:context)
97
- end
98
-
99
- private
100
-
101
- def init_deferred_after_perform_callbacks
102
- after_callbacks_deferred = interactor_class.present? &&
103
- interactor_class.after_callbacks_deferred_when_organized
104
- @deferred_after_perform_callbacks = after_callbacks_deferred ? interactor_class._perform_callbacks : nil
105
- end
106
-
107
- def skip_deferred_after_perform_callbacks
108
- return unless deferred_after_perform_callbacks.present?
109
-
110
- deferred_after_perform_callbacks.each do |callback|
111
- interactor_class.skip_callback(:perform, :after, callback.filter, raise: false)
112
- end
113
- end
114
-
115
- def check_conditionals(target, filter)
116
- resolve_option(target, filters[filter])
117
- end
118
-
119
- def resolve_option(target, opt)
120
- return unless opt
121
-
122
- return target.send(opt) if opt.is_a?(Symbol)
123
- return target.instance_exec(&opt) if opt.is_a?(Proc)
124
- end
125
- end
126
- end
127
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveInteractor
4
- module Organizer
5
- # A collection of {InteractorInterface}
6
- #
7
- # @api private
8
- # @author Aaron Allen <hello@aaronmallen.me>
9
- # @since 1.0.0
10
- #
11
- # @!attribute [r] collection
12
- # An array of {InteractorInterface}
13
- #
14
- # @return [Array<InteractorInterface>] the {InteractorInterface} collection
15
- class InteractorInterfaceCollection
16
- attr_reader :collection
17
-
18
- # @!method map(&block)
19
- # Invokes the given block once for each element of {#collection}.
20
- # @return [Array] a new array containing the values returned by the block.
21
- delegate :map, to: :collection
22
-
23
- # Initialize a new instance of {InteractorInterfaceCollection}
24
- # @return [InteractorInterfaceCollection] a new instance of {InteractorInterfaceCollection}
25
- def initialize
26
- @collection = []
27
- end
28
-
29
- # Add an {InteractorInterface} to the {#collection}
30
- #
31
- # @param interactor_class [Const, Symbol, String] an {ActiveInteractor::Base interactor} class
32
- # @param filters [Hash{Symbol=> Proc, Symbol}] conditional options for the {ActiveInteractor::Base interactor}
33
- # class
34
- # @option filters [Proc, Symbol] :if only call the {ActiveInteractor::Base interactor}
35
- # {Interactor::Perform::ClassMethods#perform .perform} if `Proc` or `method` returns `true`
36
- # @option filters [Proc, Symbol] :unless only call the {ActiveInteractor::Base interactor}
37
- # {Interactor::Perform::ClassMethods#perform .perform} if `Proc` or `method` returns `false` or `nil`
38
- # @return [self] the {InteractorInterfaceCollection} instance
39
- def add(interactor_class, filters = {})
40
- interface = ActiveInteractor::Organizer::InteractorInterface.new(interactor_class, filters)
41
- collection << interface if interface.interactor_class
42
- self
43
- end
44
-
45
- # Add multiple {InteractorInterface} to the {#collection}
46
- #
47
- # @param interactor_classes [Array<Const, Symbol, String>] the {ActiveInteractor::Base interactor} classes
48
- # @return [self] the {InteractorInterfaceCollection} instance
49
- def concat(interactor_classes)
50
- interactor_classes.flatten.each { |interactor_class| add(interactor_class) }
51
- self
52
- end
53
-
54
- # Calls the given block once for each element in {#collection}, passing that element as a parameter.
55
- # @return [self] the {InteractorInterfaceCollection} instance
56
- def each(&block)
57
- collection.each(&block) if block
58
- self
59
- end
60
- end
61
- end
62
- end