dry-events 0.2.0 → 0.4.0

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: 1423fe7cb9ad77d3af4fea999666f1ff275204e5dad84e4ba8f83ea230b0e2d0
4
- data.tar.gz: 30a0f8b923a890af19b9937fbf502b51c8a568b33444bba0f3d09995045a016d
3
+ metadata.gz: 9f63e13681ddc16b48063d8ccbbf9b134fed50d351ac7bef19fe6e31b17d2df8
4
+ data.tar.gz: e1a22779ae49b59a04bc65ffb9ff1d53d49b066a9f06a4b9b487cea36f4b7c22
5
5
  SHA512:
6
- metadata.gz: d985af03635dea492d89ae37dd5935aa4576d92ca2201bbf4096d12a396df7857fd0007bf7a28275f7d5a985560ef26532ca977bf1ea05e04e815d88db02bd8f
7
- data.tar.gz: 8de1e80e33a2a5429fddce3a675ed9c72ae5224bc919d6fcab5300f4f8d7b11617d18330b0af5451884e76accbc755b37d4282155c0aa52dbddd380e1cc723af
6
+ metadata.gz: 3d42a5f782d005c813929877e729f607cb1089164607a4a496806c265159b1746bf3aa6554c769bddfde3fd40eb019dad3744eb60b670a58bcf3598dd480041e
7
+ data.tar.gz: 824f3bc90447b278138a1421988ec8cb6fb92f7851c0c9021f56309e895600233b222e79ffc223a25b46ed2e22a0a47f245653d917ae9ffbc7686f78151fb25c
data/CHANGELOG.md CHANGED
@@ -1,14 +1,42 @@
1
- # v0.2.0 2019-07-24
1
+ <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
- ## Fixed
3
+ ## unreleased
4
+
5
+
6
+ ### Fixed
7
+
8
+ - `subscribed?` now detects instance method blocks too (via #15) (@guilherme-andrade)
9
+
10
+
11
+ [Compare v0.3.0...master](https://github.com/dry-rb/dry-events/compare/v0.3.0...master)
12
+
13
+ ## 0.3.0 2021-04-11
14
+
15
+
16
+ ### Fixed
17
+
18
+ - Trying to publish an unregistered event raises a meaningful error now (issue #13 fixed via #14) (@landongrindheim)
19
+
20
+ ### Changed
21
+
22
+ - Dependency on dry-equalizer was changed to dry-core (@solnic)
23
+
24
+ [Compare v0.2.0...v0.3.0](https://github.com/dry-rb/dry-events/compare/v0.2.0...v0.3.0)
25
+
26
+ ## 0.2.0 2019-07-24
27
+
28
+
29
+ ### Fixed
30
+
31
+ - Trying to subscribe to a non-existant event raises an exception (issue #3) (@GustavoCaso + @mensfeld)
4
32
 
5
- * Trying to subscribe to a non-existant event raises an exception (issue #3) (@GustavoCaso + @mensfeld)
6
33
 
7
34
  [Compare v0.1.1...v0.2.0](https://github.com/dry-rb/dry-events/compare/v0.1.1...v0.2.0)
8
35
 
9
- # v0.1.1 2019-03-22
36
+ ## 0.1.1 2019-03-22
10
37
 
11
- ## Added
38
+
39
+ ### Added
12
40
 
13
41
  - Subscription filters can be more complex: nested hash inclusion, array inclusion, and proc checks were added (flash-gordon)
14
42
  ```ruby
@@ -34,8 +62,9 @@
34
62
  subscribe(:event, logger: { level: -> level { %i(info warn error).include?(level) })
35
63
  ```
36
64
 
65
+
37
66
  [Compare v0.1.0...v0.1.1](https://github.com/dry-rb/dry-events/compare/v0.1.0...v0.1.1)
38
67
 
39
- # v0.1.0 2018-01-02
68
+ ## 0.1.0 2018-01-02
40
69
 
41
70
  First public release
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 dry-rb team
3
+ Copyright (c) 2015-2022 dry-rb team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
6
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -1,24 +1,30 @@
1
+ <!--- this file is synced from dry-rb/template-gem project -->
1
2
  [gem]: https://rubygems.org/gems/dry-events
2
- [travis]: https://travis-ci.com/dry-rb/dry-events
3
- [codeclimate]: https://codeclimate.com/github/dry-rb/dry-events
3
+ [actions]: https://github.com/dry-rb/dry-events/actions
4
+ [codacy]: https://www.codacy.com/gh/dry-rb/dry-events
4
5
  [chat]: https://dry-rb.zulipchat.com
5
6
  [inchpages]: http://inch-ci.org/github/dry-rb/dry-events
6
7
 
7
8
  # dry-events [![Join the chat at https://dry-rb.zulipchat.com](https://img.shields.io/badge/dry--rb-join%20chat-%23346b7a.svg)][chat]
8
9
 
9
10
  [![Gem Version](https://badge.fury.io/rb/dry-events.svg)][gem]
10
- [![Build Status](https://travis-ci.com/dry-rb/dry-events.svg?branch=master)][travis]
11
- [![Code Climate](https://codeclimate.com/github/dry-rb/dry-events/badges/gpa.svg)][codeclimate]
12
- [![Test Coverage](https://codeclimate.com/github/dry-rb/dry-events/badges/coverage.svg)][codeclimate]
13
- [![Inline docs](http://inch-ci.org/github/dry-rb/dry-events.svg?branch=master)][inchpages]
14
-
15
- Standalone pub/sub system.
11
+ [![CI Status](https://github.com/dry-rb/dry-events/workflows/ci/badge.svg)][actions]
12
+ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3170162485134ea3b778c7e20e180b26)][codacy]
13
+ [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/3170162485134ea3b778c7e20e180b26)][codacy]
14
+ [![Inline docs](http://inch-ci.org/github/dry-rb/dry-events.svg?branch=main)][inchpages]
16
15
 
17
16
  ## Links
18
17
 
19
- * [User docs](http://dry-rb.org/gems/dry-events)
20
- * [API docs](http://rubydoc.info/gems/dry-events)
18
+ * [User documentation](https://dry-rb.org/gems/dry-events)
19
+ * [API documentation](http://rubydoc.info/gems/dry-events)
20
+
21
+ ## Supported Ruby versions
22
+
23
+ This library officially supports the following Ruby versions:
24
+
25
+ * MRI `>= 2.7.0`
26
+ * jruby `>= 9.3` (postponed until 2.7 is supported)
21
27
 
22
- ## LICENSE
28
+ ## License
23
29
 
24
30
  See `LICENSE` file.
data/dry-events.gemspec CHANGED
@@ -1,25 +1,38 @@
1
- # coding: utf-8
2
- require File.expand_path('../lib/dry/events/version', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ # this file is synced from dry-rb/template-gem project
4
+
5
+ lib = File.expand_path("lib", __dir__)
6
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
7
+ require "dry/events/version"
3
8
 
4
9
  Gem::Specification.new do |spec|
5
- spec.name = 'dry-events'
6
- spec.version = Dry::Events::VERSION
7
- spec.authors = ['Piotr Solnica']
8
- spec.email = ['piotr.solnica+oss@gmail.com']
9
- spec.summary = 'Pub/sub system'
10
- spec.homepage = 'https://github.com/dry-rb/dry-events'
11
- spec.license = 'MIT'
12
-
13
- spec.files = `git ls-files -z`.split("\x0")
14
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
- spec.require_paths = ['lib']
17
-
18
- spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
19
- spec.add_runtime_dependency 'dry-core', '~> 0.4'
20
- spec.add_runtime_dependency 'dry-equalizer', '~> 0.2'
21
-
22
- spec.add_development_dependency 'bundler'
23
- spec.add_development_dependency 'rake'
24
- spec.add_development_dependency 'rspec'
10
+ spec.name = "dry-events"
11
+ spec.authors = ["Piotr Solnica"]
12
+ spec.email = ["piotr.solnica+oss@gmail.com"]
13
+ spec.license = "MIT"
14
+ spec.version = Dry::Events::VERSION.dup
15
+
16
+ spec.summary = "Pub/sub system"
17
+ spec.description = spec.summary
18
+ spec.homepage = "https://dry-rb.org/gems/dry-events"
19
+ spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-events.gemspec", "lib/**/*"]
20
+ spec.bindir = "bin"
21
+ spec.executables = []
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
+ spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-events/blob/main/CHANGELOG.md"
26
+ spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-events"
27
+ spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-events/issues"
28
+
29
+ spec.required_ruby_version = ">= 2.7.0"
30
+
31
+ # to update dependencies edit project.yml
32
+ spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
33
+ spec.add_runtime_dependency "dry-core", "~> 0.9", ">= 0.9"
34
+
35
+ spec.add_development_dependency "bundler"
36
+ spec.add_development_dependency "rake"
37
+ spec.add_development_dependency "rspec"
25
38
  end
@@ -1,4 +1,6 @@
1
- require 'dry/events/constants'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/events/constants"
2
4
 
3
5
  module Dry
4
6
  module Events
@@ -74,7 +76,14 @@ module Dry
74
76
 
75
77
  # @api private
76
78
  def subscribed?(listener)
77
- listeners.values.any? { |value| value.any? { |block, _| block.equal?(listener) } }
79
+ listeners.values.any? do |value|
80
+ value.any? do |block, _|
81
+ case listener
82
+ when Proc then block.equal?(listener)
83
+ when Method then listener.owner == block.owner && listener.name == block.name
84
+ end
85
+ end
86
+ end
78
87
  end
79
88
 
80
89
  # @api private
@@ -1,5 +1,6 @@
1
- require 'concurrent/map'
2
- require 'dry/core/constants'
1
+ # frozen_string_literal: true
2
+
3
+ require "concurrent/map"
3
4
 
4
5
  module Dry
5
6
  module Events
@@ -1,5 +1,6 @@
1
- require 'dry/equalizer'
2
- require 'dry/events/constants'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/events/constants"
3
4
 
4
5
  module Dry
5
6
  module Events
@@ -16,8 +17,8 @@ module Dry
16
17
  end
17
18
  end
18
19
 
19
- DOT = '.'.freeze
20
- UNDERSCORE = '_'.freeze
20
+ DOT = "."
21
+ UNDERSCORE = "_"
21
22
 
22
23
  # @!attribute [r] id
23
24
  # @return [Symbol, String] The event identifier
@@ -27,7 +28,7 @@ module Dry
27
28
  def self.new(id, payload = EMPTY_HASH)
28
29
  return super(id, payload) if (id.is_a?(String) || id.is_a?(Symbol)) && !id.empty?
29
30
 
30
- raise InvalidEventNameError.new
31
+ raise InvalidEventNameError
31
32
  end
32
33
 
33
34
  # Initialize a new event
@@ -87,4 +88,3 @@ module Dry
87
88
  end
88
89
  end
89
90
  end
90
-
@@ -1,4 +1,6 @@
1
- require 'set'
1
+ # frozen_string_literal: true
2
+
3
+ require "set"
2
4
 
3
5
  module Dry
4
6
  module Events
@@ -1,5 +1,6 @@
1
- require 'dry/equalizer'
2
- require 'dry/events/publisher'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/events/publisher"
3
4
 
4
5
  module Dry
5
6
  module Events
@@ -21,7 +22,7 @@ module Dry
21
22
  # end
22
23
  #
23
24
  # @api public
24
- class Listener < Module
25
+ class Listener < ::Module
25
26
  include Dry::Equalizer(:id)
26
27
 
27
28
  # @!attribute [r] :id
@@ -40,6 +41,7 @@ module Dry
40
41
 
41
42
  # @api private
42
43
  def initialize(id)
44
+ super()
43
45
  @id = id
44
46
 
45
47
  define_method(:subscribe) do |event_id, query = EMPTY_HASH, &block|
@@ -1,11 +1,10 @@
1
- require 'concurrent/map'
1
+ # frozen_string_literal: true
2
2
 
3
- require 'dry/core/class_attributes'
4
-
5
- require 'dry/events/constants'
6
- require 'dry/events/event'
7
- require 'dry/events/bus'
8
- require 'dry/events/filter'
3
+ require "dry/core"
4
+ require "dry/events/constants"
5
+ require "dry/events/event"
6
+ require "dry/events/bus"
7
+ require "dry/events/filter"
9
8
 
10
9
  module Dry
11
10
  module Events
@@ -25,13 +24,27 @@ module Dry
25
24
  def initialize(object_or_event_id)
26
25
  case object_or_event_id
27
26
  when String, Symbol
28
- super("you are trying to subscribe to an event: `#{object_or_event_id}` that has not been registered")
27
+ super(
28
+ "you are trying to subscribe to an event: `#{object_or_event_id}` "\
29
+ "that has not been registered"
30
+ )
29
31
  else
30
32
  super("you try use subscriber object that will never be executed")
31
33
  end
32
34
  end
33
35
  end
34
36
 
37
+ UnregisteredEventError = Class.new(StandardError) do
38
+ def initialize(object_or_event_id)
39
+ case object_or_event_id
40
+ when String, Symbol
41
+ super("You are trying to publish an unregistered event: `#{object_or_event_id}`")
42
+ else
43
+ super("You are trying to publish an unregistered event")
44
+ end
45
+ end
46
+ end
47
+
35
48
  # Extension used for classes that can publish events
36
49
  #
37
50
  # @example
@@ -61,7 +74,7 @@ module Dry
61
74
  # create_user.call(name: "Jane")
62
75
  #
63
76
  # @api public
64
- class Publisher < Module
77
+ class Publisher < ::Module
65
78
  include Dry::Equalizer(:id)
66
79
 
67
80
  # Internal publisher registry, which is used to identify them globally
@@ -89,12 +102,14 @@ module Dry
89
102
  #
90
103
  # @api public
91
104
  def self.[](id)
92
- raise PublisherAlreadyRegisteredError.new(id) if registry.key?(id)
105
+ raise PublisherAlreadyRegisteredError, id if registry.key?(id)
106
+
93
107
  new(id)
94
108
  end
95
109
 
96
110
  # @api private
97
111
  def initialize(id)
112
+ super()
98
113
  @id = id
99
114
  end
100
115
 
@@ -180,6 +195,7 @@ module Dry
180
195
  __bus__.events[event_id] = Event.new(event_id, payload)
181
196
  self
182
197
  end
198
+
183
199
  # Publish an event
184
200
  #
185
201
  # @param [String] event_id The event identifier
@@ -187,8 +203,12 @@ module Dry
187
203
  #
188
204
  # @api public
189
205
  def publish(event_id, payload = EMPTY_HASH)
190
- __bus__.publish(event_id, payload)
191
- self
206
+ if __bus__.can_handle?(event_id)
207
+ __bus__.publish(event_id, payload)
208
+ self
209
+ else
210
+ raise UnregisteredEventError, event_id
211
+ end
192
212
  end
193
213
  alias_method :trigger, :publish
194
214
 
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dry
2
4
  module Events
3
- VERSION = '0.2.0'.freeze
5
+ VERSION = "0.4.0"
4
6
  end
5
7
  end
data/lib/dry/events.rb CHANGED
@@ -1 +1,3 @@
1
- require 'dry/events/publisher'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/events/publisher"
data/lib/dry-events.rb CHANGED
@@ -1 +1,3 @@
1
- require 'dry/events'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/events"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-24 00:00:00.000000000 Z
11
+ date: 2022-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -30,28 +30,20 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.4'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '0.4'
41
- - !ruby/object:Gem::Dependency
42
- name: dry-equalizer
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
33
+ version: '0.9'
34
+ - - ">="
46
35
  - !ruby/object:Gem::Version
47
- version: '0.2'
36
+ version: '0.9'
48
37
  type: :runtime
49
38
  prerelease: false
50
39
  version_requirements: !ruby/object:Gem::Requirement
51
40
  requirements:
52
41
  - - "~>"
53
42
  - !ruby/object:Gem::Version
54
- version: '0.2'
43
+ version: '0.9'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0.9'
55
47
  - !ruby/object:Gem::Dependency
56
48
  name: bundler
57
49
  requirement: !ruby/object:Gem::Requirement
@@ -94,22 +86,16 @@ dependencies:
94
86
  - - ">="
95
87
  - !ruby/object:Gem::Version
96
88
  version: '0'
97
- description:
89
+ description: Pub/sub system
98
90
  email:
99
91
  - piotr.solnica+oss@gmail.com
100
92
  executables: []
101
93
  extensions: []
102
94
  extra_rdoc_files: []
103
95
  files:
104
- - ".gitignore"
105
- - ".rspec"
106
- - ".travis.yml"
107
96
  - CHANGELOG.md
108
- - CONTRIBUTING.md
109
- - Gemfile
110
97
  - LICENSE
111
98
  - README.md
112
- - Rakefile
113
99
  - dry-events.gemspec
114
100
  - lib/dry-events.rb
115
101
  - lib/dry/events.rb
@@ -120,15 +106,14 @@ files:
120
106
  - lib/dry/events/listener.rb
121
107
  - lib/dry/events/publisher.rb
122
108
  - lib/dry/events/version.rb
123
- - spec/spec_helper.rb
124
- - spec/unit/dry/events/event_spec.rb
125
- - spec/unit/dry/events/filter_spec.rb
126
- - spec/unit/dry/events/listener_spec.rb
127
- - spec/unit/dry/events/publisher_spec.rb
128
- homepage: https://github.com/dry-rb/dry-events
109
+ homepage: https://dry-rb.org/gems/dry-events
129
110
  licenses:
130
111
  - MIT
131
- metadata: {}
112
+ metadata:
113
+ allowed_push_host: https://rubygems.org
114
+ changelog_uri: https://github.com/dry-rb/dry-events/blob/main/CHANGELOG.md
115
+ source_code_uri: https://github.com/dry-rb/dry-events
116
+ bug_tracker_uri: https://github.com/dry-rb/dry-events/issues
132
117
  post_install_message:
133
118
  rdoc_options: []
134
119
  require_paths:
@@ -137,20 +122,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
122
  requirements:
138
123
  - - ">="
139
124
  - !ruby/object:Gem::Version
140
- version: '0'
125
+ version: 2.7.0
141
126
  required_rubygems_version: !ruby/object:Gem::Requirement
142
127
  requirements:
143
128
  - - ">="
144
129
  - !ruby/object:Gem::Version
145
130
  version: '0'
146
131
  requirements: []
147
- rubygems_version: 3.0.3
132
+ rubygems_version: 3.1.6
148
133
  signing_key:
149
134
  specification_version: 4
150
135
  summary: Pub/sub system
151
- test_files:
152
- - spec/spec_helper.rb
153
- - spec/unit/dry/events/event_spec.rb
154
- - spec/unit/dry/events/filter_spec.rb
155
- - spec/unit/dry/events/listener_spec.rb
156
- - spec/unit/dry/events/publisher_spec.rb
136
+ test_files: []
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- .DS_Store
2
- coverage
3
- /.bundle
4
- vendor/bundle
5
- bin/
6
- tmp/
7
- .idea/
8
- Gemfile.lock
9
- spec/test_logs/*.log
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --color
2
- --require spec_helper
3
- --order random
data/.travis.yml DELETED
@@ -1,24 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- bundler_args: --without benchmarks console tools
4
- script: "bundle exec rake ci"
5
- after_success:
6
- - '[ "${TRAVIS_JOB_NUMBER#*.}" = "1" ] && [ "$TRAVIS_BRANCH" = "master" ] && bundle exec codeclimate-test-reporter'
7
- rvm:
8
- - 2.6.3
9
- - 2.5.5
10
- - 2.4.6
11
- - jruby-9.2.7.0
12
- - truffleruby
13
- matrix:
14
- allow_failures:
15
- - rvm: truffleruby
16
- - rvm: jruby-9.2.7.0
17
- env:
18
- global:
19
- - COVERAGE='true'
20
- notifications:
21
- webhooks:
22
- on_success: change
23
- on_failure: always
24
- on_start: false
data/CONTRIBUTING.md DELETED
@@ -1,29 +0,0 @@
1
- # Issue Guidelines
2
-
3
- ## Reporting bugs
4
-
5
- If you found a bug, report an issue and describe what's the expected behavior versus what actually happens. If the bug causes a crash, attach a full backtrace. If possible, a reproduction script showing the problem is highly appreciated.
6
-
7
- ## Reporting feature requests
8
-
9
- Report a feature request **only after discussing it first on [discuss.dry-rb.org](https://discuss.dry-rb.org)** where it was accepted. Please provide a concise description of the feature, don't link to a discussion thread, and instead summarize what was discussed.
10
-
11
- ## Reporting questions, support requests, ideas, concerns etc.
12
-
13
- **PLEASE DON'T** - use [discuss.dry-rb.org](http://discuss.dry-rb.org) instead.
14
-
15
- # Pull Request Guidelines
16
-
17
- A Pull Request will only be accepted if it addresses a specific issue that was reported previously, or fixes typos, mistakes in documentation etc.
18
-
19
- Other requirements:
20
-
21
- 1) Do not open a pull request if you can't provide tests along with it. If you have problems writing tests, ask for help in the related issue.
22
- 2) Follow the style conventions of the surrounding code. In most cases, this is standard ruby style.
23
- 3) Add API documentation if it's a new feature
24
- 4) Update API documentation if it changes an existing feature
25
- 5) Bonus points for sending a PR to [github.com/dry-rb/dry-rb.org](github.com/dry-rb/dry-rb.org) which updates user documentation and guides
26
-
27
- # Asking for help
28
-
29
- If these guidelines aren't helpful, and you're stuck, please post a message on [discuss.dry-rb.org](https://discuss.dry-rb.org).
data/Gemfile DELETED
@@ -1,14 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
4
-
5
- group :test do
6
- gem 'rack'
7
- gem 'simplecov', platform: :mri, require: false
8
- gem 'codeclimate-test-reporter', require: false
9
- end
10
-
11
- group :tools do
12
- gem 'pry'
13
- gem 'pry-byebug', platform: :mri
14
- end
data/Rakefile DELETED
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env rake
2
- require 'bundler/gem_tasks'
3
-
4
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
5
-
6
- require 'rspec/core'
7
- require 'rspec/core/rake_task'
8
-
9
- task default: :spec
10
-
11
- desc 'Run all specs in spec directory'
12
- RSpec::Core::RakeTask.new(:spec)
13
-
14
- desc "Run CI tasks"
15
- task ci: [:spec]
data/spec/spec_helper.rb DELETED
@@ -1,28 +0,0 @@
1
- if RUBY_ENGINE == 'ruby' && ENV['COVERAGE'] == 'true'
2
- require 'simplecov'
3
- SimpleCov.start do
4
- add_filter '/spec/'
5
- end
6
- end
7
-
8
- begin
9
- require 'pry'
10
- require 'pry-byebug'
11
- rescue LoadError; end
12
-
13
- require 'dry-events'
14
-
15
- SPEC_ROOT = Pathname(__dir__)
16
-
17
- Dir[SPEC_ROOT.join('shared/**/*.rb')].each(&method(:require))
18
- Dir[SPEC_ROOT.join('support/**/*.rb')].each(&method(:require))
19
-
20
- RSpec.configure do |config|
21
- config.warnings = true
22
- config.disable_monkey_patching!
23
- config.filter_run_when_matching :focus
24
-
25
- config.after(:example) do
26
- Dry::Events::Publisher.instance_variable_set(:@__registry__, Concurrent::Map.new)
27
- end
28
- end
@@ -1,66 +0,0 @@
1
- require 'dry/events/event'
2
-
3
- RSpec.describe Dry::Events::Event do
4
- subject(:event) do
5
- described_class.new(event_id, payload)
6
- end
7
-
8
- let(:payload) { {} }
9
-
10
- describe 'invalid event name' do
11
- let(:event_id) { nil }
12
- it 'raises InvalidEventNameError' do
13
- expect{ event }.to raise_error(Dry::Events::Event::InvalidEventNameError)
14
- end
15
- end
16
-
17
- describe '#[]' do
18
- let(:event_id) { :test }
19
- let(:payload) { {test: :foo} }
20
-
21
- it 'fetches payload key' do
22
- expect(event[:test]).to eq :foo
23
- end
24
-
25
- it 'raises KeyError when no key found' do
26
- expect { event[:fake] }.to raise_error(KeyError)
27
- end
28
- end
29
-
30
- describe '#payload' do
31
- let(:event_id) { :test }
32
- let(:payload) { {test: :foo} }
33
-
34
- it 'returns payload if no argument' do
35
- expect(event.payload).to eq payload
36
- end
37
-
38
- it 'returns new event with payload payload' do
39
- new_event = event.payload({ bar: :baz })
40
- expect(new_event).to_not eq event
41
- expect(new_event.payload).to eq ({test: :foo, bar: :baz})
42
- end
43
- end
44
-
45
- describe '#to_h' do
46
- let(:event_id) { :test }
47
- let(:payload) { {test: :foo} }
48
-
49
- it 'returns payload' do
50
- expect(event.to_h).to eq payload
51
- end
52
- end
53
-
54
- describe '#listener_method' do
55
- let(:event_id) { :test }
56
-
57
- it 'returns listener method name' do
58
- expect(event.listener_method).to eq :on_test
59
- end
60
-
61
- it 'replaces dots for underscores' do
62
- ev = Dry::Events::Event.new('hello.world')
63
- expect(ev.listener_method).to eq :on_hello_world
64
- end
65
- end
66
- end
@@ -1,74 +0,0 @@
1
- RSpec.describe Dry::Events::Filter do
2
- subject(:filter) { described_class.new(query) }
3
-
4
- context 'nested hash' do
5
- let(:query) do
6
- { logger: { level: :info } }
7
- end
8
-
9
- specify do
10
- expect(filter.()).to be false
11
- expect(filter.(logger: { level: :info, output: :stdin })).to be true
12
- expect(filter.(logger: { level: :debug })).to be false
13
- expect(filter.(logger: :debug)).to be false
14
- end
15
- end
16
-
17
- context 'multi-value check' do
18
- let(:query) do
19
- { logger: { level: :info, output: :stdin } }
20
- end
21
-
22
- specify do
23
- expect(filter.()).to be false
24
- expect(filter.(logger: { level: :info, output: :stdin })).to be true
25
- expect(filter.(logger: { level: :info })).to be false
26
- end
27
- end
28
-
29
- context 'top-level array' do
30
- let(:query) { %i(error fatal) }
31
-
32
- specify do
33
- expect(filter.()).to be false
34
- expect(filter.(random: :hash)).to be false
35
- expect(filter.(:error)).to be true
36
- end
37
- end
38
-
39
- context 'nested array' do
40
- let(:query) do
41
- { logger: { level: %i(info warn error fatal) } }
42
- end
43
-
44
- specify do
45
- expect(filter.()).to be false
46
- expect(filter.(logger: { level: :info, output: :stdin })).to be true
47
- expect(filter.(logger: { level: :fatal })).to be true
48
- expect(filter.(logger: { level: :debug })).to be false
49
- expect(filter.(level: :debug)).to be false
50
- end
51
- end
52
-
53
- context 'nested proc' do
54
- let(:query) do
55
- { logger: { level: -> level { %i(error fatal).include?(level) } } }
56
- end
57
-
58
- specify do
59
- expect(filter.()).to be false
60
- expect(filter.(logger: { level: :error, output: :stdin })).to be true
61
- end
62
- end
63
-
64
- context 'top-level proc' do
65
- let(:query) do
66
- -> level: :debug, ** { %i(error fatal).include?(level) }
67
- end
68
-
69
- specify do
70
- expect(filter.()).to be false
71
- expect(filter.(level: :error, output: :stdin)).to be true
72
- end
73
- end
74
- end
@@ -1,45 +0,0 @@
1
- require 'dry/events/listener'
2
-
3
- RSpec.describe Dry::Events::Listener do
4
- subject(:listener) do
5
- Class.new {
6
- include Dry::Events::Listener[:test_publisher]
7
- }
8
- end
9
-
10
- let!(:publisher) do
11
- Class.new {
12
- include Dry::Events::Publisher[:test_publisher]
13
-
14
- register_event :test_event
15
- }.new
16
- end
17
-
18
- describe '.subscribe' do
19
- let(:captured) { [] }
20
-
21
- it 'subscribes a listener at class level' do
22
- listener.subscribe(:test_event) do |event|
23
- captured << event.id
24
- end
25
-
26
- publisher.publish(:test_event)
27
-
28
- expect(captured).to eql([:test_event])
29
- end
30
-
31
- describe 'filters' do
32
- it 'filters events' do
33
- listener.subscribe(:test_event, level: :info) do |event|
34
- captured << event.payload
35
- end
36
-
37
- publisher.publish(:test_event)
38
- publisher.publish(:test_event, level: :debug)
39
- publisher.publish(:test_event, level: :info)
40
-
41
- expect(captured).to eql([level: :info])
42
- end
43
- end
44
- end
45
- end
@@ -1,147 +0,0 @@
1
- require 'dry/events/publisher'
2
-
3
- RSpec.describe Dry::Events::Publisher do
4
- subject(:publisher) do
5
- Class.new {
6
- include Dry::Events::Publisher[:test_publisher]
7
-
8
- register_event :test_event
9
- }.new
10
- end
11
-
12
- describe '.[]' do
13
- it 'creates a publisher extension with provided id' do
14
- publisher = Class.new do
15
- include Dry::Events::Publisher[:my_publisher]
16
- end
17
-
18
- expect(Dry::Events::Publisher.registry[:my_publisher]).to be(publisher)
19
- end
20
-
21
- it 'does not allow same id to be used for than once' do
22
- create_publisher = -> do
23
- Class.new do
24
- include Dry::Events::Publisher[:my_publisher]
25
- end
26
- end
27
-
28
- create_publisher.()
29
-
30
- expect { create_publisher.() }.to raise_error(Dry::Events::PublisherAlreadyRegisteredError, /my_publisher/)
31
- end
32
- end
33
-
34
- describe '.subscribe' do
35
- it 'subscribes a listener at class level' do
36
- listener = -> * { }
37
-
38
- publisher.class.subscribe(:test_event, &listener)
39
-
40
- expect(publisher.subscribed?(listener)).to be(true)
41
- end
42
-
43
- it 'raises an exception when subscribing to an unregister event' do
44
- listener = -> * { }
45
-
46
- expect {
47
- publisher.subscribe(:not_register, &listener)
48
- }.to raise_error(Dry::Events::InvalidSubscriberError, /not_register/)
49
- end
50
- end
51
-
52
- describe '#register_event' do
53
- it 'registers a new event at instance level' do
54
- listener = -> * { }
55
-
56
- publisher.register_event(:test_another_event).subscribe(:test_another_event, &listener)
57
-
58
- expect(publisher.subscribed?(listener)).to be(true)
59
- end
60
- end
61
-
62
- describe '#subscribe' do
63
- it 'subscribes a listener function' do
64
- listener = -> * { }
65
-
66
- publisher.subscribe(:test_event, &listener)
67
-
68
- expect(publisher.subscribed?(listener)).to be(true)
69
- end
70
-
71
- it 'subscribes a listener object' do
72
- listener = Class.new do
73
- attr_reader :captured
74
-
75
- def initialize
76
- @captured = []
77
- end
78
-
79
- def on_test_event(event)
80
- captured << event[:message]
81
- end
82
- end.new
83
-
84
- publisher.subscribe(listener).publish(:test_event, message: 'it works')
85
-
86
- expect(listener.captured).to eql(['it works'])
87
-
88
- publisher.unsubscribe(listener)
89
-
90
- publisher.publish(:test_event, message: 'it works')
91
-
92
- expect(listener.captured).to eql(['it works'])
93
- end
94
-
95
- it 'raises an exception when subscribing with no methods to execute' do
96
- listener = Object.new
97
-
98
- expect {
99
- publisher.subscribe(listener)
100
- }.to raise_error(Dry::Events::InvalidSubscriberError, /never be executed/)
101
- end
102
-
103
- it 'does not raise an exception when subscriber has methods for notification' do
104
- listener = Object.new
105
- def listener.on_test_event; nil; end
106
- expect { publisher.subscribe(listener) }.not_to raise_error
107
- end
108
- end
109
-
110
- describe '#publish' do
111
- it 'publishes an event' do
112
- result = []
113
- listener = -> event { result << event[:message] }
114
-
115
- publisher.subscribe(:test_event, &listener).publish(:test_event, message: 'it works')
116
-
117
- expect(result).to eql(['it works'])
118
- end
119
-
120
- it 'publishes an event filtered by a query' do
121
- result = []
122
- listener = -> test: { result << test }
123
-
124
- publisher.
125
- subscribe(:test_event, test: true, &listener).
126
- publish(:test_event, test: false).
127
- publish(:test_event, test: true)
128
-
129
- expect(result).to eql([true])
130
- end
131
- end
132
-
133
- describe '#process' do
134
- it 'yields event and its listeners' do
135
- result = []
136
- listener = -> event { result << event.id }
137
-
138
- publisher.subscribe(:test_event, &listener)
139
-
140
- publisher.process(:test_event) do |event, listener|
141
- listener.(event)
142
- end
143
-
144
- expect(result).to eql([:test_event])
145
- end
146
- end
147
- end