kanina 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec8d730195a2d4c6669e0a7a3d6f221622e1d4fe
4
- data.tar.gz: 83205977db72d11380b3d41ea71664bd56530c2d
3
+ metadata.gz: dae9cec347810f3ce75541ae0ea7cf16d6af65eb
4
+ data.tar.gz: 21449f6b71e1b18e8011f6b2b584ca4ee7a38c09
5
5
  SHA512:
6
- metadata.gz: 4f8366244d463044be02f10a692ae6a32bb9d6477243e0b726ee1bed2cd883e71cc900ee47d031110c5605884614e31fd60ba5706f5c8f58c135e1b156614d55
7
- data.tar.gz: a876042754e17c9b2390a575ce9cdcedd67ec2b1990a98df7af7b57fbf6bdf98587cf3b256b420a20be3eae403d1e174efd5b68f9a9a311fe7e620edf0fcc081
6
+ metadata.gz: 8f78a97f53c19d54cd40e909d3857e00f1d163ca61e309ab4908a47393aa05a072498b8683ba3cef764e207c992be153df5ce18df6651cd9ebd4d8fa1c3f96b8
7
+ data.tar.gz: f1d0bfd1aa78393facac5a96f09febcb09f25f015fab7a45425b170a9f91a698fde1507a6618875d3f8077615a3bb8e679a8430342e84c3922eec58bee8a978e
data/.gitignore CHANGED
@@ -30,6 +30,7 @@ atlassian-ide-plugin.xml
30
30
 
31
31
  # Ignore, this being a gem.
32
32
  Gemfile.lock
33
+ *.gem
33
34
 
34
35
  # Docs
35
36
  .yardoc
@@ -1 +1 @@
1
- 2.1.0
1
+ 2.2.0
data/Gemfile CHANGED
@@ -2,8 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'coveralls', require: nil
6
- gem 'codeclimate-test-reporter', group: :test, require: nil
5
+ gem 'codeclimate-test-reporter', group: :test, require: false
7
6
 
8
7
  platforms :rbx do
9
8
  gem 'racc'
data/Guardfile CHANGED
@@ -4,6 +4,8 @@ guard :rspec, cmd: 'bundle exec rspec' do
4
4
  watch('spec/spec_helper.rb') { 'spec' }
5
5
  end
6
6
 
7
- guard 'yard', port: '8808' do
8
- watch(%r{lib/.+\.rb})
9
- end
7
+ # # TODO: Uncomment this to regenerate docs locally, AFTER Yardoc is fixed
8
+ # # post-Ruby 2.2.0
9
+ # guard 'yard', port: '8808' do
10
+ # watch(%r{lib/.+\.rb})
11
+ # end
data/History.md CHANGED
@@ -1,6 +1,18 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ v0.6.1
5
+ ------
6
+ - Complete project rename! Once "Hare", now called "Kanina".
7
+ - "Kanina" means "Bunny" in Icelandic and "a while ago" in Tagalog. More importantly, it was available on Rubygems...
8
+ - Ruby 2.2.0 support.
9
+ - Mark an exchange as durable.
10
+ - More and better documentation.
11
+ - Better coverage.
12
+ - Tweak integration with Inch & Code Climate
13
+ - Stop using Coveralls, since it was conflicting, and I'm now sending coverage to Code Climate anyway.
14
+ - Renamed exchanges and queues in specs, so all Kanina output is namespaced.
15
+
4
16
  v0.6.0
5
17
  ------
6
18
  - Mark individual messages as persistent or transient.
data/README.md CHANGED
@@ -3,10 +3,11 @@ Kanina
3
3
 
4
4
  A Rails plugin that makes it easier for your models to communicate with RabbitMQ.
5
5
 
