traffiq 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
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
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in traffiq.gemspec
4
+ gemspec
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
+ [![Circle CI](https://circleci.com/gh/ride/traffiq.svg?style=svg)](https://circleci.com/gh/ride/traffiq)
4
+
5
+ `Traffiq` helps you with your queues so you don't have to.
6
+
7
+ ![Boston Traffic](http://statescoop.com/wp-content/uploads/2014/04/boston-traffic.jpg)
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
@@ -0,0 +1,11 @@
1
+ machine:
2
+ environment:
3
+ QUEUE_URL: amqp://guest:guest@127.0.0.1:5672
4
+ ruby:
5
+ version: 2.2.2
6
+ services:
7
+ - rabbitmq-server
8
+
9
+ test:
10
+ override:
11
+ - bundle exec rake test
data/lib/traffiq.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "traffiq/errors"
2
+ require "traffiq/amqp"
3
+ require "traffiq/version"
4
+
5
+ require 'multi_json'
6
+
7
+ module Traffiq ; end
@@ -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,3 @@
1
+ module Traffiq
2
+ VERSION = "1.3.0"
3
+ 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
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../../lib/traffiq', __FILE__)
2
+ require 'minitest/autorun'
3
+ require 'mocha/mini_test'
4
+
5
+ def context(name, &block)
6
+ describe(name, &block)
7
+ end
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