dispatch-rider 0.1.2 → 0.2.0
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 +13 -5
- data/README.md +62 -45
- data/lib/dispatch-rider/publisher.rb +8 -5
- data/lib/dispatch-rider/publisher/base.rb +47 -0
- data/lib/dispatch-rider/publisher/configuration.rb +49 -0
- data/lib/dispatch-rider/publisher/configuration/destination.rb +23 -0
- data/lib/dispatch-rider/publisher/configuration/notification_service.rb +17 -0
- data/lib/dispatch-rider/publisher/configuration_reader.rb +12 -15
- data/lib/dispatch-rider/publisher/configuration_support.rb +20 -0
- data/lib/dispatch-rider/version.rb +1 -1
- metadata +30 -23
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MTkzOGNhMTYyMGFlNzUxMWJjM2MyY2ZmNjRmZTAxZTlkMTk3NDY5Mw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZjQxZDVmOTIxYTc3N2U1NWYwYTQzODQ1MDNjZTk2YjFmMmQ1ZjQ3OQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YjE4NTI3OGYzY2MzMzJiODBkZDFjZGU0MDcwNjZkODM2OGViNzY5MGU1YmM5
|
10
|
+
MTg2Y2RjNTZiYjY4ZGE0N2ViYTYwMDRmYzg5MjYzNTUxODY3MTUyYTg0MDEz
|
11
|
+
Mjk4ZDA1OGNhY2ZlNTNhODUxNDllNmI1YTUwMWNhNGY0MjIyYjc=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OTg0OGQxMDYyNWMzYTgyMjg0NWQxYWMyNjI5NzY3M2NmODM4OWQyMjU0ZmEw
|
14
|
+
YTg2YTJkMTUxZjUyNGZiZTc1NzJjMjVhMzdmZTBhNjIxY2I1N2U4NDI1NWMy
|
15
|
+
ZDZiZGQ0OTY3MDFiZWY2YzcxMjY5NGZkMmU1M2MxNDdmNDIzYmY=
|
data/README.md
CHANGED
@@ -34,11 +34,12 @@ Setting up a publisher is simple.
|
|
34
34
|
All configuration can be loaded from a hash instead of being done like the examples below.
|
35
35
|
(currently only implemented for the publisher)
|
36
36
|
|
37
|
-
|
37
|
+
#### Global configuration
|
38
|
+
|
39
|
+
You can set the global configuration using either a hash:
|
38
40
|
|
39
41
|
```ruby
|
40
|
-
|
41
|
-
publisher.configure({
|
42
|
+
DispatchRider::Publisher.configure({
|
42
43
|
notification_services: {
|
43
44
|
file_system: {}
|
44
45
|
},
|
@@ -54,6 +55,59 @@ publisher.configure({
|
|
54
55
|
})
|
55
56
|
```
|
56
57
|
|
58
|
+
or a block:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
DispatchRider::Publisher.configure do |config|
|
62
|
+
config.parse({
|
63
|
+
notification_services: {
|
64
|
+
file_system: {}
|
65
|
+
},
|
66
|
+
destinations: {
|
67
|
+
file_foo: {
|
68
|
+
service: :file_system,
|
69
|
+
channel: :foo,
|
70
|
+
options: {
|
71
|
+
path: "test/channel",
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
})
|
76
|
+
end
|
77
|
+
```
|
78
|
+
|
79
|
+
Then anytime you call configure on a new publisher, it will default to global configuration.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
DispatchRider::Publisher.new
|
83
|
+
|
84
|
+
# is the same as
|
85
|
+
|
86
|
+
DispatchRider::Publisher.new(DispatchRider::Publisher.configuration)
|
87
|
+
```
|
88
|
+
|
89
|
+
#### Local configuration
|
90
|
+
Alternatively, you can create your own configuration and load that configuration into your new publisher.
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
config = DispatchRider::Publisher::Configuration.new({
|
94
|
+
notification_services: {
|
95
|
+
file_system: {}
|
96
|
+
},
|
97
|
+
destinations: {
|
98
|
+
file_foo: {
|
99
|
+
service: :file_system,
|
100
|
+
channel: :foo,
|
101
|
+
options: {
|
102
|
+
path: "test/channel",
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}
|
106
|
+
})
|
107
|
+
|
108
|
+
DispatchRider::Publisher.new(config)
|
109
|
+
```
|
110
|
+
|
57
111
|
You can load this configuration hash from a YAML file or something, whatever works
|
58
112
|
well for your environment.
|
59
113
|
|
@@ -114,54 +168,17 @@ Sample Rails publisher:
|
|
114
168
|
|
115
169
|
```ruby
|
116
170
|
# app/publishers/news_update
|
117
|
-
class NewsPublisher
|
118
|
-
@publisher = DispatchRider::Publisher.new
|
119
|
-
|
120
|
-
amazon_config = YAML.load_file("#{Rails.root}/config/amazon.yml")
|
121
|
-
|
122
|
-
@publisher.register_notification_service(:aws_sns)
|
123
|
-
@publisher.register_destination(:sns_message_queue, :aws_sns, :dev_channel, {
|
124
|
-
:account => amazon_config[:account],
|
125
|
-
:region => amazon_config[:region],
|
126
|
-
:topic => "news-updates-#{Rails.env}"
|
127
|
-
})
|
128
|
-
|
129
|
-
@destinations = [:sns_message_queue]
|
171
|
+
class NewsPublisher < DispatchRider::Publisher::Base
|
130
172
|
|
131
|
-
|
132
|
-
|
133
|
-
attr_accessor :destinations
|
134
|
-
end
|
135
|
-
|
136
|
-
delegate :publisher, :destinations, :to => :"self.class"
|
173
|
+
destinations :sns_message_queue
|
174
|
+
subject "read_news"
|
137
175
|
|
138
|
-
def
|
139
|
-
|
176
|
+
def self.publish(news)
|
177
|
+
publish({"headlines" => news.headlines})
|
140
178
|
end
|
141
179
|
|
142
|
-
def publish
|
143
|
-
publisher.publish(:destinations => destinations, :message => {
|
144
|
-
:subject => "read_news",
|
145
|
-
:body => {"headlines" => @news.headlines}
|
146
|
-
})
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
# app/models/news
|
151
|
-
class News
|
152
|
-
serialize :headlines, Array
|
153
|
-
|
154
|
-
after_create :publish
|
155
|
-
|
156
|
-
def publish
|
157
|
-
NewsPublisher.new(self).publish
|
158
|
-
end
|
159
180
|
end
|
160
181
|
|
161
|
-
News.create!(:headlines => [
|
162
|
-
"April 29, 2013: Rails 4.0.0.rc1 is released.",
|
163
|
-
"May 14, 2013: Ruby 2.0.0-p195 is released"
|
164
|
-
])
|
165
182
|
```
|
166
183
|
|
167
184
|
### Subscriber
|
@@ -1,18 +1,19 @@
|
|
1
1
|
require "active_support/core_ext/hash/indifferent_access"
|
2
|
+
require_relative "publisher/configuration_support"
|
2
3
|
|
3
4
|
# This class takes care of the publishing side of the messaging system.
|
4
5
|
module DispatchRider
|
5
6
|
class Publisher
|
6
|
-
|
7
|
+
extend ConfigurationSupport
|
7
8
|
|
8
|
-
|
9
|
-
ConfigurationReader.parse(configuration_hash.with_indifferent_access, self)
|
10
|
-
end
|
9
|
+
attr_reader :service_channel_mapper, :notification_service_registrar, :publishing_destination_registrar, :sns_channel_registrar
|
11
10
|
|
12
|
-
def initialize
|
11
|
+
def initialize(configuration = self.class.configuration)
|
13
12
|
@notification_service_registrar = DispatchRider::Registrars::NotificationService.new
|
14
13
|
@publishing_destination_registrar = DispatchRider::Registrars::PublishingDestination.new
|
15
14
|
@service_channel_mapper = ServiceChannelMapper.new(publishing_destination_registrar)
|
15
|
+
|
16
|
+
ConfigurationReader.load_config(configuration, self)
|
16
17
|
end
|
17
18
|
|
18
19
|
def register_notification_service(name, options = {})
|
@@ -70,4 +71,6 @@ module DispatchRider
|
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
74
|
+
require_relative "publisher/configuration"
|
73
75
|
require_relative "publisher/configuration_reader"
|
76
|
+
require_relative "publisher/base"
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module DispatchRider
|
2
|
+
class Publisher::Base
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def subject(subject)
|
7
|
+
@subject = subject
|
8
|
+
end
|
9
|
+
|
10
|
+
def destinations(destinations)
|
11
|
+
@destinations = Array(destinations)
|
12
|
+
end
|
13
|
+
|
14
|
+
def default_publisher
|
15
|
+
@@default_publisher ||= DispatchRider::Publisher.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def publish(*args, &block)
|
19
|
+
raise NotImplementedError
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(publisher = nil)
|
25
|
+
@publisher = publisher
|
26
|
+
end
|
27
|
+
|
28
|
+
def publish(body)
|
29
|
+
publisher.publish(destinations: destinations, message: { subject: subject, body: body })
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def publisher
|
35
|
+
@publisher || self.class.default_publisher
|
36
|
+
end
|
37
|
+
|
38
|
+
def destinations
|
39
|
+
self.class.instance_variable_get(:@destinations)
|
40
|
+
end
|
41
|
+
|
42
|
+
def subject
|
43
|
+
self.class.instance_variable_get(:@subject)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module DispatchRider
|
2
|
+
class Publisher::Configuration
|
3
|
+
|
4
|
+
def initialize(configuration_hash = {})
|
5
|
+
@notification_services = []
|
6
|
+
@destinations = []
|
7
|
+
parse(configuration_hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
def notification_services
|
11
|
+
@notification_services
|
12
|
+
end
|
13
|
+
|
14
|
+
def destinations
|
15
|
+
@destinations
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse(configuration_hash)
|
19
|
+
clear
|
20
|
+
|
21
|
+
configuration_hash = configuration_hash.with_indifferent_access
|
22
|
+
configure_notification_services(configuration_hash[:notification_services] || {})
|
23
|
+
configure_destinations(configuration_hash[:destinations] || {})
|
24
|
+
end
|
25
|
+
|
26
|
+
def clear
|
27
|
+
@notification_services.clear
|
28
|
+
@destinations.clear
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def configure_notification_services(notification_services_hash)
|
34
|
+
notification_services_hash.each do |name, options|
|
35
|
+
@notification_services << NotificationService.new(name, options)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def configure_destinations(destinations_hash)
|
40
|
+
destinations_hash.each do |name, options|
|
41
|
+
@destinations << Destination.new(name, options)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
require_relative "configuration/destination"
|
49
|
+
require_relative "configuration/notification_service"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module DispatchRider
|
2
|
+
class Publisher::Configuration::Destination
|
3
|
+
|
4
|
+
def initialize(name, attributes={})
|
5
|
+
@name = name
|
6
|
+
|
7
|
+
attributes = attributes.with_indifferent_access
|
8
|
+
@service = attributes[:service]
|
9
|
+
@channel = attributes[:channel]
|
10
|
+
@options = attributes[:options]
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :name, :service, :channel, :options
|
14
|
+
|
15
|
+
def ==(other)
|
16
|
+
self.name == other.name &&
|
17
|
+
self.service == other.service &&
|
18
|
+
self.channel == other.channel &&
|
19
|
+
self.options == other.options
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DispatchRider
|
2
|
+
class Publisher::Configuration::NotificationService
|
3
|
+
|
4
|
+
def initialize(name, options)
|
5
|
+
@name = name
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :name, :options
|
10
|
+
|
11
|
+
def ==(other)
|
12
|
+
self.name == other.name &&
|
13
|
+
self.options == other.options
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -1,32 +1,29 @@
|
|
1
1
|
module DispatchRider
|
2
|
-
|
3
2
|
class Publisher
|
4
|
-
|
5
3
|
module ConfigurationReader
|
6
4
|
|
7
5
|
class << self
|
8
|
-
def
|
9
|
-
configure_notification_services(
|
10
|
-
configure_destinations(
|
6
|
+
def load_config(configuration, publisher)
|
7
|
+
configure_notification_services(configuration.notification_services, publisher)
|
8
|
+
configure_destinations(configuration.destinations, publisher)
|
11
9
|
end
|
12
10
|
|
13
11
|
private
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
13
|
+
def configure_notification_services(notification_services, publisher)
|
14
|
+
notification_services.each do |service|
|
15
|
+
publisher.register_notification_service(service.name, service.options)
|
19
16
|
end
|
17
|
+
end
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
19
|
+
def configure_destinations(destinations, publisher)
|
20
|
+
destinations.each do |destination|
|
21
|
+
publisher.register_destination(destination.name, destination.service, destination.channel, destination.options)
|
25
22
|
end
|
23
|
+
end
|
26
24
|
|
27
25
|
end
|
28
|
-
end
|
29
26
|
|
27
|
+
end
|
30
28
|
end
|
31
|
-
|
32
29
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module DispatchRider
|
2
|
+
class Publisher
|
3
|
+
module ConfigurationSupport
|
4
|
+
|
5
|
+
def configuration
|
6
|
+
@configuration ||= Configuration.new
|
7
|
+
end
|
8
|
+
alias_method :config, :configuration
|
9
|
+
|
10
|
+
def configure(configuration_hash = {})
|
11
|
+
if block_given?
|
12
|
+
yield configuration
|
13
|
+
else
|
14
|
+
configuration.parse(configuration_hash)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dispatch-rider
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Suman Mukherjee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - '>='
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - '>='
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activemodel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - '>='
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - '>='
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: daemons
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - '>='
|
45
|
+
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - '>='
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - '>='
|
59
|
+
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - '>='
|
66
|
+
- - ! '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
@@ -72,68 +72,70 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: !binary |-
|
76
|
+
MS44LjQ=
|
76
77
|
type: :development
|
77
78
|
prerelease: false
|
78
79
|
version_requirements: !ruby/object:Gem::Requirement
|
79
80
|
requirements:
|
80
81
|
- - ~>
|
81
82
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
83
|
+
version: !binary |-
|
84
|
+
MS44LjQ=
|
83
85
|
- !ruby/object:Gem::Dependency
|
84
86
|
name: rake
|
85
87
|
requirement: !ruby/object:Gem::Requirement
|
86
88
|
requirements:
|
87
|
-
- - '>='
|
89
|
+
- - ! '>='
|
88
90
|
- !ruby/object:Gem::Version
|
89
91
|
version: '0'
|
90
92
|
type: :development
|
91
93
|
prerelease: false
|
92
94
|
version_requirements: !ruby/object:Gem::Requirement
|
93
95
|
requirements:
|
94
|
-
- - '>='
|
96
|
+
- - ! '>='
|
95
97
|
- !ruby/object:Gem::Version
|
96
98
|
version: '0'
|
97
99
|
- !ruby/object:Gem::Dependency
|
98
100
|
name: travis-lint
|
99
101
|
requirement: !ruby/object:Gem::Requirement
|
100
102
|
requirements:
|
101
|
-
- - '>='
|
103
|
+
- - ! '>='
|
102
104
|
- !ruby/object:Gem::Version
|
103
105
|
version: '0'
|
104
106
|
type: :development
|
105
107
|
prerelease: false
|
106
108
|
version_requirements: !ruby/object:Gem::Requirement
|
107
109
|
requirements:
|
108
|
-
- - '>='
|
110
|
+
- - ! '>='
|
109
111
|
- !ruby/object:Gem::Version
|
110
112
|
version: '0'
|
111
113
|
- !ruby/object:Gem::Dependency
|
112
114
|
name: rspec
|
113
115
|
requirement: !ruby/object:Gem::Requirement
|
114
116
|
requirements:
|
115
|
-
- - '>='
|
117
|
+
- - ! '>='
|
116
118
|
- !ruby/object:Gem::Version
|
117
119
|
version: '0'
|
118
120
|
type: :development
|
119
121
|
prerelease: false
|
120
122
|
version_requirements: !ruby/object:Gem::Requirement
|
121
123
|
requirements:
|
122
|
-
- - '>='
|
124
|
+
- - ! '>='
|
123
125
|
- !ruby/object:Gem::Version
|
124
126
|
version: '0'
|
125
127
|
- !ruby/object:Gem::Dependency
|
126
128
|
name: debugger
|
127
129
|
requirement: !ruby/object:Gem::Requirement
|
128
130
|
requirements:
|
129
|
-
- - '>='
|
131
|
+
- - ! '>='
|
130
132
|
- !ruby/object:Gem::Version
|
131
133
|
version: '0'
|
132
134
|
type: :development
|
133
135
|
prerelease: false
|
134
136
|
version_requirements: !ruby/object:Gem::Requirement
|
135
137
|
requirements:
|
136
|
-
- - '>='
|
138
|
+
- - ! '>='
|
137
139
|
- !ruby/object:Gem::Version
|
138
140
|
version: '0'
|
139
141
|
description: Messaging system that is customizable based on which queueing system
|
@@ -168,7 +170,12 @@ files:
|
|
168
170
|
- lib/dispatch-rider/notification_services/file_system/channel.rb
|
169
171
|
- lib/dispatch-rider/notification_services/file_system/notifier.rb
|
170
172
|
- lib/dispatch-rider/publisher.rb
|
173
|
+
- lib/dispatch-rider/publisher/base.rb
|
174
|
+
- lib/dispatch-rider/publisher/configuration.rb
|
175
|
+
- lib/dispatch-rider/publisher/configuration/destination.rb
|
176
|
+
- lib/dispatch-rider/publisher/configuration/notification_service.rb
|
171
177
|
- lib/dispatch-rider/publisher/configuration_reader.rb
|
178
|
+
- lib/dispatch-rider/publisher/configuration_support.rb
|
172
179
|
- lib/dispatch-rider/queue_services.rb
|
173
180
|
- lib/dispatch-rider/queue_services/aws_sqs.rb
|
174
181
|
- lib/dispatch-rider/queue_services/aws_sqs/message_body_extractor.rb
|
@@ -199,17 +206,17 @@ require_paths:
|
|
199
206
|
- lib
|
200
207
|
required_ruby_version: !ruby/object:Gem::Requirement
|
201
208
|
requirements:
|
202
|
-
- - '>='
|
209
|
+
- - ! '>='
|
203
210
|
- !ruby/object:Gem::Version
|
204
211
|
version: '0'
|
205
212
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
206
213
|
requirements:
|
207
|
-
- - '>='
|
214
|
+
- - ! '>='
|
208
215
|
- !ruby/object:Gem::Version
|
209
216
|
version: '0'
|
210
217
|
requirements: []
|
211
218
|
rubyforge_project:
|
212
|
-
rubygems_version: 2.
|
219
|
+
rubygems_version: 2.1.10
|
213
220
|
signing_key:
|
214
221
|
specification_version: 4
|
215
222
|
summary: Messaging system based on the reactor patter. You can publish messages to
|