use_cases 1.0.12 → 1.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e41f6c5b8670e047cafdd85d068a66aa0efac27700f2c179d5d893ee1593c466
4
- data.tar.gz: 629cef02e18325528d6155a34356b80e48acaf31520ef45fddb4937e058c3ad2
3
+ metadata.gz: 3cec89e8a4f4ecdabae86c99156447d8b39ffd5de5e918130b21ccae18f045a7
4
+ data.tar.gz: e36cd9587aab933815775ee1181360ccea4a24e58e82c3a4a073a99bb565ff31
5
5
  SHA512:
6
- metadata.gz: 2b5fdb9fd7bd52211b9194abd49fa2247b9b814e26f763f25f0c9f3ee995dff527977a19e7192576565a563af19dbf3cfeccae833fbd74f4fba74fa4589f46a3
7
- data.tar.gz: 7d51d14db15b08764a1bbf3dc6ccede0806085e532e42273e436f1c91029f911282c3da31495b978a7dc87d5ba569fa33bc077b1b15673d7df795c9bf53ed781
6
+ metadata.gz: fdaa3ea0104e5bb38190c5c65f59e44569d38b08f0f4174e1c82f5f3b6f0698900a7001463dc3215007a2af2f4030616cc038ae2f2c78aba388b2cab90c520ad
7
+ data.tar.gz: 0c9663e589c521677529bb5b8a4cbe87c4c3591c82dfbc30ea9248b215c53f16c915f4a37dd3683f22b8dc7698f20e46e7cc8dfe20c5390ae9daaf418ee8e26d
@@ -6,7 +6,7 @@ module UseCases
6
6
  class PublishJob < ActiveJob::Base
7
7
  def perform(publish_key, payload)
8
8
  publish_key += ".async"
9
- UseCases.publisher.register_and_publish_event(publish_key, payload)
9
+ UseCases.publisher.subscribe_and_publish_event(publish_key, payload)
10
10
  end
11
11
  end
12
12
  end
@@ -5,31 +5,20 @@ module UseCases
5
5
  class Publisher
6
6
  include Dry::Events::Publisher[:use_cases]
7
7
 
8
- def self.register_and_publish_event(event_name, payload)
9
- register_events(event_name)
10
-
11
- new.tap do |publisher|
12
- publisher.subscribe_to_event(event_name)
13
- publisher.publish(event_name, payload)
14
- end
8
+ def subscribe_and_publish_event(event_name, payload)
9
+ subscribe_to_event(event_name)
10
+ publish(event_name, payload)
11
+ publish_async(event_name, payload) if event_should_be_published_asynchronously?(event_name)
12
+ end
15
13
 
16
- return unless defined? UseCases::Events::PublishJob
14
+ private
17
15
 
16
+ def publish_async(event_name, payload)
18
17
  UseCases::Events::PublishJob.perform_later(event_name, payload)
19
18
  end
20
19
 
21
- def self.extract_payload(use_case_args)
22
- {
23
- return_value: use_case_args[0],
24
- params: use_case_args[1],
25
- current_user: use_case_args[2]
26
- }
27
- end
28
-
29
- def self.register_events(event_name)
30
- [event_name, "#{event_name}.aync"].each do |key|
31
- register_event(key) unless events[key]
32
- end
20
+ def event_should_be_published_asynchronously?(event_name)
21
+ defined? UseCases::Events::PublishJob && !event_name.end_with?(".async")
33
22
  end
34
23
 
35
24
  def subscribe_to_event(event_name)
@@ -38,12 +27,25 @@ module UseCases
38
27
 
39
28
  def subscribers_for(event_name)
40
29
  available_subscribers.select do |subscriber|
41
- subscriber.subscribed_to?(event_name)
30
+ subscriber.should_subscribe_to?(event_name) && !subscribed?(subscriber)
42
31
  end
43
32
  end
44
33
 
