ii_interactor 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|