rabbit_feed 2.1.2 → 2.1.5
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
- data/Gemfile.lock +10 -7
- data/README.md +20 -1
- data/example/non_rails_app/Gemfile.lock +12 -9
- data/example/rails_app/Gemfile.lock +5 -2
- data/lib/rabbit_feed/client.rb +5 -0
- data/lib/rabbit_feed/configuration.rb +8 -4
- data/lib/rabbit_feed/consumer_connection.rb +3 -2
- data/lib/rabbit_feed/version.rb +1 -1
- data/lib/rabbit_feed.rb +2 -2
- data/spec/fixtures/configuration.yml +1 -0
- data/spec/lib/rabbit_feed/client_spec.rb +9 -0
- data/spec/lib/rabbit_feed/configuration_spec.rb +20 -1
- data/spec/lib/rabbit_feed/consumer_connection_spec.rb +6 -0
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 58c69d09c8fed13331610e7015a5dcbe19e282cd
|
|
4
|
+
data.tar.gz: fd29cc489c1bb251ab1e16bf35eda04728cc839e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5389a17aa4bffe0bacbf21f170a86fad67dc23349082502e11fff40b5bb404c405d92c6cfad9e2039bf1d1e00f83c0ccac7d12bf72bd02c2b102520199468511
|
|
7
|
+
data.tar.gz: 458a801d1631ee4be89aa3a5c59f2fd861e810a93117d536b64b2a1d725f0cc5c4162b5c4648601b81a70c03a1ae341b2926715d4865f1e1dc639ed46ac8831f
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
rabbit_feed (2.1.
|
|
4
|
+
rabbit_feed (2.1.5)
|
|
5
5
|
activemodel (>= 3.2.0, < 5.0.0)
|
|
6
6
|
activesupport (>= 3.2.0, < 5.0.0)
|
|
7
7
|
avro (>= 1.5.4, < 1.8.0)
|
|
@@ -12,10 +12,10 @@ PATH
|
|
|
12
12
|
GEM
|
|
13
13
|
remote: https://rubygems.org/
|
|
14
14
|
specs:
|
|
15
|
-
activemodel (4.2.
|
|
16
|
-
activesupport (= 4.2.
|
|
15
|
+
activemodel (4.2.3)
|
|
16
|
+
activesupport (= 4.2.3)
|
|
17
17
|
builder (~> 3.1)
|
|
18
|
-
activesupport (4.2.
|
|
18
|
+
activesupport (4.2.3)
|
|
19
19
|
i18n (~> 0.7)
|
|
20
20
|
json (~> 1.7, >= 1.7.7)
|
|
21
21
|
minitest (~> 5.1)
|
|
@@ -34,7 +34,7 @@ GEM
|
|
|
34
34
|
simplecov (>= 0.7.1, < 1.0.0)
|
|
35
35
|
coderay (1.1.0)
|
|
36
36
|
columnize (0.9.0)
|
|
37
|
-
connection_pool (2.1.
|
|
37
|
+
connection_pool (2.1.3)
|
|
38
38
|
debug_inspector (0.0.2)
|
|
39
39
|
debugger (1.6.8)
|
|
40
40
|
columnize (>= 0.3.1)
|
|
@@ -52,7 +52,7 @@ GEM
|
|
|
52
52
|
json
|
|
53
53
|
json (1.8.2)
|
|
54
54
|
method_source (0.8.2)
|
|
55
|
-
minitest (5.
|
|
55
|
+
minitest (5.7.0)
|
|
56
56
|
multi_json (1.10.1)
|
|
57
57
|
pidfile (0.3.0)
|
|
58
58
|
pry (0.10.1)
|
|
@@ -107,7 +107,7 @@ GEM
|
|
|
107
107
|
simplecov-html (~> 0.9.0)
|
|
108
108
|
simplecov-html (0.9.0)
|
|
109
109
|
slop (3.6.0)
|
|
110
|
-
thread_safe (0.3.
|
|
110
|
+
thread_safe (0.3.5)
|
|
111
111
|
timecop (0.7.3)
|
|
112
112
|
turnip (1.2.4)
|
|
113
113
|
gherkin (>= 2.5)
|
|
@@ -128,3 +128,6 @@ DEPENDENCIES
|
|
|
128
128
|
rspec-its
|
|
129
129
|
rutabaga
|
|
130
130
|
timecop
|
|
131
|
+
|
|
132
|
+
BUNDLED WITH
|
|
133
|
+
1.10.5
|
data/README.md
CHANGED
|
@@ -20,7 +20,7 @@ Add this line to your application's Gemfile:
|
|
|
20
20
|
|
|
21
21
|
### Configuration
|
|
22
22
|
|
|
23
|
-
Create a `config/rabbit_feed.yml` file. The following options
|
|
23
|
+
Create a `config/rabbit_feed.yml` file. The following options should be specified:
|
|
24
24
|
|
|
25
25
|
environment:
|
|
26
26
|
host: RabbitMQ host
|
|
@@ -36,6 +36,24 @@ Sample:
|
|
|
36
36
|
password: guest
|
|
37
37
|
application: beavers
|
|
38
38
|
|
|
39
|
+
Configuration options that can be specified are:
|
|
40
|
+
|
|
41
|
+
| Name | Use |
|
|
42
|
+
| ---- | --- |
|
|
43
|
+
| `host` | Hostname or IP of the RabbitMQ server |
|
|
44
|
+
| `hosts` | Array of hostnames or IPs of a RabbitMQ cluster |
|
|
45
|
+
| `port` | The port to use on the RabbitMQ server |
|
|
46
|
+
| `user` | The user to authenticate with the RabbitMQ server |
|
|
47
|
+
| `password` | The password to authenticate with the RabbitMQ server |
|
|
48
|
+
| `application` | The name of the application - used for routing events to the specified consumers |
|
|
49
|
+
| `environment` | The environment of the application - used for routing events to the specified consumers |
|
|
50
|
+
| `exchange` | The name of the RabbitMQ exchange to which events are published |
|
|
51
|
+
| `heartbeat` | The interval at which to send heartbeats to the RabbitMQ server (in seconds) |
|
|
52
|
+
| `connect_timeout` | The timeout (in seconds) for connecting to the RabbitMQ server |
|
|
53
|
+
| `network_recovery_interval` | Recovery interval (in seconds) periodic network recovery will use |
|
|
54
|
+
| `auto_delete_queue` | If true, any queues created will auto-delete upon disconnect |
|
|
55
|
+
| `auto_delete_exchange` | If true, any exchanges created will auto-delete upon disconnect |
|
|
56
|
+
|
|
39
57
|
### Initialisation
|
|
40
58
|
|
|
41
59
|
If installing in a rails application, the following should be defined in `config/initializers/rabbit_feed.rb`:
|
|
@@ -219,6 +237,7 @@ Publishes an event. Note: until you've specified the [event definitions](https:/
|
|
|
219
237
|
Starts a consumer. Note: until you've specified the [event routing](https://github.com/simplybusiness/rabbit_feed#event-routing-dsl), this will not receive any events. Options are as follows:
|
|
220
238
|
|
|
221
239
|
--environment The environment to run in
|
|
240
|
+
--application The name of the application (used for routing events)
|
|
222
241
|
--config The location of the rabbit_feed configuration file
|
|
223
242
|
--logfile The location of the log file
|
|
224
243
|
--require The project file containing the dependancies (only necessary if running with non-rails application)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: ../../
|
|
3
3
|
specs:
|
|
4
|
-
rabbit_feed (2.1.
|
|
4
|
+
rabbit_feed (2.1.5)
|
|
5
5
|
activemodel (>= 3.2.0, < 5.0.0)
|
|
6
6
|
activesupport (>= 3.2.0, < 5.0.0)
|
|
7
7
|
avro (>= 1.5.4, < 1.8.0)
|
|
@@ -12,10 +12,10 @@ PATH
|
|
|
12
12
|
GEM
|
|
13
13
|
remote: https://rubygems.org/
|
|
14
14
|
specs:
|
|
15
|
-
activemodel (4.2.
|
|
16
|
-
activesupport (= 4.2.
|
|
15
|
+
activemodel (4.2.3)
|
|
16
|
+
activesupport (= 4.2.3)
|
|
17
17
|
builder (~> 3.1)
|
|
18
|
-
activesupport (4.2.
|
|
18
|
+
activesupport (4.2.3)
|
|
19
19
|
i18n (~> 0.7)
|
|
20
20
|
json (~> 1.7, >= 1.7.7)
|
|
21
21
|
minitest (~> 5.1)
|
|
@@ -27,12 +27,12 @@ GEM
|
|
|
27
27
|
builder (3.2.2)
|
|
28
28
|
bunny (1.7.0)
|
|
29
29
|
amq-protocol (>= 1.9.2)
|
|
30
|
-
connection_pool (2.1.
|
|
30
|
+
connection_pool (2.1.3)
|
|
31
31
|
diff-lcs (1.2.5)
|
|
32
32
|
i18n (0.7.0)
|
|
33
|
-
json (1.8.
|
|
34
|
-
minitest (5.
|
|
35
|
-
multi_json (1.11.
|
|
33
|
+
json (1.8.3)
|
|
34
|
+
minitest (5.7.0)
|
|
35
|
+
multi_json (1.11.1)
|
|
36
36
|
pidfile (0.3.0)
|
|
37
37
|
rake (10.4.2)
|
|
38
38
|
rspec (3.2.0)
|
|
@@ -48,7 +48,7 @@ GEM
|
|
|
48
48
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
49
49
|
rspec-support (~> 3.2.0)
|
|
50
50
|
rspec-support (3.2.1)
|
|
51
|
-
thread_safe (0.3.
|
|
51
|
+
thread_safe (0.3.5)
|
|
52
52
|
tzinfo (1.2.2)
|
|
53
53
|
thread_safe (~> 0.1)
|
|
54
54
|
|
|
@@ -59,3 +59,6 @@ DEPENDENCIES
|
|
|
59
59
|
rabbit_feed!
|
|
60
60
|
rake
|
|
61
61
|
rspec
|
|
62
|
+
|
|
63
|
+
BUNDLED WITH
|
|
64
|
+
1.10.5
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: ../../
|
|
3
3
|
specs:
|
|
4
|
-
rabbit_feed (2.1.
|
|
4
|
+
rabbit_feed (2.1.5)
|
|
5
5
|
activemodel (>= 3.2.0, < 5.0.0)
|
|
6
6
|
activesupport (>= 3.2.0, < 5.0.0)
|
|
7
7
|
avro (>= 1.5.4, < 1.8.0)
|
|
@@ -61,7 +61,7 @@ GEM
|
|
|
61
61
|
coffee-script-source
|
|
62
62
|
execjs
|
|
63
63
|
coffee-script-source (1.9.1)
|
|
64
|
-
connection_pool (2.1.
|
|
64
|
+
connection_pool (2.1.3)
|
|
65
65
|
diff-lcs (1.2.5)
|
|
66
66
|
erubis (2.7.0)
|
|
67
67
|
execjs (2.3.0)
|
|
@@ -189,3 +189,6 @@ DEPENDENCIES
|
|
|
189
189
|
turbolinks
|
|
190
190
|
uglifier (>= 1.3.0)
|
|
191
191
|
unicorn
|
|
192
|
+
|
|
193
|
+
BUNDLED WITH
|
|
194
|
+
1.10.5
|
data/lib/rabbit_feed/client.rb
CHANGED
|
@@ -92,6 +92,7 @@ module RabbitFeed
|
|
|
92
92
|
|
|
93
93
|
def set_configuration
|
|
94
94
|
RabbitFeed.environment = environment
|
|
95
|
+
RabbitFeed.application = options[:application]
|
|
95
96
|
RabbitFeed.configuration_file_path = options[:config_file]
|
|
96
97
|
ENV['RACK_ENV'] ||= RabbitFeed.environment
|
|
97
98
|
ENV['RAILS_ENV'] ||= RabbitFeed.environment
|
|
@@ -138,6 +139,10 @@ module RabbitFeed
|
|
|
138
139
|
|
|
139
140
|
parser = OptionParser.new do |o|
|
|
140
141
|
|
|
142
|
+
o.on '-a', '--application VAL', 'Name of the application' do |arg|
|
|
143
|
+
opts[:application] = arg
|
|
144
|
+
end
|
|
145
|
+
|
|
141
146
|
o.on '-m', '--payload VAL', 'Payload of event to produce' do |arg|
|
|
142
147
|
opts[:payload] = arg
|
|
143
148
|
end
|
|
@@ -2,13 +2,14 @@ module RabbitFeed
|
|
|
2
2
|
class Configuration
|
|
3
3
|
include ActiveModel::Validations
|
|
4
4
|
|
|
5
|
-
attr_reader :host, :port, :user, :password, :application, :environment, :exchange, :pool_size, :pool_timeout, :heartbeat, :connect_timeout, :network_recovery_interval, :auto_delete_queue, :auto_delete_exchange
|
|
5
|
+
attr_reader :host, :hosts, :port, :user, :password, :application, :environment, :exchange, :pool_size, :pool_timeout, :heartbeat, :connect_timeout, :network_recovery_interval, :auto_delete_queue, :auto_delete_exchange
|
|
6
6
|
validates_presence_of :application, :environment, :exchange, :pool_timeout
|
|
7
7
|
|
|
8
8
|
def initialize options
|
|
9
9
|
RabbitFeed.log.debug "RabbitFeed initialising with options: #{options}..."
|
|
10
10
|
|
|
11
11
|
@host = options[:host]
|
|
12
|
+
@hosts = options[:hosts]
|
|
12
13
|
@port = options[:port]
|
|
13
14
|
@user = options[:user]
|
|
14
15
|
@password = options[:password]
|
|
@@ -24,13 +25,15 @@ module RabbitFeed
|
|
|
24
25
|
validate!
|
|
25
26
|
end
|
|
26
27
|
|
|
27
|
-
def self.load file_path, environment
|
|
28
|
-
RabbitFeed.log.debug "Reading configurations from #{file_path} in #{environment}..."
|
|
28
|
+
def self.load file_path, environment, application
|
|
29
|
+
RabbitFeed.log.debug "Reading configurations from #{file_path} in #{environment} for application #{application}..."
|
|
29
30
|
|
|
30
31
|
raise ConfigurationError.new "The RabbitFeed configuration file path specified does not exist: #{file_path}" unless (File.exist? file_path)
|
|
31
32
|
|
|
32
33
|
options = read_configuration_file file_path, environment
|
|
33
|
-
|
|
34
|
+
options[:environment] = environment
|
|
35
|
+
options[:application] ||= application
|
|
36
|
+
new options
|
|
34
37
|
end
|
|
35
38
|
|
|
36
39
|
def queue
|
|
@@ -42,6 +45,7 @@ module RabbitFeed
|
|
|
42
45
|
options[:heartbeat] = heartbeat if heartbeat
|
|
43
46
|
options[:connect_timeout] = connect_timeout if connect_timeout
|
|
44
47
|
options[:host] = host if host
|
|
48
|
+
options[:hosts] = hosts if hosts
|
|
45
49
|
options[:user] = user if user
|
|
46
50
|
options[:password] = password if password
|
|
47
51
|
options[:port] = port if port
|
|
@@ -42,9 +42,10 @@ module RabbitFeed
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
sleep # Sleep indefinitely, as the consumer runs in its own thread
|
|
45
|
-
rescue
|
|
45
|
+
rescue SystemExit, Interrupt
|
|
46
|
+
RabbitFeed.log.info "Consumer #{self.to_s} received exit request, exiting..."
|
|
47
|
+
ensure
|
|
46
48
|
(cancel_consumer consumer) if consumer.present?
|
|
47
|
-
raise
|
|
48
49
|
end
|
|
49
50
|
|
|
50
51
|
private
|
data/lib/rabbit_feed/version.rb
CHANGED
data/lib/rabbit_feed.rb
CHANGED
|
@@ -26,13 +26,13 @@ module RabbitFeed
|
|
|
26
26
|
class RoutingError < Error; end
|
|
27
27
|
class ReturnedMessageError < Error; end
|
|
28
28
|
|
|
29
|
-
attr_accessor :log, :environment, :configuration_file_path
|
|
29
|
+
attr_accessor :log, :environment, :configuration_file_path, :application
|
|
30
30
|
|
|
31
31
|
def configuration
|
|
32
32
|
RabbitFeed.log ||= (Logger.new STDOUT)
|
|
33
33
|
RabbitFeed.configuration_file_path ||= 'config/rabbit_feed.yml'
|
|
34
34
|
RabbitFeed.environment ||= ENV['RAILS_ENV'] || ENV['RACK_ENV']
|
|
35
|
-
@configuration ||= (Configuration.load RabbitFeed.configuration_file_path, RabbitFeed.environment)
|
|
35
|
+
@configuration ||= (Configuration.load RabbitFeed.configuration_file_path, RabbitFeed.environment, application)
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
def exception_notify exception
|
|
@@ -8,6 +8,7 @@ module RabbitFeed
|
|
|
8
8
|
let(:config_file) { 'spec/fixtures/configuration.yml' }
|
|
9
9
|
let(:environment) { 'test' }
|
|
10
10
|
let(:require_file){ 'rabbit_feed.rb' }
|
|
11
|
+
let(:application) { 'rabbit_feed_test' }
|
|
11
12
|
let(:arguments) do
|
|
12
13
|
[
|
|
13
14
|
command,
|
|
@@ -21,11 +22,14 @@ module RabbitFeed
|
|
|
21
22
|
pidfile,
|
|
22
23
|
'--require',
|
|
23
24
|
require_file,
|
|
25
|
+
'--application',
|
|
26
|
+
application,
|
|
24
27
|
'--daemon'
|
|
25
28
|
]
|
|
26
29
|
end
|
|
27
30
|
before do
|
|
28
31
|
RabbitFeed.environment = nil
|
|
32
|
+
RabbitFeed.application = nil
|
|
29
33
|
RabbitFeed.log = nil
|
|
30
34
|
RabbitFeed.configuration_file_path = nil
|
|
31
35
|
end
|
|
@@ -40,6 +44,11 @@ module RabbitFeed
|
|
|
40
44
|
expect(RabbitFeed.environment).to eq 'test'
|
|
41
45
|
end
|
|
42
46
|
|
|
47
|
+
it 'sets the application' do
|
|
48
|
+
subject
|
|
49
|
+
expect(RabbitFeed.application).to eq 'rabbit_feed_test'
|
|
50
|
+
end
|
|
51
|
+
|
|
43
52
|
it 'sets the logger' do
|
|
44
53
|
subject
|
|
45
54
|
expect(RabbitFeed.log).to be_a Logger
|
|
@@ -69,7 +69,8 @@ module RabbitFeed
|
|
|
69
69
|
describe '.load' do
|
|
70
70
|
let(:file_path) { 'spec/fixtures/configuration.yml' }
|
|
71
71
|
let(:environment) { 'test' }
|
|
72
|
-
|
|
72
|
+
let(:application) { }
|
|
73
|
+
subject { described_class.load file_path, environment, application }
|
|
73
74
|
|
|
74
75
|
context 'with missing configuration' do
|
|
75
76
|
let(:environment) { 'production' }
|
|
@@ -104,6 +105,21 @@ module RabbitFeed
|
|
|
104
105
|
its(:auto_delete_exchange) { should be_truthy }
|
|
105
106
|
end
|
|
106
107
|
|
|
108
|
+
context 'with application provided' do
|
|
109
|
+
let(:application) { 'new_application' }
|
|
110
|
+
|
|
111
|
+
it 'prefers the application specified in the config file' do
|
|
112
|
+
expect(subject.application).to eq 'rabbit_feed'
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context 'with an empty config file' do
|
|
116
|
+
let(:environment) { 'test_blank' }
|
|
117
|
+
|
|
118
|
+
it 'prefers the application provided' do
|
|
119
|
+
expect(subject.application).to eq 'new_application'
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
107
123
|
end
|
|
108
124
|
|
|
109
125
|
describe '.new' do
|
|
@@ -119,6 +135,7 @@ module RabbitFeed
|
|
|
119
135
|
end
|
|
120
136
|
|
|
121
137
|
its(:host) { should be_nil }
|
|
138
|
+
its(:hosts) { should be_nil }
|
|
122
139
|
its(:port) { should be_nil }
|
|
123
140
|
its(:user) { should be_nil }
|
|
124
141
|
its(:password) { should be_nil }
|
|
@@ -135,6 +152,7 @@ module RabbitFeed
|
|
|
135
152
|
let(:options) do
|
|
136
153
|
{
|
|
137
154
|
host: 'host_name',
|
|
155
|
+
hosts: ['host_name0', 'host_name1'],
|
|
138
156
|
port: 12345,
|
|
139
157
|
user: 'user_name',
|
|
140
158
|
password: 'password',
|
|
@@ -151,6 +169,7 @@ module RabbitFeed
|
|
|
151
169
|
end
|
|
152
170
|
|
|
153
171
|
its(:host) { should eq 'host_name' }
|
|
172
|
+
its(:hosts) { should eq ['host_name0', 'host_name1'] }
|
|
154
173
|
its(:port) { should eq 12345 }
|
|
155
174
|
its(:user) { should eq 'user_name' }
|
|
156
175
|
its(:password) { should eq 'password' }
|
|
@@ -46,6 +46,7 @@ module RabbitFeed
|
|
|
46
46
|
before do
|
|
47
47
|
allow(bunny_queue).to receive(:subscribe).and_yield(double(:delivery_info, delivery_tag: :tag), 'properties', 'payload')
|
|
48
48
|
allow_any_instance_of(described_class).to receive(:sleep)
|
|
49
|
+
allow_any_instance_of(described_class).to receive(:cancel_consumer)
|
|
49
50
|
end
|
|
50
51
|
|
|
51
52
|
it 'yields the payload' do
|
|
@@ -57,6 +58,11 @@ module RabbitFeed
|
|
|
57
58
|
subject.consume { }
|
|
58
59
|
end
|
|
59
60
|
|
|
61
|
+
it 'cancels the consumer' do
|
|
62
|
+
expect_any_instance_of(described_class).to receive(:cancel_consumer)
|
|
63
|
+
subject.consume { }
|
|
64
|
+
end
|
|
65
|
+
|
|
60
66
|
context 'when an exception is raised' do
|
|
61
67
|
|
|
62
68
|
context 'when Airbrake is defined' do
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rabbit_feed
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.1.
|
|
4
|
+
version: 2.1.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Simply Business
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-
|
|
11
|
+
date: 2015-07-09 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bunny
|
|
@@ -312,7 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
312
312
|
version: '0'
|
|
313
313
|
requirements: []
|
|
314
314
|
rubyforge_project:
|
|
315
|
-
rubygems_version: 2.4.
|
|
315
|
+
rubygems_version: 2.4.7
|
|
316
316
|
signing_key:
|
|
317
317
|
specification_version: 4
|
|
318
318
|
summary: Enables your Ruby applications to perform centralized event logging with
|