wisper 2.0.0 → 2.0.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
- SHA1:
3
- metadata.gz: 62cd6c2948137446de8f7f515bcbebd11c14092d
4
- data.tar.gz: dfbc3b2d28c9023edc9f8308a6c406887c20efed
2
+ SHA256:
3
+ metadata.gz: 2890739bfde16edeb614504b6a6ac9f1babe148c3ed3255af7b11d2b68275dc8
4
+ data.tar.gz: f64460470b4778927d19bbab51f5cd190ec2d16df4909340ee09aaa89b8e9636
5
5
  SHA512:
6
- metadata.gz: d82be662081f118b83ce5f01f87a0760be1bbc9d711163fc76ac303db689ba307ec453afb9edfb374fa1b23e92ab6a684a2c3857580d3f6a29195c75c8d6f754
7
- data.tar.gz: 9395fbd3e0d2b925d31dc06682aa573ad66b0f4ee980533b1671e497ce7f2b8b82019840c7f8eb15c7f52b7bdae73934592ae0e5634729b4ad99f2c068bcae3e
6
+ metadata.gz: 82292503201b5402aebb60c3ad433c4f1bfb22858fbd1221ba86225dbb9e597f2ffb97c8b075847a12c5a801fb92d7e84a9485fb8919c39548f80e54c2fdf318
7
+ data.tar.gz: b40625e6e3cf17df8a457f6547ecf5f0d921ff7dc771910462d0a5219d2aba9ab0afcc91787cdb5ccd49d18f48845eda3b95f20ef9bdd4914d1afca5c2f45f4c
Binary file
Binary file
@@ -6,11 +6,10 @@ bundler_args: --without=extras
6
6
  script: rspec spec
7
7
  sudo: false
8
8
  rvm:
9
- - '2.1.10'
10
- - '2.2.6'
11
- - '2.3.3'
12
- - '2.4.0'
13
- - jruby-9.1.6.0
9
+ - 2.6.3
10
+ - 2.5.5
11
+ - 2.4.6
12
+ - jruby-9.2
14
13
  # - rbx-2
15
14
  ### ALLOWED FAILURES ###
16
15
  # see how compatible we are with dev versions, but do not fail the build
@@ -1,10 +1,33 @@
1
1
  ## HEAD (unreleased)
2
2
 
3
- ## 2.0.0 (7th Mar 2017)
3
+ ## 2.0.1 (29th Aug 2019)
4
+
5
+ Authors: David Wilkie, hosseintoussi, Maxim Polunin, Tristan
6
+ Harmer, Bartosz Żurkowski, Kris Leech
4
7
 
5
- Authors: Sergey Mostovoy
8
+ * fix: support nested temporary global listeners
9
+ * docs: add threadsafe notes to README for global and temporary listeners
10
+ * docs: fix spelling mistakes in README
11
+ * fix: safely get signing key in gemspec when HOME is not set
12
+ * adds: add console to aid experiments and REPL driven development
13
+ * adds: Latest Ruby to CI
14
+
15
+ ## 2.0.0 (7th Mar 2017)
6
16
 
7
- * fix: logger raises exception if hash is passed as an argument to a listener
17
+ Authors: Sergey Mostovoy, Andrew Kozin, Kyle Tolle, Martin, Rob Miller, Mike
18
+ Dalto, orthographic-pedant, Drew Ulmer, Mikey Hogarth, Attila Domokos, Josh
19
+ Miltz, Pascal Betz, Vasily Kolesnikov, Julien Letessier, Kris Leech
20
+
21
+ * Fix: logger raises exception if hash is passed as an argument to a listener #133, #136
22
+ * Fix: deprecation warnings #120
23
+ * Doc improvements: #106, #111, #116, #122, #128, #130, #147, #149, #150, #151
24
+ * Adds: Allow configuration of default prefix when using `prefix: true`. #105
25
+ * Adds: Allow unsubscribing of global listeners #118
26
+ * Adds: Helpful error message when passing a block to `#subscribe` of `#on` #125
27
+ * Adds: raise an error message when `#on` is not passed a block #146
28
+ * Adds: Support for JRuby 9.x #148
29
+ * Adds: Support for MRI 2.4.0 #155
30
+ * Refactor specs #126, #131
8
31
 
