klomp 0.0.1 → 0.0.2
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.
- data/ChangeLog.md +15 -0
- data/README.md +27 -1
- data/klomp.gemspec +1 -1
- data/lib/klomp.rb +1 -5
- data/lib/klomp/client.rb +57 -35
- data/test/test_client.rb +21 -1
- metadata +8 -8
data/ChangeLog.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Changes
|
2
|
+
--------------------------------------------------------------------------------
|
3
|
+
|
4
|
+
0.0.2 (2012/06/15)
|
5
|
+
================================================================================
|
6
|
+
|
7
|
+
- Add `:logger` option to log sending and receiving of messages
|
8
|
+
- Duck-type with `#to_json` for `:translate_json` option
|
9
|
+
- Clean up options parsing, pass all options through to OnStomp client config
|
10
|
+
- Clamp onstomp gem dependency version to 1.0.x
|
11
|
+
|
12
|
+
0.0.1 (2012/06/08)
|
13
|
+
================================================================================
|
14
|
+
|
15
|
+
- Initial release
|
data/README.md
CHANGED
@@ -16,7 +16,8 @@ left behind.
|
|
16
16
|
Ruby and JSON objects.
|
17
17
|
|
18
18
|
* If a reply-to header is found in a message, a response is automatically
|
19
|
-
sent to the reply-to destination.
|
19
|
+
sent to the reply-to destination. The response will be the return value of the
|
20
|
+
subscribe block.
|
20
21
|
|
21
22
|
## Installation
|
22
23
|
|
@@ -35,6 +36,31 @@ manages connections. For example, while the `connected?` method normally
|
|
35
36
|
returns a boolean value, Klomp's `connected?` will return an array of booleans
|
36
37
|
(i.e. one result for each broker).
|
37
38
|
|
39
|
+
### Additional options for Klomp::Client
|
40
|
+
|
41
|
+
<table>
|
42
|
+
<tr>
|
43
|
+
<th>Key</th>
|
44
|
+
<th>Default value</th>
|
45
|
+
<th>Description</th>
|
46
|
+
</tr>
|
47
|
+
<tr>
|
48
|
+
<td>:translate_json</td>
|
49
|
+
<td>true</td>
|
50
|
+
<td>Translate message bodies between native Ruby and JSON objects?</td>
|
51
|
+
</tr>
|
52
|
+
<tr>
|
53
|
+
<td>:auto_reply_to</td>
|
54
|
+
<td>true</td>
|
55
|
+
<td>Automatically send response to reply-to destination?</td>
|
56
|
+
</tr>
|
57
|
+
<tr>
|
58
|
+
<td>:logger</td>
|
59
|
+
<td>false</td>
|
60
|
+
<td>Logger object</td>
|
61
|
+
</tr>
|
62
|
+
</table>
|
63
|
+
|
38
64
|
## Developers
|
39
65
|
|
40
66
|
Set up the environment using `bundle install`. Note that the tests currently
|
data/klomp.gemspec
CHANGED
data/lib/klomp.rb
CHANGED
data/lib/klomp/client.rb
CHANGED
@@ -1,44 +1,53 @@
|
|
1
|
+
require 'onstomp'
|
2
|
+
require 'onstomp/failover'
|
3
|
+
require 'json'
|
4
|
+
require 'logger'
|
5
|
+
|
1
6
|
module Klomp
|
2
7
|
|
3
8
|
class Client
|
4
|
-
attr_reader :
|
9
|
+
attr_reader :read_conn, :write_conn
|
5
10
|
|
6
11
|
def initialize(uri, options={})
|
7
|
-
@options
|
8
|
-
|
9
|
-
|
10
|
-
}
|
12
|
+
@translate_json = options.fetch(:translate_json, true)
|
13
|
+
@auto_reply_to = options.fetch(:auto_reply_to, true)
|
14
|
+
@logger = options.fetch(:logger, nil)
|
11
15
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
}) { |memo,(k,v)| memo.merge({k => v}) if memo.has_key?(k) }
|
16
|
+
# defaults for retry delay and attempts
|
17
|
+
options[:retry_delay] ||= 2
|
18
|
+
options[:retry_attempts] ||= 10
|
16
19
|
|
17
20
|
if uri.is_a?(Array)
|
18
|
-
@write_conn = OnStomp::Failover::Client.new(uri,
|
19
|
-
@read_conn = uri.
|
21
|
+
@write_conn = OnStomp::Failover::Client.new(uri, options)
|
22
|
+
@read_conn = uri.map {|obj| OnStomp::Failover::Client.new([obj], options) }
|
20
23
|
else
|
21
|
-
@write_conn = OnStomp::Failover::Client.new([uri],
|
24
|
+
@write_conn = OnStomp::Failover::Client.new([uri], options)
|
22
25
|
@read_conn = [@write_conn]
|
23
26
|
end
|
27
|
+
@all_conn = ([@write_conn] + @read_conn).uniq
|
28
|
+
configure_connections
|
24
29
|
end
|
25
30
|
|
26
31
|
def send(*args, &block)
|
27
|
-
if @
|
32
|
+
if @translate_json && args[1].respond_to?(:to_json)
|
28
33
|
args[1] = args[1].to_json
|
29
|
-
args[2]
|
34
|
+
args[2] ||= {}
|
30
35
|
args[2][:'content-type'] = 'application/json'
|
31
36
|
else
|
32
37
|
args[1] = args[1].to_s
|
33
38
|
end
|
39
|
+
log.info("[Sending] Destination=#{args[0]} Body=#{args[1]} Headers=#{args[2]}") if log
|
34
40
|
@write_conn.send(*args, &block)
|
35
41
|
end
|
42
|
+
alias puts send
|
43
|
+
alias publish send
|
36
44
|
|
37
45
|
def subscribe(*args, &block)
|
38
46
|
frames = []
|
39
47
|
@read_conn.each do |c|
|
40
48
|
frames << c.subscribe(*args) do |msg|
|
41
|
-
if
|
49
|
+
log.info("[Received] Body=#{msg.body} Headers=#{msg.headers.to_hash.sort}") if log
|
50
|
+
if @translate_json
|
42
51
|
msg.body = begin
|
43
52
|
JSON.parse(msg.body)
|
44
53
|
rescue JSON::ParserError
|
@@ -46,7 +55,7 @@ module Klomp
|
|
46
55
|
end
|
47
56
|
end
|
48
57
|
reply_args = yield msg
|
49
|
-
if @
|
58
|
+
if @auto_reply_to && !msg.headers[:'reply-to'].nil?
|
50
59
|
if reply_args.is_a?(Array)
|
51
60
|
send(msg.headers[:'reply-to'], *reply_args)
|
52
61
|
else
|
@@ -58,31 +67,44 @@ module Klomp
|
|
58
67
|
frames
|
59
68
|
end
|
60
69
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
70
|
+
def log
|
71
|
+
@logger
|
72
|
+
end
|
73
|
+
|
74
|
+
WRITE_ONLY_METHODS = [
|
75
|
+
:abort,
|
76
|
+
:begin,
|
77
|
+
:commit,
|
78
|
+
]
|
79
|
+
|
80
|
+
READ_ONLY_METHODS = [
|
81
|
+
:ack,
|
82
|
+
:nack,
|
83
|
+
:unsubscribe,
|
84
|
+
]
|
75
85
|
|
76
|
-
|
86
|
+
def method_missing(method, *args, &block)
|
87
|
+
case method
|
88
|
+
when *WRITE_ONLY_METHODS
|
77
89
|
@write_conn.send(method, *args, &block)
|
78
|
-
|
79
|
-
@read_conn.map {
|
90
|
+
when *READ_ONLY_METHODS
|
91
|
+
@read_conn.map {|c| c.__send__(method, *args, &block) }
|
92
|
+
when :connect
|
93
|
+
@all_conn.each {|c| c.connect}
|
94
|
+
self
|
80
95
|
else
|
81
|
-
|
96
|
+
@all_conn.map {|c| c.__send__(method, *args) }
|
82
97
|
end
|
83
|
-
returns.include?(method) ? returns[method] : result
|
84
98
|
end
|
85
99
|
|
100
|
+
private
|
101
|
+
def configure_connections
|
102
|
+
@all_conn.each do |c|
|
103
|
+
c.on_failover_connect_failure do
|
104
|
+
raise if OnStomp::FatalConnectionError === $!
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
86
108
|
end
|
87
109
|
|
88
110
|
end
|
data/test/test_client.rb
CHANGED
@@ -34,6 +34,12 @@ describe Klomp::Client do
|
|
34
34
|
client.disconnect
|
35
35
|
end
|
36
36
|
|
37
|
+
it 'raises an error if authentication fails' do
|
38
|
+
assert_raises OnStomp::ConnectFailedError do
|
39
|
+
Klomp::Client.new(@uris.first.sub('password', 'psswrd')).connect
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
37
43
|
it 'disconnnects' do
|
38
44
|
client = Klomp::Client.new(@uris.first).connect
|
39
45
|
assert client.write_conn.connected?
|
@@ -41,6 +47,15 @@ describe Klomp::Client do
|
|
41
47
|
refute client.write_conn.connected?
|
42
48
|
end
|
43
49
|
|
50
|
+
it 'has a logger' do
|
51
|
+
logger = Logger.new(STDOUT)
|
52
|
+
client = Klomp::Client.new(@uris, :logger=>logger).connect
|
53
|
+
|
54
|
+
assert_equal client.log, logger
|
55
|
+
|
56
|
+
client.disconnect
|
57
|
+
end
|
58
|
+
|
44
59
|
it 'sends heartbeat' do
|
45
60
|
client = Klomp::Client.new(@uris).connect.beat
|
46
61
|
end
|
@@ -66,7 +81,7 @@ describe Klomp::Client do
|
|
66
81
|
client = Klomp::Client.new(@uris).connect
|
67
82
|
reply_to_body = { 'reply_to_body' => rand(36**128).to_s(36) }
|
68
83
|
|
69
|
-
client.
|
84
|
+
client.puts(@destination, nil, { 'reply-to' => @destination })
|
70
85
|
|
71
86
|
got_message = false
|
72
87
|
client.subscribe(@destination) do |msg|
|
@@ -88,4 +103,9 @@ describe Klomp::Client do
|
|
88
103
|
client.disconnect
|
89
104
|
end
|
90
105
|
|
106
|
+
it 'sends all unknown options through to OnStomp' do
|
107
|
+
client = Klomp::Client.new(@uris.first, :haz_cheezburgers => true, :retry_attempts => 42).connect
|
108
|
+
assert client.write_conn.connected?
|
109
|
+
assert_equal 42, client.write_conn.retry_attempts
|
110
|
+
end
|
91
111
|
end
|
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: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: onstomp
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 1.0.7
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 1.0.7
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: json
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -51,6 +51,7 @@ extensions: []
|
|
51
51
|
extra_rdoc_files: []
|
52
52
|
files:
|
53
53
|
- .gitignore
|
54
|
+
- ChangeLog.md
|
54
55
|
- Gemfile
|
55
56
|
- Gemfile.lock
|
56
57
|
- Procfile
|
@@ -81,10 +82,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
82
|
version: '0'
|
82
83
|
requirements: []
|
83
84
|
rubyforge_project:
|
84
|
-
rubygems_version: 1.8.
|
85
|
+
rubygems_version: 1.8.21
|
85
86
|
signing_key:
|
86
87
|
specification_version: 3
|
87
88
|
summary: A simple wrapper around the OnStomp library with additional features
|
88
89
|
test_files:
|
89
90
|
- test/test_client.rb
|
90
|
-
has_rdoc:
|