ruote-stomp-maestrodev 2.2.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.txt +11 -0
- data/CREDITS.txt +33 -0
- data/PostInstall.txt +12 -0
- data/README.rdoc +82 -0
- data/Rakefile +101 -0
- data/TODO.txt +4 -0
- data/lib/ruote-stomp.rb +116 -0
- data/lib/ruote-stomp/launchitem_listener.rb +20 -0
- data/lib/ruote-stomp/participant.rb +212 -0
- data/lib/ruote-stomp/receiver.rb +146 -0
- data/lib/ruote-stomp/version.rb +4 -0
- data/lib/ruote-stomp/workitem_listener.rb +11 -0
- data/ruote-stomp.gemspec +31 -0
- data/spec/launchitem_listener_spec.rb +78 -0
- data/spec/participant_spec.rb +204 -0
- data/spec/receiver_spec.rb +126 -0
- data/spec/ruote_stomp_spec.rb +14 -0
- data/spec/spec_helper.rb +97 -0
- data/spec/support/ruote_helpers.rb +27 -0
- data/spec/support/ruote_matchers.rb +45 -0
- data/spec/workitem_listener_spec.rb +62 -0
- metadata +181 -0
@@ -0,0 +1,126 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
require 'ruote/participant'
|
4
|
+
|
5
|
+
describe RuoteStomp::Receiver do
|
6
|
+
|
7
|
+
after(:each) do
|
8
|
+
purge_engine
|
9
|
+
end
|
10
|
+
|
11
|
+
it "handles replies" do
|
12
|
+
pdef = Ruote.process_definition :name => 'test' do
|
13
|
+
set :field => 'foo', :value => 'foo'
|
14
|
+
sequence do
|
15
|
+
echo '${f:foo}'
|
16
|
+
stomp :queue => '/queue/test3'
|
17
|
+
echo '${f:foo}'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
@engine.register_participant(:stomp, RuoteStomp::ParticipantProxy)
|
22
|
+
|
23
|
+
receiver = RuoteStomp::Receiver.new(@engine, :ignore_disconnect_on_process => true)
|
24
|
+
|
25
|
+
wfid = @engine.launch(pdef)
|
26
|
+
|
27
|
+
workitem = nil
|
28
|
+
|
29
|
+
begin
|
30
|
+
Timeout::timeout(5) do
|
31
|
+
|
32
|
+
$stomp.subscribe("/queue/test3") do |message|
|
33
|
+
wi = Ruote::Workitem.new(Rufus::Json.decode(message.body))
|
34
|
+
workitem = wi if wi.wfid == wfid
|
35
|
+
end
|
36
|
+
|
37
|
+
loop do
|
38
|
+
break unless workitem.nil?
|
39
|
+
sleep 0.1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
rescue Timeout::Error
|
43
|
+
fail "Timeout waiting for message"
|
44
|
+
end
|
45
|
+
|
46
|
+
workitem.fields['foo'] = "bar"
|
47
|
+
|
48
|
+
$stomp.send '/queue/ruote_workitems', Rufus::Json.encode(workitem.to_h)
|
49
|
+
|
50
|
+
@engine.wait_for(wfid)
|
51
|
+
|
52
|
+
@engine.should_not have_errors
|
53
|
+
@engine.should_not have_remaining_expressions
|
54
|
+
|
55
|
+
@tracer.to_s.should == "foo\nbar"
|
56
|
+
receiver.stop
|
57
|
+
end
|
58
|
+
|
59
|
+
it "launches processes" do
|
60
|
+
|
61
|
+
json = {
|
62
|
+
'definition' => %{
|
63
|
+
Ruote.process_definition :name => 'test' do
|
64
|
+
sequence do
|
65
|
+
echo '${f:foo}'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
},
|
69
|
+
'fields' => { 'foo' => 'bar' }
|
70
|
+
}.to_json
|
71
|
+
|
72
|
+
receiver = RuoteStomp::Receiver.new(@engine, {:launchitems => true, :unsubscribe => true, :ignore_disconnect_on_process => true})
|
73
|
+
|
74
|
+
finished_processing = false
|
75
|
+
|
76
|
+
$stomp.send('/queue/ruote_workitems', json) do |r|
|
77
|
+
finished_processing = true
|
78
|
+
end
|
79
|
+
|
80
|
+
begin
|
81
|
+
Timeout::timeout(20) do
|
82
|
+
while @tracer.to_s.empty?
|
83
|
+
print "*"
|
84
|
+
sleep 1
|
85
|
+
end
|
86
|
+
end
|
87
|
+
rescue Timeout::Error
|
88
|
+
fail "Timeout waiting for message"
|
89
|
+
end
|
90
|
+
|
91
|
+
Thread.pass until finished_processing
|
92
|
+
|
93
|
+
@engine.should_not have_errors
|
94
|
+
@engine.should_not have_remaining_expressions
|
95
|
+
|
96
|
+
@tracer.to_s.should == 'bar'
|
97
|
+
receiver.stop
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'accepts a custom :queue' do
|
101
|
+
|
102
|
+
RuoteStomp::Receiver.new(
|
103
|
+
@engine, :queue => '/queue/mario', :launchitems => true, :unsubscribe => true, :ignore_disconnect_on_process => true)
|
104
|
+
|
105
|
+
@engine.register_participant 'alpha', Ruote::StorageParticipant
|
106
|
+
|
107
|
+
json = Rufus::Json.encode({
|
108
|
+
'definition' => "Ruote.define { alpha }"
|
109
|
+
})
|
110
|
+
|
111
|
+
$stomp.send '/queue/ruote_workitems', json
|
112
|
+
|
113
|
+
sleep 1
|
114
|
+
|
115
|
+
@engine.processes.size.should == 0
|
116
|
+
# nothing happened
|
117
|
+
|
118
|
+
$stomp.send '/queue/mario', json
|
119
|
+
|
120
|
+
sleep 1
|
121
|
+
|
122
|
+
@engine.processes.size.should == 1
|
123
|
+
# launch happened
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe RuoteStomp do
|
4
|
+
|
5
|
+
it "uses persistent messages by default" do
|
6
|
+
RuoteStomp.use_persistent_messages?.should be_true
|
7
|
+
end
|
8
|
+
|
9
|
+
it "allows switching to transient messages" do
|
10
|
+
RuoteStomp.use_persistent_messages = false
|
11
|
+
RuoteStomp.use_persistent_messages?.should be_false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rspec'
|
3
|
+
|
4
|
+
$:.unshift(File.join(File.dirname(__FILE__), '../lib'))
|
5
|
+
$:.unshift(File.join(File.dirname(__FILE__), '../../ruote/lib'))
|
6
|
+
|
7
|
+
require 'fileutils'
|
8
|
+
require 'json'
|
9
|
+
require 'timeout'
|
10
|
+
|
11
|
+
require 'ruote/engine'
|
12
|
+
require 'ruote/worker'
|
13
|
+
require 'ruote/storage/hash_storage'
|
14
|
+
require 'ruote/log/test_logger'
|
15
|
+
#require 'stomp_server'
|
16
|
+
|
17
|
+
require 'ruote-stomp'
|
18
|
+
|
19
|
+
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |path|
|
20
|
+
require(path)
|
21
|
+
}
|
22
|
+
|
23
|
+
# No Stomp auth is configured/required.
|
24
|
+
# test = Thread.new do
|
25
|
+
# EventMachine::run do
|
26
|
+
# config = StompServer::Configurator.new
|
27
|
+
# stomp = StompServer::Run.new(config.opts)
|
28
|
+
# stomp.start
|
29
|
+
#
|
30
|
+
# puts "Stomp protocol handler starting on #{config.opts[:host]} port #{config.opts[:port]}"
|
31
|
+
# EventMachine.start_server(config.opts[:host],
|
32
|
+
# config.opts[:port],
|
33
|
+
# StompServer::Protocols::Stomp) do |s|
|
34
|
+
# s.instance_eval {
|
35
|
+
# @@auth_required = false
|
36
|
+
# @@queue_manager = stomp.queue_manager
|
37
|
+
# @@topic_manager = stomp.topic_manager
|
38
|
+
# @@stompauth = stomp.stompauth
|
39
|
+
# }
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
|
44
|
+
STOMP.settings[:user] = ""
|
45
|
+
STOMP.settings[:passcode] = ""
|
46
|
+
STOMP.settings[:host] = "127.0.0.1"
|
47
|
+
STOMP.settings[:port] = 61613
|
48
|
+
STOMP.settings[:reliable] = true
|
49
|
+
|
50
|
+
RSpec.configure do |config|
|
51
|
+
|
52
|
+
# config.fail_fast = true
|
53
|
+
|
54
|
+
config.include(RuoteSpecHelpers)
|
55
|
+
|
56
|
+
config.before(:each) do
|
57
|
+
@tracer = Tracer.new
|
58
|
+
@engine = Ruote::Engine.new(
|
59
|
+
Ruote::Worker.new(
|
60
|
+
Ruote::HashStorage.new('s_logger' => [ 'ruote/log/test_logger', 'Ruote::TestLogger' ])
|
61
|
+
)
|
62
|
+
)
|
63
|
+
|
64
|
+
@engine.add_service('tracer', @tracer)
|
65
|
+
#@engine.noisy = true
|
66
|
+
end
|
67
|
+
|
68
|
+
config.after(:each) do
|
69
|
+
@engine.context.storage.purge!
|
70
|
+
@engine.shutdown
|
71
|
+
end
|
72
|
+
|
73
|
+
config.after(:all) do
|
74
|
+
base = File.expand_path(File.dirname(__FILE__) + '/..')
|
75
|
+
FileUtils.rm_rf(base + '/logs')
|
76
|
+
FileUtils.rm_rf(base + '/work')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class Tracer
|
81
|
+
def initialize
|
82
|
+
@trace = ''
|
83
|
+
end
|
84
|
+
def to_s
|
85
|
+
@trace.to_s.strip
|
86
|
+
end
|
87
|
+
def << s
|
88
|
+
@trace << s
|
89
|
+
end
|
90
|
+
def clear
|
91
|
+
@trace = ''
|
92
|
+
end
|
93
|
+
def puts s
|
94
|
+
@trace << "#{s}\n"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RuoteSpecHelpers
|
2
|
+
|
3
|
+
def purge_engine
|
4
|
+
|
5
|
+
# TODO : adapt to ruote 2.1.10
|
6
|
+
end
|
7
|
+
|
8
|
+
def run_definition(pdef)
|
9
|
+
|
10
|
+
wfid = @engine.launch(pdef)
|
11
|
+
|
12
|
+
#r = @engine.wait_for(wfid)
|
13
|
+
#@engine.wait_for(wfid) if r['action'] == 'ceased'
|
14
|
+
# # make sure to wait for 'terminated'
|
15
|
+
@engine.wait_for(:inactive)
|
16
|
+
|
17
|
+
@engine.should_not have_errors
|
18
|
+
@engine.should_not have_remaining_expressions
|
19
|
+
|
20
|
+
purge_engine
|
21
|
+
end
|
22
|
+
|
23
|
+
def noisy(on = true)
|
24
|
+
@engine.context.logger.noisy = on
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
RSpec::Matchers.define :have_errors do |*args|
|
2
|
+
|
3
|
+
match do |engine|
|
4
|
+
|
5
|
+
@ps = if wfid = args.shift
|
6
|
+
engine.processes(wfid)
|
7
|
+
else
|
8
|
+
engine.processes.first
|
9
|
+
end
|
10
|
+
|
11
|
+
@ps ? (@ps.errors.size != 0) : false
|
12
|
+
end
|
13
|
+
|
14
|
+
failure_message_for_should do |engine|
|
15
|
+
"Expected engine to have errors, but didn't"
|
16
|
+
end
|
17
|
+
|
18
|
+
failure_message_for_should_not do |engine|
|
19
|
+
"Expected the engine to not have errors, but it did.\n" +
|
20
|
+
@ps.errors.map { |e| " * error: #{e.message}\n\"#{e.trace}\"" }.join("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
description do
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
RSpec::Matchers.define :have_remaining_expressions do
|
28
|
+
|
29
|
+
match do |engine|
|
30
|
+
(engine.storage.get_many('expressions').size != 0)
|
31
|
+
end
|
32
|
+
|
33
|
+
failure_message_for_should do |engine|
|
34
|
+
"Expected engine to have processes remaining, but it didn't"
|
35
|
+
end
|
36
|
+
|
37
|
+
failure_message_for_should_not do |engine|
|
38
|
+
"Expected engine to have no processes remaining, but it did." +
|
39
|
+
"#{engine.storage.get_many('expressions').inspect}"
|
40
|
+
end
|
41
|
+
|
42
|
+
description do
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
#
|
4
|
+
# NOTE : RuoteStomp::WorkitemListener has been depreacted in favour of
|
5
|
+
# RuoteStomp::Receiver
|
6
|
+
#
|
7
|
+
|
8
|
+
describe RuoteStomp::WorkitemListener do
|
9
|
+
|
10
|
+
after(:each) do
|
11
|
+
purge_engine
|
12
|
+
end
|
13
|
+
|
14
|
+
it "handles replies" do
|
15
|
+
|
16
|
+
pdef = Ruote.process_definition :name => 'test' do
|
17
|
+
set :field => 'foo', :value => 'foo'
|
18
|
+
sequence do
|
19
|
+
echo '${f:foo}'
|
20
|
+
stomp :queue => '/queue/test7'
|
21
|
+
echo '${f:foo}'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
@engine.register_participant(:stomp, RuoteStomp::ParticipantProxy)
|
26
|
+
|
27
|
+
RuoteStomp::WorkitemListener.new(@engine, :unsubscribe => true, :ignore_disconnect_on_process => true)
|
28
|
+
|
29
|
+
wfid = @engine.launch(pdef)
|
30
|
+
|
31
|
+
workitem = nil
|
32
|
+
|
33
|
+
begin
|
34
|
+
Timeout::timeout(5) do
|
35
|
+
|
36
|
+
$stomp.subscribe("/queue/test7") do |message|
|
37
|
+
wi = Ruote::Workitem.new(Rufus::Json.decode(message.body))
|
38
|
+
workitem = wi if wi.wfid == wfid
|
39
|
+
end
|
40
|
+
|
41
|
+
loop do
|
42
|
+
break unless workitem.nil?
|
43
|
+
sleep 0.1
|
44
|
+
end
|
45
|
+
end
|
46
|
+
rescue Timeout::Error
|
47
|
+
fail "Timeout waiting for message"
|
48
|
+
end
|
49
|
+
|
50
|
+
workitem.fields['foo'] = 'bar'
|
51
|
+
|
52
|
+
$stomp.send '/queue/ruote_workitems', Rufus::Json.encode(workitem.to_h)
|
53
|
+
|
54
|
+
@engine.wait_for(wfid)
|
55
|
+
|
56
|
+
@engine.should_not have_errors
|
57
|
+
@engine.should_not have_remaining_expressions
|
58
|
+
|
59
|
+
@tracer.to_s.should == "foo\nbar"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
metadata
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruote-stomp-maestrodev
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.2.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Kit Plummer
|
9
|
+
- Brian Sam-Bodden
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-04-03 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: onstomp
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.4
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 1.0.4
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: ruote
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ~>
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 2.2.0
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.2.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: json
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: parslet
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rake
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rspec
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.6.0
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.6.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: stompserver
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 0.9.9
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 0.9.9
|
127
|
+
description: Stomp participant/listener pair for ruote 2.2
|
128
|
+
email:
|
129
|
+
- kplummer@maestrodev.com
|
130
|
+
- bsbodden@integrallis.com
|
131
|
+
executables: []
|
132
|
+
extensions: []
|
133
|
+
extra_rdoc_files: []
|
134
|
+
files:
|
135
|
+
- Rakefile
|
136
|
+
- lib/ruote-stomp/launchitem_listener.rb
|
137
|
+
- lib/ruote-stomp/participant.rb
|
138
|
+
- lib/ruote-stomp/receiver.rb
|
139
|
+
- lib/ruote-stomp/version.rb
|
140
|
+
- lib/ruote-stomp/workitem_listener.rb
|
141
|
+
- lib/ruote-stomp.rb
|
142
|
+
- spec/launchitem_listener_spec.rb
|
143
|
+
- spec/participant_spec.rb
|
144
|
+
- spec/receiver_spec.rb
|
145
|
+
- spec/ruote_stomp_spec.rb
|
146
|
+
- spec/spec_helper.rb
|
147
|
+
- spec/support/ruote_helpers.rb
|
148
|
+
- spec/support/ruote_matchers.rb
|
149
|
+
- spec/workitem_listener_spec.rb
|
150
|
+
- ruote-stomp.gemspec
|
151
|
+
- CHANGELOG.txt
|
152
|
+
- CREDITS.txt
|
153
|
+
- PostInstall.txt
|
154
|
+
- TODO.txt
|
155
|
+
- README.rdoc
|
156
|
+
homepage: http://ruote.rubyforge.org
|
157
|
+
licenses: []
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
require_paths:
|
161
|
+
- lib
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
164
|
+
requirements:
|
165
|
+
- - ! '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
requirements: []
|
175
|
+
rubyforge_project: ruote
|
176
|
+
rubygems_version: 1.8.25
|
177
|
+
signing_key:
|
178
|
+
specification_version: 3
|
179
|
+
summary: Stomp participant/listener pair for ruote 2.2
|
180
|
+
test_files: []
|
181
|
+
has_rdoc:
|