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 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