wisper 1.6.1 → 2.0.0.rc1
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
- checksums.yaml.gz.sig +2 -0
- data.tar.gz.sig +0 -0
- data/.gitignore +1 -0
- data/.travis.yml +0 -1
- data/CHANGELOG.md +5 -2
- data/CONTRIBUTING.md +55 -0
- data/Gemfile +1 -0
- data/README.md +7 -82
- data/gem-public_cert.pem +21 -0
- data/lib/wisper.rb +0 -15
- data/lib/wisper/broadcasters/logger_broadcaster.rb +4 -4
- data/lib/wisper/broadcasters/send_broadcaster.rb +2 -2
- data/lib/wisper/configuration.rb +8 -3
- data/lib/wisper/global_listeners.rb +4 -7
- data/lib/wisper/publisher.rb +32 -26
- data/lib/wisper/registration/block.rb +2 -0
- data/lib/wisper/registration/object.rb +2 -0
- data/lib/wisper/registration/registration.rb +29 -3
- data/lib/wisper/temporary_listeners.rb +2 -0
- data/lib/wisper/version.rb +1 -1
- data/spec/lib/{global_subscribers_spec.rb → global_listeners_spec.rb} +0 -9
- data/spec/lib/temporary_global_listeners_spec.rb +3 -3
- data/spec/lib/wisper/broadcasters/logger_broadcaster_spec.rb +9 -9
- data/spec/lib/wisper/broadcasters/send_broadcaster_spec.rb +7 -7
- data/spec/lib/wisper/configuration_spec.rb +10 -4
- data/spec/lib/wisper/publisher_spec.rb +67 -125
- data/spec/lib/wisper_spec.rb +0 -42
- data/wisper.gemspec +7 -0
- metadata +33 -15
- metadata.gz.sig +0 -0
- data/.ruby-version +0 -1
- data/lib/wisper/rspec/matchers.rb +0 -57
- data/lib/wisper/rspec/stub_wisper_publisher.rb +0 -12
- data/spec/lib/wisper/rspec/matchers_spec.rb +0 -17
- data/spec/lib/wisper/rspec/stub_wisper_publisher_spec.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e196cad72b441abfb2aa87211e0241729dbfe803
|
4
|
+
data.tar.gz: d1506f6acdac8f354ab801814c73726933201abd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f1fee408008e32f3861df1438edec17fb05e599e1bb6a196e6c288a5def62d8736d9d7667e22089bee64dae89e54f3d2a8615ecbba24a37efdd6aa23e0fb41d
|
7
|
+
data.tar.gz: b6f4e0b0bdfd905c8ae1562ca79f2c7606804de8ee7e23c4d378019ff780cb3176c1467752b6ec61ee16499658fe9de48bf1b8611da590bdf29bb8d89dcd5b9b
|
checksums.yaml.gz.sig
ADDED
data.tar.gz.sig
ADDED
Binary file
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
-
##
|
1
|
+
## 2.0.0.rc1 (17 Dec 2014)
|
2
2
|
|
3
3
|
Authors: Kris Leech
|
4
4
|
|
5
|
-
*
|
5
|
+
* remove: deprecated methods
|
6
|
+
* remove: rspec matcher and stubbing (moved to [wisper-rspec](https://github.com/krisleech/wisper-rspec))
|
7
|
+
* feature: add regexp support to `on` argument
|
8
|
+
* remove: announce alias for broadcasting
|
6
9
|
|
7
10
|
## 1.6.0 (25 Oct 2014)
|
8
11
|
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# How to Contribute
|
2
|
+
|
3
|
+
We very much welcome contributions to Wisper.
|
4
|
+
|
5
|
+
## Getting started
|
6
|
+
|
7
|
+
Please first check the existing [Issues](https://github.com/krisleech/wisper/issues)
|
8
|
+
and [Pull Requests](https://github.com/krisleech/wisper/pulls) to ensure your
|
9
|
+
issue has not already been discused.
|
10
|
+
|
11
|
+
## Bugs
|
12
|
+
|
13
|
+
Please submit a bug report to the issue tracker, with the version of Wisper
|
14
|
+
and Ruby you are using and a small code sample (or better yet a failing test).
|
15
|
+
|
16
|
+
## Features
|
17
|
+
|
18
|
+
Please open an issue with your proposed feature. We can discuss the feature and
|
19
|
+
if it is acceptable we can also discuss implimentation details. You will in
|
20
|
+
most cases have to submit a PR which adds the feature.
|
21
|
+
|
22
|
+
We also have a [Gitter channel](https://gitter.im/krisleech/wisper).
|
23
|
+
|
24
|
+
Wisper is a micro library and will remain lean. Some features would be most
|
25
|
+
appropriate as an extension to Wisper.
|
26
|
+
|
27
|
+
## Questions
|
28
|
+
|
29
|
+
Try the [Wiki](https://github.com/krisleech/wisper/wiki) first, the examples
|
30
|
+
and how to sections have lots of information.
|
31
|
+
|
32
|
+
Please ask questions on StackOverflow, [tagged wisper](https://stackoverflow.com/questions/tagged/wisper).
|
33
|
+
|
34
|
+
Feel free to ping me the URL on [Twitter](https://twitter.com/krisleech).
|
35
|
+
|
36
|
+
We also have a [channel on Gitter](https://gitter.im/krisleech/wisper).
|
37
|
+
|
38
|
+
## Pull requests
|
39
|
+
|
40
|
+
* Fork the project, create a new branch from `v1` or `master`.
|
41
|
+
* Squash commits which are related.
|
42
|
+
* Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
|
43
|
+
* Documentation only changes should have `[skip ci]` in the commit message
|
44
|
+
* Follow existing code style in terms of syntax, indentation etc.
|
45
|
+
* Add an entry to the CHANGELOG
|
46
|
+
* Do not bump the VERSION, but do indicate in the CHANGELOG if the change is
|
47
|
+
not backwards compatible.
|
48
|
+
* Issue a Pull Request
|
49
|
+
|
50
|
+
## Versions
|
51
|
+
|
52
|
+
The `v1` branch is a long lived branch and you should
|
53
|
+
branch from this if you wish to fix an issue in version `~> 1.0`.
|
54
|
+
|
55
|
+
The `master` branch will target the next version of Wisper.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -32,10 +32,10 @@ to subscribed listeners. Listeners subscribe, at runtime, to the publisher.
|
|
32
32
|
```ruby
|
33
33
|
class CancelOrder
|
34
34
|
include Wisper::Publisher
|
35
|
-
|
35
|
+
|
36
36
|
def call(order_id)
|
37
37
|
order = Order.find_by_id(order_id)
|
38
|
-
|
38
|
+
|
39
39
|
# business logic...
|
40
40
|
|
41
41
|
if order.cancelled?
|
@@ -49,7 +49,7 @@ end
|
|
49
49
|
|
50
50
|
When a publisher broadcasts an event it can include number of arguments.
|
51
51
|
|
52
|
-
The `broadcast` method is also aliased as `publish
|
52
|
+
The `broadcast` method is also aliased as `publish`.
|
53
53
|
|
54
54
|
You can also include `Wisper.publisher` instead of `Wisper::Publisher`.
|
55
55
|
|
@@ -202,8 +202,8 @@ Temporary Global Listeners are threadsafe.
|
|
202
202
|
## Subscribing to selected events
|
203
203
|
|
204
204
|
By default a listener will get notified of all events it can respond to. You
|
205
|
-
can limit which events a listener is notified of by passing an
|
206
|
-
|
205
|
+
can limit which events a listener is notified of by passing an string, symbol,
|
206
|
+
array or regular expression to `on`:
|
207
207
|
|
208
208
|
```ruby
|
209
209
|
post_creater.subscribe(PusherListener.new, on: :create_post_successful)
|
@@ -224,7 +224,7 @@ use the default prefix, "on".
|
|
224
224
|
|
225
225
|
## Mapping an event to a different method
|
226
226
|
|
227
|
-
By default the method called on the
|
227
|
+
By default the method called on the listener is the same as the event
|
228
228
|
broadcast. However it can be mapped to a different method using `with:`.
|
229
229
|
|
230
230
|
```ruby
|
@@ -257,82 +257,7 @@ You could also alias the method within your listener, as such
|
|
257
257
|
|
258
258
|
## RSpec
|
259
259
|
|
260
|
-
|
261
|
-
|
262
|
-
```ruby
|
263
|
-
require 'wisper/rspec/matchers'
|
264
|
-
|
265
|
-
RSpec::configure do |config|
|
266
|
-
config.include(Wisper::RSpec::BroadcastMatcher)
|
267
|
-
end
|
268
|
-
|
269
|
-
expect { publisher.execute }.to broadcast(:an_event)
|
270
|
-
```
|
271
|
-
|
272
|
-
### Using message expections
|
273
|
-
|
274
|
-
If you need to assert on the arguments broadcast you can subscribe a double
|
275
|
-
with a [message expection](https://github.com/rspec/rspec-mocks#message-expectations)
|
276
|
-
and then use any of the [argument matchers](https://github.com/rspec/rspec-mocks#argument-matchers).
|
277
|
-
|
278
|
-
```ruby
|
279
|
-
listener = double('Listener')
|
280
|
-
|
281
|
-
expect(listener).to receive(:an_event).with(some_args)
|
282
|
-
|
283
|
-
publisher.subscribe(listener)
|
284
|
-
|
285
|
-
publisher.execute
|
286
|
-
```
|
287
|
-
|
288
|
-
### Stubbing publishers
|
289
|
-
|
290
|
-
You can stub publishers and their events in unit (isolated) tests that only care about reacting to events.
|
291
|
-
|
292
|
-
Given this piece of code:
|
293
|
-
|
294
|
-
```ruby
|
295
|
-
class MyController
|
296
|
-
def create
|
297
|
-
publisher = MyPublisher.new
|
298
|
-
|
299
|
-
publisher.on(:some_event) do |variable|
|
300
|
-
return "Hello with #{variable}!"
|
301
|
-
end
|
302
|
-
|
303
|
-
publisher.execute
|
304
|
-
end
|
305
|
-
end
|
306
|
-
```
|
307
|
-
|
308
|
-
You can test it like this:
|
309
|
-
|
310
|
-
```ruby
|
311
|
-
require 'wisper/rspec/stub_wisper_publisher'
|
312
|
-
|
313
|
-
describe MyController do
|
314
|
-
context "on some_event" do
|
315
|
-
before do
|
316
|
-
stub_wisper_publisher("MyPublisher", :execute, :some_event, "foo")
|
317
|
-
end
|
318
|
-
|
319
|
-
it "renders" do
|
320
|
-
response = MyController.new.create
|
321
|
-
expect(response).to eq "Hello with foo!"
|
322
|
-
end
|
323
|
-
end
|
324
|
-
end
|
325
|
-
```
|
326
|
-
|
327
|
-
This is useful when testing Rails controllers in isolation from the business logic.
|
328
|
-
|
329
|
-
You can use any number of args to pass to the event:
|
330
|
-
|
331
|
-
```ruby
|
332
|
-
stub_wisper_publisher("MyPublisher", :execute, :some_event, "foo1", "foo2", ...)
|
333
|
-
```
|
334
|
-
|
335
|
-
See `spec/lib/rspec_extensions_spec.rb` for a runnable example.
|
260
|
+
Please see [wisper-rspec](https://github.com/krisleech/wisper-rspec).
|
336
261
|
|
337
262
|
## Clearing Global Listeners
|
338
263
|
|
data/gem-public_cert.pem
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRMwEQYDVQQDDAprcmlz
|
3
|
+
LmxlZWNoMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
|
4
|
+
b20wHhcNMTQxMTA1MTEwMzQ4WhcNMTUxMTA1MTEwMzQ4WjBBMRMwEQYDVQQDDApr
|
5
|
+
cmlzLmxlZWNoMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
|
6
|
+
FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtW0/UtrFK/tSm
|
7
|
+
uq5HnCUkZAQjnSaZ/h1Tby9s30CDJjDUdizPRdLQCplLDAMHFsAfTyD0Mc+Ez8o9
|
8
|
+
CdTh8EZ4TSf+nokL+SUprpdR6qm6OWU03Ntd+bDCP0+rdqCX82g3N3mnvjR9aD3a
|
9
|
+
+hd9Fhp0WuEyqTNjQ7IlopeUPDW7eYfSwI4bjfRHxsDR1GuZ3j0npxCAgAIN41WH
|
10
|
+
MSTTZhdo0vKEiKZEtMMnT6w6fG/c3XIhVVPGnqy5+IZqBL0SYC+WJL3vC6yUBgqB
|
11
|
+
nrpA/q+b3M69W+q+TkGv0qOnrxln0O7J2pykjoGIxUhhRkiGEldEhy9dxQWubffr
|
12
|
+
hVJ4F0wLAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
13
|
+
BBSzq+x8mwj0ldvNkvjOl44OJG354jAfBgNVHREEGDAWgRRrcmlzLmxlZWNoQGdt
|
14
|
+
YWlsLmNvbTAfBgNVHRIEGDAWgRRrcmlzLmxlZWNoQGdtYWlsLmNvbTANBgkqhkiG
|
15
|
+
9w0BAQUFAAOCAQEAF5M2Md3DcNCrQrDRDLaIzHaMM+RTgfbpgmZ6tU0iEowES18g
|
16
|
+
QWQgrAbFuvQRPETJ2gbL5AC35fEqN80nU+3GhgW/bDYhII5D3PGLMorxhFw1JYLI
|
17
|
+
0Fd7MCE0sImc2rPybYUdpZ6TxvqgPKp+8CzM8vBUrdYd+dSHXit1piViWBcZcJb+
|
18
|
+
EL5Ze4IodjkCPAeHvu2MQieieViLyfB4eG1syvfkxvAXCjFHeQoIFP16vVtcljdF
|
19
|
+
k5cHH/4SGeMuGrSLRsqVvltxVV3AbQAfH8WUos2brjYHsoH5tVPrJ7UcFhzP95oU
|
20
|
+
pEfFMW42smiNTOXpzG6JoIpA11szEHFT5ZS+UQ==
|
21
|
+
-----END CERTIFICATE-----
|
data/lib/wisper.rb
CHANGED
@@ -11,21 +11,6 @@ require 'wisper/broadcasters/send_broadcaster'
|
|
11
11
|
require 'wisper/broadcasters/logger_broadcaster'
|
12
12
|
|
13
13
|
module Wisper
|
14
|
-
def self.included(base)
|
15
|
-
warn "[DEPRECATION] `include Wisper::Publisher` instead of `include Wisper`"
|
16
|
-
base.class_eval { include Wisper::Publisher }
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.with_listeners(*args, &block)
|
20
|
-
warn "[DEPRECATION] `use Wisper.subscribe` instead of `Wisper.with_listeners`"
|
21
|
-
self.subscribe(*args, &block)
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.add_listener(listener, options = {})
|
25
|
-
warn "[DEPRECATION] `use Wisper.subscribe` instead of `Wisper.add_listener`"
|
26
|
-
self.subscribe(listener, options)
|
27
|
-
end
|
28
|
-
|
29
14
|
# Examples:
|
30
15
|
#
|
31
16
|
# Wisper.subscribe(AuditRecorder.new)
|
@@ -8,15 +8,15 @@ module Wisper
|
|
8
8
|
@broadcaster = broadcaster
|
9
9
|
end
|
10
10
|
|
11
|
-
def broadcast(
|
12
|
-
@logger.info("[WISPER] #{name(publisher)} published #{event} to #{name(
|
13
|
-
@broadcaster.broadcast(
|
11
|
+
def broadcast(listener, publisher, event, args)
|
12
|
+
@logger.info("[WISPER] #{name(publisher)} published #{event} to #{name(listener)} with #{arg_names(args)}")
|
13
|
+
@broadcaster.broadcast(listener, publisher, event, args)
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
18
|
def name(object)
|
19
|
-
id_method = %w(id uuid key object_id).find { |
|
19
|
+
id_method = %w(id uuid key object_id).find { |id_method| object.respond_to?(id_method) }
|
20
20
|
id = object.send(id_method)
|
21
21
|
class_name = object.class == Class ? object.name : object.class.name
|
22
22
|
"#{class_name}##{id}"
|
data/lib/wisper/configuration.rb
CHANGED
@@ -8,14 +8,19 @@ module Wisper
|
|
8
8
|
@broadcasters = Broadcasters.new
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
# registers a broadcaster, referenced by key
|
12
|
+
#
|
13
|
+
# @param key [String, #to_s] an arbitrary key
|
14
|
+
# @param broadcaster [#broadcast] a broadcaster
|
15
|
+
def broadcaster(key, broadcaster)
|
16
|
+
@broadcasters[key] = broadcaster
|
17
|
+
self
|
13
18
|
end
|
14
19
|
|
15
20
|
class Broadcasters
|
16
21
|
extend Forwardable
|
17
22
|
|
18
|
-
def_delegators :@data, :[], :[]=, :empty?, :include?, :clear
|
23
|
+
def_delegators :@data, :fetch, :[], :[]=, :empty?, :include?, :clear
|
19
24
|
|
20
25
|
def initialize
|
21
26
|
@data = {}
|
@@ -1,7 +1,9 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
|
3
1
|
# Handles global subscriptions
|
4
2
|
|
3
|
+
# @api private
|
4
|
+
|
5
|
+
require 'singleton'
|
6
|
+
|
5
7
|
module Wisper
|
6
8
|
class GlobalListeners
|
7
9
|
include Singleton
|
@@ -50,11 +52,6 @@ module Wisper
|
|
50
52
|
instance.clear
|
51
53
|
end
|
52
54
|
|
53
|
-
def self.add_listener(listener, options = {}) # deprecated
|
54
|
-
warn "[DEPRECATION] use `subscribe` instead of `add_listener`"
|
55
|
-
subscribe(listener, options)
|
56
|
-
end
|
57
|
-
|
58
55
|
private
|
59
56
|
|
60
57
|
def with_mutex
|
data/lib/wisper/publisher.rb
CHANGED
@@ -4,42 +4,58 @@ module Wisper
|
|
4
4
|
registrations.map(&:listener).freeze
|
5
5
|
end
|
6
6
|
|
7
|
+
# subscribe a listener
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# my_publisher.subscribe(MyListener.new)
|
11
|
+
#
|
12
|
+
# @return [self]
|
7
13
|
def subscribe(listener, options = {})
|
8
14
|
local_registrations << ObjectRegistration.new(listener, options)
|
9
15
|
self
|
10
16
|
end
|
11
17
|
|
18
|
+
# subscribe a block
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# my_publisher.on(:order_created) { |args| ... }
|
22
|
+
#
|
23
|
+
# @return [self]
|
12
24
|
def on(*events, &block)
|
13
25
|
raise ArgumentError, 'must give at least one event' if events.empty?
|
14
26
|
local_registrations << BlockRegistration.new(block, on: events)
|
15
27
|
self
|
16
28
|
end
|
17
29
|
|
18
|
-
|
19
|
-
|
20
|
-
|
30
|
+
# broadcasts an event
|
31
|
+
#
|
32
|
+
# @example
|
33
|
+
# def call
|
34
|
+
# # ...
|
35
|
+
# broadcast(:finished, self)
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# @return [self]
|
39
|
+
def broadcast(event, *args)
|
40
|
+
registrations.each do | registration |
|
41
|
+
registration.broadcast(clean_event(event), self, *args)
|
42
|
+
end
|
21
43
|
self
|
22
44
|
end
|
23
45
|
|
24
|
-
|
25
|
-
warn "[DEPRECATED] use `subscribe` instead of `add_listener`"
|
26
|
-
subscribe(listener, options)
|
27
|
-
end
|
46
|
+
alias :publish :broadcast
|
28
47
|
|
29
|
-
|
30
|
-
warn '[DEPRECATED] use `on` instead of `respond_to`'
|
31
|
-
on(*events, &block)
|
32
|
-
end
|
48
|
+
private :broadcast, :publish
|
33
49
|
|
34
50
|
module ClassMethods
|
51
|
+
# subscribe a listener
|
52
|
+
#
|
53
|
+
# @example
|
54
|
+
# MyPublisher.subscribe(MyListener.new)
|
55
|
+
#
|
35
56
|
def subscribe(listener, options = {})
|
36
57
|
GlobalListeners.subscribe(listener, options.merge(:scope => self))
|
37
58
|
end
|
38
|
-
|
39
|
-
def add_listener(listener, options = {})
|
40
|
-
warn "[DEPRECATED] use `subscribe` instead of `add_listener`"
|
41
|
-
subscribe(listener, options)
|
42
|
-
end
|
43
59
|
end
|
44
60
|
|
45
61
|
private
|
@@ -60,15 +76,6 @@ module Wisper
|
|
60
76
|
local_registrations + global_registrations + temporary_registrations
|
61
77
|
end
|
62
78
|
|
63
|
-
def broadcast(event, *args)
|
64
|
-
registrations.each do | registration |
|
65
|
-
registration.broadcast(clean_event(event), self, *args)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
alias :publish :broadcast
|
70
|
-
alias :announce :broadcast
|
71
|
-
|
72
79
|
def clean_event(event)
|
73
80
|
event.to_s.gsub('-', '_')
|
74
81
|
end
|
@@ -78,4 +85,3 @@ module Wisper
|
|
78
85
|
end
|
79
86
|
end
|
80
87
|
end
|
81
|
-
|
@@ -1,16 +1,42 @@
|
|
1
|
+
# @api private
|
2
|
+
|
1
3
|
module Wisper
|
2
4
|
class Registration
|
3
5
|
attr_reader :on, :listener
|
4
6
|
|
7
|
+
ALL = Object.new.freeze
|
8
|
+
|
5
9
|
def initialize(listener, options)
|
6
|
-
@listener
|
7
|
-
@on
|
10
|
+
@listener = listener
|
11
|
+
@on = stringify(options.fetch(:on, ALL))
|
8
12
|
end
|
9
13
|
|
10
14
|
private
|
11
15
|
|
12
16
|
def should_broadcast?(event)
|
13
|
-
on
|
17
|
+
return true if on == ALL
|
18
|
+
|
19
|
+
case on.class.name
|
20
|
+
when 'String'
|
21
|
+
event == on
|
22
|
+
when 'Array'
|
23
|
+
on.include?(event)
|
24
|
+
when 'Regexp'
|
25
|
+
!!on.match(event)
|
26
|
+
else
|
27
|
+
raise ArgumentError, "#{on.class} not supported for `on` argument"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def stringify(on)
|
32
|
+
case on.class.name
|
33
|
+
when 'Symbol'
|
34
|
+
on.to_s
|
35
|
+
when 'Array'
|
36
|
+
on.map(&:to_s)
|
37
|
+
else
|
38
|
+
on
|
39
|
+
end
|
14
40
|
end
|
15
41
|
end
|
16
42
|
end
|
data/lib/wisper/version.rb
CHANGED
@@ -79,13 +79,4 @@ describe Wisper::GlobalListeners do
|
|
79
79
|
Wisper::GlobalListeners.clear
|
80
80
|
expect(Wisper::GlobalListeners.listeners).to be_empty
|
81
81
|
end
|
82
|
-
|
83
|
-
describe 'backwards compatibility' do
|
84
|
-
it '.add_listener is aliased to .add' do
|
85
|
-
silence_warnings do
|
86
|
-
expect(Wisper::GlobalListeners).to receive(:subscribe)
|
87
|
-
Wisper::GlobalListeners.add_listener(global_listener)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
82
|
end
|
@@ -53,10 +53,10 @@ describe Wisper::TemporaryListeners do
|
|
53
53
|
|
54
54
|
expect(Wisper::TemporaryListeners.registrations.size).to eql 0
|
55
55
|
end
|
56
|
-
end
|
57
56
|
|
58
|
-
|
59
|
-
|
57
|
+
it 'returns self so methods can be chained' do
|
58
|
+
expect(Wisper::TemporaryListeners.subscribe {}).to be_an_instance_of(Wisper::TemporaryListeners)
|
59
|
+
end
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -17,7 +17,7 @@ module Wisper
|
|
17
17
|
|
18
18
|
describe 'unit tests:' do
|
19
19
|
let(:publisher) { classy_double('Publisher', id: 1) }
|
20
|
-
let(:
|
20
|
+
let(:listener) { classy_double('Listener', id: 2) }
|
21
21
|
let(:logger) { double('Logger').as_null_object }
|
22
22
|
let(:broadcaster) { double('Broadcaster').as_null_object }
|
23
23
|
let(:event) { 'thing_created' }
|
@@ -29,13 +29,13 @@ module Wisper
|
|
29
29
|
let(:args) { [] }
|
30
30
|
|
31
31
|
it 'logs publised event' do
|
32
|
-
expect(logger).to receive(:info).with('[WISPER] Publisher#1 published thing_created to
|
33
|
-
subject.broadcast(
|
32
|
+
expect(logger).to receive(:info).with('[WISPER] Publisher#1 published thing_created to Listener#2 with no arguments')
|
33
|
+
subject.broadcast(listener, publisher, event, args)
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'delgates broadcast to given broadcaster' do
|
37
|
-
expect(broadcaster).to receive(:broadcast).with(
|
38
|
-
subject.broadcast(
|
37
|
+
expect(broadcaster).to receive(:broadcast).with(listener, publisher, event, args)
|
38
|
+
subject.broadcast(listener, publisher, event, args)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -43,13 +43,13 @@ module Wisper
|
|
43
43
|
let(:args) { [arg_double(id: 3), arg_double(id: 4)] }
|
44
44
|
|
45
45
|
it 'logs published event and arguments' do
|
46
|
-
expect(logger).to receive(:info).with('[WISPER] Publisher#1 published thing_created to
|
47
|
-
subject.broadcast(
|
46
|
+
expect(logger).to receive(:info).with('[WISPER] Publisher#1 published thing_created to Listener#2 with Argument#3, Argument#4')
|
47
|
+
subject.broadcast(listener, publisher, event, args)
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'delgates broadcast to given broadcaster' do
|
51
|
-
expect(broadcaster).to receive(:broadcast).with(
|
52
|
-
subject.broadcast(
|
51
|
+
expect(broadcaster).to receive(:broadcast).with(listener, publisher, event, args)
|
52
|
+
subject.broadcast(listener, publisher, event, args)
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -1,25 +1,25 @@
|
|
1
1
|
module Wisper
|
2
2
|
module Broadcasters
|
3
3
|
describe SendBroadcaster do
|
4
|
-
let(:
|
4
|
+
let(:listener) { double('listener') }
|
5
5
|
let(:event) { 'thing_created' }
|
6
6
|
|
7
7
|
describe '#broadcast' do
|
8
8
|
context 'without arguments' do
|
9
9
|
let(:args) { [] }
|
10
10
|
|
11
|
-
it 'sends event to
|
12
|
-
expect(
|
13
|
-
subject.broadcast(
|
11
|
+
it 'sends event to listener without any arguments' do
|
12
|
+
expect(listener).to receive(event).with(no_args())
|
13
|
+
subject.broadcast(listener, anything, event, args)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
context 'with arguments' do
|
18
18
|
let(:args) { [1,2,3] }
|
19
19
|
|
20
|
-
it 'sends event to
|
21
|
-
expect(
|
22
|
-
subject.broadcast(
|
20
|
+
it 'sends event to listener with arguments' do
|
21
|
+
expect(listener).to receive(event).with(*args)
|
22
|
+
subject.broadcast(listener, anything, event, args)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -8,10 +8,16 @@ module Wisper
|
|
8
8
|
expect(subject.broadcasters).to be_empty
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
describe '#broadcaster' do
|
12
|
+
it 'adds given broadcaster' do
|
13
|
+
subject.broadcaster(key, broadcaster)
|
14
|
+
expect(subject.broadcasters).to include key
|
15
|
+
expect(subject.broadcasters[key]).to eql broadcaster
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns the configuration' do
|
19
|
+
expect(subject.broadcaster(key, broadcaster)).to eq subject
|
20
|
+
end
|
15
21
|
end
|
16
22
|
end
|
17
23
|
end
|
@@ -14,32 +14,67 @@ describe Wisper::Publisher do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
describe ':on argument' do
|
17
|
-
|
18
|
-
|
17
|
+
before do
|
18
|
+
allow(listener).to receive(:something_a_happened)
|
19
|
+
allow(listener).to receive(:and_this)
|
19
20
|
allow(listener).to receive(:so_did_this)
|
20
|
-
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
+
describe 'given a string' do
|
24
|
+
it 'subscribes listener to an event' do
|
25
|
+
expect(listener).to receive(:this_happened)
|
26
|
+
expect(listener).not_to receive(:so_did_this)
|
23
27
|
|
24
|
-
|
28
|
+
publisher.subscribe(listener, on: 'this_happened')
|
25
29
|
|
26
|
-
|
27
|
-
|
30
|
+
publisher.send(:broadcast, 'this_happened')
|
31
|
+
publisher.send(:broadcast, 'so_did_this')
|
32
|
+
end
|
28
33
|
end
|
29
34
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
expect(listener).not_to receive(:so_did_this)
|
35
|
+
describe 'given a symbol' do
|
36
|
+
it 'subscribes listener to an event' do
|
37
|
+
expect(listener).to receive(:this_happened)
|
38
|
+
expect(listener).not_to receive(:so_did_this)
|
35
39
|
|
36
|
-
|
40
|
+
publisher.subscribe(listener, on: :this_happened)
|
37
41
|
|
38
|
-
|
42
|
+
publisher.send(:broadcast, 'this_happened')
|
43
|
+
publisher.send(:broadcast, 'so_did_this')
|
44
|
+
end
|
45
|
+
end
|
39
46
|
|
40
|
-
|
41
|
-
|
42
|
-
|
47
|
+
describe 'given an array' do
|
48
|
+
it 'subscribes listener to events' do
|
49
|
+
expect(listener).to receive(:this_happened)
|
50
|
+
expect(listener).to receive(:and_this)
|
51
|
+
expect(listener).not_to receive(:so_did_this)
|
52
|
+
|
53
|
+
publisher.subscribe(listener, on: ['this_happened', 'and_this'])
|
54
|
+
|
55
|
+
publisher.send(:broadcast, 'this_happened')
|
56
|
+
publisher.send(:broadcast, 'so_did_this')
|
57
|
+
publisher.send(:broadcast, 'and_this')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe 'given a regex' do
|
62
|
+
it 'subscribes listener to matching events' do
|
63
|
+
expect(listener).to receive(:something_a_happened)
|
64
|
+
expect(listener).not_to receive(:so_did_this)
|
65
|
+
|
66
|
+
publisher.subscribe(listener, on: /something_._happened/)
|
67
|
+
|
68
|
+
publisher.send(:broadcast, 'something_a_happened')
|
69
|
+
publisher.send(:broadcast, 'so_did_this')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'given an unsupported argument' do
|
74
|
+
it 'raises an error' do
|
75
|
+
publisher.subscribe(listener, on: Object.new)
|
76
|
+
expect { publisher.send(:broadcast, 'something_a_happened') }.to raise_error(ArgumentError)
|
77
|
+
end
|
43
78
|
end
|
44
79
|
end
|
45
80
|
|
@@ -74,8 +109,6 @@ describe Wisper::Publisher do
|
|
74
109
|
end
|
75
110
|
end
|
76
111
|
|
77
|
-
# NOTE: these are not realistic use cases, since you would only ever use
|
78
|
-
# `scope` when globally subscribing.
|
79
112
|
describe ':scope argument' do
|
80
113
|
let(:listener_1) { double('Listener') }
|
81
114
|
let(:listener_2) { double('Listener') }
|
@@ -181,28 +214,8 @@ describe Wisper::Publisher do
|
|
181
214
|
end
|
182
215
|
|
183
216
|
describe '.on' do
|
184
|
-
|
185
|
-
|
186
|
-
it 'subscribes block to given event' do
|
187
|
-
expect(insider).to receive(:yes).once
|
188
|
-
|
189
|
-
publisher.on(:something_happened) do
|
190
|
-
insider.yes
|
191
|
-
end
|
192
|
-
|
193
|
-
publisher.send(:broadcast, :something_happened)
|
194
|
-
publisher.send(:broadcast, :and_so_did_this)
|
195
|
-
end
|
196
|
-
|
197
|
-
it 'subscribes block to given events' do
|
198
|
-
expect(insider).to receive(:yes).twice
|
199
|
-
|
200
|
-
publisher.on(:something_happened, :and_so_did_this) do
|
201
|
-
insider.yes
|
202
|
-
end
|
203
|
-
|
204
|
-
publisher.send(:broadcast, :something_happened)
|
205
|
-
publisher.send(:broadcast, :and_so_did_this)
|
217
|
+
it 'returns publisher so methods can be chained' do
|
218
|
+
expect(publisher.on('this_thing_happened') {}).to eq publisher
|
206
219
|
end
|
207
220
|
|
208
221
|
it 'raise an error if no events given' do
|
@@ -214,82 +227,8 @@ describe Wisper::Publisher do
|
|
214
227
|
end
|
215
228
|
end
|
216
229
|
|
217
|
-
# @deprecated
|
218
|
-
describe '.add_listener' do
|
219
|
-
it 'is aliased to .subscribe' do
|
220
|
-
expect(publisher).to receive(:subscribe)
|
221
|
-
silence_warnings do
|
222
|
-
publisher.add_listener(listener)
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
# @deprecated
|
228
|
-
describe '.add_block_listener' do
|
229
|
-
let(:insider) { double('insider') }
|
230
|
-
|
231
|
-
it 'subscribes given block to all events' do
|
232
|
-
expect(insider).to receive(:it_happened).twice
|
233
|
-
|
234
|
-
silence_warnings do
|
235
|
-
publisher.add_block_listener do
|
236
|
-
insider.it_happened
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
publisher.send(:broadcast, 'something_happened')
|
241
|
-
publisher.send(:broadcast, 'and_so_did_this')
|
242
|
-
end
|
243
|
-
|
244
|
-
describe ':on argument' do
|
245
|
-
it '.add_block_listener subscribes block to an event' do
|
246
|
-
expect(insider).not_to receive(:it_happened).once
|
247
|
-
|
248
|
-
silence_warnings do
|
249
|
-
publisher.add_block_listener(:on => 'something_happened') do
|
250
|
-
insider.it_happened
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
publisher.send(:broadcast, 'something_happened')
|
255
|
-
publisher.send(:broadcast, 'and_so_did_this')
|
256
|
-
end
|
257
|
-
|
258
|
-
it '.add_block_listener subscribes block to all listed events' do
|
259
|
-
expect(insider).to receive(:it_happened).twice
|
260
|
-
|
261
|
-
silence_warnings do
|
262
|
-
publisher.add_block_listener(
|
263
|
-
:on => ['something_happened', 'and_so_did_this']) do
|
264
|
-
insider.it_happened
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
publisher.send(:broadcast, 'something_happened')
|
269
|
-
publisher.send(:broadcast, 'and_so_did_this')
|
270
|
-
publisher.send(:broadcast, 'but_not_this')
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
it 'returns publisher so methods can be chained' do
|
275
|
-
silence_warnings do
|
276
|
-
expect(publisher.add_block_listener(:on => 'this_thing_happened') do
|
277
|
-
end).to eq publisher
|
278
|
-
end
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
# @deprecated
|
283
|
-
describe '.respond_to (alternative block syntax)' do
|
284
|
-
it 'delegates to .on' do
|
285
|
-
expect(publisher).to receive(:on).with(:foobar)
|
286
|
-
silence_warnings do
|
287
|
-
publisher.respond_to(:foobar) { }
|
288
|
-
end
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
230
|
describe '.broadcast' do
|
231
|
+
|
293
232
|
it 'does not publish events which cannot be responded to' do
|
294
233
|
expect(listener).not_to receive(:so_did_this)
|
295
234
|
allow(listener).to receive(:respond_to?).and_return(false)
|
@@ -318,6 +257,18 @@ describe Wisper::Publisher do
|
|
318
257
|
publisher.send(:broadcast, 'this-happened')
|
319
258
|
end
|
320
259
|
end
|
260
|
+
|
261
|
+
it 'returns publisher' do
|
262
|
+
expect(publisher.send(:broadcast, :foo)).to eq publisher
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'is not public' do
|
266
|
+
expect(publisher).not_to respond_to(:broadcast)
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'is alised as .publish' do
|
270
|
+
expect(publisher.method(:broadcast)).to eq publisher.method(:publish)
|
271
|
+
end
|
321
272
|
end
|
322
273
|
|
323
274
|
describe '.listeners' do
|
@@ -344,13 +295,4 @@ describe Wisper::Publisher do
|
|
344
295
|
publisher_klass_2.new.send(:broadcast, 'it_happened')
|
345
296
|
end
|
346
297
|
end
|
347
|
-
|
348
|
-
describe '#add_listener' do # deprecated
|
349
|
-
it 'is aliased to #subscribe' do
|
350
|
-
expect(publisher).to receive(:subscribe)
|
351
|
-
silence_warnings do
|
352
|
-
publisher.add_listener(listener)
|
353
|
-
end
|
354
|
-
end
|
355
|
-
end
|
356
298
|
end
|
data/spec/lib/wisper_spec.rb
CHANGED
@@ -1,46 +1,4 @@
|
|
1
1
|
describe Wisper do
|
2
|
-
before do
|
3
|
-
# assign the stderr to a new StringIO to test errors
|
4
|
-
@orig_stderr, $stderr = $stderr, StringIO.new
|
5
|
-
end
|
6
|
-
|
7
|
-
after do
|
8
|
-
# reassign the stderr to the original <IO:<STDERR>> instead of StringIO
|
9
|
-
# used for testing
|
10
|
-
$stderr = @orig_stderr
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'includes Wisper::Publisher for backwards compatibility' do
|
14
|
-
publisher_class = Class.new { include Wisper }
|
15
|
-
expect(publisher_class.ancestors).to include Wisper::Publisher
|
16
|
-
|
17
|
-
$stderr.rewind
|
18
|
-
expect($stderr.gets.chomp).to include 'DEPRECATION'
|
19
|
-
end
|
20
|
-
|
21
|
-
# NOTE .with_listeners is deprecated
|
22
|
-
it '.with_listeners subscribes listeners to all broadcast events for the duration of block' do
|
23
|
-
publisher = publisher_class.new
|
24
|
-
listener = double('listener')
|
25
|
-
|
26
|
-
Wisper.with_listeners(listener) do
|
27
|
-
publisher.send(:broadcast, 'im_here')
|
28
|
-
end
|
29
|
-
|
30
|
-
$stderr.rewind
|
31
|
-
expect($stderr.string.chomp).to include 'DEPRECATION'
|
32
|
-
end
|
33
|
-
|
34
|
-
# NOTE .add_listener is deprecated
|
35
|
-
it '.add_listener adds a global listener' do
|
36
|
-
listener = double('listener')
|
37
|
-
|
38
|
-
Wisper.add_listener(listener)
|
39
|
-
|
40
|
-
$stderr.rewind
|
41
|
-
expect($stderr.string.chomp).to include 'DEPRECATION'
|
42
|
-
end
|
43
|
-
|
44
2
|
describe '.subscribe' do
|
45
3
|
context 'given block' do
|
46
4
|
it 'subscribes listeners to all events for duration of the block' do
|
data/wisper.gemspec
CHANGED
@@ -13,6 +13,13 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.homepage = "https://github.com/krisleech/wisper"
|
14
14
|
gem.license = "MIT"
|
15
15
|
|
16
|
+
signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
|
17
|
+
|
18
|
+
if File.exist?(signing_key)
|
19
|
+
gem.signing_key = signing_key
|
20
|
+
gem.cert_chain = ['gem-public_cert.pem']
|
21
|
+
end
|
22
|
+
|
16
23
|
gem.files = `git ls-files`.split($/)
|
17
24
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
25
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
metadata
CHANGED
@@ -1,14 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wisper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kris Leech
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRMwEQYDVQQDDAprcmlz
|
14
|
+
LmxlZWNoMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
|
15
|
+
b20wHhcNMTQxMTA1MTEwMzQ4WhcNMTUxMTA1MTEwMzQ4WjBBMRMwEQYDVQQDDApr
|
16
|
+
cmlzLmxlZWNoMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
|
17
|
+
FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtW0/UtrFK/tSm
|
18
|
+
uq5HnCUkZAQjnSaZ/h1Tby9s30CDJjDUdizPRdLQCplLDAMHFsAfTyD0Mc+Ez8o9
|
19
|
+
CdTh8EZ4TSf+nokL+SUprpdR6qm6OWU03Ntd+bDCP0+rdqCX82g3N3mnvjR9aD3a
|
20
|
+
+hd9Fhp0WuEyqTNjQ7IlopeUPDW7eYfSwI4bjfRHxsDR1GuZ3j0npxCAgAIN41WH
|
21
|
+
MSTTZhdo0vKEiKZEtMMnT6w6fG/c3XIhVVPGnqy5+IZqBL0SYC+WJL3vC6yUBgqB
|
22
|
+
nrpA/q+b3M69W+q+TkGv0qOnrxln0O7J2pykjoGIxUhhRkiGEldEhy9dxQWubffr
|
23
|
+
hVJ4F0wLAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
24
|
+
BBSzq+x8mwj0ldvNkvjOl44OJG354jAfBgNVHREEGDAWgRRrcmlzLmxlZWNoQGdt
|
25
|
+
YWlsLmNvbTAfBgNVHRIEGDAWgRRrcmlzLmxlZWNoQGdtYWlsLmNvbTANBgkqhkiG
|
26
|
+
9w0BAQUFAAOCAQEAF5M2Md3DcNCrQrDRDLaIzHaMM+RTgfbpgmZ6tU0iEowES18g
|
27
|
+
QWQgrAbFuvQRPETJ2gbL5AC35fEqN80nU+3GhgW/bDYhII5D3PGLMorxhFw1JYLI
|
28
|
+
0Fd7MCE0sImc2rPybYUdpZ6TxvqgPKp+8CzM8vBUrdYd+dSHXit1piViWBcZcJb+
|
29
|
+
EL5Ze4IodjkCPAeHvu2MQieieViLyfB4eG1syvfkxvAXCjFHeQoIFP16vVtcljdF
|
30
|
+
k5cHH/4SGeMuGrSLRsqVvltxVV3AbQAfH8WUos2brjYHsoH5tVPrJ7UcFhzP95oU
|
31
|
+
pEfFMW42smiNTOXpzG6JoIpA11szEHFT5ZS+UQ==
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
date: 2014-12-17 00:00:00.000000000 Z
|
12
34
|
dependencies: []
|
13
35
|
description: pub/sub for Ruby objects
|
14
36
|
email:
|
@@ -19,13 +41,14 @@ extra_rdoc_files: []
|
|
19
41
|
files:
|
20
42
|
- ".gitignore"
|
21
43
|
- ".rspec"
|
22
|
-
- ".ruby-version"
|
23
44
|
- ".travis.yml"
|
24
45
|
- CHANGELOG.md
|
46
|
+
- CONTRIBUTING.md
|
25
47
|
- Gemfile
|
26
48
|
- Guardfile
|
27
49
|
- README.md
|
28
50
|
- Rakefile
|
51
|
+
- gem-public_cert.pem
|
29
52
|
- lib/wisper.rb
|
30
53
|
- lib/wisper/broadcasters/logger_broadcaster.rb
|
31
54
|
- lib/wisper/broadcasters/send_broadcaster.rb
|
@@ -35,11 +58,9 @@ files:
|
|
35
58
|
- lib/wisper/registration/block.rb
|
36
59
|
- lib/wisper/registration/object.rb
|
37
60
|
- lib/wisper/registration/registration.rb
|
38
|
-
- lib/wisper/rspec/matchers.rb
|
39
|
-
- lib/wisper/rspec/stub_wisper_publisher.rb
|
40
61
|
- lib/wisper/temporary_listeners.rb
|
41
62
|
- lib/wisper/version.rb
|
42
|
-
- spec/lib/
|
63
|
+
- spec/lib/global_listeners_spec.rb
|
43
64
|
- spec/lib/integration_spec.rb
|
44
65
|
- spec/lib/simple_example_spec.rb
|
45
66
|
- spec/lib/temporary_global_listeners_spec.rb
|
@@ -48,8 +69,6 @@ files:
|
|
48
69
|
- spec/lib/wisper/configuration_spec.rb
|
49
70
|
- spec/lib/wisper/publisher_spec.rb
|
50
71
|
- spec/lib/wisper/registrations/object_spec.rb
|
51
|
-
- spec/lib/wisper/rspec/matchers_spec.rb
|
52
|
-
- spec/lib/wisper/rspec/stub_wisper_publisher_spec.rb
|
53
72
|
- spec/lib/wisper_spec.rb
|
54
73
|
- spec/spec_helper.rb
|
55
74
|
- wisper.gemspec
|
@@ -68,17 +87,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
68
87
|
version: '0'
|
69
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
89
|
requirements:
|
71
|
-
- - "
|
90
|
+
- - ">"
|
72
91
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
92
|
+
version: 1.3.1
|
74
93
|
requirements: []
|
75
94
|
rubyforge_project:
|
76
|
-
rubygems_version: 2.
|
95
|
+
rubygems_version: 2.2.2
|
77
96
|
signing_key:
|
78
97
|
specification_version: 4
|
79
98
|
summary: pub/sub for Ruby objects
|
80
99
|
test_files:
|
81
|
-
- spec/lib/
|
100
|
+
- spec/lib/global_listeners_spec.rb
|
82
101
|
- spec/lib/integration_spec.rb
|
83
102
|
- spec/lib/simple_example_spec.rb
|
84
103
|
- spec/lib/temporary_global_listeners_spec.rb
|
@@ -87,7 +106,6 @@ test_files:
|
|
87
106
|
- spec/lib/wisper/configuration_spec.rb
|
88
107
|
- spec/lib/wisper/publisher_spec.rb
|
89
108
|
- spec/lib/wisper/registrations/object_spec.rb
|
90
|
-
- spec/lib/wisper/rspec/matchers_spec.rb
|
91
|
-
- spec/lib/wisper/rspec/stub_wisper_publisher_spec.rb
|
92
109
|
- spec/lib/wisper_spec.rb
|
93
110
|
- spec/spec_helper.rb
|
111
|
+
has_rdoc:
|
metadata.gz.sig
ADDED
Binary file
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.2.2
|
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'rspec/expectations'
|
2
|
-
|
3
|
-
module Wisper
|
4
|
-
module RSpec
|
5
|
-
class EventRecorder
|
6
|
-
def initialize
|
7
|
-
@broadcast_events = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def respond_to?(method_name)
|
11
|
-
true
|
12
|
-
end
|
13
|
-
|
14
|
-
def method_missing(method_name, *args, &block)
|
15
|
-
@broadcast_events << method_name.to_s
|
16
|
-
end
|
17
|
-
|
18
|
-
def broadcast?(event_name)
|
19
|
-
@broadcast_events.include?(event_name.to_s)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
module BroadcastMatcher
|
24
|
-
class Matcher
|
25
|
-
def initialize(event)
|
26
|
-
@event = event
|
27
|
-
end
|
28
|
-
|
29
|
-
def supports_block_expectations?
|
30
|
-
true
|
31
|
-
end
|
32
|
-
|
33
|
-
def matches?(block)
|
34
|
-
event_recorder = EventRecorder.new
|
35
|
-
|
36
|
-
Wisper.subscribe(event_recorder) do
|
37
|
-
block.call
|
38
|
-
end
|
39
|
-
|
40
|
-
event_recorder.broadcast?(@event)
|
41
|
-
end
|
42
|
-
|
43
|
-
def failure_message
|
44
|
-
"expected publisher to broadcast #{@event} event"
|
45
|
-
end
|
46
|
-
|
47
|
-
def failure_message_when_negated
|
48
|
-
"expected publisher not to broadcast #{@event} event"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def broadcast(event)
|
53
|
-
Matcher.new(event)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class TestWisperPublisher
|
2
|
-
include Wisper::Publisher
|
3
|
-
def initialize(*args); end
|
4
|
-
end
|
5
|
-
|
6
|
-
def stub_wisper_publisher(clazz, called_method, event_to_publish, *published_event_args)
|
7
|
-
stub_const(clazz, Class.new(TestWisperPublisher) do
|
8
|
-
define_method(called_method) do |*args|
|
9
|
-
publish(event_to_publish, *published_event_args)
|
10
|
-
end
|
11
|
-
end)
|
12
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'wisper/rspec/matchers'
|
2
|
-
|
3
|
-
RSpec::configure do |config|
|
4
|
-
config.include(Wisper::RSpec::BroadcastMatcher)
|
5
|
-
end
|
6
|
-
|
7
|
-
describe 'broadcast matcher' do
|
8
|
-
it 'passes when publisher broadcasts inside block' do
|
9
|
-
publisher = publisher_class.new
|
10
|
-
expect { publisher.send(:broadcast, :foobar) }.to broadcast(:foobar)
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'passes with not_to when publisher does not broadcast inside block' do
|
14
|
-
publisher = publisher_class.new
|
15
|
-
expect { publisher }.not_to broadcast(:foobar)
|
16
|
-
end
|
17
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'wisper/rspec/stub_wisper_publisher'
|
2
|
-
|
3
|
-
describe '#stub_wisper_publisher' do
|
4
|
-
describe "given a piece of code invoking a publisher" do
|
5
|
-
class CodeThatReactsToEvents
|
6
|
-
def do_something
|
7
|
-
publisher = MyPublisher.new
|
8
|
-
publisher.on(:some_event) do |variable1, variable2|
|
9
|
-
return "Hello with #{variable1} #{variable2}!"
|
10
|
-
end
|
11
|
-
publisher.execute
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context "when stubbing the publisher to emit an event" do
|
16
|
-
before do
|
17
|
-
stub_wisper_publisher("MyPublisher", :execute, :some_event, "foo1", "foo2")
|
18
|
-
end
|
19
|
-
|
20
|
-
it "emits the event" do
|
21
|
-
response = CodeThatReactsToEvents.new.do_something
|
22
|
-
expect(response).to eq "Hello with foo1 foo2!"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|