bunnicula 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +119 -0
- data/Rakefile +0 -1
- data/bunnicula.gemspec +5 -7
- data/config/arguments.rb +69 -70
- data/config/boot.rb +60 -59
- data/config/environment.rb +34 -33
- data/lib/bunnicula/version.rb +1 -1
- data/libexec/bunnicula-daemon.rb +0 -1
- metadata +13 -29
- data/README +0 -30
data/README.rdoc
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
== Overview
|
2
|
+
Bunnicula is a simple AMQP relay implemented as a ruby daemon (a-la {daemon-kit}[http://github.com/kennethkalmer/daemon-kit]). Similar in intent to {shovel}[http://www.lshift.net/blog/2010/02/01/rabbitmq-shovel-message-relocation-equipment],
|
3
|
+
Bunnicula is intended to enable the common messaging scenario where services and applications publish messages to an AMQP broker on the local LAN for speed and reliability which are then subsequently relayed to a remote AMQP instance by a relay process which isn't so irritable as message producers tend to be when it comes to network speed and reliability.
|
4
|
+
|
5
|
+
Bunnicula can be configured via configuration file (a Ruby DSL) or, for most common configurations, through command line arguments.
|
6
|
+
|
7
|
+
== Install
|
8
|
+
|
9
|
+
Install the gem with:
|
10
|
+
|
11
|
+
gem install bunnicula
|
12
|
+
or
|
13
|
+
sudo gem install bunnicula
|
14
|
+
|
15
|
+
== Quick Start
|
16
|
+
relay messages published to the direct exchange 'my.exchange' on localhost to the direct exchange 'my.exchange' on my.remote.broker
|
17
|
+
|
18
|
+
bunnicula start --target my.remote.broker --relay my.exchange
|
19
|
+
|
20
|
+
|
21
|
+
== Motivation
|
22
|
+
While LShift maintains a relay called "Shovel" that is tightly integrated with RabbitMQ, the setup and configuration of that plugin required building specific versions of the broker and other acrobatic feats that proved too much for my feeble brain (and appetite for deployment complexity).
|
23
|
+
|
24
|
+
== Approach
|
25
|
+
Bunnicula uses the AMQP gem (which in turn runs on Event Machine) to create a (optionally durable) queue bound to each configured message exchange. When it receives a message on this exchange, it uses Bunny, a synchronous AMQP library, to immediately publish that message to a target AMQP broker and (optionally) ack the original message once this is successful.
|
26
|
+
By default, Bunnicula will re-use the configuration details for the source exchange (exchange name, durability and exchange type) but can be configured to publish to alternate exchanges as desired.
|
27
|
+
|
28
|
+
|
29
|
+
== Suck some Blood(y messages) already
|
30
|
+
As a daemon-kit daemon, bunnicula understands the following commands
|
31
|
+
* run - run as a regular script, i.e. do not daemonize
|
32
|
+
* start - start the daemon
|
33
|
+
* stop - stop the daemon
|
34
|
+
|
35
|
+
Note: when specifying amqp brokers, either on the command line or from the DSL, Bunnicula uses a URI as a connection string.
|
36
|
+
So, amqp://usr:pwd@my.broker/my_vhost:12345 will result in Bunnicula connecting to my.broker on port 12345
|
37
|
+
with the username 'usr' the password 'pwd' and choosing vhost /my_vhost. All of the options except the host name can be excluded in favor of the
|
38
|
+
standard defaults. If you just have a hostname to specify, you don't need the uri syntax, and can just specify the hostname as is, such as "my_source_broker" or "192.168.0.71"
|
39
|
+
|
40
|
+
|
41
|
+
== From the command line
|
42
|
+
Feel free to type bunnicula --help to get a full list of options that may or may not have adequate documentation of usage.
|
43
|
+
|
44
|
+
Relay messages published to a topic exchange named an.exchange.to.replay on amqp://my_source_broker to an identical exchange on a_target_broker:
|
45
|
+
|
46
|
+
bunnicula run --source my_source_broker --target a_target_broker --relay an.exchange.to.relay --type topic --log /var/log/bunnicula
|
47
|
+
|
48
|
+
Relay messages published to a topic exchange named a.source.exchange on my_source_broker to a fanout exchange named a.target.exchange on a_target_broker
|
49
|
+
|
50
|
+
bunnicula run --source my_source_broker --target a_target_broker --relay a.source.exchange --type topic --to a.target.exchange --type fanout --log /path/to/my/log
|
51
|
+
|
52
|
+
You can specify as many --target flags as you like, each indicating a single target AMQP broker, and you can in turn specify as many --relay flags as you like for each --target.
|
53
|
+
Bunnicula currently supports listening to a single source broker per process.
|
54
|
+
|
55
|
+
== Configuring Bunnicula via the Ruby DSL
|
56
|
+
You can optionally configure bunnicula using a Ruby DSL. If you have a complex configuration or you need a feature not available from the command line (aka message filtering) you can
|
57
|
+
select the ruby configuration file you want via the --relay_file flag.
|
58
|
+
|
59
|
+
bunnicula run --relay_file MyRelayFile.rb --log /path/to/my/log
|
60
|
+
|
61
|
+
A Relay file will look something like what you see below. In keeping with the vampire rabbit theme evoked by the name of the library, the DSL may be a little colorful for a few of you with your pocket protectors on too tight. For those folks, all the fun has been aliased out of the DSL so your configuration file can look nice and prudish as you please, but you'll need to figure out how from the source.
|
62
|
+
|
63
|
+
Bunnicula.bite {
|
64
|
+
|
65
|
+
#Bunnicula will listen for incoming messages on the following host:
|
66
|
+
victim "amqp://a:b@a-host:12345/tada"
|
67
|
+
|
68
|
+
#This sets up a target broker
|
69
|
+
transfusion_to "amqp://username:password@example.com:12345" do
|
70
|
+
|
71
|
+
#Relay all messages published to "an.exchange.name", using the default type of 'direct', durable=true, ack=true
|
72
|
+
relay "an.exchange.name"
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
#A second target broker
|
77
|
+
transfusion_to {
|
78
|
+
|
79
|
+
#Specify connection settings the long way
|
80
|
+
host "target_server_1"
|
81
|
+
port 12345
|
82
|
+
username "a"
|
83
|
+
password "b"
|
84
|
+
vhost "tada"
|
85
|
+
|
86
|
+
#Set up a relay with a destination exchange that varies its configuration from the source exchange
|
87
|
+
relay do
|
88
|
+
from "test_source_exchange", :type=>:topic, :durable=>true, :ack=>true
|
89
|
+
to "test_destination_exchange", :durable=>true
|
90
|
+
end
|
91
|
+
|
92
|
+
#Set up a group of relays that share a common configuration. All exchange settings specified in this way
|
93
|
+
#will be mirrored on the destination broker.
|
94
|
+
relay "another_exchange",
|
95
|
+
"and_another_exchange",
|
96
|
+
"and_even_another",
|
97
|
+
:type=>:fanout,
|
98
|
+
:durable=>false,
|
99
|
+
:ack=>true
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
The DSL is pretty self explanatory, but keep in mind you can have only one victim, but as many transfusions (which represent a target server) and relays per transfusion as you please.
|
104
|
+
In all cases, the plethora of individual host, port, username etc.. command specifying connection options can be replaced by passing a URI of the structure described previously as an argument
|
105
|
+
to the command itself.
|
106
|
+
|
107
|
+
== Other Resources
|
108
|
+
A wealth of information on Bunnicula can be found {here}[http://www.google.com/images?q=bunnicula]
|
109
|
+
|
110
|
+
== Limitations
|
111
|
+
* None. Bunnicula is 100% perfect in every way. If you find a problem, you are probably confused and may be high or having a stroke. My first recommendation would be to seek medical attention or check yourself into rehab. If however you insist in persisting in your delusion that Bunnicula has a limitation, or perhaps even more preposterously has made a mistake, you can use the issue tracker at which point I will confirm your insanity and draw on my vast knowledge of shamanistic medicine to recommend an appropriate treatment for your ailment.
|
112
|
+
|
113
|
+
== Bugs/Issues
|
114
|
+
Please report them {on github}[http://github.com/plasticlizard/bunnicula/issues].
|
115
|
+
|
116
|
+
== Todo
|
117
|
+
Per-relay message filtering based on a regex or a code block has been implemented but not tested or documented. I don't really have a use case for such a feature yet in my own
|
118
|
+
systems. I should probably remove it until I do, but I didn't. So if this is something that would be useful, put it in the issue tracker
|
119
|
+
and I'll finish documenting and testing it. If you want to use it like a cowboy, see relay.rb
|
data/Rakefile
CHANGED
data/bunnicula.gemspec
CHANGED
@@ -5,21 +5,22 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{bunnicula}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nathan Stults"]
|
12
|
-
s.date = %q{2010-07-
|
12
|
+
s.date = %q{2010-07-12}
|
13
13
|
s.default_executable = %q{bunnicula}
|
14
14
|
s.description = %q{A very simple relay for moving messages from a local broker to a remote broker}
|
15
15
|
s.email = %q{hereiam@sonic.net}
|
16
16
|
s.executables = ["bunnicula"]
|
17
17
|
s.extra_rdoc_files = [
|
18
|
-
"LICENSE.txt"
|
18
|
+
"LICENSE.txt",
|
19
|
+
"README.rdoc"
|
19
20
|
]
|
20
21
|
s.files = [
|
21
22
|
"LICENSE.txt",
|
22
|
-
"README",
|
23
|
+
"README.rdoc",
|
23
24
|
"Rakefile",
|
24
25
|
"Relayfile",
|
25
26
|
"bin/bunnicula",
|
@@ -65,18 +66,15 @@ Gem::Specification.new do |s|
|
|
65
66
|
s.specification_version = 3
|
66
67
|
|
67
68
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
68
|
-
s.add_runtime_dependency(%q<daemon-kit>, ["= 0.1.7.12"])
|
69
69
|
s.add_runtime_dependency(%q<bunny>, ["= 0.6.0"])
|
70
70
|
s.add_runtime_dependency(%q<amqp>, ["= 0.6.7"])
|
71
71
|
s.add_development_dependency(%q<shoulda>, ["= 2.11.1"])
|
72
72
|
else
|
73
|
-
s.add_dependency(%q<daemon-kit>, ["= 0.1.7.12"])
|
74
73
|
s.add_dependency(%q<bunny>, ["= 0.6.0"])
|
75
74
|
s.add_dependency(%q<amqp>, ["= 0.6.7"])
|
76
75
|
s.add_dependency(%q<shoulda>, ["= 2.11.1"])
|
77
76
|
end
|
78
77
|
else
|
79
|
-
s.add_dependency(%q<daemon-kit>, ["= 0.1.7.12"])
|
80
78
|
s.add_dependency(%q<bunny>, ["= 0.6.0"])
|
81
79
|
s.add_dependency(%q<amqp>, ["= 0.6.7"])
|
82
80
|
s.add_dependency(%q<shoulda>, ["= 2.11.1"])
|
data/config/arguments.rb
CHANGED
@@ -1,70 +1,69 @@
|
|
1
|
-
# Argument handling for your daemon is configured here.
|
2
|
-
#
|
3
|
-
# You have access to two variables when this file is
|
4
|
-
# parsed. The first is +opts+, which is the object yielded from
|
5
|
-
# +OptionParser.new+, the second is +@options+ which is a standard
|
6
|
-
# Ruby hash that is later accessible through
|
7
|
-
# DaemonKit.arguments.options and can be used in your daemon process.
|
8
|
-
|
9
|
-
# Here is an example:
|
10
|
-
# opts.on('-f', '--foo FOO', 'Set foo') do |foo|
|
11
|
-
# @options[:foo] = foo
|
12
|
-
# end
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
@options[:targets]
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
@options[:targets][-1][:relays]
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
relay =
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
relay
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
relay
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
relay
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
1
|
+
# Argument handling for your daemon is configured here.
|
2
|
+
#
|
3
|
+
# You have access to two variables when this file is
|
4
|
+
# parsed. The first is +opts+, which is the object yielded from
|
5
|
+
# +OptionParser.new+, the second is +@options+ which is a standard
|
6
|
+
# Ruby hash that is later accessible through
|
7
|
+
# DaemonKit.arguments.options and can be used in your daemon process.
|
8
|
+
|
9
|
+
# Here is an example:
|
10
|
+
# opts.on('-f', '--foo FOO', 'Set foo') do |foo|
|
11
|
+
# @options[:foo] = foo
|
12
|
+
# end
|
13
|
+
|
14
|
+
opts.on('--relay_file PATH') do |config|
|
15
|
+
@options[:configuration_file] = config
|
16
|
+
end
|
17
|
+
|
18
|
+
opts.on('-s SOURCE','--source SOURCE') do |source_uri|
|
19
|
+
@options[:source_uri] = source_uri
|
20
|
+
end
|
21
|
+
|
22
|
+
opts.on('-t TARGET','--target TARGET') do |target_uri|
|
23
|
+
@options[:targets] ||= []
|
24
|
+
@options[:targets] << {:target_uri=>target_uri}
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on('-r RELAY', '--relay RELAY') do |relay|
|
28
|
+
raise "You specified a RELAY parameter, but did not first specify a TARGET parameter. Please indicate the target AMQP server in the form of -t TARGET or --target TARGET" unless @options[:targets]
|
29
|
+
@options[:targets][-1][:relays] ||= []
|
30
|
+
@options[:targets][-1][:relays] << {:from=>relay}
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.on('-y TO', '--to TO') do |to|
|
34
|
+
puts to
|
35
|
+
raise "You specified a RELAY_TO parameter, but did not first specify a RELAY parameter. Please indicate the target AMQP server in the form of -r RELAY or --relay RELAY" unless @options[:targets] && @options[:targets][-1][:relays]
|
36
|
+
relay = @options[:targets][-1][:relays][-1]
|
37
|
+
relay[:to] = to
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.on('-x TYPE', '--type TYPE') do |type|
|
41
|
+
raise "You specified a TYPE parameter, but did not first specify a RELAY parameter. Please indicate the target AMQP server in the form of -r RELAY or --relay RELAY" unless @options[:targets] && @options[:targets][-1][:relays]
|
42
|
+
relay = @options[:targets][-1][:relays][-1]
|
43
|
+
if relay[:to]
|
44
|
+
relay[:to_type] = type.downcase.to_sym
|
45
|
+
else
|
46
|
+
relay[:from_type] = type.downcase.to_sym
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
opts.on('-d','--durable') do |durable|
|
51
|
+
raise "You specified a DURABLE parameter, but did not first specify a RELAY parameter. Please indicate the target AMQP server in the form of -r RELAY or --relay RELAY" unless @options[:targets] && @options[:targets][-1][:relays]
|
52
|
+
relay = @options[:targets][-1][:relays][-1]
|
53
|
+
if relay[:to]
|
54
|
+
relay[:to_durable] = durable
|
55
|
+
else
|
56
|
+
relay[:from_durable] = durable
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
opts.on('-a','--ack') do |ack|
|
61
|
+
raise "You specified a ACK parameter, but did not first specify a RELAY parameter. Please indicate the target AMQP server in the form of -r RELAY or --relay RELAY" unless @options[:targets] && @options[:targets][-1][:relays]
|
62
|
+
relay = @options[:targets][-1][:relays][-1]
|
63
|
+
if relay[:to]
|
64
|
+
relay[:to_ack] = ack
|
65
|
+
else
|
66
|
+
relay[:from_ack] = ack
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
data/config/boot.rb
CHANGED
@@ -1,59 +1,60 @@
|
|
1
|
-
# Don't change this file!
|
2
|
-
# Configure your daemon in config/environment.rb
|
3
|
-
|
4
|
-
DAEMON_ROOT = "#{File.expand_path(File.dirname(__FILE__))}/.." unless defined?( DAEMON_ROOT )
|
5
|
-
|
6
|
-
module DaemonKit
|
7
|
-
class << self
|
8
|
-
def boot!
|
9
|
-
unless booted?
|
10
|
-
pick_boot.run
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def booted?
|
15
|
-
defined? DaemonKit::Initializer
|
16
|
-
end
|
17
|
-
|
18
|
-
def pick_boot
|
19
|
-
(vendor_kit? ? VendorBoot : GemBoot).new
|
20
|
-
end
|
21
|
-
|
22
|
-
def vendor_kit?
|
23
|
-
File.exists?( "#{DAEMON_ROOT}/vendor/daemon_kit" )
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class Boot
|
28
|
-
def run
|
29
|
-
load_initializer
|
30
|
-
DaemonKit::
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
|
1
|
+
# Don't change this file!
|
2
|
+
# Configure your daemon in config/environment.rb
|
3
|
+
|
4
|
+
DAEMON_ROOT = "#{File.expand_path(File.dirname(__FILE__))}/.." unless defined?( DAEMON_ROOT )
|
5
|
+
|
6
|
+
module DaemonKit
|
7
|
+
class << self
|
8
|
+
def boot!
|
9
|
+
unless booted?
|
10
|
+
pick_boot.run
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def booted?
|
15
|
+
defined? DaemonKit::Initializer
|
16
|
+
end
|
17
|
+
|
18
|
+
def pick_boot
|
19
|
+
(vendor_kit? ? VendorBoot : GemBoot).new
|
20
|
+
end
|
21
|
+
|
22
|
+
def vendor_kit?
|
23
|
+
File.exists?( "#{DAEMON_ROOT}/vendor/daemon_kit/daemon_kit" )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Boot
|
28
|
+
def run
|
29
|
+
load_initializer
|
30
|
+
DaemonKit::Arguments.parser_available = true
|
31
|
+
DaemonKit::Initializer.run
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class VendorBoot < Boot
|
36
|
+
def load_initializer
|
37
|
+
require "#{DAEMON_ROOT}/vendor/daemon_kit/daemon_kit/lib/daemon_kit/initializer"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class GemBoot < Boot
|
42
|
+
def load_initializer
|
43
|
+
begin
|
44
|
+
gem 'daemon-kit'
|
45
|
+
require 'daemon_kit/initializer'
|
46
|
+
rescue Gem::LoadError => e
|
47
|
+
msg = <<EOF
|
48
|
+
You are missing the daemon-kit gem. Please install the following gems:
|
49
|
+
|
50
|
+
* Stable - sudo gem install daemon-kit
|
51
|
+
|
52
|
+
EOF
|
53
|
+
$stderr.puts msg
|
54
|
+
exit 1
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
DaemonKit.boot!
|
data/config/environment.rb
CHANGED
@@ -1,33 +1,34 @@
|
|
1
|
-
# Be sure to restart your daemon when you modify this file
|
2
|
-
|
3
|
-
# Uncomment below to force your daemon into production mode
|
4
|
-
ENV['DAEMON_ENV'] ||= 'production'
|
5
|
-
|
6
|
-
# Boot up
|
7
|
-
require "rubygems"
|
8
|
-
|
9
|
-
begin
|
10
|
-
require 'amqp'
|
11
|
-
require 'mq'
|
12
|
-
rescue LoadError
|
13
|
-
$stderr.puts "Missing amqp gem. Please run 'gem install amqp'."
|
14
|
-
exit 1
|
15
|
-
end
|
16
|
-
|
17
|
-
require File.join(File.dirname(__FILE__), 'boot')
|
18
|
-
|
19
|
-
DaemonKit::
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
#
|
29
|
-
|
30
|
-
|
31
|
-
#
|
32
|
-
# config.safety_net.
|
33
|
-
|
1
|
+
# Be sure to restart your daemon when you modify this file
|
2
|
+
|
3
|
+
# Uncomment below to force your daemon into production mode
|
4
|
+
ENV['DAEMON_ENV'] ||= 'production'
|
5
|
+
|
6
|
+
# Boot up
|
7
|
+
require "rubygems"
|
8
|
+
|
9
|
+
begin
|
10
|
+
require 'amqp'
|
11
|
+
require 'mq'
|
12
|
+
rescue LoadError
|
13
|
+
$stderr.puts "Missing amqp gem. Please run 'gem install amqp'."
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
|
17
|
+
require File.join(File.dirname(__FILE__), 'boot')
|
18
|
+
|
19
|
+
DaemonKit::Arguments.parser_available = true
|
20
|
+
DaemonKit::Initializer.run do |config|
|
21
|
+
|
22
|
+
# The name of the daemon as reported by process monitoring tools
|
23
|
+
config.daemon_name = 'bunnicula'
|
24
|
+
|
25
|
+
# Force the daemon to be killed after X seconds from asking it to
|
26
|
+
# config.force_kill_wait = 30
|
27
|
+
|
28
|
+
# Log backraces when a thread/daemon dies (Recommended)
|
29
|
+
# config.backtraces = true
|
30
|
+
|
31
|
+
# Configure the safety net (see DaemonKit::Safety)
|
32
|
+
# config.safety_net.handler = :mail # (or :hoptoad )
|
33
|
+
# config.safety_net.mail.host = 'localhost'
|
34
|
+
end
|
data/lib/bunnicula/version.rb
CHANGED
data/libexec/bunnicula-daemon.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bunnicula
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Nathan Stults
|
@@ -15,30 +15,13 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-07-
|
18
|
+
date: 2010-07-12 00:00:00 -07:00
|
19
19
|
default_executable: bunnicula
|
20
20
|
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
22
|
-
name: daemon-kit
|
23
|
-
prerelease: false
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - "="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 67
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 1
|
33
|
-
- 7
|
34
|
-
- 12
|
35
|
-
version: 0.1.7.12
|
36
|
-
type: :runtime
|
37
|
-
version_requirements: *id001
|
38
21
|
- !ruby/object:Gem::Dependency
|
39
22
|
name: bunny
|
40
23
|
prerelease: false
|
41
|
-
requirement: &
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
42
25
|
none: false
|
43
26
|
requirements:
|
44
27
|
- - "="
|
@@ -50,11 +33,11 @@ dependencies:
|
|
50
33
|
- 0
|
51
34
|
version: 0.6.0
|
52
35
|
type: :runtime
|
53
|
-
version_requirements: *
|
36
|
+
version_requirements: *id001
|
54
37
|
- !ruby/object:Gem::Dependency
|
55
38
|
name: amqp
|
56
39
|
prerelease: false
|
57
|
-
requirement: &
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
58
41
|
none: false
|
59
42
|
requirements:
|
60
43
|
- - "="
|
@@ -66,11 +49,11 @@ dependencies:
|
|
66
49
|
- 7
|
67
50
|
version: 0.6.7
|
68
51
|
type: :runtime
|
69
|
-
version_requirements: *
|
52
|
+
version_requirements: *id002
|
70
53
|
- !ruby/object:Gem::Dependency
|
71
54
|
name: shoulda
|
72
55
|
prerelease: false
|
73
|
-
requirement: &
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
74
57
|
none: false
|
75
58
|
requirements:
|
76
59
|
- - "="
|
@@ -82,7 +65,7 @@ dependencies:
|
|
82
65
|
- 1
|
83
66
|
version: 2.11.1
|
84
67
|
type: :development
|
85
|
-
version_requirements: *
|
68
|
+
version_requirements: *id003
|
86
69
|
description: A very simple relay for moving messages from a local broker to a remote broker
|
87
70
|
email: hereiam@sonic.net
|
88
71
|
executables:
|
@@ -91,9 +74,10 @@ extensions: []
|
|
91
74
|
|
92
75
|
extra_rdoc_files:
|
93
76
|
- LICENSE.txt
|
77
|
+
- README.rdoc
|
94
78
|
files:
|
95
79
|
- LICENSE.txt
|
96
|
-
- README
|
80
|
+
- README.rdoc
|
97
81
|
- Rakefile
|
98
82
|
- Relayfile
|
99
83
|
- bin/bunnicula
|
data/README
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
== Overview
|
2
|
-
|
3
|
-
== Motivation
|
4
|
-
|
5
|
-
== Approach
|
6
|
-
|
7
|
-
== Install
|
8
|
-
|
9
|
-
Install the gem with:
|
10
|
-
|
11
|
-
gem install bunnicula
|
12
|
-
or
|
13
|
-
sudo gem install bunnicula
|
14
|
-
|
15
|
-
|
16
|
-
== An Example
|
17
|
-
|
18
|
-
== Limitations
|
19
|
-
* Cubicle cannot currently cause child documents to be emitted in the map reduce. This is a pretty big limitation, and will be resolved shortly.
|
20
|
-
* Documentation is non-existent. This is being worked on (head that one before?)
|
21
|
-
* Test coverage is OK, but the tests could be better organized
|
22
|
-
* Code needs to be modularized a bit, main classes are pretty hairy at the moment
|
23
|
-
|
24
|
-
|
25
|
-
== Bugs/Issues
|
26
|
-
Please report them {on github}[http://github.com/plasticlizard/bunnicula/issues].
|
27
|
-
|
28
|
-
== Links
|
29
|
-
|
30
|
-
== Todo
|