hutch 0.1.1 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5623aace290058a93c0c71c86f5de6f55ef7c689
4
- data.tar.gz: 671e8f47f98013006f1a8de4cc07ea6e3dc8e036
3
+ metadata.gz: eeb23a1408742881e2fe57465b1ac93ff5f291c7
4
+ data.tar.gz: a690db26520da645ce2727d70f06757e1db9e161
5
5
  SHA512:
6
- metadata.gz: 0c88548d9ebfaa4edffccfe90269231653709c2e4689d5b7f6063c5985c83f316ab4884c0fe8076b4e1325ff9f34ff97d3d0c876be6c7e758a7b5bc7ca1703c2
7
- data.tar.gz: afb238ab42b8b4a7bc853202920cced777249c03606e40db6b80ef3dea71d00e1b20306a57bc831864981375837a15565723123132f354abdb030f1fb4a8c7ff
6
+ metadata.gz: 578a80bc3746ceb989bd569f0bbf838f7ceffeae97628fd06705d03a6d10c8945f3916184466ad397ce7f2052df0e1677602f85d5fa8074e5181fb8639ab4662
7
+ data.tar.gz: d03df05f440e75a3620ce885d004af204fb0adcdf255ba250429d797c9bf02d0dd7d6abf006ef9d1a04e7bf2316de14156c8c6d5dd28b016693ac19b70c4e344
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  .bundle
2
2
  hutch-*.gem
3
+ Gemfile.lock
data/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ ## 0.2.0 - September 16, 2013
2
+
3
+ - Support for connecting to RabbitMQ with TLS/SSL. There are two new
4
+ configuration options : `mq-tls` and `mq-api-ssl`.
5
+ - JSON message parsing errors are now handled properly.
6
+
7
+ ## 0.1.1 - September 9, 2013
8
+
9
+ - Relax Bunny dependency specification
10
+
11
+ ## 0.1.0 - September 9, 2013
12
+
13
+ - Initial release
14
+
data/README.md CHANGED
@@ -4,6 +4,44 @@ Hutch is a Ruby library for enabling asynchronous inter-service communication
4
4
  in a service-oriented architecture, using RabbitMQ.
5
5
 
6
6
 
