lapin 0.1.2

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.
data/.gitignore ADDED
@@ -0,0 +1,27 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+ public
15
+ example
16
+
17
+ # YARD artifacts
18
+ .yardoc
19
+ _yardoc
20
+ doc/
21
+ .DS_Store
22
+ config.ru.development
23
+ .rbx
24
+ log
25
+ .DS_Store
26
+ config.ru
27
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+
3
+ script: "bundle exec rake test"
4
+
5
+ rvm:
6
+ - 1.8.7
7
+ - 1.9.2
8
+ - 1.9.3
9
+ - ree
10
+
11
+ notifications:
12
+ email:
13
+ on_success: always
14
+ on_failure: always
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Load the gem's dependencies
4
+ gemspec
5
+
6
+ group :development do
7
+ gem "thin"
8
+ gem "passenger"
9
+ end
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # Lapin
2
+
3
+ [![Build Status](https://secure.travis-ci.org/giraffi/lapin.png?branch=master)](http://travis-ci.org/giraffi/lapin) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/giraffi/lapin)
4
+
5
+ A sinatra-based app that provides a JSON endpoint over HTTP for interacting with an AMQP message broker.
6
+
7
+ ## Requirements
8
+
9
+ * [RabbitMQ](http://www.rabbitmq.com/) server
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ $ gem install lapin
15
+ ```
16
+
17
+ To use with bundler, drop in your Gemfile.
18
+
19
+ ```ruby
20
+ gem "lapin", :git => "git://github.com/giraffi/lapin.git"
21
+ ```
22
+
23
+ ## Setup
24
+
25
+ Create `config.ru` in the root folder of your app.
26
+
27
+ ```ruby
28
+ require 'lapin'
29
+
30
+ Lapin::Config.amqp_url = 'amqp://guest:guest@localhost/vhost'
31
+ Lapin::Config.exchange = 'amq.direct'
32
+ Lapin::Config.logging = true if ENV['RACK_ENV'] == 'development'
33
+ Lapin.options.quiet = false
34
+
35
+ run Lapin::Server
36
+ ```
37
+
38
+ ## Usage
39
+
40
+ Just do the following to start `Lapin::Server` using [thin](https://github.com/macournoyer/thin/) for the web server.
41
+
42
+ ```bash
43
+ $ thin start -R config.ru
44
+ ```
45
+
46
+ Or, for [passenger](http://www.modrails.com/) (standalone version),
47
+
48
+ ```bash
49
+ $ passenger start -R config.ru
50
+ ```
51
+
52
+ To handle a POST request like below, you need a running RabbitMQ server according to the `Lapin::Config.amqp_url` option beforehand.
53
+
54
+ ```bash
55
+ $ curl -v \
56
+ > -H "Accept: application/json" -H "Content-type: application/json" -H "X-ROUTING-KEY: amqp.giraffi" \
57
+ > -X POST -d '{"user":{"name":"foo", "email":"hoge@example.com"}}' \
58
+ > http://localhost:3000/publish.json
59
+ ```
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+
5
+ desc "Default: run unit tests"
6
+ task :default => :test
7
+
8
+ desc "Test Lapin"
9
+ Rake::TestTask.new(:test) do |test|
10
+ test.libs << 'lib' << 'test'
11
+ test.pattern = 'test/**/*_test.rb'
12
+ test.verbose = true
13
+ end
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ require "amqp"
5
+
6
+ AMQP.start(host: 'localhost') do |conn|
7
+ channel = AMQP::Channel.new(conn)
8
+ exchange = channel.direct('amqp.direct')
9
+ queue = channel.queue("", exclusive: true)
10
+ queue.bind(exchange, routing_key: 'amqp.giraffi')
11
+
12
+ Signal.trap("INT") do
13
+ conn.close do
14
+ EM.stop { exit }
15
+ end
16
+ end
17
+
18
+ puts " [*] Waiting for logs. To exit press CTRL+C"
19
+
20
+ i = 1
21
+ queue.subscribe do |header, payload|
22
+ #puts " [x] #{header}:#{payload}"
23
+ puts " [x] #{header} ----- #{i}"
24
+ i += 1
25
+ end
26
+ end
data/lapin.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lapin/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "lapin"
8
+ s.version = Lapin::VERSION
9
+ s.authors = ["azukiwasher"]
10
+ s.email = ["azukiwasher@higanworks.com"]
11
+ s.homepage = "https://github.com/giraffi/lapin.git"
12
+ s.summary = %q{A sinatra-based app that redirects data received via HTTP to an AMQP message broker}
13
+ s.description = %q{A sinatra-based app that redirects data received via HTTP to an AMQP message broker.}
14
+
15
+ s.rubyforge_project = "lapin"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency "rack", "~> 1.4.0"
23
+ s.add_dependency "bunny", "~> 0.8.0"
24
+ s.add_dependency "multi_json", "~> 1.3.0"
25
+ s.add_dependency "sinatra", "~> 1.3.0"
26
+
27
+ s.add_development_dependency "rake"
28
+ s.add_development_dependency "yajl-ruby"
29
+ s.add_development_dependency "rack-test"
30
+ s.add_development_dependency "shoulda"
31
+ s.add_development_dependency "simplecov"
32
+ s.add_development_dependency "mocha"
33
+ s.add_development_dependency "thin"
34
+ end
@@ -0,0 +1,43 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'uri'
3
+
4
+ module Lapin
5
+ class Config
6
+
7
+ class << self
8
+ attr_accessor :amqp_url, :vhost
9
+ attr_accessor :exchange, :routing_key
10
+ attr_accessor :logging
11
+
12
+ def amqp_config
13
+ uri = URI.parse(amqp_url)
14
+ {
15
+ :user => uri.user,
16
+ :pass => uri.password,
17
+ :host => uri.host,
18
+ :port => (uri.port || 5672),
19
+ :vhost => @vhost || uri.path ,
20
+ :logging => @logging || false
21
+ }
22
+ rescue Object => e
23
+ raise "Invalid AMQP url: #{uri.inspect} (#{e})"
24
+ end
25
+
26
+ def amqp_url
27
+ @amqp_url ||= ENV["AMQP_URL"] || "amqp://guest:guest@localhost"
28
+ end
29
+
30
+ def vhost
31
+ @vhost
32
+ end
33
+
34
+ def exchange
35
+ @exchange ||= "amq.direct"
36
+ end
37
+
38
+ def routing_key
39
+ @routing_key ||= "*"
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,83 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'sinatra/base'
3
+ require 'multi_json'
4
+
5
+ module Lapin
6
+ class Server < Sinatra::Base
7
+
8
+ # Reduce the amount of data transferred
9
+ # from the app.
10
+ use Rack::Deflater
11
+
12
+ set :raise_error => false
13
+ set :show_exception => false
14
+
15
+ helpers do
16
+ # define helper methods
17
+ def json_status(code, reason)
18
+ content_type "application/json"
19
+ status code
20
+ MultiJson.encode({:status => code, :reason => reason})
21
+ end
22
+
23
+ def validate_json(data)
24
+ begin
25
+ if MultiJson.respond_to?(:adapter)
26
+ MultiJson.load(data)
27
+ else
28
+ MultiJson.decode(data)
29
+ end
30
+ return true
31
+ rescue
32
+ return false
33
+ end
34
+ end
35
+ end
36
+
37
+ error do
38
+ e = request.env['sinatra.error']
39
+ Lapin.log "Error: #{e.class}: #{e.message}"
40
+ json_status 412, e.message
41
+ end
42
+
43
+ # Create an exchange from the current AMQP connection.
44
+ def exchange
45
+ @exchange ||= Lapin.client.exchange(Config.exchange, :type => 'direct')
46
+ end
47
+
48
+ # Recieve post data, validate and redirect it
49
+ # to an AMQP broker.
50
+ post '/publish.json' do
51
+ content_type :json
52
+
53
+ begin
54
+ # Set routing key from headers
55
+ Config.routing_key = request.env['HTTP_X_ROUTING_KEY']
56
+
57
+ # Set payload from bod
58
+ payload = request.body.read
59
+
60
+ if validate_json(payload)
61
+ exchange.publish(payload, :key => Config.routing_key)
62
+
63
+ # No Content
64
+ status 204
65
+ else
66
+ # Bad request
67
+ status 400
68
+ end
69
+ rescue Errno::ECONNRESET => e
70
+ Lapin.log "Error: #{e.class}: #{e.message}"
71
+ Lapin.client = nil
72
+
73
+ # Bad gateway
74
+ json_status 502, e.message
75
+ rescue Bunny::ConnectionError, Bunny::ServerDownError => e
76
+ Lapin.log "Error: #{e.class}: #{e.message}"
77
+
78
+ # Bad gateway
79
+ json_status 502, e.message
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Lapin
4
+ VERSION = "0.1.2"
5
+ end
data/lib/lapin.rb ADDED
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ ENV['RACK_ENV'] ||= 'development'
5
+
6
+ require 'bunny'
7
+ require 'lapin/config'
8
+ require 'lapin/server'
9
+
10
+ module Lapin
11
+ class << self
12
+ attr_accessor :options
13
+ attr_accessor :client
14
+
15
+ def options
16
+ @options ||= Struct.new(:debug, :quiet).new
17
+ @options.debug ||= false
18
+ @options.quiet ||= false
19
+ @options
20
+ end
21
+
22
+ def client
23
+ unless @client
24
+ c = ::Bunny.new(Config.amqp_config)
25
+ c.start
26
+ @client = c
27
+ end
28
+ @client
29
+ end
30
+
31
+ def log(msg)
32
+ unless options.quiet
33
+ time = Time.now.strftime('%H:%M:%S %Y-%m-%d')
34
+ puts "** [#{time}] #$$: #{msg}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+
4
+ class ConfigTest < Test::Unit::TestCase
5
+ context 'AMQP URL parsing' do
6
+ setup do
7
+ Lapin::Config.amqp_url = 'amqp://guest:guest@localhost:5671/my-vhost'
8
+ end
9
+
10
+ should 'handle all options properly' do
11
+ assert_equal Lapin::Config.amqp_config[:user], 'guest'
12
+ assert_equal Lapin::Config.amqp_config[:pass], 'guest'
13
+ assert_equal Lapin::Config.amqp_config[:host], 'localhost'
14
+ assert_equal Lapin::Config.amqp_config[:port], 5671
15
+ assert_equal Lapin::Config.amqp_config[:vhost], '/my-vhost'
16
+ assert_equal Lapin::Config.amqp_config[:logging], false
17
+ end
18
+
19
+ should 'overwrite vhost by the vhost attribute' do
20
+ Lapin::Config.vhost = 'your-vhost'
21
+ assert_equal Lapin::Config.amqp_config[:vhost], 'your-vhost'
22
+ end
23
+
24
+ should 'set routing key to * when x-routing-key is nil' do
25
+ Lapin::Config.routing_key = nil
26
+ assert_equal "*", Lapin::Config.routing_key
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+ require 'mocha'
4
+
5
+ class ServerTest < Test::Unit::TestCase
6
+ include Rack::Test::Methods
7
+
8
+ def app
9
+ Lapin::Server.new
10
+ end
11
+
12
+ context "POST /publish.json" do
13
+ setup do
14
+ @payload = "{\"data\": \"sample\"}"
15
+ Lapin::Config.amqp_url = 'amqp://guest:guest@localhost/'
16
+ end
17
+
18
+ teardown do
19
+ @payload = nil
20
+ end
21
+
22
+ should "return 204 with an appropriate request" do
23
+ m = mock()
24
+ Bunny.expects(:new).with(Lapin::Config.amqp_config).returns(m)
25
+ m.expects(:start)
26
+ e = mock("exchange")
27
+ m.stubs(:exchange).with(Lapin::Config.exchange, {:type => 'direct'}).returns(e)
28
+ e.stubs(:publish).with(@payload, {:key => 'giraffi.nagios'})
29
+
30
+ post "/publish.json", @payload, {"CONTENT_TYPE" => "application/json", "HTTP_X_ROUTING_KEY" => "giraffi.nagios"}
31
+ assert_equal last_request.body.string, @payload
32
+ assert_equal last_response.status, 204
33
+ end
34
+
35
+ should "return 400 with a malformed request body" do
36
+ post "/publish.json", "malformed_body", {"CONTENT_TYPE" => "text/plain"}
37
+ assert_equal last_response.status, 400
38
+ end
39
+ end
40
+
41
+ context "Error handling" do
42
+ setup do
43
+ Lapin.options.quiet = true
44
+ end
45
+
46
+ should "return 412 when the sinatra.error is catched" do
47
+ m = mock()
48
+ Bunny.expects(:new).with(Lapin::Config.amqp_config).returns(m)
49
+ m.stubs(:start).raises(Exception.new)
50
+
51
+ post "/publish.json", @payload, {"CONTENT_TYPE" => "application/json"}
52
+ assert_equal last_response.status, 412
53
+ end
54
+
55
+ should "return 502 when the connection is reset by peer" do
56
+ m = mock()
57
+ Bunny.expects(:new).with(Lapin::Config.amqp_config).returns(m)
58
+ m.stubs(:start).raises(Errno::ECONNRESET.new)
59
+
60
+ post "/publish.json", @payload, {"CONTENT_TYPE" => "application/json"}
61
+ assert_equal last_response.status, 502
62
+ end
63
+
64
+ should "return 502 when the no connection and no socket are found" do
65
+ m = mock()
66
+ Bunny.expects(:new).with(Lapin::Config.amqp_config).returns(m)
67
+ m.stubs(:start).raises(Bunny::ConnectionError.new)
68
+
69
+ post "/publish.json", @payload, {"CONTENT_TYPE" => "application/json"}
70
+ assert_equal last_response.status, 502
71
+ end
72
+
73
+ should "return 502 when the broken pipe is catched" do
74
+ m = mock()
75
+ Bunny.expects(:new).with(Lapin::Config.amqp_config).returns(m)
76
+ m.stubs(:start).raises(Bunny::ServerDownError.new)
77
+
78
+ post "/publish.json", @payload, {"CONTENT_TYPE" => "application/json"}
79
+ assert_equal last_response.status, 502
80
+ end
81
+
82
+ end
83
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+
6
+ # Configure Rack Environment
7
+ ENV['RACK_ENV'] = "test"
8
+
9
+ begin
10
+ Bundler.setup(:default, :development)
11
+ rescue Bundler::BundleError => e
12
+ $stderr.puts e.message
13
+ $stderr.puts "Run `bundle install` to install missing gems"
14
+ exit e.status_code
15
+ end
16
+
17
+ require 'test/unit'
18
+ require 'shoulda'
19
+ require 'rack/test'
20
+ require 'simplecov'
21
+ SimpleCov.start
22
+
23
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
24
+ require 'lapin'
25
+
26
+ class Test::Unit::TestCase
27
+ end
metadata ADDED
@@ -0,0 +1,241 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lapin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - azukiwasher
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.4.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.4.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: bunny
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 0.8.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.8.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: multi_json
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.3.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.3.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: sinatra
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.3.0
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.3.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: yajl-ruby
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rack-test
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: shoulda
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: simplecov
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: mocha
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: thin
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ description: A sinatra-based app that redirects data received via HTTP to an AMQP
191
+ message broker.
192
+ email:
193
+ - azukiwasher@higanworks.com
194
+ executables: []
195
+ extensions: []
196
+ extra_rdoc_files: []
197
+ files:
198
+ - .gitignore
199
+ - .travis.yml
200
+ - Gemfile
201
+ - README.md
202
+ - Rakefile
203
+ - examples/subscriber.rb
204
+ - lapin.gemspec
205
+ - lib/lapin.rb
206
+ - lib/lapin/config.rb
207
+ - lib/lapin/server.rb
208
+ - lib/lapin/version.rb
209
+ - test/config_test.rb
210
+ - test/server_test.rb
211
+ - test/test_helper.rb
212
+ homepage: https://github.com/giraffi/lapin.git
213
+ licenses: []
214
+ post_install_message:
215
+ rdoc_options: []
216
+ require_paths:
217
+ - lib
218
+ required_ruby_version: !ruby/object:Gem::Requirement
219
+ none: false
220
+ requirements:
221
+ - - ! '>='
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ required_rubygems_version: !ruby/object:Gem::Requirement
225
+ none: false
226
+ requirements:
227
+ - - ! '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ requirements: []
231
+ rubyforge_project: lapin
232
+ rubygems_version: 1.8.25
233
+ signing_key:
234
+ specification_version: 3
235
+ summary: A sinatra-based app that redirects data received via HTTP to an AMQP message
236
+ broker
237
+ test_files:
238
+ - test/config_test.rb
239
+ - test/server_test.rb
240
+ - test/test_helper.rb
241
+ has_rdoc: