use_cases 1.0.12 → 1.1.1

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: 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: []