use_cases 1.0.13 → 1.1.2
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/Gemfile.lock +3 -2
- data/lib/use_cases/events/event_registry.rb +23 -0
- data/lib/use_cases/events/publish_job.rb +5 -3
- data/lib/use_cases/events/publisher.rb +10 -37
- data/lib/use_cases/events/subscriber.rb +4 -2
- data/lib/use_cases/module_optins/authorized.rb +2 -2
- data/lib/use_cases/module_optins/publishing.rb +7 -19
- data/lib/use_cases/module_optins/validated.rb +15 -6
- data/lib/use_cases/module_optins.rb +1 -1
- data/lib/use_cases/rspec/matchers.rb +1 -1
- data/lib/use_cases/version.rb +1 -1
- data/lib/use_cases.rb +10 -0
- data/use_cases.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1acf28555c44f6ddde193195d340f9ea4dc9d3ffce2ec9ad5302d626bc3fa07a
|
4
|
+
data.tar.gz: eebecd33d8f5f64e0fc73e1174e7e32b7252d88f1c2de8543297ec3fd78fbab4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e728db5f63082ce761579c57bf3b9ab22a2059d5720823bfda3c90105b60be10dc7e93ad7d0c87cef7b848bbc2ffd061a4cd806e386c030b34b39c04974ae12
|
7
|
+
data.tar.gz: 7f04086052168ba6af1933d2e196fbb4e5053188270b72f3ebf245007863be40695aa10d3dc98c7ea53845c3f88bebb68d35f5a316f39203b36e0906694623df
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
use_cases (1.
|
4
|
+
use_cases (1.1.1)
|
5
5
|
activesupport
|
6
6
|
dry-events
|
7
7
|
dry-matcher
|
@@ -110,6 +110,7 @@ GEM
|
|
110
110
|
|
111
111
|
PLATFORMS
|
112
112
|
x86_64-darwin-20
|
113
|
+
x86_64-darwin-21
|
113
114
|
x86_64-linux
|
114
115
|
|
115
116
|
DEPENDENCIES
|
@@ -126,4 +127,4 @@ DEPENDENCIES
|
|
126
127
|
use_cases!
|
127
128
|
|
128
129
|
BUNDLED WITH
|
129
|
-
2.2.
|
130
|
+
2.2.32
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module UseCases
|
4
|
+
module Events
|
5
|
+
class EventRegistry
|
6
|
+
def self.register(event_id)
|
7
|
+
event_ids << event_id
|
8
|
+
listener_name = ["on", event_id].join("_").gsub(".", "_")
|
9
|
+
UseCases.publisher.register_event(event_id)
|
10
|
+
|
11
|
+
UseCases.subscribers.each do |subscriber|
|
12
|
+
next if !subscriber.respond_to?(listener_name) || UseCases.publisher.subscribed?(subscriber.method(listener_name))
|
13
|
+
|
14
|
+
UseCases.publisher.subscribe(subscriber)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.event_ids
|
19
|
+
@event_ids ||= []
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
return unless defined? ActiveJob
|
3
4
|
|
4
5
|
module UseCases
|
5
6
|
module Events
|
6
7
|
class PublishJob < ActiveJob::Base
|
7
|
-
def perform(
|
8
|
-
|
9
|
-
|
8
|
+
def perform(event_id, payload)
|
9
|
+
event_id += ".async"
|
10
|
+
Events::EventRegistry.register(event_id)
|
11
|
+
UseCases.publisher.publish(event_id, payload)
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "dry/events/publisher"
|
2
4
|
|
3
5
|
module UseCases
|
@@ -5,47 +7,18 @@ module UseCases
|
|
5
7
|
class Publisher
|
6
8
|
include Dry::Events::Publisher[:use_cases]
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def publish_async(event_name, payload)
|
17
|
-
UseCases::Events::PublishJob.perform_later(event_name, payload)
|
18
|
-
end
|
19
|
-
|
20
|
-
def event_should_be_published_asynchronously?(event_name)
|
21
|
-
defined? UseCases::Events::PublishJob && !event_name.end_with?(".async")
|
22
|
-
end
|
23
|
-
|
24
|
-
def subscribe_to_event(event_name)
|
25
|
-
subscribers_for(event_name).each(&method(:subscribe))
|
26
|
-
end
|
27
|
-
|
28
|
-
def subscribers_for(event_name)
|
29
|
-
available_subscribers.select do |subscriber|
|
30
|
-
subscriber.should_subscribe_to?(event_name) && !subscribed?(subscriber)
|
10
|
+
# This is a hack waiting for this https://github.com/dry-rb/dry-events/pull/15 to be merged
|
11
|
+
def subscribed?(listener)
|
12
|
+
__bus__.listeners.values.any? do |value|
|
13
|
+
value.any? do |block, _|
|
14
|
+
block.owner == listener.owner && block.name == listener.name
|
15
|
+
end
|
31
16
|
end
|
32
17
|
end
|
33
18
|
|
34
|
-
def
|
35
|
-
subcribers << listener
|
19
|
+
def publish(event_name, payload)
|
36
20
|
super
|
37
|
-
|
38
|
-
|
39
|
-
def subscribed?(listener)
|
40
|
-
subcribers.include?(listener)
|
41
|
-
end
|
42
|
-
|
43
|
-
def subcribers
|
44
|
-
@subcribers ||= []
|
45
|
-
end
|
46
|
-
|
47
|
-
def available_subscribers
|
48
|
-
UseCases.subscribers
|
21
|
+
PublishJob.perform_later(event_name, payload) if defined?(PublishJob) && !event_name.to_s.end_with?(".async")
|
49
22
|
end
|
50
23
|
end
|
51
24
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module UseCases
|
2
4
|
module Events
|
3
5
|
module Subscriber
|
@@ -6,8 +8,8 @@ module UseCases
|
|
6
8
|
end
|
7
9
|
|
8
10
|
def should_subscribe_to?(event_name)
|
9
|
-
event_handler_name = "on_#{event_name.gsub(
|
10
|
-
|
11
|
+
event_handler_name = "on_#{event_name.gsub(".", "_")}"
|
12
|
+
|
11
13
|
respond_to?(event_handler_name.to_sym)
|
12
14
|
end
|
13
15
|
end
|
@@ -17,10 +17,10 @@ module UseCases
|
|
17
17
|
failure: :unauthorized,
|
18
18
|
failure_message: "Not Authorized",
|
19
19
|
merge_input_as: :resource
|
20
|
-
}
|
20
|
+
}.freeze
|
21
21
|
|
22
22
|
def authorize(name, options = {})
|
23
|
-
options = DEFAULT_OPTIONS.merge(options)
|
23
|
+
options = DEFAULT_OPTIONS.merge(options)
|
24
24
|
|
25
25
|
check name, options
|
26
26
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require "use_cases/events/publisher"
|
4
4
|
require "use_cases/events/subscriber"
|
5
5
|
require "use_cases/events/publish_job"
|
6
|
+
require "use_cases/events/event_registry"
|
6
7
|
|
7
8
|
module UseCases
|
8
9
|
module ModuleOptins
|
@@ -13,29 +14,16 @@ module UseCases
|
|
13
14
|
end
|
14
15
|
|
15
16
|
module StepPatch
|
16
|
-
def initialize(*
|
17
|
+
def initialize(*)
|
17
18
|
super
|
18
|
-
return unless options[:publish]
|
19
|
-
|
20
|
-
register_events
|
21
|
-
end
|
22
|
-
|
23
|
-
def register_events
|
24
|
-
event_names.each do |event_name|
|
25
|
-
next if UseCases.publisher.class.events[event_name]
|
19
|
+
return unless options[:publish]
|
26
20
|
|
27
|
-
|
21
|
+
%w[success failure].map do |event_type|
|
22
|
+
event_id = [options[:publish], event_type].join(".")
|
23
|
+
Events::EventRegistry.register(event_id)
|
28
24
|
end
|
29
25
|
end
|
30
26
|
|
31
|
-
def event_names
|
32
|
-
event_name = options[:publish]
|
33
|
-
[
|
34
|
-
"#{event_name}.success", "#{event_name}.failure",
|
35
|
-
"#{event_name}.success.async", "#{event_name}.failure.async"
|
36
|
-
]
|
37
|
-
end
|
38
|
-
|
39
27
|
def call(*args)
|
40
28
|
super(*args).tap do |result|
|
41
29
|
publish_step_result(result, args)
|
@@ -48,7 +36,7 @@ module UseCases
|
|
48
36
|
key = extract_event_key(step_result)
|
49
37
|
payload = extract_payload(step_result, args)
|
50
38
|
|
51
|
-
UseCases.publisher.
|
39
|
+
UseCases.publisher.publish(key, payload)
|
52
40
|
end
|
53
41
|
|
54
42
|
private
|
@@ -32,29 +32,36 @@ module UseCases
|
|
32
32
|
def params(*args, &blk)
|
33
33
|
_setup_validation
|
34
34
|
|
35
|
-
_contract_class.params(*args, &blk)
|
35
|
+
_contract_class.params(*args, &block_with_config(&blk))
|
36
36
|
end
|
37
37
|
|
38
38
|
def schema(*args, &blk)
|
39
39
|
_setup_validation
|
40
40
|
|
41
|
-
_contract_class.schema(*args, &blk)
|
41
|
+
_contract_class.schema(*args, &block_with_config(&blk))
|
42
42
|
end
|
43
43
|
|
44
44
|
def rule(*args, &blk)
|
45
45
|
_setup_validation
|
46
46
|
|
47
|
-
_contract_class.rule(*args, &blk)
|
47
|
+
_contract_class.rule(*args, &block_with_config(&blk))
|
48
48
|
end
|
49
49
|
|
50
50
|
def json(*args, &blk)
|
51
51
|
_setup_validation
|
52
52
|
|
53
|
-
_contract_class.json(*args, &blk)
|
53
|
+
_contract_class.json(*args, &block_with_config(&blk))
|
54
54
|
end
|
55
55
|
|
56
56
|
def option(*args, &blk)
|
57
|
-
_contract_class.option(*args, &blk)
|
57
|
+
_contract_class.option(*args, &block_with_config(&blk))
|
58
|
+
end
|
59
|
+
|
60
|
+
def block_with_config(&blk)
|
61
|
+
Proc.new do
|
62
|
+
instance_exec(&UseCases.dry_validation)
|
63
|
+
instance_exec(&blk)
|
64
|
+
end
|
58
65
|
end
|
59
66
|
end
|
60
67
|
|
@@ -74,7 +81,9 @@ module UseCases
|
|
74
81
|
end
|
75
82
|
|
76
83
|
def contract
|
77
|
-
return
|
84
|
+
return unless self.class._contract_class_defined?
|
85
|
+
|
86
|
+
self.class._contract_class.new
|
78
87
|
end
|
79
88
|
|
80
89
|
module ClassMethods
|
@@ -29,7 +29,7 @@ RSpec::Matchers.define(:be_failure_with_payload) do |expected_result|
|
|
29
29
|
else
|
30
30
|
"the use case was expected to fail but it succeeded with #{test_subject.success.inspect}"
|
31
31
|
end
|
32
|
-
end
|
32
|
+
end
|
33
33
|
end
|
34
34
|
|
35
35
|
RSpec::Matchers.define(:be_failure_with) do |*expected_failure|
|
data/lib/use_cases/version.rb
CHANGED
data/lib/use_cases.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "dry/configurable"
|
4
|
+
require "dry/types"
|
4
5
|
|
5
6
|
require_relative "use_case"
|
6
7
|
require_relative "use_cases/version"
|
@@ -17,4 +18,13 @@ module UseCases
|
|
17
18
|
setting :container, reader: true
|
18
19
|
setting :publisher, default: ::UseCases::Events::Publisher.new, reader: true
|
19
20
|
setting :subscribers, default: [], reader: true
|
21
|
+
setting :dry_validation, default: ->(config) {}
|
22
|
+
|
23
|
+
def self.dry_validation
|
24
|
+
config_proc = config.dry_validation
|
25
|
+
|
26
|
+
Proc.new do
|
27
|
+
config_proc.call(config)
|
28
|
+
end
|
29
|
+
end
|
20
30
|
end
|
data/use_cases.gemspec
CHANGED
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_dependency "dry-monads"
|
37
37
|
spec.add_dependency "dry-validation"
|
38
38
|
|
39
|
+
spec.add_development_dependency "byebug"
|
39
40
|
spec.add_development_dependency "rake"
|
40
41
|
spec.add_development_dependency "rspec"
|
41
42
|
spec.add_development_dependency "rubocop"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: use_cases
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ring Twice
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-02-
|
11
|
+
date: 2022-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: byebug
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rake
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,6 +160,7 @@ files:
|
|
146
160
|
- lib/use_case.rb
|
147
161
|
- lib/use_cases.rb
|
148
162
|
- lib/use_cases/dsl.rb
|
163
|
+
- lib/use_cases/events/event_registry.rb
|
149
164
|
- lib/use_cases/events/publish_job.rb
|
150
165
|
- lib/use_cases/events/publisher.rb
|
151
166
|
- lib/use_cases/events/subscriber.rb
|