klomp 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.md +8 -0
- data/klomp.gemspec +2 -2
- data/lib/klomp.rb +1 -1
- data/lib/klomp/connection.rb +12 -15
- data/lib/klomp/frames.rb +6 -9
- data/spec/klomp/frames_spec.rb +26 -1
- metadata +3 -3
data/ChangeLog.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
Klomp Changes
|
2
2
|
--------------------------------------------------------------------------------
|
3
3
|
|
4
|
+
1.0.2 (2012/10/10)
|
5
|
+
================================================================================
|
6
|
+
|
7
|
+
- Frames now respond to `#[]` and `#[]=` (for header access) and `#body=` (for
|
8
|
+
setting body after construction)
|
9
|
+
- Configurable foreground IO.select timeout through `options['select_timeout']`
|
10
|
+
- Add logging of read frames and exceptions when going offline
|
11
|
+
|
4
12
|
1.0.1 (2012/10/5)
|
5
13
|
================================================================================
|
6
14
|
|
data/klomp.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "klomp"
|
5
|
-
s.version = "1.0.
|
5
|
+
s.version = "1.0.2"
|
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 = "2012-10-
|
9
|
+
s.date = "2012-10-10"
|
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"]
|
data/lib/klomp.rb
CHANGED
data/lib/klomp/connection.rb
CHANGED
@@ -28,6 +28,7 @@ class Klomp
|
|
28
28
|
@options['host'] ||= host
|
29
29
|
@subscriptions = {}
|
30
30
|
@logger = options['logger']
|
31
|
+
@select_timeout = options['select_timeout'] || 0.1
|
31
32
|
connect
|
32
33
|
end
|
33
34
|
|
@@ -82,7 +83,7 @@ class Klomp
|
|
82
83
|
@socket = TCPSocket.new *options['server']
|
83
84
|
@socket.set_encoding 'UTF-8'
|
84
85
|
write Frames::Connect.new(options)
|
85
|
-
frame = read Frames::Connected,
|
86
|
+
frame = read Frames::Connected, @select_timeout
|
86
87
|
log_frame frame if logger
|
87
88
|
raise Error, frame.headers['message'] if frame.error?
|
88
89
|
end
|
@@ -91,7 +92,7 @@ class Klomp
|
|
91
92
|
raise Error, "connection closed" if closed?
|
92
93
|
raise Error, "disconnected" unless connected?
|
93
94
|
|
94
|
-
rs, ws, = IO.select(nil, [@socket], nil,
|
95
|
+
rs, ws, = IO.select(nil, [@socket], nil, @select_timeout)
|
95
96
|
raise Error, "connection unavailable for write" unless ws && !ws.empty?
|
96
97
|
|
97
98
|
@socket.write frame.to_s
|
@@ -99,19 +100,19 @@ class Klomp
|
|
99
100
|
frame
|
100
101
|
rescue Error
|
101
102
|
raise
|
102
|
-
rescue
|
103
|
-
go_offline
|
103
|
+
rescue => e
|
104
|
+
go_offline e
|
104
105
|
raise
|
105
106
|
end
|
106
107
|
|
107
108
|
def read(type, timeout = nil)
|
108
109
|
rs, = IO.select([@socket], nil, nil, timeout)
|
109
110
|
raise Error, "connection unavailable for read" unless rs && !rs.empty?
|
110
|
-
type.new
|
111
|
+
type.new(@socket.gets(FRAME_SEP)).tap {|frame| log_frame frame if logger }
|
111
112
|
rescue Error
|
112
113
|
raise
|
113
|
-
rescue
|
114
|
-
go_offline
|
114
|
+
rescue => e
|
115
|
+
go_offline e
|
115
116
|
raise
|
116
117
|
end
|
117
118
|
|
@@ -122,8 +123,8 @@ class Klomp
|
|
122
123
|
logger.debug "frame=#{frame.name} #{frame.headers.map{|k,v| k + '=' + v }.join(' ')} body=#{body}"
|
123
124
|
end
|
124
125
|
|
125
|
-
def log_exception(ex, level = :error)
|
126
|
-
logger.send level, "exception=#{ex.class.name} message=#{ex.message.inspect} backtrace[0]=#{ex.backtrace[0]} backtrace[1]=#{ex.backtrace[1]}"
|
126
|
+
def log_exception(ex, level = :error, msg_start = '')
|
127
|
+
logger.send level, "#{msg_start}exception=#{ex.class.name} message=#{ex.message.inspect} backtrace[0]=#{ex.backtrace[0]} backtrace[1]=#{ex.backtrace[1]}"
|
127
128
|
logger.debug "exception=#{ex.class.name} full_backtrace=" + ex.backtrace.join("\n")
|
128
129
|
end
|
129
130
|
|
@@ -131,12 +132,8 @@ class Klomp
|
|
131
132
|
@closing = true
|
132
133
|
end
|
133
134
|
|
134
|
-
def go_offline
|
135
|
-
if logger
|
136
|
-
msg = "offline server=#{options['server'].join(':')}"
|
137
|
-
msg << " exception=#{$!.class.name} message=#{$!.message.inspect}" if $!
|
138
|
-
logger.warn msg
|
139
|
-
end
|
135
|
+
def go_offline(ex)
|
136
|
+
log_exception(ex, :warn, "offline server=#{options['server'].join(':')} ") if logger
|
140
137
|
@socket.close rescue nil
|
141
138
|
@socket = nil
|
142
139
|
Sentinel.new(self)
|
data/lib/klomp/frames.rb
CHANGED
@@ -3,17 +3,14 @@ class Klomp
|
|
3
3
|
|
4
4
|
module Frames
|
5
5
|
class Frame
|
6
|
-
def name
|
7
|
-
@name ||= self.class.name.split('::').last.upcase
|
8
|
-
end
|
6
|
+
def name; @name ||= self.class.name.split('::').last.upcase; end
|
9
7
|
|
10
|
-
def headers
|
11
|
-
|
12
|
-
end
|
8
|
+
def headers; @headers ||= {}; end
|
9
|
+
def [](key); headers[key]; end
|
10
|
+
def []=(key, value); headers[key] = value; end
|
13
11
|
|
14
|
-
def body
|
15
|
-
|
16
|
-
end
|
12
|
+
def body; @body ||= ""; end
|
13
|
+
def body=(b); @body = b; end
|
17
14
|
|
18
15
|
def to_s
|
19
16
|
"#{name}\n#{dump_headers}\n#{@body}#{FRAME_SEP}"
|
data/spec/klomp/frames_spec.rb
CHANGED
@@ -2,9 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Klomp::Frames do
|
4
4
|
|
5
|
+
Given(:options) { {'login' => 'admin', 'passcode' => 'password', 'host' => '127.0.0.1'} }
|
6
|
+
|
5
7
|
context "CONNECT" do
|
6
8
|
|
7
|
-
Given(:options) { {'login' => 'admin', 'passcode' => 'password', 'host' => '127.0.0.1'} }
|
8
9
|
|
9
10
|
When(:connect) { Klomp::Frames::Connect.new(options).to_s }
|
10
11
|
|
@@ -20,4 +21,28 @@ describe Klomp::Frames do
|
|
20
21
|
|
21
22
|
end
|
22
23
|
|
24
|
+
context "#[] is an alias for #headers" do
|
25
|
+
|
26
|
+
When(:connect) { Klomp::Frames::Connect.new(options) }
|
27
|
+
|
28
|
+
When { connect['my-header'] = 'my-value' }
|
29
|
+
|
30
|
+
Then { connect['login'].should == 'admin' }
|
31
|
+
|
32
|
+
Then { connect['passcode'].should == 'password' }
|
33
|
+
|
34
|
+
Then { connect['my-header'].should == 'my-value' }
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
context "body can be assigned after construction" do
|
39
|
+
|
40
|
+
Given(:send_frame) { Klomp::Frames::Send.new("/queue/q", "", {}) }
|
41
|
+
|
42
|
+
When { send_frame.body = "hello" }
|
43
|
+
|
44
|
+
Then { send_frame.body.should == "hello" }
|
45
|
+
|
46
|
+
end
|
47
|
+
|
23
48
|
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: 1.0.
|
4
|
+
version: 1.0.2
|
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: 2012-10-
|
12
|
+
date: 2012-10-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
@@ -224,7 +224,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
224
224
|
version: '0'
|
225
225
|
segments:
|
226
226
|
- 0
|
227
|
-
hash:
|
227
|
+
hash: 4534787410900240650
|
228
228
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
229
229
|
none: false
|
230
230
|
requirements:
|