traffiq 1.3.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 +7 -0
- data/.gitignore +14 -0
- data/CHANGELOG.md +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +108 -0
- data/Rakefile +12 -0
- data/circle.yml +11 -0
- data/lib/traffiq.rb +7 -0
- data/lib/traffiq/amqp.rb +111 -0
- data/lib/traffiq/errors.rb +19 -0
- data/lib/traffiq/test_helpers.rb +19 -0
- data/lib/traffiq/version.rb +3 -0
- data/test/lib/traffiq/amqp_test.rb +137 -0
- data/test/test_helper.rb +7 -0
- data/traffiq.gemspec +28 -0
- metadata +151 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ebf36730922b2f8e415d1a0220a6edf1b4c1a21b
|
4
|
+
data.tar.gz: b77ef9b9902681c190418c85238cc104526b2827
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 749a2c2dcefe36499ce673dc57153cdfa492e2ff2feb786f42474ddbb6bd4c9f7a7af7a9c7b4c2d27483eecb3d55a490b74a894738adc4b4c4e5e4115909e6be
|
7
|
+
data.tar.gz: 76c41db2eaab5872b91097bd68b3f8858037ceea1bd2f5830bcc271bdccc055007482597f98fc84363d506a74ce8a4d9d5bf7bbfade6e3786130d518dd5e9d15
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## Version 1.3.0 (July 10)
|
4
|
+
|
5
|
+
* Allow publishers to bind queues on publish even if no consumers are up (9016226).
|
6
|
+
|
7
|
+
## Version 1.1.0 to 1.2.0 (Mar 18)
|
8
|
+
|
9
|
+
* Allow clients to specify a block to be called when an uncaught exception happens
|
10
|
+
in a consumer.
|
11
|
+
|
12
|
+
## Version 1.0.1 to 1.1.0 (Feb 4)
|
13
|
+
|
14
|
+
* Adding AMQP test helpers (d707a1e).
|
15
|
+
|
16
|
+
## Version 1.0.0 to 1.0.1 (Jan 27)
|
17
|
+
|
18
|
+
* Update bunny dependency to allow bunny version 1.6.x (40f7f71).
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Ride Group Inc and contributors.
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
# Traffiq
|
2
|
+
|
3
|
+
[](https://circleci.com/gh/ride/traffiq)
|
4
|
+
|
5
|
+
`Traffiq` helps you with your queues so you don't have to.
|
6
|
+
|
7
|
+

|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
For now only AMQP is supported with *topic* exchanges.
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
# consumer.rb
|
15
|
+
amqp = Traffiq::AMQP.new("user:password@rabbit-server.com")
|
16
|
+
amqp.define_exchange('events', durable: true)
|
17
|
+
amqp.subscribe('routing_key', options) do |delivery_info, metadata, payload|
|
18
|
+
puts delivery_info, metadata, payload
|
19
|
+
end
|
20
|
+
|
21
|
+
# producer.rb
|
22
|
+
amqp = Traffiq::AMQP.new(queue_url)
|
23
|
+
amqp.define_exchange('events', durable: true)
|
24
|
+
amqp.publish('routing_key', payload)
|
25
|
+
amqp.close
|
26
|
+
```
|
27
|
+
|
28
|
+
By default, the exchanges created will be `durable`. Please note that the
|
29
|
+
producer and the consumer need to agree on the exchange options.
|
30
|
+
|
31
|
+
Queues will be created with `durable: true, auto_delete: false`.
|
32
|
+
|
33
|
+
More documentation can be found in the code as inline comments.
|
34
|
+
|
35
|
+
### Publishing Messages
|
36
|
+
|
37
|
+
Be aware that, by design, `topic` exchanges will drop any message sent to a
|
38
|
+
queue that has never been binded to. So you will need to make sure your
|
39
|
+
consumers start before the producer (and bind to a specific queue) before you
|
40
|
+
send messages to them.
|
41
|
+
|
42
|
+
You can force the publisher to bind to a queue with the `bind_to_queue`
|
43
|
+
option on the `#publish` method. This will create a queue with the same name of
|
44
|
+
the routing key, so be careful with that. You don't want to have many durable
|
45
|
+
queues created by temporary proccesses.
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
amqp = Traffiq::AMQP.new("server")
|
49
|
+
amqp.publish('routing_key', payload)
|
50
|
+
amqp.queues['routing_key'] # => nil
|
51
|
+
|
52
|
+
amqp.publish('routing_key', payload, bind_to_queue: true)
|
53
|
+
amqp.queues['routing_key'] # => Bunny::Queue
|
54
|
+
```
|
55
|
+
|
56
|
+
## Test Helpers
|
57
|
+
|
58
|
+
`traffiq` comes with some test helpers for RabbitMQ integration tests. Notice
|
59
|
+
that when using these helpers you *must* have a RabbitMQ server running.
|
60
|
+
|
61
|
+
To use them, you can do the following:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
# test_helper.rb
|
65
|
+
|
66
|
+
require 'traffiq/test_helpers'
|
67
|
+
include Traffiq::TestHelpers
|
68
|
+
|
69
|
+
queue, amqp = setup_amqp_queue(server_url, exchange_name, routing_key)
|
70
|
+
|
71
|
+
amqp.publish(routing_key, { tony: 'montana' }.to_json)
|
72
|
+
|
73
|
+
last_amqp_queue_message(queue) # => { 'tony' => 'montana' }
|
74
|
+
```
|
75
|
+
|
76
|
+
## Installation
|
77
|
+
|
78
|
+
Add this line to your application's Gemfile:
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
gem 'traffiq'
|
82
|
+
```
|
83
|
+
|
84
|
+
And then execute:
|
85
|
+
|
86
|
+
$ bundle
|
87
|
+
|
88
|
+
## Running Tests
|
89
|
+
|
90
|
+
Traffiq requires RabbitMQ to be running for tests. So after you start your
|
91
|
+
rabbit server, you can test with Rake:
|
92
|
+
|
93
|
+
```
|
94
|
+
bundle exec rake test
|
95
|
+
```
|
96
|
+
|
97
|
+
You can pass the Rabbit URL via the `QUEUE_URL` environment variable. If you are
|
98
|
+
running Rabbit with the default configuration you don't need this. Same goes for
|
99
|
+
Boxen, Traffiq will detect if you have Boxen installed and use the Boxen default
|
100
|
+
port (55672).
|
101
|
+
|
102
|
+
## Contributing
|
103
|
+
|
104
|
+
1. Fork it ( https://github.com/ride/traffiq/fork )
|
105
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
106
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
107
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
108
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rake/testtask"
|
3
|
+
|
4
|
+
Rake::TestTask.new do |t|
|
5
|
+
t.libs = [ "test" ]
|
6
|
+
t.test_files = FileList['test/**/*_test.rb']
|
7
|
+
t.verbose = true
|
8
|
+
# TODO: AMQP has a lot of warnings. Fix them and turn this on.
|
9
|
+
# t.warning = true
|
10
|
+
end
|
11
|
+
|
12
|
+
task :default => [ :test ]
|
data/circle.yml
ADDED
data/lib/traffiq.rb
ADDED
data/lib/traffiq/amqp.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'bunny'
|
2
|
+
|
3
|
+
module Traffiq
|
4
|
+
class AMQP
|
5
|
+
attr_reader :exchange
|
6
|
+
|
7
|
+
def initialize(queue_url)
|
8
|
+
@conn = Bunny.new(queue_url)
|
9
|
+
@conn.start
|
10
|
+
|
11
|
+
@channel = @conn.create_channel
|
12
|
+
end
|
13
|
+
|
14
|
+
# Checks if the connection to the Rabbit server is opened.
|
15
|
+
def connected?
|
16
|
+
@conn.connected? && @channel.open?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the exchanges that the channel has, except the default exchange.
|
20
|
+
def exchanges
|
21
|
+
@channel.exchanges
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns the queues that are binded on this connection.
|
25
|
+
def queues
|
26
|
+
@channel.queues
|
27
|
+
end
|
28
|
+
|
29
|
+
# Sets up the block to run when an error happens.
|
30
|
+
#
|
31
|
+
# @param [Block] block The block to run on uncaught exceptions.
|
32
|
+
def on_uncaught_exception(&block)
|
33
|
+
@channel.on_uncaught_exception(&block)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Defines a *topic* exchange.
|
37
|
+
#
|
38
|
+
# This defines a durable topic exchange by default.
|
39
|
+
#
|
40
|
+
# @param [String] name The name of the exchange.
|
41
|
+
# @param [Hash] options The options to define the exchange with.
|
42
|
+
#
|
43
|
+
# For options, look at Bunny's exchange options.
|
44
|
+
# http://rubybunny.info/articles/exchanges.html
|
45
|
+
def define_exchange(name, options = {})
|
46
|
+
options = {
|
47
|
+
durable: true,
|
48
|
+
}.merge(options)
|
49
|
+
@exchange = @channel.topic(name, options)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Binds a queue to the exchange and sets it's routing_key to `name`.
|
53
|
+
#
|
54
|
+
# @param [String] name The name of the queue and routing key to use.
|
55
|
+
# @param [Hash] options Queue options.
|
56
|
+
#
|
57
|
+
# For options look at Bunny's Queue options.
|
58
|
+
# http://rubybunny.info/articles/queues.html
|
59
|
+
def bind_queue(name, options = {})
|
60
|
+
raise Traffiq::NoExchangeError.new if @exchange.nil?
|
61
|
+
|
62
|
+
options = {
|
63
|
+
durable: true,
|
64
|
+
auto_delete: false,
|
65
|
+
}.merge(options)
|
66
|
+
|
67
|
+
@channel.queue(name, options)
|
68
|
+
.bind(@exchange, routing_key: name)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Subscribes to a specific routing_key. Executes the block when there's a
|
72
|
+
# message routed there.
|
73
|
+
#
|
74
|
+
# A queue will be binded with the `routing_key` name.
|
75
|
+
#
|
76
|
+
# @param [String] routing_key Routing key to subscribe to.
|
77
|
+
# @param [Hash] options Subscribe options for the queue.
|
78
|
+
# @param [Block] &block the block you want to execute when a message arrive.
|
79
|
+
#
|
80
|
+
# For options look at Bunny's Queue#subscribe options.
|
81
|
+
# http://rubybunny.info/articles/queues.html
|
82
|
+
def subscribe(routing_key, options = {}, &block)
|
83
|
+
q = bind_queue(routing_key)
|
84
|
+
options = options.merge(manual_ack: true)
|
85
|
+
|
86
|
+
q.subscribe(options) do |delivery_info, metadata, payload|
|
87
|
+
block.call(delivery_info, metadata, payload)
|
88
|
+
@channel.ack(delivery_info.delivery_tag)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Publishes a message to a specific routing key.
|
93
|
+
#
|
94
|
+
# @param [String] routing_key The routing key where you want to send the message to.
|
95
|
+
# @param [Hash] payload What you want the message to have. It'll be converted to JSON.
|
96
|
+
# @param [Hash] options Publish options
|
97
|
+
#
|
98
|
+
# @option opts [Boolean] :bind_to_queue If you want to bind a queue just in case there are no subscribers.
|
99
|
+
def publish(routing_key, payload = {}, options = {})
|
100
|
+
raise Traffiq::NoExchangeError.new if @exchange.nil?
|
101
|
+
bind_queue(routing_key) if options[:bind_to_queue]
|
102
|
+
@exchange.publish(MultiJson.dump(payload), routing_key: routing_key, persistent: true)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Closes connection to the Rabbit server.
|
106
|
+
def close
|
107
|
+
@channel.close
|
108
|
+
@conn.close
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Traffiq
|
2
|
+
class Error < StandardError
|
3
|
+
def initialize(msg = nil)
|
4
|
+
super(msg || default_message)
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
def default_message
|
9
|
+
"Traffiq error"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class NoExchangeError < Error
|
14
|
+
private
|
15
|
+
def default_message
|
16
|
+
"Must define exchange"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Traffiq
|
2
|
+
module TestHelpers
|
3
|
+
def setup_amqp_queue(url, exchange_name, routing_key)
|
4
|
+
amqp = Traffiq::AMQP.new(url)
|
5
|
+
amqp.define_exchange(exchange_name)
|
6
|
+
queue = amqp.bind_queue(routing_key)
|
7
|
+
queue.purge
|
8
|
+
return queue, amqp
|
9
|
+
end
|
10
|
+
|
11
|
+
def last_amqp_queue_message(queue)
|
12
|
+
_, _, payload = queue.pop
|
13
|
+
if payload
|
14
|
+
payload = JSON.parse(payload)
|
15
|
+
end
|
16
|
+
payload
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Traffiq
|
4
|
+
class AMQPTest < Minitest::Spec
|
5
|
+
let(:queue_url) { ENV['QUEUE_URL'] || ENV['BOXEN_RABBITMQ_URL'] || "amqp://guest:guest@localhost:5672" }
|
6
|
+
let(:amqp) { ::Traffiq::AMQP.new(queue_url) }
|
7
|
+
let(:payload) {{ payload: :goes_here }}
|
8
|
+
let(:routing_key) { 'routing_key' }
|
9
|
+
let(:json_payload) { '{"payload":"goes_here"}' }
|
10
|
+
|
11
|
+
after do
|
12
|
+
amqp.close
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#initialize' do
|
16
|
+
it "connects to a queue and creates a channel" do
|
17
|
+
amqp = ::Traffiq::AMQP.new(queue_url)
|
18
|
+
assert amqp.connected?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#define_exchange' do
|
23
|
+
let(:exchange_name) { 'new_exchange' }
|
24
|
+
let(:exchange) { amqp.exchanges[exchange_name] }
|
25
|
+
|
26
|
+
before do
|
27
|
+
amqp.define_exchange(exchange_name)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "defines a topic exchange with the exchange name" do
|
31
|
+
assert_equal 1, amqp.exchanges.size
|
32
|
+
refute_nil exchange
|
33
|
+
assert_equal :topic, exchange.type
|
34
|
+
end
|
35
|
+
|
36
|
+
it "defines a durable and non auto-delete exchange" do
|
37
|
+
assert exchange.durable?
|
38
|
+
refute exchange.auto_delete?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#bind_queue" do
|
43
|
+
context "without an exchange" do
|
44
|
+
it "raises an error" do
|
45
|
+
assert_raises ::Traffiq::NoExchangeError do
|
46
|
+
amqp.bind_queue(routing_key)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "with an exchange" do
|
52
|
+
before do
|
53
|
+
amqp.define_exchange('traffiq_test')
|
54
|
+
end
|
55
|
+
|
56
|
+
it "creates a queue" do
|
57
|
+
queue = amqp.bind_queue(routing_key)
|
58
|
+
refute_nil queue
|
59
|
+
|
60
|
+
assert_equal 1, amqp.queues.length
|
61
|
+
assert_equal queue, amqp.queues[routing_key]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#publish" do
|
67
|
+
context "without an exchange" do
|
68
|
+
it "raises an error" do
|
69
|
+
assert_raises ::Traffiq::NoExchangeError do
|
70
|
+
amqp.publish(routing_key, payload)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "with an exchange" do
|
76
|
+
before do
|
77
|
+
amqp.define_exchange('traffiq_test')
|
78
|
+
end
|
79
|
+
|
80
|
+
it "pushes a message with a specific routing key and as JSON" do
|
81
|
+
amqp.exchange.expects(:publish).
|
82
|
+
with(json_payload, routing_key: 'test_routing_key', persistent: true).
|
83
|
+
once
|
84
|
+
amqp.publish('test_routing_key', payload)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "doesn't bind to a queue by default" do
|
88
|
+
amqp.publish('test_routing_key', payload)
|
89
|
+
assert_empty amqp.queues
|
90
|
+
end
|
91
|
+
|
92
|
+
it "binds to a queue if you want it to" do
|
93
|
+
amqp.publish('test_routing_key', payload, bind_to_queue: true)
|
94
|
+
refute_empty amqp.queues
|
95
|
+
refute_nil amqp.queues['test_routing_key']
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe "#subscribe" do
|
101
|
+
let(:noop) { lambda{ |_,_,_| }}
|
102
|
+
context "without an exchange" do
|
103
|
+
it "raises an error" do
|
104
|
+
assert_raises ::Traffiq::NoExchangeError do
|
105
|
+
amqp.subscribe(routing_key, &noop)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "with an exchange" do
|
111
|
+
before do
|
112
|
+
amqp.define_exchange('traffiq_test')
|
113
|
+
end
|
114
|
+
|
115
|
+
it "binds to a routing key" do
|
116
|
+
amqp.subscribe(routing_key, &noop)
|
117
|
+
assert_equal 1, amqp.queues.length
|
118
|
+
|
119
|
+
queue = amqp.queues[routing_key]
|
120
|
+
refute_nil queue
|
121
|
+
assert_equal routing_key, queue.name
|
122
|
+
end
|
123
|
+
|
124
|
+
it "executes the block with the payload when something is published" do
|
125
|
+
amqp.subscribe(routing_key) do |delivery_info, metadata, q_payload|
|
126
|
+
refute_nil delivery_info
|
127
|
+
refute_nil metadata
|
128
|
+
refute_nil q_payload
|
129
|
+
assert_equal json_payload, q_payload
|
130
|
+
end
|
131
|
+
|
132
|
+
amqp.publish('test_routing_key', payload)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
data/test/test_helper.rb
ADDED
data/traffiq.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'traffiq/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "traffiq"
|
8
|
+
spec.version = Traffiq::VERSION
|
9
|
+
spec.authors = ["Ride"]
|
10
|
+
spec.email = ["nicolas@ride.com"]
|
11
|
+
spec.summary = %q{Simple queue helpers for Ride.}
|
12
|
+
spec.description = %q{Simple queue helpers for Ride.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency 'multi_json', '~> 1.11'
|
22
|
+
spec.add_dependency 'bunny', '>= 1.5.1', '< 2.0'
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
spec.add_development_dependency "minitest", "~> 5.7"
|
27
|
+
spec.add_development_dependency "mocha", "~> 1.1"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: traffiq
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ride
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: multi_json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bunny
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.5.1
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '2.0'
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.5.1
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.7'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.7'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '10.0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '10.0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: minitest
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '5.7'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '5.7'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: mocha
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '1.1'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.1'
|
103
|
+
description: Simple queue helpers for Ride.
|
104
|
+
email:
|
105
|
+
- nicolas@ride.com
|
106
|
+
executables: []
|
107
|
+
extensions: []
|
108
|
+
extra_rdoc_files: []
|
109
|
+
files:
|
110
|
+
- ".gitignore"
|
111
|
+
- CHANGELOG.md
|
112
|
+
- Gemfile
|
113
|
+
- LICENSE.txt
|
114
|
+
- README.md
|
115
|
+
- Rakefile
|
116
|
+
- circle.yml
|
117
|
+
- lib/traffiq.rb
|
118
|
+
- lib/traffiq/amqp.rb
|
119
|
+
- lib/traffiq/errors.rb
|
120
|
+
- lib/traffiq/test_helpers.rb
|
121
|
+
- lib/traffiq/version.rb
|
122
|
+
- test/lib/traffiq/amqp_test.rb
|
123
|
+
- test/test_helper.rb
|
124
|
+
- traffiq.gemspec
|
125
|
+
homepage: ''
|
126
|
+
licenses:
|
127
|
+
- MIT
|
128
|
+
metadata: {}
|
129
|
+
post_install_message:
|
130
|
+
rdoc_options: []
|
131
|
+
require_paths:
|
132
|
+
- lib
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
requirements: []
|
144
|
+
rubyforge_project:
|
145
|
+
rubygems_version: 2.4.5
|
146
|
+
signing_key:
|
147
|
+
specification_version: 4
|
148
|
+
summary: Simple queue helpers for Ride.
|
149
|
+
test_files:
|
150
|
+
- test/lib/traffiq/amqp_test.rb
|
151
|
+
- test/test_helper.rb
|