ii_interactor 1.0.0 → 1.1.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/.github/workflows/ci.yml +1 -1
- data/CHANGELOG.md +9 -0
- data/README.md +15 -0
- data/lib/ii_interactor.rb +1 -0
- data/lib/ii_interactor/base.rb +4 -62
- data/lib/ii_interactor/callbacks.rb +6 -0
- data/lib/ii_interactor/core.rb +69 -0
- data/lib/ii_interactor/instrumentation.rb +13 -0
- data/lib/ii_interactor/log_subscriber.rb +18 -0
- data/lib/ii_interactor/lookup.rb +6 -6
- data/lib/ii_interactor/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d08217ca0d49ae98a2c034ed00bb785aca82359dd90a2d06285a6b6e850b5ac
|
4
|
+
data.tar.gz: 85d61cde0ae2f9e828637fcf5cd7144aabf9ba42d9842c582f9a86d06e7328d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 148a1e202624098aef8cbe7fcbededf1cd86a03d33c070768e1d75f0aa848363b45e4a9b349e6b614e1f753710d8256a4ac3aed9a39d2bf91a7444a9eb0140fd
|
7
|
+
data.tar.gz: daf5475ab67cae1eb42043c5b0cc20334683f94e4fdf908e222bcb67e323f81606b8b888a5e14c07b3d31c4a7ee1f68c285fa692f784fe575098f51ed6f20c89
|
data/.github/workflows/ci.yml
CHANGED
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -359,6 +359,21 @@ end
|
|
359
359
|
# BInteractor: called B
|
360
360
|
```
|
361
361
|
|
362
|
+
### Logging
|
363
|
+
|
364
|
+
Interactor supports instrumentation hook supplied by `ActiveSupport::Notifications`.
|
365
|
+
You can enable log subscriber as follows:
|
366
|
+
|
367
|
+
```ruby
|
368
|
+
IIInteractor::LogSubscriber.attach_to :ii_interactor
|
369
|
+
```
|
370
|
+
|
371
|
+
This subscriber will write logs in debug mode as the following example:
|
372
|
+
|
373
|
+
```
|
374
|
+
Called SimpleInteractor (Duration: 0.3ms, Allocations: 42)
|
375
|
+
```
|
376
|
+
|
362
377
|
## Contributing
|
363
378
|
|
364
379
|
Bug reports and pull requests are welcome at https://github.com/kanety/ii_interactor.
|
data/lib/ii_interactor.rb
CHANGED
data/lib/ii_interactor/base.rb
CHANGED
@@ -1,76 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'context'
|
4
|
+
require_relative 'core'
|
4
5
|
require_relative 'callbacks'
|
6
|
+
require_relative 'instrumentation'
|
5
7
|
require_relative 'interaction'
|
6
8
|
require_relative 'lookup'
|
7
9
|
|
8
10
|
module IIInteractor
|
9
11
|
class Base
|
12
|
+
include Core
|
10
13
|
include Callbacks
|
14
|
+
include Instrumentation
|
11
15
|
include Interaction
|
12
16
|
include Lookup
|
13
|
-
|
14
|
-
attr_reader :context
|
15
|
-
|
16
|
-
def initialize(context = {}, &block)
|
17
|
-
@context = if context.is_a?(IIInteractor::Context)
|
18
|
-
context
|
19
|
-
else
|
20
|
-
IIInteractor::Context.new(context, &block)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def call_all
|
25
|
-
planned = lookup.map { |interactor| interactor.new(@context) } + [self]
|
26
|
-
@context._planned += planned
|
27
|
-
planned.each_with_index do |interactor, i|
|
28
|
-
if i == planned.size - 1
|
29
|
-
interactor.call_self
|
30
|
-
else
|
31
|
-
interactor.call_all
|
32
|
-
end
|
33
|
-
break if @context.stopped?
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def call_self
|
38
|
-
run_callbacks :call do
|
39
|
-
call
|
40
|
-
end
|
41
|
-
@context._called << self
|
42
|
-
end
|
43
|
-
|
44
|
-
def call
|
45
|
-
end
|
46
|
-
|
47
|
-
def rollback
|
48
|
-
end
|
49
|
-
|
50
|
-
def inform(*args)
|
51
|
-
@context._block.call(*([self] + args)) if @context._block
|
52
|
-
end
|
53
|
-
|
54
|
-
def fail!(data = {})
|
55
|
-
@context.fail!(data)
|
56
|
-
raise UnprogressableError.new(@context)
|
57
|
-
end
|
58
|
-
|
59
|
-
def stop!(data = {})
|
60
|
-
@context.stop!(data)
|
61
|
-
end
|
62
|
-
|
63
|
-
class << self
|
64
|
-
def call(context = {}, &block)
|
65
|
-
interactor = new(context, &block)
|
66
|
-
interactor.call_all
|
67
|
-
interactor.context
|
68
|
-
rescue UnprogressableError
|
69
|
-
interactor.context._called.reverse.each do |called|
|
70
|
-
called.rollback
|
71
|
-
end
|
72
|
-
interactor.context
|
73
|
-
end
|
74
|
-
end
|
75
17
|
end
|
76
18
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IIInteractor
|
4
|
+
module Core
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
attr_reader :context
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(context = {}, &block)
|
12
|
+
@context = if context.is_a?(IIInteractor::Context)
|
13
|
+
context
|
14
|
+
else
|
15
|
+
IIInteractor::Context.new(context, &block)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def call_all
|
20
|
+
planned = lookup.map { |interactor| interactor.new(@context) } + [self]
|
21
|
+
@context._planned += planned
|
22
|
+
planned.each_with_index do |interactor, i|
|
23
|
+
if i == planned.size - 1
|
24
|
+
interactor.call_self
|
25
|
+
else
|
26
|
+
interactor.call_all
|
27
|
+
end
|
28
|
+
break if @context.stopped?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def call_self
|
33
|
+
call
|
34
|
+
@context._called << self
|
35
|
+
end
|
36
|
+
|
37
|
+
def call
|
38
|
+
end
|
39
|
+
|
40
|
+
def rollback
|
41
|
+
end
|
42
|
+
|
43
|
+
def inform(*args)
|
44
|
+
@context._block.call(*([self] + args)) if @context._block
|
45
|
+
end
|
46
|
+
|
47
|
+
def fail!(data = {})
|
48
|
+
@context.fail!(data)
|
49
|
+
raise UnprogressableError.new(@context)
|
50
|
+
end
|
51
|
+
|
52
|
+
def stop!(data = {})
|
53
|
+
@context.stop!(data)
|
54
|
+
end
|
55
|
+
|
56
|
+
class_methods do
|
57
|
+
def call(context = {}, &block)
|
58
|
+
interactor = new(context, &block)
|
59
|
+
interactor.call_all
|
60
|
+
interactor.context
|
61
|
+
rescue UnprogressableError
|
62
|
+
interactor.context._called.reverse.each do |called|
|
63
|
+
called.rollback
|
64
|
+
end
|
65
|
+
interactor.context
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IIInteractor
|
4
|
+
class LogSubscriber < ActiveSupport::LogSubscriber
|
5
|
+
def call(event)
|
6
|
+
debug do
|
7
|
+
interactor = event.payload[:interactor]
|
8
|
+
"Called #{interactor.class} (#{additional_log(event)})"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def additional_log(event)
|
13
|
+
additions = ["Duration: %.1fms" % event.duration]
|
14
|
+
additions << "Allocations: %d" % event.allocations if event.respond_to?(:allocations)
|
15
|
+
additions.join(', ')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/ii_interactor/lookup.rb
CHANGED
@@ -41,11 +41,11 @@ module IIInteractor
|
|
41
41
|
class_attribute :lookups
|
42
42
|
self.lookups = [Lookups::Name, Lookups::Object]
|
43
43
|
|
44
|
-
class_attribute :
|
45
|
-
self.
|
44
|
+
class_attribute :cache
|
45
|
+
self.cache = {}
|
46
46
|
|
47
47
|
def call(klass, interaction)
|
48
|
-
|
48
|
+
with_cache(klass, interaction) do
|
49
49
|
lookup = lookups.detect { |lookup| lookup.call?(interaction) }
|
50
50
|
lookup.new(klass, interaction).call if lookup
|
51
51
|
end
|
@@ -53,10 +53,10 @@ module IIInteractor
|
|
53
53
|
|
54
54
|
private
|
55
55
|
|
56
|
-
def
|
56
|
+
def with_cache(klass, interaction)
|
57
57
|
if Config.lookup_cache
|
58
|
-
self.
|
59
|
-
self.
|
58
|
+
self.cache[klass] ||= {}
|
59
|
+
self.cache[klass][interaction] ||= yield
|
60
60
|
else
|
61
61
|
yield
|
62
62
|
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: 1.
|
4
|
+
version: 1.1.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-07-
|
11
|
+
date: 2021-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- ".github/workflows/ci.yml"
|
105
105
|
- ".gitignore"
|
106
106
|
- ".rspec"
|
107
|
+
- CHANGELOG.md
|
107
108
|
- Gemfile
|
108
109
|
- LICENSE
|
109
110
|
- README.md
|
@@ -121,9 +122,12 @@ files:
|
|
121
122
|
- lib/ii_interactor/callbacks.rb
|
122
123
|
- lib/ii_interactor/config.rb
|
123
124
|
- lib/ii_interactor/context.rb
|
125
|
+
- lib/ii_interactor/core.rb
|
124
126
|
- lib/ii_interactor/errors.rb
|
127
|
+
- lib/ii_interactor/instrumentation.rb
|
125
128
|
- lib/ii_interactor/interaction.rb
|
126
129
|
- lib/ii_interactor/loader.rb
|
130
|
+
- lib/ii_interactor/log_subscriber.rb
|
127
131
|
- lib/ii_interactor/lookup.rb
|
128
132
|
- lib/ii_interactor/lookups/base.rb
|
129
133
|
- lib/ii_interactor/lookups/name.rb
|