7
+ ## Project Maturity
8
+
9
+ Hutch is a relatively young project that was extracted from production systems.
10
+
11
+
12
+
13
+ ## Installation & Bundler Dependency
14
+
15
+ ### Most Recent Release
16
+
17
+ [![Gem Version](https://badge.fury.io/rb/hutch.png)](http://badge.fury.io/rb/hutch)
18
+
19
+ ### With Rubygems
20
+
21
+ To install with RubyGems:
22
+
23
+ ```
24
+ gem install hutch
25
+ ```
26
+
27
+ ### Bundler Dependency
28
+
29
+ To use in a project managed with Bundler:
30
+
31
+ ``` ruby
32
+ gem "hutch", "~> 0.1.1"
33
+ ```
34
+
35
+ ## Overview
36
+
37
+ Hutch is a conventions-based framework for writing services that communicate
38
+ over RabbitMQ. Hutch is opinionated: it uses topic exchanges for message
39
+ distribution and makes some assumptions about how consumers and publishers
40
+ should work.
41
+
42
+ Hutch uses [Bunny](http://rubybunny.info) under the hood.
43
+
44
+
7
45
  ## Defining Consumers
8
46
 
9
47
  Consumers receive messages from a RabbitMQ queue. That queue may be bound to
@@ -96,6 +134,7 @@ possible, this should be used, rather than directly interfacing with RabbitMQ
96
134
  libraries.
97
135
 
98
136
  ```ruby
137
+ Hutch.connect
99
138
  Hutch.publish('routing.key', subject: 'payment', action: 'received')
100
139
  ```
101
140
 
@@ -131,6 +170,12 @@ AMQP.connect(host: config[:host]) do |connection|
131
170
  end
132
171
  ```
133
172
 
173
+ ## Supported RabbitMQ Versions
174
+
175
+ Hutch requires RabbitMQ 2.x or later. 3.x releases
176
+ are recommended.
177
+
178
+
134
179
  [pc-issue]: https://github.com/ruby-amqp/amqp/issues/92
135
180
  [pc-gist]: https://gist.github.com/3042381
136
181
 
data/lib/hutch/broker.rb CHANGED
@@ -36,11 +36,12 @@ module Hutch
36
36
  def set_up_amqp_connection
37
37
  host, port, vhost = @config[:mq_host], @config[:mq_port]
38
38
  username, password = @config[:mq_username], @config[:mq_password]
39
- vhost = @config[:mq_vhost]
39
+ vhost, tls = @config[:mq_vhost], @config[:mq_tls]
40
+ protocol = tls ? "amqps://" : "amqp://"
40
41
  uri = "#{username}:#{password}@#{host}:#{port}/#{vhost.sub(/^\//, '')}"
41
- logger.info "connecting to rabbitmq (amqp://#{uri})"
42
+ logger.info "connecting to rabbitmq (#{protocol}#{uri})"
42
43
 
43
- @connection = Bunny.new(host: host, port: port, vhost: vhost,
44
+ @connection = Bunny.new(host: host, port: port, vhost: vhost, tls: tls,
44
45
  username: username, password: password,
45
46
  heartbeat: 1, automatically_recover: true,
46
47
  network_recovery_interval: 1)
@@ -54,7 +55,7 @@ module Hutch
54
55
  @exchange = @channel.topic(exchange_name, durable: true)
55
56
  rescue Bunny::TCPConnectionFailed => ex
56
57
  logger.error "amqp connection error: #{ex.message.downcase}"
57
- uri = "amqp://#{host}:#{port}"
58
+ uri = "#{protocol}#{host}:#{port}"
58
59
  raise ConnectionError.new("couldn't connect to rabbitmq at #{uri}")
59
60
  rescue Bunny::PreconditionFailed => ex
60
61
  logger.error ex.message
@@ -69,12 +70,15 @@ module Hutch
69
70
  def set_up_api_connection
70
71
  host, port = @config[:mq_api_host], @config[:mq_api_port]
71
72
  username, password = @config[:mq_username], @config[:mq_password]
73
+ ssl = @config[:mq_api_ssl]
72
74
 
73
- management_uri = "http://#{username}:#{password}@#{host}:#{port}/"
75
+ protocol = ssl ? "https://" : "http://"
76
+ management_uri = "#{protocol}#{username}:#{password}@#{host}:#{port}/"
74
77
  logger.info "connecting to rabbitmq management api (#{management_uri})"
75
78
 
76
79
  @api_client = CarrotTop.new(host: host, port: port,
77
- user: username, password: password)
80
+ user: username, password: password,
81
+ ssl: ssl)
78
82
  @api_client.exchanges
79
83
  rescue Errno::ECONNREFUSED => ex
80
84
  logger.error "api connection error: #{ex.message.downcase}"
data/lib/hutch/cli.rb CHANGED
@@ -96,6 +96,10 @@ module Hutch
96
96
  Hutch::Config.mq_port = port
97
97
  end
98
98
 
99
+ opts.on('--mq-tls', 'Set the RabbitMQ connection to use TLS') do |tls|
100
+ Hutch::Config.mq_tls = tls
101
+ end
102
+
99
103
  opts.on('--mq-exchange EXCHANGE',
100
104
  'Set the RabbitMQ exchange') do |exchange|
101
105
  Hutch::Config.mq_exchange = exchange
@@ -123,6 +127,10 @@ module Hutch
123
127
  Hutch::Config.mq_api_port = port
124
128
  end
125
129
 
130
+ opts.on('--mq-api-ssl', 'Set the RabbitMQ API connection to use SSL') do |api_ssl|
131
+ Hutch::Config.mq_api_ssl = api_ssl
132
+ end
133
+
126
134
  opts.on('--require PATH', 'Require a Rails app or path') do |path|
127
135
  Hutch::Config.require_paths << path
128
136
  end
data/lib/hutch/config.rb CHANGED
@@ -10,10 +10,12 @@ module Hutch
10
10
  mq_port: 5672,
11
11
  mq_exchange: 'hutch', # TODO: should this be required?
12
12
  mq_vhost: '/',
13
+ mq_ssl: false,
13
14
  mq_username: 'guest',
14
15
  mq_password: 'guest',
15
16
  mq_api_host: 'localhost',
16
17
  mq_api_port: 15672,
18
+ mq_api_ssl: false,
17
19
  log_level: Logger::INFO,
18
20
  require_paths: [],
19
21
  error_handlers: [Hutch::ErrorHandlers::Logger.new]
data/lib/hutch/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Hutch
2
- VERSION = '0.1.1'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
4
4
 
data/lib/hutch/worker.rb CHANGED
@@ -84,13 +84,13 @@ module Hutch
84
84
  "consumer: #{consumer}, " +
85
85
  "payload: #{payload}")
86
86
 
87
- message = Message.new(delivery_info, properties, payload)
88
87
  broker = @broker
89
88
  begin
89
+ message = Message.new(delivery_info, properties, payload)
90
90
  consumer.new.process(message)
91
91
  broker.ack(delivery_info.delivery_tag)
92
92
  rescue StandardError => ex
93
- handle_error(message.message_id, consumer, ex)
93
+ handle_error(properties.message_id, consumer, ex)
94
94
  broker.ack(delivery_info.delivery_tag)
95
95
  end
96
96
  end
@@ -75,6 +75,22 @@ describe Hutch::Worker do
75
75
  worker.handle_message(consumer, delivery_info, properties, payload)
76
76
  end
77
77
  end
78
+
79
+ context "when the payload is not valid json" do
80
+ let(:payload) { "Not Valid JSON" }
81
+
82
+ it 'logs the error' do
83
+ Hutch::Config[:error_handlers].each do |backend|
84
+ backend.should_receive(:handle)
85
+ end
86
+ worker.handle_message(consumer, delivery_info, properties, payload)
87
+ end
88
+
89
+ it 'acknowledges the message' do
90
+ broker.should_receive(:ack).with(delivery_info.delivery_tag)
91
+ worker.handle_message(consumer, delivery_info, properties, payload)
92
+ end
93
+ end
78
94
  end
79
95
  end
80
96
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hutch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harry Marr
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-09 00:00:00.000000000 Z
11
+ date: 2013-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
@@ -76,6 +76,7 @@ extensions: []
76
76
  extra_rdoc_files: []
77
77
  files:
78
78
  - .gitignore
79
+ - CHANGELOG.md
79
80
  - Gemfile
80
81
  - Guardfile
81
82
  - README.md