6
+ [![Gem Version](https://badge.fury.io/rb/kanina.svg)](http://badge.fury.io/rb/kanina)
6
7
  [![Build Status](https://travis-ci.org/judy/kanina.svg?branch=master)](https://travis-ci.org/judy/kanina)
7
8
  [![Code Climate](https://codeclimate.com/github/judy/kanina.png)](https://codeclimate.com/github/judy/kanina)
8
- [![Coverage Status](https://coveralls.io/repos/judy/kanina/badge.png)](https://coveralls.io/r/judy/kanina)
9
9
  [![Inline docs](http://inch-ci.org/github/judy/kanina.png?branch=master)](http://inch-ci.org/github/judy/kanina)
10
+ [![API Documentation](https://www.omniref.com/ruby/gems/kanina.png)](https://www.omniref.com/ruby/gems/kanina)
10
11
 
11
12
  Kanina abstracts away queue and exchange creation, so you can focus on the message and subscription side of things in Rails.
12
13
 
@@ -1,6 +1,7 @@
1
1
  require 'rails/generators'
2
2
 
3
3
  module Kanina
4
+ # `Kanina::InstallGenerator` handles installing Kanina into a Rails project.
4
5
  class InstallGenerator < Rails::Generators::Base
5
6
  source_root File.expand_path('../templates', __FILE__)
6
7
 
@@ -1,10 +1,13 @@
1
1
  require 'rails/generators'
2
2
 
3
3
  module Kanina
4
- # <tt>Kanina::MessageGenerator</tt> generates a template of a message file. Change the
4
+ # `Kanina::MessageGenerator` generates a template of a message file. Change the
5
5
  # resulting file with your intended exchange or routing_key information. For example:
6
6
  #
7
7
  # rails generate message user_notification
8
+ #
9
+ # Then you'll want to update the generated message class with instructions on
10
+ # which exchange to send messages, the type of exchange, and so on.
8
11
  class MessageGenerator < Rails::Generators::NamedBase
9
12
  source_root File.expand_path('../templates', __FILE__)
10
13
 
@@ -1,7 +1,7 @@
1
1
  require 'rails/generators'
2
2
 
3
3
  module Kanina
4
- # <tt>Kanina::SubscriptionGenerator</tt> generates a subscription file, for
4
+ # `Kanina::SubscriptionGenerator` generates a subscription file, for
5
5
  # example:
6
6
  #
7
7
  # rails generate subscription user_notification
@@ -1,15 +1,21 @@
1
1
  require 'logger'
2
2
 
3
3
  module Kanina
4
- # Simplifies sending messages to standard output and/or the Rails log files.
4
+ # `Kanina::Logger` simplifies sending messages to standard output and/or the
5
+ # Rails log files.
5
6
  module Logger
6
7
  DEFAULT_LOG_LEVEL = ::Logger::INFO
7
8
 
9
+ # Sets up the Rails logger
10
+ # @return [Rails::Logger] the logger being used
8
11
  def logger
9
12
  Rails.logger ||= ::Logger.new(STDOUT)
10
13
  @logger ||= Rails.logger
11
14
  end
12
15
 
16
+ # Sends a message to the log
17
+ # @param text [String] the message to log
18
+ # @param level the importance of the logged message. Default is Logger::INFO
13
19
  def say(text, level = DEFAULT_LOG_LEVEL)
14
20
  puts text if @loud
15
21
  logger.add level, "HARE: #{text}"
@@ -15,7 +15,8 @@ module Kanina
15
15
  # parsed back out of JSON into native Ruby objects.
16
16
  class Message
17
17
  class << self
18
- # Helper method to return the channel opened by `Kanina::Server`.
18
+ # Helper method to return the channel that Kanina::Server is talking on.
19
+ # @return [Bunny::Channel]
19
20
  def channel
20
21
  Kanina::Server.channel or fail 'Kanina::Server.channel is not open'
21
22
  end
@@ -25,12 +26,11 @@ module Kanina
25
26
  # @overload exchange(name, *opts)
26
27
  # Set the name and type of the exchange messages should be sent to.
27
28
  # @param name [String] the name of the exchange
28
- # @param type [:direct, :fanout, :topic] the type of exchange
29
29
  # @return [String] the exchange
30
- def exchange(name = nil, type: :direct)
30
+ def exchange(name = nil, type: :direct, durable: false)
31
31
  if name.present?
32
32
  @type = type
33
- @exchange = channel.exchange(name, type: type)
33
+ @exchange = channel.exchange(name, type: type, durable: durable)
34
34
  else
35
35
  @exchange || channel.default_exchange
36
36
  end
@@ -1,5 +1,5 @@
1
1
  module Kanina
2
- # <tt>Kanina::Server</tt> loads configuration, opens a connection to RabbitMQ
2
+ # `Kanina::Server` loads configuration, opens a connection to RabbitMQ
3
3
  # and opens a channel so messages can be received and sent. This class is
4
4
  # automatically called and handled by a Railtie, so you shouldn't have to
5
5
  # invoke it by hand.
@@ -10,10 +10,16 @@ module Kanina
10
10
  attr_reader :connection, :channel
11
11
  attr_accessor :config, :loud
12
12
 
13
+ # Returns the current status of the server connection.
14
+ # @return [String] status, as 'off', 'starting', 'started', or 'stopping'
13
15
  def status
14
16
  @status || 'off'
15
17
  end
16
18
 
19
+ # Loads the configuration, opens a connection, and opens the channel. This
20
+ # will automatically be run in the railtie when you install Kanina into a
21
+ # Rails project, so you shouldn't have to run it yourself.
22
+ # @return [String] status as 'started', unless something went wrong.
17
23
  def start
18
24
  set_status 'starting'
19
25
  load_config unless @config.present?
@@ -22,6 +28,8 @@ module Kanina
22
28
  set_status 'started'
23
29
  end
24
30
 
31
+ # Closes the connection to RabbitMQ.
32
+ # @return [String] status as 'stopping'
25
33
  def stop
26
34
  set_status 'stopping'
27
35
  cleanup
@@ -32,6 +40,7 @@ module Kanina
32
40
  def set_status(string)
33
41
  @status = string
34
42
  say "Status changed to #{@status}"
43
+ @status
35
44
  end
36
45
 
37
46
  def cleanup
@@ -40,7 +49,7 @@ module Kanina
40
49
  end
41
50
 
42
51
  def config_file_location
43
- Rails.root + 'config/amqp.yml'
52
+ (Rails.try(:root) || './') + 'config/amqp.yml'
44
53
  end
45
54
 
46
55
  def load_config
@@ -22,7 +22,7 @@ module Kanina
22
22
  # Helper method to return the channel that Kanina::Server is talking on.
23
23
  # @return [Bunny::Channel]
24
24
  def channel
25
- Kanina::Server.channel
25
+ Kanina::Server.channel or fail 'Kanina::Server.channel is not open'
26
26
  end
27
27
 
28
28
  # Begins subscribing to the specified queue (or binds to an exchange and
@@ -1,3 +1,8 @@
1
+ # Dumb module definition to set VERSION. Kanina uses
2
+ # [Semantic Versioniong](http://semver.org/) religiously; the patch number is
3
+ # bumped for bug fixes, minor number is bumped for new features that don't break
4
+ # backward compatibility, and major numbers are only bumped when introducing
5
+ # major API changes that break backward compatibility.
1
6
  module Kanina
2
- VERSION = '0.6.0'
7
+ VERSION = '0.6.1'
3
8
  end
@@ -2,24 +2,33 @@ describe Kanina::Message do
2
2
  describe '.exchange' do
3
3
  it 'sets and returns the exchange' do
4
4
  dummy_class = Class.new(Kanina::Message) do
5
- exchange 'test', type: :direct
5
+ exchange 'kanina.message_spec.exchange', type: :direct
6
6
  end
7
- expect(dummy_class.exchange.name).to eql 'test'
7
+ expect(dummy_class.exchange.name).to eql 'kanina.message_spec.exchange'
8
8
  expect(dummy_class.exchange.type).to eql :direct
9
9
  end
10
+
10
11
  it "returns the default exchange if exchange hasn't been set." do
11
12
  dummy_class = Class.new(Kanina::Message)
12
13
  expect(dummy_class.exchange.name).to eql ''
13
14
  expect(dummy_class.exchange.type).to eql :direct
14
15
  end
16
+
17
+ it 'makes a durable exchange' do
18
+ dummy_class = Class.new(Kanina::Message) do
19
+ exchange 'kanina.message_spec.durable_exchange', durable: :true
20
+ end
21
+
22
+ expect(`rabbitmqctl list_exchanges name durable`).to include("kanina.message_spec.durable_exchange\ttrue")
23
+ end
15
24
  end
16
25
 
17
26
  describe '.routing_key' do
18
27
  it 'sets and returns the routing_key variable' do
19
28
  dummy_class = Class.new(Kanina::Message) do
20
- routing_key 'test'
29
+ routing_key 'kanina.message_spec.routing_key'
21
30
  end
22
- expect(dummy_class.routing_key).to eql 'test'
31
+ expect(dummy_class.routing_key).to eql 'kanina.message_spec.routing_key'
23
32
  end
24
33
  end
25
34
 
@@ -59,10 +68,10 @@ describe Kanina::Message do
59
68
 
60
69
  it 'delivers a message to the default exchange' do
61
70
  dummy_class = Class.new(Kanina::Message) do
62
- routing_key 'testkey'
71
+ routing_key 'kanina.message_spec.default_exchange_to_queue'
63
72
  end
64
73
 
65
- q = Kanina::Server.channel.queue('testkey')
74
+ q = Kanina::Server.channel.queue('kanina.message_spec.default_exchange_to_queue')
66
75
  message = dummy_class.new('test')
67
76
  result = nil
68
77
  message.deliver
@@ -77,11 +86,11 @@ describe Kanina::Message do
77
86
 
78
87
  it 'delivers a message to a fanout exchange' do
79
88
  dummy_class = Class.new(Kanina::Message) do
80
- fanout 'fanning_out'
89
+ fanout 'kanina.message_spec.fanout_exchange'
81
90
  end
82
91
 
83
92
  q = Kanina::Server.channel.queue('')
84
- q.bind('fanning_out')
93
+ q.bind('kanina.message_spec.fanout_exchange')
85
94
  message = dummy_class.new('data')
86
95
  message.deliver
87
96
  result = nil
@@ -94,13 +103,13 @@ describe Kanina::Message do
94
103
  expect(result).to eql('"data"')
95
104
  end
96
105
 
97
- it 'delivers a message to a named exchange' do
106
+ it 'delivers a message to a direct exchange' do
98
107
  dummy_class = Class.new(Kanina::Message) do
99
- exchange 'direct-test-exchange', type: :direct
108
+ exchange 'kanina.message_spec.direct_exchange', type: :direct
100
109
  end
101
110
 
102
111
  q = Kanina::Server.channel.queue('')
103
- q.bind('direct-test-exchange')
112
+ q.bind('kanina.message_spec.direct_exchange')
104
113
  message = dummy_class.new('data')
105
114
  message.deliver
106
115
  result = nil
@@ -115,8 +124,8 @@ describe Kanina::Message do
115
124
  context "with a topic exchange" do
116
125
  before(:each) do
117
126
  @dummy_class = Class.new(Kanina::Message) do
118
- topic "topic_exchange"
119
- routing_key "prefix.middle.suffix"
127
+ topic "kanina.message_spec.topic_exchange"
128
+ routing_key "kanina.message_spec.topic_exchange.suffix"
120
129
  end
121
130
  @q = Kanina::Server.channel.queue('')
122
131
  @ex = @dummy_class.class_eval{exchange}
@@ -131,24 +140,24 @@ describe Kanina::Message do
131
140
  end
132
141
 
133
142
  it "should match a full topic" do
134
- @q.bind @ex, routing_key: "prefix.middle.suffix"
143
+ @q.bind @ex, routing_key: "kanina.message_spec.topic_exchange.suffix"
135
144
  end
136
145
 
137
146
  it "should match a prefix" do
138
- @q.bind @ex, routing_key: "prefix.#"
147
+ @q.bind @ex, routing_key: "kanina.message_spec.topic_exchange.#"
139
148
  end
140
149
 
141
150
  it "should match a suffix" do
142
- @q.bind @ex, routing_key: "#.suffix"
151
+ @q.bind @ex, routing_key: "#.topic_exchange.suffix"
143
152
  end
144
153
  end
145
154
 
146
155
  context 'with persistence turned on' do
147
156
  it 'should make messages persistent' do
148
- Kanina::Server.channel.queue('persistentqueue', durable: true)
157
+ Kanina::Server.channel.queue('kanina.message_spec.persistent_messages', durable: true)
149
158
 
150
159
  dummy_class = Class.new(Kanina::Message) do
151
- routing_key 'persistentqueue'
160
+ routing_key 'kanina.message_spec.persistent_messages'
152
161
  persistent
153
162
  end
154
163
  result = nil
@@ -158,7 +167,7 @@ describe Kanina::Message do
158
167
  Kanina::Server.stop
159
168
  Kanina::Server.start
160
169
 
161
- Kanina::Server.channel.queue('persistentqueue', durable: true).subscribe do |_, _, body|
170
+ Kanina::Server.channel.queue('kanina.message_spec.persistent_messages', durable: true).subscribe do |_, _, body|
162
171
  result = body
163
172
  end
164
173
 
@@ -169,12 +178,13 @@ describe Kanina::Message do
169
178
 
170
179
  context 'with persistence turned off' do
171
180
  it 'should make messages transient' do
172
- # TODO: Fix this test so it reliably restarts RabbitMQ across all platforms!
181
+ # TODO: Fix this test so it reliably restarts RabbitMQ across all
182
+ # platforms, including TravisCI.
173
183
  skip "can fail when restarting RabbitMQ server."
174
- Kanina::Server.channel.queue('transientqueue', durable: true)
184
+ Kanina::Server.channel.queue('kanina.message_spec.transient_messages', durable: true)
175
185
 
176
186
  dummy_class = Class.new(Kanina::Message) do
177
- routing_key 'transientqueue'
187
+ routing_key 'kanina.message_spec.transient_messages'
178
188
  transient
179
189
  end
180
190
  result = nil
@@ -183,13 +193,14 @@ describe Kanina::Message do
183
193
  msg.deliver
184
194
 
185
195
  Kanina::Server.stop
196
+ sleep 1
186
197
  `rabbitmqctl stop_app`
198
+ sleep 1
187
199
  `rabbitmqctl start_app`
188
- # `lunchy restart rabbitmq`
189
- # sleep 3
200
+ sleep 1
190
201
  Kanina::Server.start
191
202
 
192
- Kanina::Server.channel.queue('transientqueue', durable: true).subscribe do |_, _, body|
203
+ Kanina::Server.channel.queue('kanina.message_spec.transient_messages', durable: true).subscribe do |_, _, body|
193
204
  result = body
194
205
  end
195
206
 
@@ -2,13 +2,13 @@ describe Kanina::Subscription do
2
2
  describe '.subscribe' do
3
3
  it 'watches a queue' do
4
4
  result = nil
5
- Kanina::Subscription.subscribe queue: 'subscription.test.queue' do |data|
5
+ Kanina::Subscription.subscribe queue: 'kanina.subscription_spec.subscribe' do |data|
6
6
  result = data[:string]
7
7
  end
8
8
 
9
9
  Kanina::Server.channel.default_exchange.publish(
10
10
  { string: 'success' }.to_json,
11
- routing_key: 'subscription.test.queue'
11
+ routing_key: 'kanina.subscription_spec.subscribe'
12
12
  )
13
13
 
14
14
  sleep(0.1)
@@ -19,19 +19,19 @@ describe Kanina::Subscription do
19
19
  result = nil
20
20
 
21
21
  # The queue must exist first before we send messages to it.
22
- Kanina::Subscription.create_queue('subscription.test.durablequeue', durable: true)
22
+ Kanina::Subscription.create_queue('kanina.subscription_spec.durable_queue', durable: true)
23
23
 
24
24
  # Push the message
25
25
  Kanina::Server.channel.default_exchange.publish(
26
26
  { string: 'success' }.to_json,
27
- routing_key: 'subscription.test.durablequeue'
27
+ routing_key: 'kanina.subscription_spec.durable_queue'
28
28
  )
29
29
 
30
30
  Kanina::Server.stop
31
31
  Kanina::Server.start
32
32
 
33
33
  # Re-open the subscription to the queue
34
- Kanina::Subscription.subscribe queue: 'subscription.test.durablequeue', durable: true do |data|
34
+ Kanina::Subscription.subscribe queue: 'kanina.subscription_spec.durable_queue', durable: true do |data|
35
35
  result = data[:string]
36
36
  end
37
37
 
@@ -41,10 +41,10 @@ describe Kanina::Subscription do
41
41
 
42
42
  it 'sets up a binding to a named exchange' do
43
43
  result = nil
44
- Kanina::Subscription.subscribe bind: 'named_exchange' do |data|
44
+ Kanina::Subscription.subscribe bind: 'kanina.subscription_spec.binding_to_named_exchange' do |data|
45
45
  result = data[:string]
46
46
  end
47
- Kanina::Server.channel.direct('named_exchange').publish(
47
+ Kanina::Server.channel.direct('kanina.subscription_spec.binding_to_named_exchange').publish(
48
48
  { string: 'success' }.to_json
49
49
  )
50
50
 
@@ -5,17 +5,13 @@ require 'simplecov'
5
5
  original_process = Process.pid
6
6
 
7
7
  SimpleCov.start do
8
- add_filter 'spec/dummy'
8
+ add_filter 'spec'
9
9
  end
10
10
 
11
11
  SimpleCov.at_exit do
12
12
  SimpleCov.result.format! if Process.pid == original_process
13
13
  end
14
14
 
15
- # Coveralls for online code coverage generation.
16
- require 'coveralls'
17
- Coveralls.wear!
18
-
19
15
  # Send code coverage to Code Climate
20
16
  require "codeclimate-test-reporter"
21
17
  CodeClimate::TestReporter.start
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kanina
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clinton Judy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-06 00:00:00.000000000 Z
11
+ date: 2015-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -351,7 +351,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
351
351
  version: '0'
352
352
  requirements: []
353
353
  rubyforge_project:
354
- rubygems_version: 2.4.3
354
+ rubygems_version: 2.4.5
355
355
  signing_key:
356
356
  specification_version: 4
357
357
  summary: Rails plugin for RabbitMQ