use_cases 1.0.12 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e41f6c5b8670e047cafdd85d068a66aa0efac27700f2c179d5d893ee1593c466
4
- data.tar.gz: 629cef02e18325528d6155a34356b80e48acaf31520ef45fddb4937e058c3ad2
3
+ metadata.gz: c61b0fc85c1ed9ffdee1bc0f03b6991a7fcd9b64bb502e5b6859e5e124865068
4
+ data.tar.gz: b99383f71920f2c376e2bb197e4a7be3140630b36dcd33b3169bc15582adc5ac
5
5
  SHA512:
6
- metadata.gz: 2b5fdb9fd7bd52211b9194abd49fa2247b9b814e26f763f25f0c9f3ee995dff527977a19e7192576565a563af19dbf3cfeccae833fbd74f4fba74fa4589f46a3
7
- data.tar.gz: 7d51d14db15b08764a1bbf3dc6ccede0806085e532e42273e436f1c91029f911282c3da31495b978a7dc87d5ba569fa33bc077b1b15673d7df795c9bf53ed781
6
+ metadata.gz: 93f9d4b5b4f7492ac49d142b51336b6837c3ad8ff54706a1fa363bd851bd6f7d366e6131bb5e8399ef32de8e38608c07f33c8794ab7cb5fd571e6450b8f866f6
7
+ data.tar.gz: ea72716e2909d65ec10904df231262ba6104cab8e564eb99129f1ba2adfaf2a43b1e93b5ab7c1285aa3e72f76d52b9440e65ce2c7a5a903ae191685f4bee3a39
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- use_cases (1.0.12)
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.28
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(publish_key, payload)
8
- publish_key += ".async"
9
- UseCases.publisher.register_and_publish_event(publish_key, payload)
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,45 +7,18 @@ module UseCases
5
7
  class Publisher
6
8
  include Dry::Events::Publisher[:use_cases]
7
9
 
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
15
-
16
- return unless defined? UseCases::Events::PublishJob
17
-
18
- UseCases::Events::PublishJob.perform_later(event_name, payload)
19
- end
20
-
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
33
- end
34
-
35
- def subscribe_to_event(event_name)
36
- subscribers_for(event_name).each(&method(:subscribe))
37
- end
38
-
39
- def subscribers_for(event_name)
40
- available_subscribers.select do |subscriber|
41
- subscriber.subscribed_to?(event_name)
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
42
16
  end
43
17
  end
44
18
 
45
- def available_subscribers
46
- UseCases::Events::Subscriber.descendants.map(&:new) + UseCases.subscribers
19
+ def publish(event_name, payload)
20
+ super
21
+ PublishJob.perform_later(event_name, payload) if defined?(PublishJob) && !event_name.to_s.end_with?(".async")
47
22
  end
48
23
  end
49
24
  end
@@ -1,12 +1,16 @@
1
- require "active_support/core_ext/class/subclasses"
1
+ # frozen_string_literal: true
2
2
 
3
3
  module UseCases
4
4
  module Events
5
- class Subscriber
6
- def subscribed_to?(event_name)
7
- event_handler_name = "on_#{event_name.gsub('.', '_')}"
8
-
9
- respond_to?(event_handler_name)
5
+ module Subscriber
6
+ def self.included(base)
7
+ UseCases.subscribers << base.new
8
+ end
9
+
10
+ def should_subscribe_to?(event_name)
11
+ event_handler_name = "on_#{event_name.gsub(".", "_")}"
12
+
13
+ respond_to?(event_handler_name.to_sym)
10
14
  end
11
15
  end
12
16
  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,16 +3,25 @@
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
9
10
  module Publishing
10
11
  def self.included(base)
11
12
  super
12
- StepAdapters::Abstract.prepend StepCallPatch
13
+ StepAdapters::Abstract.prepend StepPatch
13
14
  end
14
15
 
15
- module StepCallPatch
16
+ module StepPatch
17
+ def initialize(*)
18
+ super
19
+ %w[success failure].map do |event_type|
20
+ event_id = [options[:publish], event_type].join(".")
21
+ Events::EventRegistry.register(event_id)
22
+ end
23
+ end
24
+
16
25
  def call(*args)
17
26
  super(*args).tap do |result|
18
27
  publish_step_result(result, args)
@@ -25,7 +34,7 @@ module UseCases
25
34
  key = extract_event_key(step_result)
26
35
  payload = extract_payload(step_result, args)
27
36
 
28
- UseCases.publisher.register_and_publish_event(key, payload)
37
+ UseCases.publisher.publish(key, payload)
29
38
  end
30
39
 
31
40
  private
@@ -16,7 +16,7 @@ module UseCases
16
16
  validated: Validated,
17
17
  prepared: Prepared,
18
18
  publishing: Publishing
19
- }
19
+ }.freeze
20
20
 
21
21
  def [](*options)
22
22
  modules = [self]
@@ -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|
@@ -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.1.1"
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
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.0.12
4
+ version: 1.1.1
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-14 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
@@ -178,7 +193,7 @@ metadata:
178
193
  homepage_uri: https://github.com/listminut/use_cases
179
194
  source_code_uri: https://github.com/listminut/use_cases
180
195
  changelog_uri: https://github.com/listminut/use_cases/CHANGELOG.md
181
- post_install_message:
196
+ post_install_message:
182
197
  rdoc_options: []
183
198
  require_paths:
184
199
  - lib
@@ -194,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
209
  version: '0'
195
210
  requirements: []
196
211
  rubygems_version: 3.1.6
197
- signing_key:
212
+ signing_key:
198
213
  specification_version: 4
199
214
  summary: Use Cases
200
215
  test_files: []