ii_interactor 1.2.0 → 2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +11 -170
- data/ii_interactor.gemspec +1 -0
- data/lib/ii_interactor/base.rb +2 -4
- data/lib/ii_interactor/coactors.rb +23 -0
- data/lib/ii_interactor/core.rb +1 -1
- data/lib/ii_interactor/version.rb +1 -1
- data/lib/ii_interactor.rb +1 -5
- metadata +18 -9
- data/lib/ii_interactor/interaction.rb +0 -43
- data/lib/ii_interactor/loader.rb +0 -19
- data/lib/ii_interactor/lookup.rb +0 -66
- data/lib/ii_interactor/lookups/base.rb +0 -20
- data/lib/ii_interactor/lookups/name.rb +0 -20
- data/lib/ii_interactor/lookups/object.rb +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2fdfb2e93eb53ee2b70845fb78c285aae26c237681537ae59893675873974f1
|
4
|
+
data.tar.gz: b85095ca4396ccc3523fbe6f212ed335f057a77dc60e87b0969c14666a5e0d0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b1321aee1be7d0c362315ef1020db0113d77445366617de0e0f9ff010c49d1118f7a26f5182102065efa60eb832616ded910f1e3bd222fc897d5fcaa0947236
|
7
|
+
data.tar.gz: a0d731eb5334b3846530e60858146c9b1f748d01b313917ee7e50153ab5f22f9fdb8a2cc53c24d08459ff7f074ee203579752c4d778bfad618e269c3361e318f
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -129,9 +129,9 @@ Interactor.call(message: 'something')
|
|
129
129
|
#=> something
|
130
130
|
```
|
131
131
|
|
132
|
-
###
|
132
|
+
### Coactions
|
133
133
|
|
134
|
-
You can call other interactors in the same context using `
|
134
|
+
You can call other interactors in the same context using `coact`:
|
135
135
|
|
136
136
|
```ruby
|
137
137
|
class AInteractor < IIInteractor::Base
|
@@ -147,8 +147,8 @@ class BInteractor < IIInteractor::Base
|
|
147
147
|
end
|
148
148
|
|
149
149
|
class MainInteractor < IIInteractor::Base
|
150
|
-
|
151
|
-
|
150
|
+
coact AInteractor
|
151
|
+
coact BInteractor
|
152
152
|
end
|
153
153
|
|
154
154
|
MainInteractor.call
|
@@ -156,166 +156,7 @@ MainInteractor.call
|
|
156
156
|
# BInteractor
|
157
157
|
```
|
158
158
|
|
159
|
-
|
160
|
-
|
161
|
-
You can also define named interactions.
|
162
|
-
The interactors to be called are looked up from all interactors.
|
163
|
-
|
164
|
-
```ruby
|
165
|
-
class AInteractor < IIInteractor::Base
|
166
|
-
react :some_name
|
167
|
-
|
168
|
-
def call
|
169
|
-
puts self.class.name
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
class BInteractor < IIInteractor::Base
|
174
|
-
react :some_name
|
175
|
-
|
176
|
-
def call
|
177
|
-
puts self.class.name
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
class MainInteractor < IIInteractor::Base
|
182
|
-
interact :some_name
|
183
|
-
end
|
184
|
-
|
185
|
-
MainInteractor.call
|
186
|
-
#=> AInteractor
|
187
|
-
# BInteractor
|
188
|
-
```
|
189
|
-
|
190
|
-
Note followings:
|
191
|
-
|
192
|
-
* All files in `app/interactors` are loaded in development mode to lookup interactors having same name.
|
193
|
-
* The called interactors are unordered.
|
194
|
-
|
195
|
-
#### Object based interaction
|
196
|
-
|
197
|
-
You can also define object based interactions.
|
198
|
-
The interactors to be called are looked up from the namespace corresponding with caller interactor.
|
199
|
-
|
200
|
-
```ruby
|
201
|
-
class A
|
202
|
-
end
|
203
|
-
|
204
|
-
class B
|
205
|
-
end
|
206
|
-
|
207
|
-
class Main::AInteractor < IIInteractor::Base
|
208
|
-
def call
|
209
|
-
puts self.class.name
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
class Main::BInteractor < IIInteractor::Base
|
214
|
-
def call
|
215
|
-
puts self.class.name
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
class MainInteractor < IIInteractor::Base
|
220
|
-
interact A
|
221
|
-
interact B
|
222
|
-
end
|
223
|
-
|
224
|
-
MainInteractor.call
|
225
|
-
#=> Main::AInteractor
|
226
|
-
# Main::BInteractor
|
227
|
-
```
|
228
|
-
|
229
|
-
#### Custom interaction
|
230
|
-
|
231
|
-
You can also customize lookup of interactors as follows:
|
232
|
-
|
233
|
-
```ruby
|
234
|
-
class AInteractor < IIInteractor::Base
|
235
|
-
def call
|
236
|
-
puts self.class.name
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
class BInteractor < IIInteractor::Base
|
241
|
-
def call
|
242
|
-
puts self.class.name
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
class MainInteractor < IIInteractor::Base
|
247
|
-
# set block
|
248
|
-
interact do
|
249
|
-
if @context.condition == 'A'
|
250
|
-
AInteractor
|
251
|
-
else
|
252
|
-
BInteractor
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
# set method name
|
257
|
-
interact :conditional_interactors
|
258
|
-
|
259
|
-
def conditional_interactors
|
260
|
-
if @context.condition == 'A'
|
261
|
-
AInteractor
|
262
|
-
else
|
263
|
-
BInteractor
|
264
|
-
end
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
MainInteractor.call(condition: 'A')
|
269
|
-
#=> AInteractor
|
270
|
-
|
271
|
-
MainInteractor.call(condition: 'B')
|
272
|
-
#=> BInteractor
|
273
|
-
```
|
274
|
-
|
275
|
-
#### Nested interaction
|
276
|
-
|
277
|
-
You can define nested interactions as follows:
|
278
|
-
|
279
|
-
```ruby
|
280
|
-
class NestedAInteractor < IIInteractor::Base
|
281
|
-
def call
|
282
|
-
puts self.class.name
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
class NestedBInteractor < IIInteractor::Base
|
287
|
-
def call
|
288
|
-
puts self.class.name
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
class AInteractor < IIInteractor::Base
|
293
|
-
interact NestedAInteractor
|
294
|
-
|
295
|
-
def call
|
296
|
-
puts self.class.name
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
class BInteractor < IIInteractor::Base
|
301
|
-
interact NestedBInteractor
|
302
|
-
|
303
|
-
def call
|
304
|
-
puts self.class.name
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
class MainInteractor < IIInteractor::Base
|
309
|
-
interact AInteractor
|
310
|
-
interact BInteractor
|
311
|
-
end
|
312
|
-
|
313
|
-
MainInteractor.call
|
314
|
-
#=> NestedAInteractor
|
315
|
-
# AInteractor
|
316
|
-
# NestedBInteractor
|
317
|
-
# BInteractor
|
318
|
-
```
|
159
|
+
See [coactive](https://github.com/kanety/coactive) for more `coact` examples:
|
319
160
|
|
320
161
|
### Stop interactions
|
321
162
|
|
@@ -336,8 +177,8 @@ class BInteractor < IIInteractor::Base
|
|
336
177
|
end
|
337
178
|
|
338
179
|
class MainInteractor < IIInteractor::Base
|
339
|
-
|
340
|
-
|
180
|
+
coact AInteractor
|
181
|
+
coact BInteractor
|
341
182
|
end
|
342
183
|
|
343
184
|
context = MainInteractor.call
|
@@ -379,8 +220,8 @@ class BInteractor < IIInteractor::Base
|
|
379
220
|
end
|
380
221
|
|
381
222
|
class MainInteractor < IIInteractor::Base
|
382
|
-
|
383
|
-
|
223
|
+
coact AInteractor
|
224
|
+
coact BInteractor
|
384
225
|
end
|
385
226
|
|
386
227
|
context = MainInteractor.call
|
@@ -413,8 +254,8 @@ class BInteractor < IIInteractor::Base
|
|
413
254
|
end
|
414
255
|
|
415
256
|
class MainInteractor < IIInteractor::Base
|
416
|
-
|
417
|
-
|
257
|
+
coact AInteractor
|
258
|
+
coact BInteractor
|
418
259
|
end
|
419
260
|
|
420
261
|
MainInteractor.call do |interactor, message|
|
data/ii_interactor.gemspec
CHANGED
data/lib/ii_interactor/base.rb
CHANGED
@@ -5,8 +5,7 @@ require_relative 'core'
|
|
5
5
|
require_relative 'variables'
|
6
6
|
require_relative 'callbacks'
|
7
7
|
require_relative 'instrumentation'
|
8
|
-
require_relative '
|
9
|
-
require_relative 'lookup'
|
8
|
+
require_relative 'coactors'
|
10
9
|
|
11
10
|
module IIInteractor
|
12
11
|
class Base
|
@@ -14,7 +13,6 @@ module IIInteractor
|
|
14
13
|
include Callbacks
|
15
14
|
include Instrumentation
|
16
15
|
include Variables
|
17
|
-
include
|
18
|
-
include Lookup
|
16
|
+
include Coactors
|
19
17
|
end
|
20
18
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IIInteractor
|
4
|
+
module Coactors
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
include Coactive::Base
|
9
|
+
|
10
|
+
configure_coactive do |config|
|
11
|
+
config.load_paths = ['app/interactors']
|
12
|
+
config.class_suffix = 'Interactor'
|
13
|
+
config.use_cache = true
|
14
|
+
config.lookup_superclass_until = ['ActiveRecord::Base', 'ActiveModel::Base']
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
18
|
+
alias_method :interact, :coact
|
19
|
+
alias_method :react, :coaction
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/ii_interactor/core.rb
CHANGED
@@ -17,7 +17,7 @@ module IIInteractor
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def call_all
|
20
|
-
planned =
|
20
|
+
planned = coactors.map { |interactor| interactor.new(@context) } + [self]
|
21
21
|
planned.each_with_index do |interactor, i|
|
22
22
|
if i == planned.size - 1
|
23
23
|
interactor.call_self
|
data/lib/ii_interactor.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'active_support'
|
2
|
+
require 'coactive'
|
2
3
|
|
3
4
|
require 'ii_interactor/version'
|
4
5
|
require 'ii_interactor/errors'
|
5
6
|
require 'ii_interactor/config'
|
6
7
|
require 'ii_interactor/base'
|
7
|
-
require 'ii_interactor/loader'
|
8
8
|
require 'ii_interactor/log_subscriber'
|
9
9
|
|
10
10
|
module IIInteractor
|
@@ -16,9 +16,5 @@ module IIInteractor
|
|
16
16
|
def config
|
17
17
|
Config
|
18
18
|
end
|
19
|
-
|
20
|
-
def load
|
21
|
-
Loader.call
|
22
|
-
end
|
23
19
|
end
|
24
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ii_interactor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshikazu Kaneta
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: coactive
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.1'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rails
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,18 +134,13 @@ files:
|
|
120
134
|
- lib/ii_interactor.rb
|
121
135
|
- lib/ii_interactor/base.rb
|
122
136
|
- lib/ii_interactor/callbacks.rb
|
137
|
+
- lib/ii_interactor/coactors.rb
|
123
138
|
- lib/ii_interactor/config.rb
|
124
139
|
- lib/ii_interactor/context.rb
|
125
140
|
- lib/ii_interactor/core.rb
|
126
141
|
- lib/ii_interactor/errors.rb
|
127
142
|
- lib/ii_interactor/instrumentation.rb
|
128
|
-
- lib/ii_interactor/interaction.rb
|
129
|
-
- lib/ii_interactor/loader.rb
|
130
143
|
- lib/ii_interactor/log_subscriber.rb
|
131
|
-
- lib/ii_interactor/lookup.rb
|
132
|
-
- lib/ii_interactor/lookups/base.rb
|
133
|
-
- lib/ii_interactor/lookups/name.rb
|
134
|
-
- lib/ii_interactor/lookups/object.rb
|
135
144
|
- lib/ii_interactor/variables.rb
|
136
145
|
- lib/ii_interactor/version.rb
|
137
146
|
homepage: https://github.com/kanety/ii_interactor
|
@@ -152,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
161
|
- !ruby/object:Gem::Version
|
153
162
|
version: '0'
|
154
163
|
requirements: []
|
155
|
-
rubygems_version: 3.
|
164
|
+
rubygems_version: 3.0.3
|
156
165
|
signing_key:
|
157
166
|
specification_version: 4
|
158
167
|
summary: A base interactor to support management of bussiness logic
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module IIInteractor
|
4
|
-
module Interaction
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
included do
|
8
|
-
class_attribute :_interactions
|
9
|
-
self._interactions = []
|
10
|
-
class_attribute :_reactions
|
11
|
-
self._reactions = []
|
12
|
-
end
|
13
|
-
|
14
|
-
class_methods do
|
15
|
-
def interact(*interactors, **options, &block)
|
16
|
-
if block
|
17
|
-
self._interactions = _interactions + [block]
|
18
|
-
elsif options[:before]
|
19
|
-
index = self._interactions.index { |interaction| interaction == options[:before] }
|
20
|
-
self._interactions = self._interactions.insert(index, *interactors)
|
21
|
-
else
|
22
|
-
self._interactions = _interactions + interactors
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def interactions
|
27
|
-
self._interactions
|
28
|
-
end
|
29
|
-
|
30
|
-
def clear_interactions
|
31
|
-
self._interactions = []
|
32
|
-
end
|
33
|
-
|
34
|
-
def react(*reactions)
|
35
|
-
self._reactions = _reactions + reactions
|
36
|
-
end
|
37
|
-
|
38
|
-
def reactions
|
39
|
-
self._reactions
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/lib/ii_interactor/loader.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module IIInteractor
|
4
|
-
module Loader
|
5
|
-
class << self
|
6
|
-
def call
|
7
|
-
return unless defined?(Rails)
|
8
|
-
return if Rails.application.config.eager_load
|
9
|
-
|
10
|
-
engines = [Rails] + Rails::Engine.subclasses.map(&:instance)
|
11
|
-
engines.each do |engine|
|
12
|
-
Dir["#{engine.root}/app/interactors/**/*.rb"].each do |file|
|
13
|
-
require file
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/ii_interactor/lookup.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'lookups/base'
|
4
|
-
require_relative 'lookups/name'
|
5
|
-
require_relative 'lookups/object'
|
6
|
-
|
7
|
-
module IIInteractor
|
8
|
-
module Lookup
|
9
|
-
extend ActiveSupport::Concern
|
10
|
-
|
11
|
-
def lookup_all
|
12
|
-
lookup.map { |interactor| [interactor] + interactor.new(@context).lookup_all }.flatten
|
13
|
-
end
|
14
|
-
|
15
|
-
def lookup
|
16
|
-
self.class._interactions.map do |interaction|
|
17
|
-
if interaction.is_a?(Symbol) && respond_to?(interaction, true)
|
18
|
-
send(interaction)
|
19
|
-
elsif interaction.is_a?(Proc)
|
20
|
-
instance_exec(&interaction)
|
21
|
-
else
|
22
|
-
interaction
|
23
|
-
end
|
24
|
-
end.flatten.compact.map do |interaction|
|
25
|
-
if interaction.is_a?(Class) && interaction < IIInteractor::Base
|
26
|
-
interaction
|
27
|
-
else
|
28
|
-
self.class.lookup(interaction)
|
29
|
-
end
|
30
|
-
end.flatten.compact
|
31
|
-
end
|
32
|
-
|
33
|
-
class_methods do
|
34
|
-
def lookup(*interactions)
|
35
|
-
interactions = _interactions unless interactions
|
36
|
-
interactions.map { |interaction| Lookup.call(self, interaction) }.flatten
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class << self
|
41
|
-
class_attribute :lookups
|
42
|
-
self.lookups = [Lookups::Name, Lookups::Object]
|
43
|
-
|
44
|
-
class_attribute :cache
|
45
|
-
self.cache = {}
|
46
|
-
|
47
|
-
def call(klass, interaction)
|
48
|
-
with_cache(klass, interaction) do
|
49
|
-
lookup = lookups.detect { |lookup| lookup.call?(interaction) }
|
50
|
-
lookup.new(klass, interaction).call if lookup
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
def with_cache(klass, interaction)
|
57
|
-
if Config.lookup_cache
|
58
|
-
self.cache[klass] ||= {}
|
59
|
-
self.cache[klass][interaction] ||= yield
|
60
|
-
else
|
61
|
-
yield
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module IIInteractor
|
4
|
-
module Lookups
|
5
|
-
class Base
|
6
|
-
def initialize(klass, interaction)
|
7
|
-
@klass = klass
|
8
|
-
@interaction = interaction
|
9
|
-
end
|
10
|
-
|
11
|
-
def call
|
12
|
-
end
|
13
|
-
|
14
|
-
class << self
|
15
|
-
def call?(interaction)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module IIInteractor
|
4
|
-
module Lookups
|
5
|
-
class Name < Base
|
6
|
-
def call
|
7
|
-
IIInteractor.load
|
8
|
-
IIInteractor::Base.descendants.select do |interactor|
|
9
|
-
interactor._reactions.any? { |reaction| reaction == @interaction }
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def call?(interaction)
|
15
|
-
interaction.is_a?(Symbol)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module IIInteractor
|
4
|
-
module Lookups
|
5
|
-
class Object < Base
|
6
|
-
def call
|
7
|
-
return if terminate?
|
8
|
-
|
9
|
-
if @interaction.name.present? && (interactor = resolve)
|
10
|
-
interactor
|
11
|
-
elsif @interaction.superclass
|
12
|
-
self.class.new(@klass, @interaction.superclass).call
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def terminate?
|
19
|
-
@interaction.name.to_s.in?(['Object', 'ActiveRecord::Base', 'ActiveModel::Base'])
|
20
|
-
end
|
21
|
-
|
22
|
-
def resolve
|
23
|
-
name = resolve_name
|
24
|
-
interactor = name.safe_constantize
|
25
|
-
return interactor if interactor && name == interactor.name
|
26
|
-
end
|
27
|
-
|
28
|
-
def resolve_name
|
29
|
-
namespace = @klass.name.to_s.sub(/Interactor$/, '').to_s
|
30
|
-
[namespace, "#{@interaction.name}Interactor"].join('::')
|
31
|
-
end
|
32
|
-
|
33
|
-
class << self
|
34
|
-
def call?(interaction)
|
35
|
-
interaction.is_a?(Module)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|