klomp 1.0.7 → 1.0.8

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.
@@ -1,6 +1,11 @@
1
1
  Klomp Changes
2
2
  --------------------------------------------------------------------------------
3
3
 
4
+ 1.0.8 (2013/04/16)
5
+ ================================================================================
6
+ - Allow headers to be passed to subscribe and unsubscribe.
7
+
8
+
4
9
  1.0.7 (2013/02/04)
5
10
  ================================================================================
6
11
 
@@ -12,6 +12,7 @@ lib/klomp.rb
12
12
  lib/klomp/connection.rb
13
13
  lib/klomp/frames.rb
14
14
  lib/klomp/sentinel.rb
15
+ lib/klomp/subscription.rb
15
16
  spec/acceptance/acceptance_spec.rb
16
17
  spec/acceptance/reconnect_spec.rb
17
18
  spec/frames/auth_error.txt
data/README.md CHANGED
@@ -38,6 +38,10 @@ end
38
38
  klomp.subscribe("/queue/klomp", Klompen.new)
39
39
  klomp.unsubscribe("/queue/klomp")
40
40
 
41
+ # subscribe with custom headers
42
+ klomp.subscribe("/queue/klomp", Klompen.new, :persistent => :true)
43
+ klomp.subscribe("/queue/klomp", :persistent => :true) do ... end
44
+
41
45
  klomp.disconnect
