activeinteractor 1.2.2 → 2.0.0.alpha.1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,378 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveInteractor
4
- module Interactor
5
- # Interactor context methods. Because {Context} is a module classes should include {Context} rather than inherit
6
- # from it.
7
- #
8
- # @author Aaron Allen <hello@aaronmallen.me>
9
- # @since 0.1.0
10
- module Context
11
- # Interactor context class methods. Because {ClassMethods} is a module classes should extend {ClassMethods}
12
- # rather than inherit from it.
13
- #
14
- # @author Aaron Allen <hello@aaronmallen.me>
15
- # @since 0.1.0
16
- module ClassMethods
17
- # @!method context_attributes(*attributes)
18
- # Call {ActiveInteractor::Context::Attributes#attributes .attributes} on the {Base interactor} class'
19
- # {#context_class context class}
20
- #
21
- # @since 0.1.0
22
- #
23
- # @example
24
- # class MyInteractor < ActiveInteractor::Base
25
- # context_attributes :first_name, :last_name
26
- # end
27
- #
28
- # MyInteractor.context_class.attributes
29
- # #=> [:first_name, :last_name]
30
- #
31
- # @!method context_attribute_missing(match, *args, &block)
32
- # Call {ActiveInteractor::Context::Base.attribute_missing .attribute_missing} on the {Base interactor} class'
33
- # {#context_class context class}
34
- #
35
- # @since 1.0.1
36
- #
37
- # @!method context_respond_to_without_attributes?(method, include_private_methods = false)
38
- # Call {ActiveInteractor::Context::Base.respond_to_without_attributes? .respond_to_without_attributes?} on the
39
- # {Base interactor} class' {#context_class context class}
40
- #
41
- # @since 1.0.1
42
- delegate :attributes, :attribute_missing, :respond_to_without_attributes?, to: :context_class, prefix: :context
43
-
44
- # @!method context_attribute(name, type=Type::Value.new, **options)
45
- # Call {ActiveInteractor::Context::Base.attribute .attribute} on the {Base interactor} class'
46
- # {#context_class context class}
47
- #
48
- # @since 1.0.1
49
- #
50
- # @example Setting default values on the {ActiveInteractor::Context::Base context} class
51
- # class MyInteractor < ActiveInteractor::Base
52
- # context_attribute :first_name, default: -> { 'Aaron' }
53
- # end
54
- #
55
- # MyInteractor.perform
56
- # #=> <#MyInteractor::Context first_name='Aaron'>
57
- #
58
- # MyInteractor.perform(first_name: 'Bob')
59
- # #=> <#MyInteractor::Context first_name='Bob'>
60
- #
61
- # @!method context_attribute_names
62
- # Call {ActiveInteractor::Context::Base.attribute_names .attribute_names} on the {Base interactor} class'
63
- # {#context_class context class}
64
- #
65
- # @since 1.0.1
66
- delegate(*ActiveModel::Attributes::ClassMethods.instance_methods, to: :context_class, prefix: :context)
67
-
68
- # @!method context_attribute_method?(attribute)
69
- # Call {ActiveInteractor::Context::Base.attribute_method? .attribute_method?} on the {Base interactor} class'
70
- # {#context_class context class}
71
- #
72
- # @since 0.1.0
73
- #
74
- # @!method context_clear_validators!(attribute)
75
- # Call {ActiveInteractor::Context::Base.clear_validators! .clear_validators!} on the {Base interactor} class'
76
- # {#context_class context class}
77
- #
78
- # @since 0.1.0
79
- #
80
- # @!method context_validate(*args, &block)
81
- # Call {ActiveInteractor::Context::Base.validate .validate} on the {Base interactor} class'
82
- # {#context_class context class}
83
- #
84
- # @since 0.1.0
85
- #
86
- # @!method context_validates(*attributes)
87
- # Call {ActiveInteractor::Context::Base.validates .validates} on the {Base interactor} class'
88
- # {#context_class context class}
89
- #
90
- # @since 0.1.0
91
- #
92
- # @!method context_validates!(*attributes)
93
- # Call {ActiveInteractor::Context::Base.validates! .validates!} on the {Base interactor} class'
94
- # {#context_class context class}
95
- #
96
- # @since 0.1.0
97
- #
98
- # @!method context_validates_each(*attr_names, &block)
99
- # Call {ActiveInteractor::Context::Base.validates_each .validates_each} on the {Base interactor} class'
100
- # {#context_class context class}
101
- #
102
- # @since 0.1.0
103
- #
104
- # @!method context_validates_with(*args, &block)
105
- # Call {ActiveInteractor::Context::Base.validates_with .validates_with} on the {Base interactor} class'
106
- # {#context_class context class}
107
- #
108
- # @since 0.1.0
109
- #
110
- # @!method context_validators
111
- # Call {ActiveInteractor::Context::Base.validators .validators} on the {Base interactor} class'
112
- # {#context_class context class}
113
- #
114
- # @since 0.1.0
115
- #
116
- # @!method context_validators_on(*attributes)
117
- # Call {ActiveInteractor::Context::Base.validators_on .validators_on} on the {Base interactor} class'
118
- # {#context_class context class}
119
- #
120
- # @since 0.1.0
121
- delegate(*ActiveModel::Validations::ClassMethods.instance_methods, to: :context_class, prefix: :context)
122
-
123
- # @!method context_validates_absence_of(*attr_names)
124
- # Call {ActiveInteractor::Context::Base.validates_absence_of .validates_absence_of} on the {Base interactor}
125
- # class' {#context_class context class}
126
- #
127
- # @since 0.1.0
128
- #
129
- # @!method context_validates_acceptance_of(*attr_names)
130
- # Call {ActiveInteractor::Context::Base.validates_acceptance_of .validates_acceptance_of} on the
131
- # {Base interactor} class' {#context_class context class}
132
- #
133
- # @since 0.1.0
134
- #
135
- # @!method context_validates_confirmation_of(*attr_names)
136
- # Call {ActiveInteractor::Context::Base.validates_confirmation_of .validates_confirmation_of} on the
137
- # {Base interactor} class' {#context_class context class}
138
- #
139
- # @since 0.1.0
140
- #
141
- # @!method context_validates_exclusion_of(*attr_names)
142
- # Call {ActiveInteractor::Context::Base.validates_exclusion_of .validates_exclusion_of} on the
143
- # {Base interactor} class' {#context_class context class}
144
- #
145
- # @since 0.1.0
146
- #
147
- # @!method context_validates_format_of(*attr_names)
148
- # Call {ActiveInteractor::Context::Base.validates_format_of .validates_format_of} on the {Base interactor}
149
- # class' {#context_class context class}
150
- #
151
- # @since 0.1.0
152
- #
153
- # @!method context_validates_inclusion_of(*attr_names)
154
- # Call {ActiveInteractor::Context::Base.validates_inclusion_of .validates_inclusion_of} on the
155
- # {Base interactor} class' {#context_class context class}
156
- #
157
- # @since 0.1.0
158
- #
159
- # @!method context_validates_length_of(*attr_names)
160
- # Call {ActiveInteractor::Context::Base.validates_length_of .validates_length_of} on the {Base interactor}
161
- # class' {#context_class context class}
162
- #
163
- # @since 0.1.0
164
- #
165
- # @!method context_validates_numericality_of(*attr_names)
166
- # Call {ActiveInteractor::Context::Base.validates_numericality_of .validates_numericality_of} on the
167
- # {Base interactor} class' {#context_class context class}
168
- #
169
- # @since 0.1.0
170
- #
171
- # @!method context_validates_presence_of(*attr_names)
172
- # Call {ActiveInteractor::Context::Base.validates_presence_of .validates_presence_of} on the {Base interactor}
173
- # class' {#context_class context class}
174
- #
175
- # @since 0.1.0
176
- #
177
- # @!method context_validates_size_of(*attr_names)
178
- # Call {ActiveInteractor::Context::Base.validates_size_of .validates_size_of} on the {Base interactor} class'
179
- # {#context_class context class}
180
- #
181
- # @since 0.1.0
182
- delegate(*ActiveModel::Validations::HelperMethods.instance_methods, to: :context_class, prefix: :context)
183
-
184
- # Get the {Base interactor} class' {ActiveInteractor::Context::Base context} class. If no class is found or no
185
- # class is set via the {#contextualize_with} method a new class is created.
186
- #
187
- # @see ActiveInteractor::Context::Loader.find_or_create
188
- #
189
- # @return [Const] the {Base interactor} class' {ActiveInteractor::Context::Base context} class
190
- def context_class
191
- @context_class ||= ActiveInteractor::Context::Loader.find_or_create(self)
192
- end
193
-
194
- # Set the {Base interactor} class' {#context_class context class}
195
- #
196
- # @since 1.0.0
197
- #
198
- # @example
199
- # class User < ActiveRecord::Base
200
- # end
201
- #
202
- # class MyInteractor < ActiveInteractor::Base
203
- # contextualize_with :user
204
- # end
205
- #
206
- # MyInteractor.context_class
207
- # #=> User
208
- #
209
- # @param klass [Const, Symbol, String] the class to use as context
210
- # @raise [Error::InvalidContextClass] if the class can not be found.
211
- # @return [Const] the {Base interactor} class' {ActiveInteractor::Context::Base context} class
212
- def contextualize_with(klass)
213
- @context_class = begin
214
- context_class = klass.to_s.camelize.safe_constantize
215
- raise(ActiveInteractor::Error::InvalidContextClass, klass) unless context_class
216
-
217
- context_class
218
- end
219
- end
220
- end
221
-
222
- # @!method context_attribute_missing(match, *args, &block)
223
- # Call {ActiveInteractor::Context::Base#attribute_missing #attribute_missing} on the {Base interactor} instance's
224
- # {ActiveInteractor::Context::Base context} instance
225
- #
226
- # @since 1.0.1
227
- #
228
- # @!method context_attribute_names
229
- # Call {ActiveInteractor::Context::Base#attribute_names #attribute_names} on the {Base interactor} instance's
230
- # {ActiveInteractor::Context::Base context} instance
231
- #
232
- # @since 1.0.1
233
- #
234
- # @!method context_fail!(errors = nil)
235
- # Call {ActiveInteractor::Context::Status#fail! #fail!} on the {Base interactor} instance's
236
- # {ActiveInteractor::Context::Base context} instance
237
- #
238
- # @since 1.0.0
239
- #
240
- # @!method context_respond_to_without_attributes?(method, include_private_methods = false)
241
- # Call {ActiveInteractor::Context::Base#respond_to_without_attributes? #respond_to_without_attributes?} on the
242
- # {Base interactor} instance's {ActiveInteractor::Context::Base context} instance
243
- #
244
- # @since 1.0.1
245
- #
246
- # @!method context_rollback!
247
- # Call {ActiveInteractor::Context::Status#rollback! #rollback!} on the {Base interactor} instance's
248
- # {ActiveInteractor::Context::Base context} instance
249
- #
250
- # @since 1.0.0
251
- delegate :attribute_missing, :attribute_names, :fail!, :respond_to_without_attributes?, :rollback!,
252
- to: :context, prefix: true
253
-
254
- # @!method context_errors
255
- # Call {ActiveInteractor::Context::Base#errors #errors} on the {Base interactor} instance's
256
- # {ActiveInteractor::Context::Base context} instance
257
- #
258
- # @since 0.1.0
259
- #
260
- # @!method context_invalid?(context = nil)
261
- # Call {ActiveInteractor::Context::Base#invalid? #invalid?} on the {Base interactor} instance's
262
- # {ActiveInteractor::Context::Base context} instance
263
- #
264
- # @since 0.1.0
265
- #
266
- # @!method context_valid?(context = nil)
267
- # Call {ActiveInteractor::Context::Base#valid? #valid?} on the {Base interactor} instance's
268
- # {ActiveInteractor::Context::Base context} instance
269
- #
270
- # @since 0.1.0
271
- #
272
- # @!method context_validate(context = nil)
273
- # Call {ActiveInteractor::Context::Base#validate #validate} on the {Base interactor} instance's
274
- # {ActiveInteractor::Context::Base context} instance
275
- #
276
- # @since 0.1.0
277
- #
278
- # @!method context_validate!(context = nil)
279
- # Call {ActiveInteractor::Context::Base#validate! #validate!} on the {Base interactor} instance's
280
- # {ActiveInteractor::Context::Base context} instance
281
- #
282
- # @since 0.1.0
283
- #
284
- # @!method context_validates_with(*args, &block)
285
- # Call {ActiveInteractor::Context::Base#validates_with #validates_with} on the {Base interactor} instance's
286
- # {ActiveInteractor::Context::Base context} instance
287
- #
288
- # @since 0.1.0
289
- delegate(*ActiveModel::Validations.instance_methods, to: :context, prefix: true)
290
-
291
- # @!method context_validates_absence_of(*attr_names)
292
- # Call {ActiveInteractor::Context::Base#validates_absence_of #validates_absence_of} on the {Base interactor}
293
- # instance's {ActiveInteractor::Context::Base context} instance
294
- #
295
- # @since 0.1.0
296
- #
297
- # @!method context_validates_acceptance_of(*attr_names)
298
- # Call {ActiveInteractor::Context::Base#validates_acceptance_of #validates_acceptance_of} on the
299
- # {Base interactor} instance's {ActiveInteractor::Context::Base context} instance
300
- #
301
- # @since 0.1.0
302
- #
303
- # @!method context_validates_confirmation_of(*attr_names)
304
- # Call {ActiveInteractor::Context::Base#validates_confirmation_of #validates_confirmation_of} on the
305
- # {Base interactor} instance's {ActiveInteractor::Context::Base context} instance
306
- #
307
- # @since 0.1.0
308
- #
309
- # @!method context_validates_exclusion_of(*attr_names)
310
- # Call {ActiveInteractor::Context::Base#validates_exclusion_of #validates_exclusion_of} on the {Base interactor}
311
- # instance's {ActiveInteractor::Context::Base context} instance
312
- #
313
- # @since 0.1.0
314
- #
315
- # @!method context_validates_format_of(*attr_names)
316
- # Call {ActiveInteractor::Context::Base#validates_format_of #validates_format_of} on the {Base interactor}
317
- # instance's {ActiveInteractor::Context::Base context} instance
318
- #
319
- # @since 0.1.0
320
- #
321
- # @!method context_validates_inclusion_of(*attr_names)
322
- # Call {ActiveInteractor::Context::Base#validates_inclusion_of #validates_inclusion_of} on the
323
- # {Base interactor} instance's {ActiveInteractor::Context::Base context} instance
324
- #
325
- # @since 0.1.0
326
- #
327
- # @!method context_validates_length_of(*attr_names)
328
- # Call {ActiveInteractor::Context::Base#validates_length_of #validates_length_of} on the {Base interactor}
329
- # instance's {ActiveInteractor::Context::Base context} instance
330
- #
331
- # @since 0.1.0
332
- #
333
- # @!method context_validates_numericality_of(*attr_names)
334
- # Call {ActiveInteractor::Context::Base#validates_numericality_of #validates_numericality_of} on the
335
- # {Base interactor} instance's {ActiveInteractor::Context::Base context} instance
336
- #
337
- # @since 0.1.0
338
- #
339
- # @!method context_validates_presence_of(*attr_names)
340
- # Call {ActiveInteractor::Context::Base#validates_presence_of #validates_presence_of} on the {Base interactor}
341
- # instance's {ActiveInteractor::Context::Base context} instance
342
- #
343
- # @since 0.1.0
344
- #
345
- # @!method context_validates_size_of(*attr_names)
346
- # Call {ActiveInteractor::Context::Base#validates_size_of #validates_size_of} on the {Base interactor}
347
- # instance's {ActiveInteractor::Context::Base context} instance
348
- #
349
- # @since 0.1.0
350
- delegate(*ActiveModel::Validations::HelperMethods.instance_methods, to: :context, prefix: true)
351
-
352
- # Initialize a new instance of {Base}
353
- #
354
- # @param context [Hash, Class] attributes to assign to the {Base interactor} instance's
355
- # {ActiveInteractor::Context::Base context} instance
356
- # @return [Base] a new instance of {Base}
357
- def initialize(context = {})
358
- @context = self.class.context_class.new(context)
359
- end
360
-
361
- # Mark the {Base interactor} instance as called on the instance's {ActiveInteractor::Context::Base context}
362
- # instance and return the {ActiveInteractor::Context::Base context} instance.
363
- #
364
- # @since 1.0.0
365
- #
366
- # @return [Class] the {ActiveInteractor::Context::Base context} instance
367
- def finalize_context!
368
- context.called!(self)
369
- context.resolve
370
- context
371
- end
372
-
373
- private
374
-
375
- attr_accessor :context
376
- end
377
- end
378
- end
@@ -1,260 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveInteractor
4
- module Interactor
5
- # Interactor perform methods. Because {Perform} is a module classes should include {Perform} rather than inherit
6
- # from it.
7
- #
8
- # @author Aaron Allen <hello@aaronmallen.me>
9
- # @since 1.0.0
10
- module Perform
11
- # Interactor perform class methods. Because {ClassMethods} is a module classes should extend {ClassMethods}
12
- # rather than inherit from it.
13
- #
14
- # @author Aaron Allen <hello@aaronmallen.me>
15
- # @since 1.0.0
16
- module ClassMethods
17
- # Initialize a new {Base interactor} instance and call its {Interactor::Perform#perform #perform} method. This
18
- # is the default api to interact with all {Base interactors}.
19
- #
20
- # @since 0.1.0
21
- #
22
- # @example
23
- # class MyInteractor < ActiveInteractor::Base
24
- # def perform
25
- # puts "I performed"
26
- # end
27
- # end
28
- #
29
- # MyInteractor.perform
30
- # "I performed"
31
- # #=> <#MyInteractor::Context>
32
- #
33
- # @param context [Hash, Class] attributes to assign to the {Base interactor} instance's
34
- # {ActiveInteractor::Context::Base context} instance
35
- # @param options [Hash, Perform::Options] options to use for the {.perform}. See {Perform::Options}
36
- # @return [Class] an instance of the {Base interactor} class' {ActiveInteractor::Context::Base context}
37
- # instance
38
- def perform(context = {}, options = {})
39
- new(context).with_options(options).execute_perform
40
- end
41
-
42
- # Initialize a new {Base interactor} instance and call its {Interactor::Perform#perform #perform} method without
43
- # rescuing {ActiveInteractor::Error::ContextFailure}.
44
- #
45
- # @since 0.1.0
46
- #
47
- # @example Calling {Perform::ClassMethods#perform! .perform!} without failure
48
- # class MyInteractor < ActiveInteractor::Base
49
- # def perform
50
- # puts "I performed"
51
- # end
52
- # end
53
- #
54
- # MyInteractor.perform!
55
- # "I performed"
56
- # #=> <#MyInteractor::Context>
57
- #
58
- # @example Calling {Perform::ClassMethods#perform! .perform!} with failure
59
- # class MyInteractor < ActiveInteractor::Base
60
- # def perform
61
- # context.fail!
62
- # end
63
- # end
64
- #
65
- # MyInteractor.perform!
66
- # ActiveInteractor::Error::ContextFailure "<#MyInteractor::Context>"
67
- #
68
- # @param context [Hash, Class] attributes to assign to the {Base interactor} instance's
69
- # {ActiveInteractor::Context::Base context} instance
70
- # @param options [Hash, Perform::Options] options to use for the {.perform}. See {Perform::Options}
71
- # @raise [Error::ContextFailure] if the {ActiveInteractor::Context::Base context} instance
72
- # fails.
73
- # @return [Class] an instance of the {Base interactor} class' {ActiveInteractor::Context::Base context}
74
- # instance
75
- def perform!(context = {}, options = {})
76
- new(context).with_options(options).execute_perform!
77
- end
78
- end
79
-
80
- # Interactor {Interactor::Perform#perform #perform} options
81
- #
82
- # @author Aaron Allen <hello@aaronmallen.me>
83
- # @since 1.0.0
84
- #
85
- # @!attribute [rw] skip_each_perform_callbacks
86
- # if `true` an {Organizer::Base organizer} will be instructed to skip
87
- # {Organizer::Callbacks::ClassMethods each_perform} callbacks.
88
- #
89
- # @since 1.0.0
90
- #
91
- # @return [Boolean] whether or not to skip {Organizer::Callbacks::ClassMethods each_perform} callbacks
92
- #
93
- # @!attribute [rw] skip_perform_callbacks
94
- # if `true` an {Base interactor} will be instructed to skip {Interactor::Callbacks::ClassMethods perform}
95
- # callbacks.
96
- #
97
- # @since 1.0.0
98
- #
99
- # @return [Boolean] whether or not to skip {Interactor::Callbacks::ClassMethods perform} callbacks.
100
- #
101
- # @!attribute [rw] skip_rollback
102
- # if `true` an {Base interactor} will be instructed to skip {Interactor::Perform#rollback #rollback} on
103
- # {Context::Base context} {ActiveInteractor::Context::Status#fail! failure}.
104
- #
105
- # @since 1.0.0
106
- #
107
- # @return [Boolean] whether or not to skip {Interactor::Perform#rollback #rollback}
108
- #
109
- # @!attribute [rw] skip_rollback_callbacks
110
- # if `true` an {Base interactor} will be instructed to skip {Interactor::Callbacks::ClassMethods rollback}
111
- # callbacks on {Context::Base context} {ActiveInteractor::Context::Status#fail! failure}.
112
- #
113
- # @since 1.0.0
114
- #
115
- # @return [Boolean] whether or not to skip {Interactor::Callbacks::ClassMethods rollback} callbacks.
116
- #
117
- # @!attribute [rw] validate
118
- # if `false` an {Base interactor} will not run validations.
119
- #
120
- # @since 1.0.0
121
- #
122
- # @return [Boolean] whether or to run validations.
123
- #
124
- # @!attribute [rw] validate_on_calling
125
- # if `false` an {Base interactor} will not run validations with the validation context `:calling`.
126
- #
127
- # @since 1.0.0
128
- #
129
- # @return [Boolean] whether or to run validations with the validation context `:calling`
130
- #
131
- # @!attribute [rw] validate_on_called
132
- # if `false` an {Base interactor} will not run validations with the validation context `:called`.
133
- #
134
- # @since 1.0.0
135
- #
136
- # @return [Boolean] whether or to run validation with the validation context `:called`.
137
- #
138
- # @!method initialize(options = {})
139
- # Initialize a new instance of {Options}
140
- #
141
- # @since 1.0.0
142
- #
143
- # @param options [Hash{Symbol=>*}] the attributes to assign to {Options}
144
- # @option options [Boolean] :skip_each_perform_callbacks (false) the {Options#skip_each_perform_callbacks}
145
- # attribute
146
- # @option options [Boolean] :skip_perform_callbacks (false) the {Options#skip_perform_callbacks} attribute
147
- # @option options [Boolean] :skip_rollback (false) the {Options#skip_rollback} attribute
148
- # @option options [Boolean] :skip_rollback_callbacks (false) the {Options#skip_rollback_callbacks} attribute
149
- # @option options [Boolean] :validate (true) the {Options#validate} attribute
150
- # @option options [Boolean] :validate_on_calling (true) the {Options#validate_on_calling} attribute
151
- # @option options [Boolean] :validate_on_called (true) the {Options#validate_on_called} attribute
152
- # @return [Options] a new instance of {Options}
153
- class Options
154
- include ActiveInteractor::Configurable
155
- defaults skip_each_perform_callbacks: false, skip_perform_callbacks: false, skip_rollback: false,
156
- skip_rollback_callbacks: false, validate: true, validate_on_calling: true, validate_on_called: true
157
- end
158
-
159
- # @!method execute_perform
160
- # Run the {Base interactor} instance's {#perform} with callbacks and validation.
161
- #
162
- # @api private
163
- # @since 0.1.0
164
- #
165
- # @!method execute_perform!
166
- # Run the {Base interactor} instance's {#perform} with callbacks and validation without rescuing
167
- # {Error::ContextFailure}.
168
- #
169
- # @api private
170
- # @since 0.1.0
171
- delegate :execute_perform, :execute_perform!, to: :worker
172
-
173
- # Duplicate an {Base interactor} instance as well as it's {#options} and {ActiveInteractor::Context::Base context}
174
- # instances.
175
- #
176
- # @return [Base] a duplicated {Base interactor} instance
177
- def deep_dup
178
- dupped = dup
179
- %w[@context @options].each do |variable|
180
- dupped.instance_variable_set(variable, instance_variable_get(variable)&.dup)
181
- end
182
- dupped
183
- end
184
-
185
- # Options for the {Base interactor} {#perform}
186
- #
187
- # @return [Options] an instance of {Options}
188
- def options
189
- @options ||= ActiveInteractor::Interactor::Perform::Options.new
190
- end
191
-
192
- # The steps to run when an {Base interactor} is called. An {Base interactor's} {#perform} method should never be
193
- # called directly on an {Base interactor} instance and should instead be invoked by the {Base interactor's} class
194
- # method {Perform::ClassMethods#perform .perform}.
195
- #
196
- # @since 0.1.0
197
- #
198
- # @abstract {Base interactors} should override {#perform} with the appropriate steps and
199
- # {ActiveInteractor::Context::Base context} mutations required for the {Base interactor} to do its work.
200
- #
201
- # @example
202
- # class MyInteractor < ActiveInteractor::Base
203
- # def perform
204
- # context.first_name = 'Aaron'
205
- # end
206
- # end
207
- #
208
- # MyInteractor.perform
209
- # #=> <#MyInteractor::Context first_name='Aaron'>
210
- def perform; end
211
-
212
- # The steps to run when an {Base interactor} {ActiveInteractor::Context::Status#fail! fails}. An
213
- # {Base interactor's} {#rollback} method should never be called directly and is instead called by the
214
- # {Base interactor's} {ActiveInteractor::Context::Base context} when
215
- # {ActiveInteractor::Context::Status#fail! #fail} is called.
216
- #
217
- # @since 0.1.0
218
- #
219
- # @abstract {Base interactors} should override {#rollback} with the appropriate steps and
220
- # {ActiveInteractor::Context::Base context} mutations required for the {Base interactor} to roll back its work.
221
- #
222
- # @example
223
- # class MyInteractor < ActiveInteractor::Base
224
- # def perform
225
- # context.first_name = 'Aaron'
226
- # context.fail!
227
- # end
228
- #
229
- # def rollback
230
- # context.first_name = 'Bob'
231
- # end
232
- # end
233
- #
234
- # MyInteractor.perform
235
- # #=> <#MyInteractor::Context first_name='Bob'>
236
- def rollback; end
237
-
238
- # Set {Options options} for an {Base interactor's} {#perform}
239
- #
240
- # @api private
241
- #
242
- # @param options [Hash, Perform::Options] options to use for the perform call. See {Perform::Options}
243
- # @return [self] the {Base interactor} instance
244
- def with_options(options)
245
- @options = if options.is_a?(ActiveInteractor::Interactor::Perform::Options)
246
- options
247
- else
248
- ActiveInteractor::Interactor::Perform::Options.new(options)
249
- end
250
- self
251
- end
252
-
253
- private
254
-
255
- def worker
256
- ActiveInteractor::Interactor::Worker.new(self)
257
- end
258
- end
259
- end
260
- end