9
32
  ## 2.0.0.rc1 (17 Dec 2014)
10
33
 
@@ -28,10 +28,6 @@ appropriate as an extension to Wisper.
28
28
 
29
29
  We also have a [Gitter channel](https://gitter.im/krisleech/wisper) if you wish to discuss your ideas.
30
30
 
31
- ## Backlog / Roadmap
32
-
33
- The backlog for Wisper and related gems is on [Waffle](https://waffle.io/krisleech/wisper).
34
-
35
31
  ## Questions
36
32
 
37
33
  Try the [Wiki](https://github.com/krisleech/wisper/wiki) first, the examples
@@ -43,7 +39,7 @@ Feel free to ping me the URL on [Twitter](https://twitter.com/krisleech).
43
39
 
44
40
  ## Pull requests
45
41
 
46
- * Fork the project, create a new branch from `v1` or `master`.
42
+ * Fork the project, create a new branch `master`.
47
43
  * Squash commits which are related.
48
44
  * Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
49
45
  * Documentation only changes should have `[skip ci]` in the commit message
@@ -58,4 +54,4 @@ not backwards compatible.
58
54
  The `v1` branch is a long lived branch and you should
59
55
  branch from this if you wish to fix an issue in version `~> 1.0`.
60
56
 
61
- The `master` branch will target the next version of Wisper.
57
+ Otherwise branch from `master` branch.
data/Gemfile CHANGED
@@ -2,8 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rake', '~> 10.3.0'
6
- gem 'rspec', '~> 3.4.0'
5
+ gem 'rake'
6
+ gem 'rspec'
7
7
  gem 'coveralls', require: false
8
8
 
9
9
  group :extras do
data/README.md CHANGED
@@ -10,10 +10,12 @@
10
10
  * Decouple core business logic from external concerns in Hexagonal style architectures
11
11
  * Use as an alternative to ActiveRecord callbacks and Observers in Rails apps
12
12
  * Connect objects based on context without permanence
13
- * React to events synchronously or asynchronously
13
+ * Publish events synchronously or asynchronously
14
14
 
15
15
  Note: Wisper was originally extracted from a Rails codebase but is not dependant on Rails.
16
16
 
17
+ Please also see the [Wiki](https://github.com/krisleech/wisper/wiki) for more additional information and articles.
18
+
17
19
  ## Installation
18
20
 
19
21
  Add this line to your application's Gemfile:
@@ -74,7 +76,7 @@ class OrderNotifier
74
76
  def cancel_order_successful(order_id)
75
77
  order = Order.find_by_id(order_id)
76
78
 
77
- # notify someone ...
79
+ # notify someone ...
78
80
  end
79
81
  end
80
82
  ```
@@ -118,8 +120,9 @@ cancel_order.subscribe(OrderNotifier.new, async: true)
118
120
  Wisper has various adapters for asynchronous event handling, please refer to
119
121
  [wisper-celluloid](https://github.com/krisleech/wisper-celluloid),
120
122
  [wisper-sidekiq](https://github.com/krisleech/wisper-sidekiq),
121
- [wisper-activejob](https://github.com/krisleech/wisper-activejob), or
122
- [wisper-que](https://github.com/joevandyk/wisper-que).
123
+ [wisper-activejob](https://github.com/krisleech/wisper-activejob),
124
+ [wisper-que](https://github.com/joevandyk/wisper-que) or
125
+ [wisper-resque](https://github.com/bzurkowski/wisper-resque).
123
126
 
124
127
  Depending on the adapter used the listener may need to be a class instead of an object. In this situation, every method corresponding to events should be declared as a class method, too. For example:
125
128
 
@@ -131,7 +134,7 @@ class OrderNotifier
131
134
  def self.cancel_order_successful(order_id)
132
135
  order = Order.find_by_id(order_id)
133
136
 
134
- # notify someone ...
137
+ # notify someone ...
135
138
  end
136
139
  end
137
140
  ```
@@ -191,9 +194,10 @@ This is useful for cross cutting concerns such as recording statistics, indexing
191
194
  Wisper.subscribe(MyListener.new)
192
195
  ```
193
196
 
194
- In a Rails app you might want to add your global listeners in an initalizer.
197
+ In a Rails app you might want to add your global listeners in an initializer.
198
+
199
+ Global listeners are threadsafe. Subscribers will receive events published on all threads.
195
200
 
196
- Global listeners are threadsafe.
197
201
 
198
202
  ### Scoping by publisher class
199
203
 
@@ -231,7 +235,7 @@ listeners.
231
235
 
232
236
  This is useful for capturing events published by objects to which you do not have access in a given context.
233
237
 
234
- Temporary Global Listeners are threadsafe.
238
+ Temporary Global Listeners are threadsafe. Subscribers will receive events published on the same thread.
235
239
 
236
240
  ## Subscribing to selected events
237
241
 
@@ -291,7 +295,7 @@ You could also alias the method within your listener, as such
291
295
 
292
296
  ## Testing
293
297
 
294
- Testing matchers and stubs are in seperate gems.
298
+ Testing matchers and stubs are in separate gems.
295
299
 
296
300
  * [wisper-rspec](https://github.com/krisleech/wisper-rspec)
297
301
  * [wisper-minitest](https://github.com/digitalcuisine/wisper-minitest)
@@ -339,6 +343,7 @@ Please read the [Contributing Guidelines](https://github.com/krisleech/wisper/bl
339
343
 
340
344
  * gem releases are [signed](http://guides.rubygems.org/security/) ([public key](https://github.com/krisleech/wisper/blob/master/gem-public_cert.pem))
341
345
  * commits are GPG signed ([public key](https://pgp.mit.edu/pks/lookup?op=get&search=0x3ABC74851F7CCC88))
346
+ * My [Keybase.io profile](https://keybase.io/krisleech)
342
347
 
343
348
  ## License
344
349
 
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "wisper"
5
+
6
+ require "pry"
7
+ Pry.start
8
+
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
@@ -1,21 +1,20 @@
1
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==
2
+ MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBprcmlz
3
+ LmxlZWNoL0RDPWdtYWlsL0RDPWNvbTAeFw0xOTEwMTYxNDEzNDVaFw0yMDEwMTUx
4
+ NDEzNDVaMCUxIzAhBgNVBAMMGmtyaXMubGVlY2gvREM9Z21haWwvREM9Y29tMIIB
5
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8gg/iZE6RFkl6GjisJJf9wQl
6
+ 5Tog+mrGqtylNpe9QKeyQS1fKLNR3Cqmv6sT3f3GlU8hhG+802MXmlJo7VyENs+s
7
+ HdMy85fBnYwhS/szhTzBqduXw43RAAGqB0VaHAoHdufTZBkmFSXET5c0/jUqQrPL
8
+ Zxsm2i0NV8cVpvrZlQcsW4Kf97DG1ZFNncS0IfCDqnluh21qMSgVAuiKHGoVKCYG
9
+ Igey486VuuJ8j6axwW3ii8HoBOxjF8Ka/rJ/t4sB9Ql/p6RHR4RhxP5xIS9geCpI
10
+ dsPGnCSleTW1EnXGHLdOdJpVmJXueYJEQJ1Rh/rR+9PeqAT3RA0D/dxSGIVtrQID
11
+ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUyupX2gb3
12
+ +isBRwf4/fhgLnh02sYwHwYDVR0RBBgwFoEUa3Jpcy5sZWVjaEBnbWFpbC5jb20w
13
+ HwYDVR0SBBgwFoEUa3Jpcy5sZWVjaEBnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
14
+ ggEBAExirH+Py0Wm8+ZzNnx/oyFXSF7V9FClYhPUXwQ5FmvQG+gXRlonO9IR/HL+
15
+ wGJNFh4B19fpughgQeJKjKJsG2zk2XnSK2yQyyNGdr/9dHXp/TS5sGvX9jFYVeAr
16
+ 0XCWXRBK+IfEqNnbFvPkwZEK62WLnrL50gMs3u2ILmLP5gkO3EoLyezJvIj33CLO
17
+ HX0Plp0VwiSp8+gEELX5wtdrnJ/UjmrY1lg7szukE+jgOJ++1e7Rzr+woBewIWvF
18
+ xn3z1ObkNQCnLZMRmzEcSa40T10/AuuuEv32emAgb50u9vz+s4y2lnE9i4mWW7+X
19
+ 5vdRgX7VnzYPA+Lc39kD+AcGIrQ=
21
20
  -----END CERTIFICATE-----
@@ -4,7 +4,6 @@
4
4
 
5
5
  module Wisper
6
6
  class TemporaryListeners
7
-
8
7
  def self.subscribe(*listeners, &block)
9
8
  new.subscribe(*listeners, &block)
10
9
  end
@@ -13,13 +12,14 @@ module Wisper
13
12
  new.registrations
14
13
  end
15
14
 
16
- def subscribe(*listeners, &block)
17
- options = listeners.last.is_a?(Hash) ? listeners.pop : {}
15
+ def subscribe(*listeners, &_block)
16
+ new_registrations = build_registrations(listeners)
17
+
18
18
  begin
19
- listeners.each { |listener| registrations << ObjectRegistration.new(listener, options) }
19
+ registrations.merge new_registrations
20
20
  yield
21
21
  ensure
22
- clear
22
+ registrations.subtract new_registrations
23
23
  end
24
24
  self
25
25
  end
@@ -30,8 +30,9 @@ module Wisper
30
30
 
31
31
  private
32
32
 
33
- def clear
34
- registrations.clear
33
+ def build_registrations(listeners)
34
+ options = listeners.last.is_a?(Hash) ? listeners.pop : {}
35
+ listeners.map { |listener| ObjectRegistration.new(listener, options) }
35
36
  end
36
37
 
37
38
  def key
@@ -1,3 +1,3 @@
1
1
  module Wisper
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -32,6 +32,42 @@ describe Wisper::TemporaryListeners do
32
32
  publisher.instance_eval { broadcast(:failure) }
33
33
  end
34
34
 
35
+ it 'globally subscribes listeners for duration of nested block' do
36
+
37
+ expect(listener_1).to receive(:success)
38
+ expect(listener_1).to receive(:failure)
39
+
40
+ expect(listener_2).to receive(:success)
41
+ expect(listener_2).to_not receive(:failure)
42
+
43
+ Wisper::TemporaryListeners.subscribe(listener_1) do
44
+ Wisper::TemporaryListeners.subscribe(listener_2) do
45
+ publisher.instance_eval { broadcast(:success) }
46
+ end
47
+ publisher.instance_eval { broadcast(:failure) }
48
+ end
49
+ end
50
+
51
+ it 'clears registrations for the block which exits' do
52
+
53
+ # listener_1 is subscribed twice hence it's supposed to get the message twice
54
+ expect(listener_1).to receive(:success).twice
55
+ expect(listener_1).to receive(:failure)
56
+ expect(listener_1).to_not receive(:ignored)
57
+
58
+ expect(listener_2).to receive(:success)
59
+ expect(listener_2).to_not receive(:failure)
60
+ expect(listener_2).to_not receive(:ignored)
61
+
62
+ Wisper::TemporaryListeners.subscribe(listener_1) do
63
+ Wisper::TemporaryListeners.subscribe(listener_1, listener_2) do
64
+ publisher.instance_eval { broadcast(:success) }
65
+ end
66
+ publisher.instance_eval { broadcast(:failure) }
67
+ end
68
+ publisher.instance_eval { broadcast(:ignored) }
69
+ end
70
+
35
71
  it 'is thread safe' do
36
72
  num_threads = 20
37
73
  (1..num_threads).to_a.map do
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.homepage = "https://github.com/krisleech/wisper"
18
18
  gem.license = "MIT"
19
19
 
20
- signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
20
+ signing_key = File.expand_path(ENV['HOME'].to_s + '/.ssh/gem-private_key.pem')
21
21
 
22
22
  if File.exist?(signing_key)
23
23
  gem.signing_key = signing_key
metadata CHANGED
@@ -1,14 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wisper
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kris Leech
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain: []
11
- date: 2017-03-07 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBprcmlz
14
+ LmxlZWNoL0RDPWdtYWlsL0RDPWNvbTAeFw0xOTEwMTYxNDEzNDVaFw0yMDEwMTUx
15
+ NDEzNDVaMCUxIzAhBgNVBAMMGmtyaXMubGVlY2gvREM9Z21haWwvREM9Y29tMIIB
16
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8gg/iZE6RFkl6GjisJJf9wQl
17
+ 5Tog+mrGqtylNpe9QKeyQS1fKLNR3Cqmv6sT3f3GlU8hhG+802MXmlJo7VyENs+s
18
+ HdMy85fBnYwhS/szhTzBqduXw43RAAGqB0VaHAoHdufTZBkmFSXET5c0/jUqQrPL
19
+ Zxsm2i0NV8cVpvrZlQcsW4Kf97DG1ZFNncS0IfCDqnluh21qMSgVAuiKHGoVKCYG
20
+ Igey486VuuJ8j6axwW3ii8HoBOxjF8Ka/rJ/t4sB9Ql/p6RHR4RhxP5xIS9geCpI
21
+ dsPGnCSleTW1EnXGHLdOdJpVmJXueYJEQJ1Rh/rR+9PeqAT3RA0D/dxSGIVtrQID
22
+ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUyupX2gb3
23
+ +isBRwf4/fhgLnh02sYwHwYDVR0RBBgwFoEUa3Jpcy5sZWVjaEBnbWFpbC5jb20w
24
+ HwYDVR0SBBgwFoEUa3Jpcy5sZWVjaEBnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
25
+ ggEBAExirH+Py0Wm8+ZzNnx/oyFXSF7V9FClYhPUXwQ5FmvQG+gXRlonO9IR/HL+
26
+ wGJNFh4B19fpughgQeJKjKJsG2zk2XnSK2yQyyNGdr/9dHXp/TS5sGvX9jFYVeAr
27
+ 0XCWXRBK+IfEqNnbFvPkwZEK62WLnrL50gMs3u2ILmLP5gkO3EoLyezJvIj33CLO
28
+ HX0Plp0VwiSp8+gEELX5wtdrnJ/UjmrY1lg7szukE+jgOJ++1e7Rzr+woBewIWvF
29
+ xn3z1ObkNQCnLZMRmzEcSa40T10/AuuuEv32emAgb50u9vz+s4y2lnE9i4mWW7+X
30
+ 5vdRgX7VnzYPA+Lc39kD+AcGIrQ=
31
+ -----END CERTIFICATE-----
32
+ date: 2019-10-16 00:00:00.000000000 Z
12
33
  dependencies: []
13
34
  description: |2
14
35
  A micro library providing objects with Publish-Subscribe capabilities.
@@ -16,7 +37,9 @@ description: |2
16
37
  Check out the Wiki for articles, guides and examples: https://github.com/krisleech/wisper/wiki
17
38
  email:
18
39
  - kris.leech@gmail.com
19
- executables: []
40
+ executables:
41
+ - console
42
+ - setup
20
43
  extensions: []
21
44
  extra_rdoc_files: []
22
45
  files:
@@ -28,6 +51,8 @@ files:
28
51
  - Gemfile
29
52
  - README.md
30
53
  - Rakefile
54
+ - bin/console
55
+ - bin/setup
31
56
  - gem-public_cert.pem
32
57
  - lib/wisper.rb
33
58
  - lib/wisper/broadcasters/logger_broadcaster.rb
@@ -76,8 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
101
  - !ruby/object:Gem::Version
77
102
  version: '0'
78
103
  requirements: []
79
- rubyforge_project:
80
- rubygems_version: 2.5.1
104
+ rubygems_version: 3.0.6
81
105
  signing_key:
82
106
  specification_version: 4
83
107
  summary: A micro library providing objects with Publish-Subscribe capabilities
Binary file