42
46
  ```
43
47
 
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "klomp"
5
- s.version = "1.0.7"
5
+ s.version = "1.0.8"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Nick Sieger"]
9
- s.date = "2013-02-04"
9
+ s.date = "2013-04-17"
10
10
  s.description = "Klomp is a simple [Stomp] messaging client that keeps your sanity intact.\n\nThe purpose of Klomp is to be the simplest possible Stomp client. No in-memory\nbuffering of outgoing messages, no fanout subscriptions in-process, no\ntransactions, no complicated messaging patterns. Code simple enough so that when\nsomething goes wrong, the problem is obvious.\n\n[Stomp]: http://stomp.github.com/"
11
11
  s.email = ["nick.sieger@livingsocial.com"]
12
12
  s.extra_rdoc_files = ["Manifest.txt"]
13
- s.files = [".gemtest", ".rspec", ".simplecov", "ChangeLog.md", "Gemfile", "Gemfile.lock", "Manifest.txt", "README.md", "Rakefile", "klomp.gemspec", "lib/klomp.rb", "lib/klomp/connection.rb", "lib/klomp/frames.rb", "lib/klomp/sentinel.rb", "spec/acceptance/acceptance_spec.rb", "spec/acceptance/reconnect_spec.rb", "spec/frames/auth_error.txt", "spec/frames/connect.txt", "spec/frames/connect_vhost.txt", "spec/frames/connected.txt", "spec/frames/disconnect.txt", "spec/frames/error.txt", "spec/frames/greeting.txt", "spec/frames/message.txt", "spec/frames/receipt.txt", "spec/frames/subscribe.txt", "spec/frames/unsubscribe.txt", "spec/klomp/connection_spec.rb", "spec/klomp/frames_spec.rb", "spec/klomp/sentinel_spec.rb", "spec/klomp_spec.rb", "spec/spec_helper.rb", "spec/support/have_received.rb", "spec/support/shared_contexts.rb"]
13
+ s.files = [".gemtest", ".rspec", ".simplecov", "ChangeLog.md", "Gemfile", "Gemfile.lock", "Manifest.txt", "README.md", "Rakefile", "klomp.gemspec", "lib/klomp.rb", "lib/klomp/connection.rb", "lib/klomp/frames.rb", "lib/klomp/sentinel.rb", "lib/klomp/subscription.rb", "spec/acceptance/acceptance_spec.rb", "spec/acceptance/reconnect_spec.rb", "spec/frames/auth_error.txt", "spec/frames/connect.txt", "spec/frames/connect_vhost.txt", "spec/frames/connected.txt", "spec/frames/disconnect.txt", "spec/frames/error.txt", "spec/frames/greeting.txt", "spec/frames/message.txt", "spec/frames/receipt.txt", "spec/frames/subscribe.txt", "spec/frames/unsubscribe.txt", "spec/klomp/connection_spec.rb", "spec/klomp/frames_spec.rb", "spec/klomp/sentinel_spec.rb", "spec/klomp_spec.rb", "spec/spec_helper.rb", "spec/support/have_received.rb", "spec/support/shared_contexts.rb"]
14
14
  s.homepage = "http://github.com/livingsocial/klomp"
15
15
  s.rdoc_options = ["--main", "README.md"]
16
16
  s.require_paths = ["lib"]
@@ -1,5 +1,5 @@
1
1
  class Klomp
2
- VERSION = '1.0.7'
2
+ VERSION = '1.0.8'
3
3
 
4
4
  class Error < StandardError; end
5
5
 
@@ -23,17 +23,18 @@ class Klomp
23
23
  end
24
24
  end
25
25
 
26
- def subscribe(queue, subscriber = nil, &block)
27
- connections.map {|conn| conn.subscribe(queue, subscriber, &block) }
26
+
27
+ def subscribe(queue, subscriber = nil, headers = {}, &block)
28
+ connections.map {|conn| conn.subscribe(queue, subscriber, headers, &block) }
28
29
  end
29
30
 
30
- def unsubscribe(queue)
31
+ def unsubscribe(queue, headers = {})
31
32
  if Array === queue
32
33
  raise ArgumentError,
33
34
  "wrong size array for #{connections.size} (#{queue.size})" unless connections.size == queue.size
34
- connections.zip(queue).map {|conn,arg| conn.unsubscribe arg rescue nil }
35
+ connections.zip(queue).map {|conn,arg| conn.unsubscribe(arg, headers) rescue nil }
35
36
  else
36
- connections.map {|conn| conn.unsubscribe(queue) rescue nil }
37
+ connections.map {|conn| conn.unsubscribe(queue, headers) rescue nil }
37
38
  end
38
39
  end
39
40
 
@@ -48,6 +49,7 @@ class Klomp
48
49
  end
49
50
  end
50
51
 
52
+ require 'klomp/subscription'
51
53
  require 'klomp/connection'
52
54
  require 'klomp/sentinel'
53
55
  require 'klomp/frames'
@@ -32,18 +32,23 @@ class Klomp
32
32
  connect
33
33
  end
34
34
 
35
- def publish(queue, body, headers={})
35
+ def publish(queue, body, headers = {})
36
36
  write Frames::Send.new(queue, body, headers)
37
37
  end
38
38
 
39
- def subscribe(queue, subscriber = nil, &block)
39
+ def subscribe(queue, subscriber = nil, headers = {}, &block)
40
+ if subscriber.is_a?(Hash)
41
+ headers = subscriber
42
+ subscriber = nil
43
+ end
44
+
40
45
  raise Klomp::Error, "no subscriber provided" unless subscriber || block
41
46
  raise Klomp::Error, "subscriber does not respond to #call" if subscriber && !subscriber.respond_to?(:call)
42
47
  previous = subscriptions[queue]
43
- subscriptions[queue] = subscriber || block
44
- frame = Frames::Subscribe.new(queue)
48
+ subscriptions[queue] = Subscription.new(subscriber || block, headers)
49
+ frame = Frames::Subscribe.new(queue, headers)
45
50
  if previous
46
- frame.previous_subscriber = previous
51
+ frame.previous_subscriber = previous.subscriber
47
52
  else
48
53
  write frame
49
54
  end
@@ -51,9 +56,9 @@ class Klomp
51
56
  frame
52
57
  end
53
58
 
54
- def unsubscribe(queue)
59
+ def unsubscribe(queue, headers = {})
55
60
  queue = queue.headers['destination'] if Frames::Subscribe === queue
56
- write Frames::Unsubscribe.new(queue) if subscriptions.delete queue
61
+ write Frames::Unsubscribe.new(queue, headers) if subscriptions.delete queue
57
62
  end
58
63
 
59
64
  def connected?() @socket end
@@ -75,7 +80,9 @@ class Klomp
75
80
  connect
76
81
  subs = subscriptions.dup
77
82
  subscriptions.clear
78
- subs.each {|queue, subscriber| subscribe(queue, subscriber) }
83
+ subs.each do |queue, subscription|
84
+ subscribe(queue, subscription.subscriber, subscription.headers)
85
+ end
79
86
  @sentinel = nil
80
87
  ensure
81
88
  @subscriptions = subs if subs && subs.size != @subscriptions.size
@@ -152,8 +159,8 @@ class Klomp
152
159
  begin
153
160
  message = read Frames::Message
154
161
  raise Error, message.headers['message'] if message.error?
155
- if subscriber = subscriptions[message.headers['destination']]
156
- subscriber.call message
162
+ if subscription = subscriptions[message.headers['destination']]
163
+ subscription.call(message)
157
164
  end
158
165
  rescue INTERRUPT
159
166
  break
@@ -26,6 +26,12 @@ class Klomp
26
26
  pair.map {|x| x.to_s.gsub("\n","\\n").gsub(":","\\c").gsub("\\", "\\\\") }.join(':')
27
27
  end.join("\n").tap {|s| s << "\n" unless s.empty? }
28
28
  end
29
+
30
+ def stringify_headers(hdrs)
31
+ new_hdrs = {}
32
+ hdrs.each { |k, v| new_hdrs[k.to_s] = v }
33
+ new_hdrs
34
+ end
29
35
  end
30
36
 
31
37
  class ServerFrame < Frame
@@ -87,7 +93,7 @@ class Klomp
87
93
  class Send < Frame
88
94
  def initialize(queue, body, hdrs)
89
95
  headers['destination'] = queue
90
- headers.update(hdrs.reject{|k,v| %w(destination content-length).include? k })
96
+ headers.update(stringify_headers(hdrs).reject { |k,v| %w(destination content-length).include? k })
91
97
  headers['content-type'] ||= 'text/plain'
92
98
  headers['content-length'] = body.bytesize.to_s
93
99
  @body = body
@@ -96,16 +102,18 @@ class Klomp
96
102
 
97
103
  class Subscribe < Frame
98
104
  attr_accessor :previous_subscriber
99
- def initialize(queue)
100
- headers['id'] = queue
105
+ def initialize(queue, hdrs = {})
106
+ headers.update(stringify_headers(hdrs).reject { |k,v| %w(destination ack).include? k })
107
+ headers['id'] ||= queue
101
108
  headers['destination'] = queue
102
109
  headers['ack'] = 'auto'
103
110
  end
104
111
  end
105
112
 
106
113
  class Unsubscribe < Frame
107
- def initialize(queue)
114
+ def initialize(queue, hdrs = {})
108
115
  headers['id'] = queue
116
+ headers.update(stringify_headers(hdrs).reject { |k,v| %w(id).include? k })
109
117
  end
110
118
  end
111
119
 
@@ -0,0 +1,14 @@
1
+ class Klomp
2
+ class Subscription
3
+ attr_reader :subscriber, :headers
4
+
5
+ def initialize(subscriber, headers)
6
+ @subscriber = subscriber
7
+ @headers = headers
8
+ end
9
+
10
+ def call(message = nil)
11
+ @subscriber.call(message)
12
+ end
13
+ end
14
+ end
@@ -137,7 +137,35 @@ describe Klomp::Connection do
137
137
 
138
138
  When { connection.subscribe("/queue/foo", subscriber) }
139
139
 
140
- Then { connection.subscriptions["/queue/foo"].should == subscriber }
140
+ Then { connection.subscriptions["/queue/foo"].subscriber.should == subscriber }
141
+
142
+ end
143
+
144
+ context "and accepts custom headers" do
145
+
146
+ Given(:headers) { { :foo => "bar" } }
147
+
148
+ Given { Klomp::Frames::Subscribe.stub!(:new => Klomp::Frames::Subscribe.new("/queue/foo")) }
149
+
150
+ When { connection.subscribe("/queue/foo", subscriber, headers) }
151
+
152
+ Then { Klomp::Frames::Subscribe.should have_received(:new).with("/queue/foo", headers) }
153
+
154
+ end
155
+
156
+ context "and accepts custom headers plus subscriber object" do
157
+
158
+ Given(:headers) { { :foo => "bar" } }
159
+
160
+ Given { Klomp::Frames::Subscribe.stub!(:new => Klomp::Frames::Subscribe.new("/queue/foo")) }
161
+
162
+ When { connection.subscribe("/queue/foo", subscriber, headers) }
163
+
164
+ Then do
165
+ Klomp::Frames::Subscribe.should have_received(:new).with("/queue/foo", headers)
166
+ connection.subscriptions["/queue/foo"].subscriber.should == subscriber
167
+ connection.subscriptions["/queue/foo"].headers.should == headers
168
+ end
141
169
 
142
170
  end
143
171
 
@@ -117,7 +117,7 @@ describe Klomp do
117
117
 
118
118
  When(:result) { klomp.subscribe("/queue/greeting") { true } }
119
119
 
120
- Then { connections.values.each {|conn| conn.should have_received(:subscribe).with("/queue/greeting", nil) } }
120
+ Then { connections.values.each {|conn| conn.should have_received(:subscribe).with("/queue/greeting", nil, {}) } }
121
121
 
122
122
  context "and returns the results of all Connection#subscribe as an array" do
123
123
 
@@ -147,7 +147,7 @@ describe Klomp do
147
147
 
148
148
  When(:result) { klomp.unsubscribe("/queue/greeting") }
149
149
 
150
- Then { connections.values.each {|conn| conn.should have_received(:unsubscribe).with("/queue/greeting") } }
150
+ Then { connections.values.each {|conn| conn.should have_received(:unsubscribe).with("/queue/greeting", {}) } }
151
151
 
152
152
  context "and returns the results of all Connection#unsubscribe as an array" do
153
153
 
@@ -163,7 +163,7 @@ describe Klomp do
163
163
 
164
164
  When { klomp.unsubscribe("/queue/greeting") }
165
165
 
166
- Then { connections.values.each {|conn| conn.should have_received(:unsubscribe).with("/queue/greeting") } }
166
+ Then { connections.values.each {|conn| conn.should have_received(:unsubscribe).with("/queue/greeting", {}) } }
167
167
 
168
168
  end
169
169
 
@@ -177,7 +177,7 @@ describe Klomp do
177
177
 
178
178
  When { klomp.unsubscribe arg }
179
179
 
180
- Then { connections.values.each {|conn| conn.should have_received(:unsubscribe).with(42) } }
180
+ Then { connections.values.each {|conn| conn.should have_received(:unsubscribe).with(42, {}) } }
181
181
 
182
182
  end
183
183
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: klomp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-04 00:00:00.000000000 Z
12
+ date: 2013-04-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdoc
@@ -238,6 +238,7 @@ files:
238
238
  - lib/klomp/connection.rb
239
239
  - lib/klomp/frames.rb
240
240
  - lib/klomp/sentinel.rb
241
+ - lib/klomp/subscription.rb
241
242
  - spec/acceptance/acceptance_spec.rb
242
243
  - spec/acceptance/reconnect_spec.rb
243
244
  - spec/frames/auth_error.txt
@@ -274,7 +275,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
274
275
  version: '0'
275
276
  segments:
276
277
  - 0
277
- hash: 2933496602827248730
278
+ hash: 2253396799858323588
278
279
  required_rubygems_version: !ruby/object:Gem::Requirement
279
280
  none: false
280
281
  requirements: