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 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
@@ -28,7 +28,6 @@ begin
28
28
  s.extra_rdoc_files = ["README.rdoc", "LICENSE.txt"]
29
29
  s.files = FileList["[A-Z]*", "{bin,lib,config,libexec,test}/**/*"]
30
30
 
31
- s.add_dependency('daemon-kit', '0.1.7.12')
32
31
  s.add_dependency('bunny', '0.6.0')
33
32
  s.add_dependency('amqp', '0.6.7')
34
33
 
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.1.1"
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-09}
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
- opts.on('-c PATH','--config_path PATH') do |config|
16
- @options[:configuration_file] = config
17
- end
18
-
19
- opts.on('-s SOURCE','--source SOURCE') do |source_uri|
20
- @options[:source_uri] = source_uri
21
- end
22
-
23
- opts.on('-t TARGET','--target TARGET') do |target_uri|
24
- @options[:targets] ||= []
25
- @options[:targets] << {:target_uri=>target_uri}
26
- end
27
-
28
- opts.on('-r RELAY', '--relay RELAY') do |relay|
29
- 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]
30
- @options[:targets][-1][:relays] ||= []
31
- @options[:targets][-1][:relays] << {:from=>relay}
32
- end
33
-
34
- opts.on('-y TO', '--to TO') do |to|
35
- puts to
36
- 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]
37
- relay = @options[:targets][-1][:relays][-1]
38
- relay[:to] = to
39
- end
40
-
41
- opts.on('-x TYPE', '--type TYPE') do |type|
42
- 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]
43
- relay = @options[:targets][-1][:relays][-1]
44
- if relay[:to]
45
- relay[:to_type] = type.downcase.to_sym
46
- else
47
- relay[:from_type] = type.downcase.to_sym
48
- end
49
- end
50
-
51
- opts.on('-d','--durable') do |durable|
52
- 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]
53
- relay = @options[:targets][-1][:relays][-1]
54
- if relay[:to]
55
- relay[:to_durable] = durable
56
- else
57
- relay[:from_durable] = durable
58
- end
59
- end
60
-
61
- opts.on('-a','--ack') do |ack|
62
- 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]
63
- relay = @options[:targets][-1][:relays][-1]
64
- if relay[:to]
65
- relay[:to_ack] = ack
66
- else
67
- relay[:from_ack] = ack
68
- end
69
- end
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::Initializer.run
31
- end
32
- end
33
-
34
- class VendorBoot < Boot
35
- def load_initializer
36
- require "#{DAEMON_ROOT}/vendor/daemon_kit/lib/daemon_kit/initializer"
37
- end
38
- end
39
-
40
- class GemBoot < Boot
41
- def load_initializer
42
- begin
43
- gem 'daemon-kit'
44
- require 'daemon_kit/initializer'
45
- rescue Gem::LoadError => e
46
- msg = <<EOF
47
- You are missing the daemon-kit gem. Please install the following gems:
48
-
49
- * Stable - sudo gem install daemon-kit
50
-
51
- EOF
52
- $stderr.puts msg
53
- exit 1
54
- end
55
- end
56
- end
57
- end
58
-
59
- DaemonKit.boot!
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!
@@ -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::Initializer.run do |config|
20
-
21
- # The name of the daemon as reported by process monitoring tools
22
- config.daemon_name = 'bunnicula'
23
-
24
- # Force the daemon to be killed after X seconds from asking it to
25
- # config.force_kill_wait = 30
26
-
27
- # Log backraces when a thread/daemon dies (Recommended)
28
- # config.backtraces = true
29
-
30
- # Configure the safety net (see DaemonKit::Safety)
31
- # config.safety_net.handler = :mail # (or :hoptoad )
32
- # config.safety_net.mail.host = 'localhost'
33
- end
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
@@ -1,3 +1,3 @@
1
1
  module Bunnicula
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -1,5 +1,4 @@
1
1
  # Generated amqp daemon
2
-
3
2
  # Do your post daemonization configuration here
4
3
  # At minimum you need just the first line (without the block), or a lot
5
4
  # of strange things might start happening...
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: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
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-09 00:00:00 -07:00
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: &id002 !ruby/object:Gem::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: *id002
36
+ version_requirements: *id001
54
37
  - !ruby/object:Gem::Dependency
55
38
  name: amqp
56
39
  prerelease: false
57
- requirement: &id003 !ruby/object:Gem::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: *id003
52
+ version_requirements: *id002
70
53
  - !ruby/object:Gem::Dependency
71
54
  name: shoulda
72
55
  prerelease: false
73
- requirement: &id004 !ruby/object:Gem::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: *id004
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