activeinteractor 1.2.1 → 2.0.0.alpha.1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -3
- data/LICENSE +1 -1
- data/README.md +4 -64
- data/lib/active_interactor/base.rb +77 -29
- data/lib/active_interactor/errors.rb +12 -0
- data/lib/active_interactor/result.rb +73 -0
- data/lib/active_interactor.rb +3 -101
- data/sig/active_interactor.rbs +3 -0
- metadata +24 -207
- data/.yardopts +0 -12
- data/lib/active_interactor/config.rb +0 -60
- data/lib/active_interactor/configurable.rb +0 -53
- data/lib/active_interactor/context/attributes.rb +0 -179
- data/lib/active_interactor/context/base.rb +0 -333
- data/lib/active_interactor/context/errors.rb +0 -57
- data/lib/active_interactor/context/loader.rb +0 -50
- data/lib/active_interactor/context/status.rb +0 -106
- data/lib/active_interactor/error.rb +0 -46
- data/lib/active_interactor/interactor/callbacks.rb +0 -293
- data/lib/active_interactor/interactor/context.rb +0 -378
- data/lib/active_interactor/interactor/perform.rb +0 -260
- data/lib/active_interactor/interactor/worker.rb +0 -114
- data/lib/active_interactor/models.rb +0 -50
- data/lib/active_interactor/organizer/base.rb +0 -18
- data/lib/active_interactor/organizer/callbacks.rb +0 -275
- data/lib/active_interactor/organizer/interactor_interface.rb +0 -127
- data/lib/active_interactor/organizer/interactor_interface_collection.rb +0 -62
- data/lib/active_interactor/organizer/organize.rb +0 -67
- data/lib/active_interactor/organizer/perform.rb +0 -113
- data/lib/active_interactor/rails/orm/active_record.rb +0 -5
- data/lib/active_interactor/rails/orm/dynamoid.rb +0 -5
- data/lib/active_interactor/rails/orm/mongoid.rb +0 -5
- data/lib/active_interactor/rails/railtie.rb +0 -21
- data/lib/active_interactor/rails.rb +0 -4
- data/lib/active_interactor/version.rb +0 -45
- data/lib/rails/generators/active_interactor/application_context_generator.rb +0 -21
- data/lib/rails/generators/active_interactor/application_interactor_generator.rb +0 -21
- data/lib/rails/generators/active_interactor/application_organizer_generator.rb +0 -21
- data/lib/rails/generators/active_interactor/base.rb +0 -29
- data/lib/rails/generators/active_interactor/generator.rb +0 -21
- data/lib/rails/generators/active_interactor/install_generator.rb +0 -16
- data/lib/rails/generators/active_interactor.rb +0 -5
- data/lib/rails/generators/interactor/context/rspec_generator.rb +0 -17
- data/lib/rails/generators/interactor/context/test_unit_generator.rb +0 -17
- data/lib/rails/generators/interactor/context_generator.rb +0 -22
- data/lib/rails/generators/interactor/generates_context.rb +0 -28
- data/lib/rails/generators/interactor/interactor_generator.rb +0 -25
- data/lib/rails/generators/interactor/organizer_generator.rb +0 -39
- data/lib/rails/generators/interactor/rspec_generator.rb +0 -15
- data/lib/rails/generators/interactor/test_unit_generator.rb +0 -15
- data/lib/rails/generators/templates/active_interactor.erb +0 -17
- data/lib/rails/generators/templates/application_context.rb +0 -4
- data/lib/rails/generators/templates/application_interactor.rb +0 -4
- data/lib/rails/generators/templates/application_organizer.rb +0 -4
- data/lib/rails/generators/templates/context.erb +0 -7
- data/lib/rails/generators/templates/context_spec.erb +0 -7
- data/lib/rails/generators/templates/context_test_unit.erb +0 -9
- data/lib/rails/generators/templates/interactor.erb +0 -15
- data/lib/rails/generators/templates/interactor_spec.erb +0 -7
- data/lib/rails/generators/templates/interactor_test_unit.erb +0 -9
- data/lib/rails/generators/templates/organizer.erb +0 -13
- data/spec/active_interactor/base_spec.rb +0 -85
- data/spec/active_interactor/config_spec.rb +0 -17
- data/spec/active_interactor/context/base_spec.rb +0 -443
- data/spec/active_interactor/error_spec.rb +0 -45
- data/spec/active_interactor/interactor/perform/options_spec.rb +0 -25
- data/spec/active_interactor/interactor/worker_spec.rb +0 -189
- data/spec/active_interactor/organizer/base_spec.rb +0 -276
- data/spec/active_interactor/organizer/interactor_interface_collection_spec.rb +0 -78
- data/spec/active_interactor/organizer/interactor_interface_spec.rb +0 -235
- data/spec/active_interactor/version_spec.rb +0 -119
- data/spec/active_interactor_spec.rb +0 -23
- data/spec/integration/a_basic_interactor_spec.rb +0 -154
- data/spec/integration/a_basic_organizer_spec.rb +0 -354
- data/spec/integration/a_failing_interactor_spec.rb +0 -43
- data/spec/integration/active_record_integration_spec.rb +0 -32
- data/spec/integration/an_interactor_with_after_context_validation_callbacks_spec.rb +0 -69
- data/spec/integration/an_interactor_with_after_perform_callbacks_spec.rb +0 -31
- data/spec/integration/an_interactor_with_after_rollback_callbacks_spec.rb +0 -34
- data/spec/integration/an_interactor_with_an_existing_context_class_spec.rb +0 -50
- data/spec/integration/an_interactor_with_around_perform_callbacks_spec.rb +0 -35
- data/spec/integration/an_interactor_with_around_rollback_callbacks_spec.rb +0 -39
- data/spec/integration/an_interactor_with_before_perform_callbacks_spec.rb +0 -31
- data/spec/integration/an_interactor_with_before_rollback_callbacks_spec.rb +0 -34
- data/spec/integration/an_interactor_with_deferred_after_callbacks.rb +0 -32
- data/spec/integration/an_interactor_with_validations_on_called_spec.rb +0 -41
- data/spec/integration/an_interactor_with_validations_on_calling_spec.rb +0 -37
- data/spec/integration/an_interactor_with_validations_spec.rb +0 -95
- data/spec/integration/an_organizer_containing_organizer_with_after_callbacks_deferred_spec.rb +0 -125
- data/spec/integration/an_organizer_performing_in_parallel_spec.rb +0 -48
- data/spec/integration/an_organizer_with_after_callbacks_deferred_spec.rb +0 -154
- data/spec/integration/an_organizer_with_after_each_callbacks_spec.rb +0 -35
- data/spec/integration/an_organizer_with_all_perform_callbacks.rb +0 -112
- data/spec/integration/an_organizer_with_around_each_callbacks_spec.rb +0 -39
- data/spec/integration/an_organizer_with_before_each_callbacks_spec.rb +0 -35
- data/spec/integration/an_organizer_with_conditionally_organized_interactors_spec.rb +0 -326
- data/spec/integration/an_organizer_with_failing_nested_organizer_spec.rb +0 -47
- data/spec/integration/an_organizer_with_options_callbacks_spec.rb +0 -64
- data/spec/spec_helper.rb +0 -33
- data/spec/support/coverage.rb +0 -50
- data/spec/support/helpers/factories.rb +0 -49
- data/spec/support/shared_examples/a_class_that_extends_active_interactor_models_example.rb +0 -81
- data/spec/support/shared_examples/a_class_with_interactor_callback_methods_example.rb +0 -107
- data/spec/support/shared_examples/a_class_with_interactor_context_methods_example.rb +0 -60
- data/spec/support/shared_examples/a_class_with_interactor_methods_example.rb +0 -21
- data/spec/support/shared_examples/a_class_with_organizer_callback_methods_example.rb +0 -42
- data/spec/support/spec_helpers.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b84d76be97bd543c4583c588b6f7dae50424c640fa675b7a4fb154bc8bdb1051
|
4
|
+
data.tar.gz: c0846db96ac34ed824b79118395afea967e528f4b8eb797eb7411c156ddb5d55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ce8f776d073318c6bfdc47e6d822febde4570aa4777eab9ff2096bac4e8162a5849e01b929f8ed4e33f04b45edeca018e9a7381e651a3ec1556b68826c2e891
|
7
|
+
data.tar.gz: 822f52d219f12aaec5f373e1eed23f70568b3dd44972eda16f6a2c27f03fb1895b3566d605602448443db263765dae6e0b7a0c2e1dfdd0f61d0392c92c064977
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning].
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [v1.2.2] - 2023-09-30
|
11
|
+
|
12
|
+
### Fixed
|
13
|
+
|
14
|
+
- [\#366] Fixes a minor timing issue for when deferred after_perform callbacks are run.
|
15
|
+
|
10
16
|
## [v1.2.1] - 2022-09-26
|
11
17
|
|
12
18
|
### Fixed
|
@@ -21,7 +27,7 @@ and this project adheres to [Semantic Versioning].
|
|
21
27
|
|
22
28
|
## [v1.2.0] - 2022-09-08
|
23
29
|
|
24
|
-
|
30
|
+
|
25
31
|
|
26
32
|
- `ActiveInteractor::Base.defer_after_callbacks_when_organized`
|
27
33
|
- `ActiveInteractor::Organizer::Base.after_all_perform`
|
@@ -270,9 +276,10 @@ and this project adheres to [Semantic Versioning].
|
|
270
276
|
|
271
277
|
<!-- versions -->
|
272
278
|
|
273
|
-
[Unreleased]: https://github.com/aaronmallen/activeinteractor/compare/
|
279
|
+
[Unreleased]: https://github.com/aaronmallen/activeinteractor/compare/v2.0.0-alpha.1.0.0...HEAD
|
280
|
+
[v1.2.2]: https://github.com/aaronmallen/activeinteractor/compare/v1.2.1...v1.2.2
|
274
281
|
[v1.2.1]: https://github.com/aaronmallen/activeinteractor/compare/v1.2.0...v1.2.1
|
275
|
-
[v1.2.0]: https://github.com/aaronmallen/activeinteractor/compare/v1.1.
|
282
|
+
[v1.2.0]: https://github.com/aaronmallen/activeinteractor/compare/v1.1.7...v1.2.0
|
276
283
|
[v1.1.7]: https://github.com/aaronmallen/activeinteractor/compare/v1.1.6...v1.1.7
|
277
284
|
[v1.1.6]: https://github.com/aaronmallen/activeinteractor/compare/v1.1.4...v1.1.6
|
278
285
|
[v1.1.4]: https://github.com/aaronmallen/activeinteractor/compare/v1.1.3...v1.1.4
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,69 +1,9 @@
|
|
1
1
|
# ActiveInteractor
|
2
2
|
|
3
3
|
[![Version](https://img.shields.io/gem/v/activeinteractor.svg?logo=ruby)](https://rubygems.org/gems/activeinteractor)
|
4
|
-
[![Build
|
5
|
-
[![
|
6
|
-
[![Test Coverage](https://api.codeclimate.com/v1/badges/2f1cb318f681a1eebb27/test_coverage)](https://codeclimate.com/github/aaronmallen/activeinteractor/test_coverage)
|
7
|
-
[![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://www.rubydoc.info/gems/activeinteractor)
|
8
|
-
[![Inline docs](http://inch-ci.org/github/aaronmallen/activeinteractor.svg?branch=main)](http://inch-ci.org/github/aaronmallen/activeinteractor)
|
9
|
-
[![License](https://img.shields.io/github/license/aaronmallen/activeinteractor.svg?maxAge=300)](https://github.com/aaronmallen/activeinteractor/blob/main/LICENSE)
|
4
|
+
[![Build](https://github.com/activeinteractor/activeinteractor/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/activeinteractor/activeinteractor/actions/workflows/build.yml)
|
5
|
+
[![License](https://img.shields.io/github/license/activeinteractor/activeinteractor.svg?maxAge=300)](https://github.com/activeinteractor/activeinteractor/blob/main/LICENSE)
|
10
6
|
|
11
|
-
|
12
|
-
[interactor][collective_idea_interactors] gem. Rich support for attributes, callbacks, and validations,
|
13
|
-
and thread safe performance methods.
|
7
|
+
## DISCLAIMER
|
14
8
|
|
15
|
-
|
16
|
-
course on how to use ActiveInteractors. Read the [wiki] for detailed usage information.
|
17
|
-
|
18
|
-
## Features
|
19
|
-
|
20
|
-
* [Context validation][wiki_context_validation]
|
21
|
-
* [Callbacks][wiki_callbacks]
|
22
|
-
* Thread safe performance calls
|
23
|
-
* Organize multiple interactors [conditionally][wiki_organizers_conditionally] or in [parallel][wiki_organizers_parallel]
|
24
|
-
|
25
|
-
## Documentation
|
26
|
-
|
27
|
-
Be sure to read the [wiki] for detailed information on how to use ActiveInteractor.
|
28
|
-
|
29
|
-
For technical documentation please see the gem's [ruby docs].
|
30
|
-
|
31
|
-
## Install
|
32
|
-
|
33
|
-
Add this line to your application's Gemfile:
|
34
|
-
|
35
|
-
```ruby
|
36
|
-
gem 'activeinteractor', require: 'active_interactor'
|
37
|
-
```
|
38
|
-
|
39
|
-
Or install it yourself as:
|
40
|
-
|
41
|
-
```sh
|
42
|
-
gem install activeinteractor
|
43
|
-
```
|
44
|
-
|
45
|
-
## Contributing
|
46
|
-
|
47
|
-
Read our guidelines for [Contributing](CONTRIBUTING.md).
|
48
|
-
|
49
|
-
## Acknowledgements
|
50
|
-
|
51
|
-
ActiveInteractor is made possible by wonderful [humans].
|
52
|
-
|
53
|
-
## License
|
54
|
-
|
55
|
-
The gem is available as open source under the terms of the [MIT License][mit_license].
|
56
|
-
|
57
|
-
[ActiveModel::Validations]: https://api.rubyonrails.org/classes/ActiveModel/Validations.html
|
58
|
-
[business_logic_wikipedia]: https://en.wikipedia.org/wiki/Business_logic
|
59
|
-
[collective_idea_interactors]: https://github.com/collectiveidea/interactor
|
60
|
-
[command pattern]: https://en.wikipedia.org/wiki/Command_pattern
|
61
|
-
[humans]: https://github.com/aaronmallen/activeinteractor/tree/main/HUMANS.md
|
62
|
-
[Medium article]: https://medium.com/@aaronmallen/activeinteractor-8557c0dc78db
|
63
|
-
[mit_license]: https://opensource.org/licenses/MIT
|
64
|
-
[ruby docs]: https://www.rubydoc.info/gems/activeinteractor
|
65
|
-
[wiki]: https://github.com/aaronmallen/activeinteractor/wiki
|
66
|
-
[wiki_callbacks]: https://github.com/aaronmallen/activeinteractor/wiki/Callbacks
|
67
|
-
[wiki_context_validation]: https://github.com/aaronmallen/activeinteractor/wiki/Context#validating-the-context
|
68
|
-
[wiki_organizers_conditionally]: https://github.com/aaronmallen/activeinteractor/wiki/Interactors#organizing-interactors-conditionally
|
69
|
-
[wiki_organizers_parallel]: https://github.com/aaronmallen/activeinteractor/wiki/Interactors#running-interactors-in-parallel
|
9
|
+
This project is a work in progress. Go [here](https://github.com/aaronmallen/activeinteractor) for information on the current version of ActiveInteractor.
|
@@ -1,35 +1,83 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveInteractor
|
4
|
-
# The base class all {Base interactors} should inherit from.
|
5
|
-
#
|
6
|
-
# When {Base} is loaded by your application an
|
7
|
-
# {https://api.rubyonrails.org/classes/ActiveSupport/LazyLoadHooks.html ActiveSupport load hook} is called
|
8
|
-
# with `:active_interactor` and {Base}.
|
9
|
-
#
|
10
|
-
# @author Aaron Allen <hello@aaronmallen.me>
|
11
|
-
# @since 0.1.0
|
12
|
-
#
|
13
|
-
# @example a basic {Base interactor}
|
14
|
-
# class MyInteractor < ActiveInteractor::Base
|
15
|
-
# def perform
|
16
|
-
# # TODO: implement the perform method
|
17
|
-
# end
|
18
|
-
#
|
19
|
-
# def rollback
|
20
|
-
# # TODO: implement the rollback method
|
21
|
-
# end
|
22
|
-
# end
|
23
4
|
class Base
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
5
|
+
class << self
|
6
|
+
def argument(name, type, description = nil, **options)
|
7
|
+
attributes[:arguments][name.to_sym] = { name: name, type: type, description: description }.merge(options)
|
8
|
+
end
|
9
|
+
|
10
|
+
def perform(input_context = {})
|
11
|
+
new(input_context).send(:exec_perform!)
|
12
|
+
rescue Error => e
|
13
|
+
e.result
|
14
|
+
rescue StandardError => e
|
15
|
+
Result.failure(errors: e.message)
|
16
|
+
end
|
17
|
+
|
18
|
+
def returns(name, type, description = nil, **options)
|
19
|
+
attributes[:fields][name.to_sym] = { name: name, type: type, description: description }.merge(options)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def attributes
|
25
|
+
@attributes ||= { arguments: {}, fields: {} }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize(input = {})
|
30
|
+
@input = input.freeze
|
31
|
+
@context = parse_input!
|
32
|
+
end
|
33
|
+
|
34
|
+
def perform; end
|
35
|
+
def rollback; end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
attr_accessor :context
|
40
|
+
|
41
|
+
def exec_perform!
|
42
|
+
perform
|
43
|
+
Result.success(data: parse_output!)
|
44
|
+
end
|
33
45
|
|
34
|
-
|
46
|
+
def fail!(errors = {})
|
47
|
+
rollback
|
48
|
+
raise Error, Result.failure(data: context, errors: errors)
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse_input!
|
52
|
+
errors = {}
|
53
|
+
context = self.class.send(:attributes)[:arguments].each_with_object({}) do |(name, options), hash|
|
54
|
+
errors = validate_attribute_value(@input[name], name, options, errors)
|
55
|
+
hash[name] = @input[name] || options[:default]
|
56
|
+
end
|
57
|
+
|
58
|
+
raise Error, Result.failure(errors: errors, status: Result::STATUS[:failed_on_input]) unless errors.empty?
|
59
|
+
|
60
|
+
context
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_output!
|
64
|
+
errors = {}
|
65
|
+
context = self.class.send(:attributes)[:fields].each_with_object({}) do |(name, options), hash|
|
66
|
+
errors = validate_attribute_value(self.context[name], name, options, errors)
|
67
|
+
hash[name] = self.context[name] || options[:default]
|
68
|
+
end
|
69
|
+
|
70
|
+
raise Error, Result.failure(errors: errors, status: Result::STATUS[:failed_on_output]) unless errors.empty?
|
71
|
+
|
72
|
+
context
|
73
|
+
end
|
74
|
+
|
75
|
+
def validate_attribute_value(value, attribute_name, attribute_options, errors)
|
76
|
+
return errors unless value.blank? && attribute_options[:required] && !attribute_options[:default]
|
77
|
+
|
78
|
+
errors[attribute_name] ||= []
|
79
|
+
errors[attribute_name] << :blank
|
80
|
+
errors
|
81
|
+
end
|
82
|
+
end
|
35
83
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveInteractor
|
4
|
+
class Result
|
5
|
+
extend ActiveModel::Naming
|
6
|
+
|
7
|
+
STATUS = {
|
8
|
+
success: 0,
|
9
|
+
failed_at_input: 1,
|
10
|
+
failed_at_runtime: 2,
|
11
|
+
failed_at_output: 3
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
attr_reader :data, :errors
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def success(data: {})
|
18
|
+
new(status: STATUS[:success], data: data)
|
19
|
+
end
|
20
|
+
|
21
|
+
def failure(data: {}, errors: {}, status: STATUS[:failed_at_runtime])
|
22
|
+
result = new(status: status, data: data)
|
23
|
+
parse_errors(errors).each_pair do |attribute, messages|
|
24
|
+
Array.wrap(messages).each { |message| result.errors.add(attribute, message) }
|
25
|
+
end
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
def human_attribute_name(attribute, _options = {})
|
30
|
+
attribute.respond_to?(:to_s) ? attribute.to_s.humanize : attribute
|
31
|
+
end
|
32
|
+
|
33
|
+
def lookup_ancestors
|
34
|
+
[self]
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def parse_errors(errors)
|
40
|
+
case errors
|
41
|
+
when String
|
42
|
+
{ generic: [errors] }
|
43
|
+
when ActiveModel::Errors
|
44
|
+
errors.as_json
|
45
|
+
else
|
46
|
+
errors
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private_class_method :new
|
52
|
+
|
53
|
+
def initialize(status:, data: {})
|
54
|
+
@status = status
|
55
|
+
@data = data
|
56
|
+
@errors = ActiveModel::Errors.new(self)
|
57
|
+
end
|
58
|
+
|
59
|
+
def failure?
|
60
|
+
!success?
|
61
|
+
end
|
62
|
+
alias failed? failure?
|
63
|
+
|
64
|
+
def read_attribute_for_validation(attribute_name)
|
65
|
+
data[attribute_name]
|
66
|
+
end
|
67
|
+
|
68
|
+
def success?
|
69
|
+
@status == STATUS[:success]
|
70
|
+
end
|
71
|
+
alias successful? success?
|
72
|
+
end
|
73
|
+
end
|
data/lib/active_interactor.rb
CHANGED
@@ -1,111 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_model'
|
4
|
-
require 'active_support
|
5
|
-
require 'active_support/core_ext/array/extract_options'
|
6
|
-
require 'active_support/core_ext/class/attribute'
|
7
|
-
require 'active_support/core_ext/string/inflections'
|
8
|
-
require 'active_support/dependencies/autoload'
|
9
|
-
require 'logger'
|
10
|
-
require 'ostruct'
|
4
|
+
require 'active_support'
|
11
5
|
|
12
|
-
|
13
|
-
require 'active_interactor/config'
|
14
|
-
require 'active_interactor/version'
|
6
|
+
require_relative 'active_interactor/errors'
|
15
7
|
|
16
|
-
# An {Base interactor} is a simple, single-purpose service object. {Base Interactors} can be used to reduce the
|
17
|
-
# responsibility of your controllers, workers, and models and encapsulate your application's
|
18
|
-
# {https://en.wikipedia.org/wiki/Business_logic business logic}. Each {Base interactor} represents one thing that your
|
19
|
-
# application does.
|
20
|
-
#
|
21
|
-
# Each {Base interactor} has it's own immutable {Context::Base context} which contains everything the
|
22
|
-
# {Base interactor} needs to do its work. When an {Base interactor} does its single purpose, it affects its given
|
23
|
-
# {Context::Base context}.
|
24
|
-
#
|
25
|
-
# @see https://medium.com/@aaronmallen/activeinteractor-8557c0dc78db Basic Usage
|
26
|
-
# @see https://github.com/aaronmallen/activeinteractor/wiki Advanced Usage
|
27
|
-
# @see https://github.com/aaronmallen/activeinteractor Source Code
|
28
|
-
# @see https://github.com/aaronmallen/activeinteractor/issues Issues
|
29
|
-
#
|
30
|
-
# ## License
|
31
|
-
#
|
32
|
-
# Copyright (c) 2019 Aaron Allen
|
33
|
-
#
|
34
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
35
|
-
# of this software and associated documentation files (the "Software"), to deal
|
36
|
-
# in the Software without restriction, including without limitation the rights
|
37
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
38
|
-
# copies of the Software, and to permit persons to whom the Software is
|
39
|
-
# furnished to do so, subject to the following conditions:
|
40
|
-
#
|
41
|
-
# The above copyright notice and this permission notice shall be included in
|
42
|
-
# all copies or substantial portions of the Software.
|
43
|
-
#
|
44
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
45
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
46
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
47
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
48
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
49
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
50
|
-
# THE SOFTWARE.
|
51
8
|
module ActiveInteractor
|
52
9
|
extend ActiveSupport::Autoload
|
53
10
|
|
54
11
|
autoload :Base
|
55
|
-
|
56
|
-
# {Context::Base Context} classes and modules
|
57
|
-
#
|
58
|
-
# @see https://github.com/aaronmallen/activeinteractor/wiki/Context Context
|
59
|
-
#
|
60
|
-
# @author Aaron Allen <hello@aaronmallen.me>
|
61
|
-
# @since 0.1.0
|
62
|
-
module Context
|
63
|
-
extend ActiveSupport::Autoload
|
64
|
-
|
65
|
-
autoload :Attributes
|
66
|
-
autoload :Base
|
67
|
-
autoload :Errors
|
68
|
-
autoload :Loader
|
69
|
-
autoload :Status
|
70
|
-
end
|
71
|
-
|
72
|
-
# {Base Interactor} classes and modules
|
73
|
-
#
|
74
|
-
# @see https://github.com/aaronmallen/activeinteractor/wiki/Interactors Interactors
|
75
|
-
#
|
76
|
-
# @author Aaron Allen <hello@aaronmallen.me>
|
77
|
-
# @since 0.1.0
|
78
|
-
module Interactor
|
79
|
-
extend ActiveSupport::Autoload
|
80
|
-
|
81
|
-
autoload :Callbacks
|
82
|
-
autoload :Context
|
83
|
-
autoload :Perform
|
84
|
-
autoload :Worker
|
85
|
-
end
|
86
|
-
|
87
|
-
autoload :Models
|
88
|
-
|
89
|
-
# {Organizer::Base Organizer} classes and modules
|
90
|
-
#
|
91
|
-
# @see https://github.com/aaronmallen/activeinteractor/wiki/Interactors#organizers Organizers
|
92
|
-
#
|
93
|
-
# @author Aaron Allen <hello@aaronmallen.me>
|
94
|
-
# @since 0.1.0
|
95
|
-
module Organizer
|
96
|
-
extend ActiveSupport::Autoload
|
97
|
-
|
98
|
-
autoload :Base
|
99
|
-
autoload :Callbacks
|
100
|
-
autoload :InteractorInterface
|
101
|
-
autoload :InteractorInterfaceCollection
|
102
|
-
autoload :Organize
|
103
|
-
autoload :Perform
|
104
|
-
end
|
105
|
-
|
106
|
-
eager_autoload do
|
107
|
-
autoload :Error
|
108
|
-
end
|
12
|
+
autoload :Result
|
109
13
|
end
|
110
|
-
|
111
|
-
require 'active_interactor/rails' if defined?(::Rails)
|