34
+ def subscribe(listener)
35
+ subcribers << listener
36
+ super
37
+ end
38
+
39
+ def subscribed?(listener)
40
+ subcribers.include?(listener)
41
+ end
42
+
43
+ def subcribers
44
+ @subcribers ||= []
45
+ end
46
+
45
47
  def available_subscribers
46
- UseCases::Events::Subscriber.descendants.map(&:new) + UseCases.subscribers
48
+ UseCases.subscribers
47
49
  end
48
50
  end
49
51
  end
@@ -1,12 +1,14 @@
1
- require "active_support/core_ext/class/subclasses"
2
-
3
1
  module UseCases
4
2
  module Events
5
- class Subscriber
6
- def subscribed_to?(event_name)
3
+ module Subscriber
4
+ def self.included(base)
5
+ UseCases.subscribers << base.new
6
+ end
7
+
8
+ def should_subscribe_to?(event_name)
7
9
  event_handler_name = "on_#{event_name.gsub('.', '_')}"
8
10
 
9
- respond_to?(event_handler_name)
11
+ respond_to?(event_handler_name.to_sym)
10
12
  end
11
13
  end
12
14
  end
@@ -9,10 +9,33 @@ module UseCases
9
9
  module Publishing
10
10
  def self.included(base)
11
11
  super
12
- StepAdapters::Abstract.prepend StepCallPatch
12
+ StepAdapters::Abstract.prepend StepPatch
13
13
  end
14
14
 
15
- module StepCallPatch
15
+ module StepPatch
16
+ def initialize(*args)
17
+ super
18
+ return unless options[:publish] && UseCases.publisher
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]
26
+
27
+ UseCases.publisher.class.register_event(event_name)
28
+ end
29
+ end
30
+
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
+
16
39
  def call(*args)
17
40
  super(*args).tap do |result|
18
41
  publish_step_result(result, args)
@@ -25,7 +48,7 @@ module UseCases
25
48
  key = extract_event_key(step_result)
26
49
  payload = extract_payload(step_result, args)
27
50
 
28
- UseCases.publisher.register_and_publish_event(key, payload)
51
+ UseCases.publisher.subscribe_and_publish_event(key, payload)
29
52
  end
30
53
 
31
54
  private
@@ -85,11 +85,11 @@ module UseCases
85
85
  end
86
86
 
87
87
  def external?
88
- with_option.present?
88
+ !with_option.nil?
89
89
  end
90
90
 
91
91
  def selects_external_args?
92
- pass_option.present?
92
+ !pass_option.nil?
93
93
  end
94
94
 
95
95
  def callable_args_count
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module UseCases
4
- VERSION = "1.0.12"
4
+ VERSION = "1.0.13"
5
5
  end
data/lib/use_cases.rb CHANGED
@@ -15,6 +15,6 @@ module UseCases
15
15
  extend Dry::Configurable
16
16
 
17
17
  setting :container, reader: true
18
- setting :publisher, default: ::UseCases::Events::Publisher, reader: true
18
+ setting :publisher, default: ::UseCases::Events::Publisher.new, reader: true
19
19
  setting :subscribers, default: [], reader: true
20
20
  end
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.0.12
4
+ version: 1.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ring Twice
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-31 00:00:00.000000000 Z
11
+ date: 2022-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -178,7 +178,7 @@ metadata:
178
178
  homepage_uri: https://github.com/listminut/use_cases
179
179
  source_code_uri: https://github.com/listminut/use_cases
180
180
  changelog_uri: https://github.com/listminut/use_cases/CHANGELOG.md
181
- post_install_message:
181
+ post_install_message:
182
182
  rdoc_options: []
183
183
  require_paths:
184
184
  - lib
@@ -194,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
194
  version: '0'
195
195
  requirements: []
196
196
  rubygems_version: 3.1.6
197
- signing_key:
197
+ signing_key:
198
198
  specification_version: 4
199
199
  summary: Use Cases
200
200
  test_files: []