sinatra-rocketio-linda 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/History.txt +8 -0
- data/README.md +8 -1
- data/Rakefile +6 -0
- data/lib/sinatra-rocketio-linda/linda.rb +26 -49
- data/lib/sinatra-rocketio-linda/tuple.rb +3 -1
- data/lib/sinatra-rocketio-linda/tuplespace.rb +22 -6
- data/lib/sinatra/rocketio/linda/version.rb +1 -1
- data/test/app.rb +38 -0
- data/test/app/config.ru +14 -0
- data/test/app/main.rb +28 -0
- data/test/test_client_disconnect.rb +46 -0
- data/test/test_helper.rb +2 -0
- data/test/test_rubyclient.rb +125 -0
- data/test/test_tuplespace.rb +6 -2
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22a5549a8d89eeae678b0f22d44dae2afad0473f
|
4
|
+
data.tar.gz: aa42150b15eb7393de375740260e094c60e8ce00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ce242560eb393dd968e79199708a6a7c5f1cce9a8593015d1f89b88286ee26ecb9f3d7f4aea5efc9856386ca5cdf39c255b2fe3f0a00793ca6940a369259111
|
7
|
+
data.tar.gz: 8f71b0aefc032cd9b2020a365b6633a95e7307817417ba4df96d2304a70a4b120d75544e43293f0e5a6fedd1418e5c646e16c655d6b1fa286088933665f6cab5
|
data/History.txt
CHANGED
@@ -1,8 +1,16 @@
|
|
1
|
+
=== 0.0.3 2013-05-16
|
2
|
+
|
3
|
+
* remove read/take/watch listener on client disconnect
|
4
|
+
* {expire => false} option on tuple write
|
5
|
+
* add ruby client's test
|
6
|
+
|
1
7
|
=== 0.0.2 2013-05-15
|
8
|
+
|
2
9
|
* update README
|
3
10
|
* TupleSpace#watch(tuple, callback(tuple))
|
4
11
|
|
5
12
|
=== 0.0.1 2013-05-15
|
13
|
+
|
6
14
|
* JavaScript Linda Client for WebBrowser
|
7
15
|
* Ruby Linda Client
|
8
16
|
* TupleSpace#write(tuple)
|
data/README.md
CHANGED
@@ -54,7 +54,7 @@ Server Side
|
|
54
54
|
require 'sinatra'
|
55
55
|
require 'sinatra/rocketio'
|
56
56
|
require 'sinatra/rocketio/linda'
|
57
|
-
set :linda, :
|
57
|
+
set :linda, :expire_check => 60
|
58
58
|
|
59
59
|
run Sinatra::Application
|
60
60
|
```
|
@@ -151,6 +151,13 @@ Test
|
|
151
151
|
|
152
152
|
% gem install bundler
|
153
153
|
% bundle install
|
154
|
+
|
155
|
+
start server
|
156
|
+
|
157
|
+
% rake test_server
|
158
|
+
|
159
|
+
run test
|
160
|
+
|
154
161
|
% rake test
|
155
162
|
|
156
163
|
|
data/Rakefile
CHANGED
@@ -3,22 +3,26 @@ module Sinatra
|
|
3
3
|
module Linda
|
4
4
|
|
5
5
|
def self.tuplespaces
|
6
|
-
@@spaces ||= Hash.new{|h,k| h[k] = TupleSpace.new }
|
6
|
+
@@spaces ||= Hash.new{|h,k| h[k] = TupleSpace.new(k) }
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.[](name)
|
10
10
|
self.tuplespaces[name]
|
11
11
|
end
|
12
12
|
|
13
|
+
def self.check_expire
|
14
|
+
tuplespaces.values.each do |ts|
|
15
|
+
ts.check_expire
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
13
19
|
end
|
14
20
|
end
|
15
21
|
end
|
16
22
|
|
17
23
|
Sinatra::RocketIO.on :start do
|
18
24
|
EM::add_periodic_timer Sinatra::RocketIO::Linda.options[:expire_check] do
|
19
|
-
Sinatra::RocketIO::Linda
|
20
|
-
ts.check_expire
|
21
|
-
end
|
25
|
+
Sinatra::RocketIO::Linda.check_expire
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
@@ -43,50 +47,23 @@ Sinatra::RocketIO.on :__linda_write do |data, client|
|
|
43
47
|
Sinatra::RocketIO::Linda[space].write tuple, opts
|
44
48
|
end
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
Sinatra::RocketIO.
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
Sinatra::RocketIO.
|
63
|
-
|
64
|
-
space = "__default__" if !space or !space.kind_of? String or space.empty?
|
65
|
-
unless [Hash, Array].include? tuple.class
|
66
|
-
Sinatra::RocketIO::Linda.emit :error, "received Tuple is not Hash or Array at :__linda_take"
|
67
|
-
next
|
68
|
-
end
|
69
|
-
if !callback or !callback.kind_of? String or callback.empty?
|
70
|
-
Sinatra::RocketIO::Linda.emit :error, "received Callback ID is not valid at :__linda_take"
|
71
|
-
next
|
72
|
-
end
|
73
|
-
Sinatra::RocketIO::Linda[space].take tuple do |tuple|
|
74
|
-
Sinatra::RocketIO.push "__linda_take_callback_#{callback}", tuple.data, :to => client.session
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
Sinatra::RocketIO.on :__linda_watch do |data, client|
|
79
|
-
space, tuple, callback = data
|
80
|
-
space = "__default__" if !space or !space.kind_of? String or space.empty?
|
81
|
-
unless [Hash, Array].include? tuple.class
|
82
|
-
Sinatra::RocketIO::Linda.emit :error, "received Tuple is not Hash or Array at :__linda_watch"
|
83
|
-
next
|
84
|
-
end
|
85
|
-
if !callback or !callback.kind_of? String or callback.empty?
|
86
|
-
Sinatra::RocketIO::Linda.emit :error, "received Callback ID is not valid at :__linda_watch"
|
87
|
-
next
|
88
|
-
end
|
89
|
-
Sinatra::RocketIO::Linda[space].watch tuple do |tuple|
|
90
|
-
Sinatra::RocketIO.push "__linda_watch_callback_#{callback}", tuple.data, :to => client.session
|
50
|
+
[:read, :take, :watch].each do |func|
|
51
|
+
Sinatra::RocketIO.on "__linda_#{func}" do |data, client|
|
52
|
+
space, tuple, callback = data
|
53
|
+
space = "__default__" if !space or !space.kind_of? String or space.empty?
|
54
|
+
unless [Hash, Array].include? tuple.class
|
55
|
+
Sinatra::RocketIO::Linda.emit :error, "received Tuple is not Hash or Array at :__linda_#{func}"
|
56
|
+
next
|
57
|
+
end
|
58
|
+
if !callback or !callback.kind_of? String or callback.empty?
|
59
|
+
Sinatra::RocketIO::Linda.emit :error, "received Callback ID is not valid at :__linda_#{func}"
|
60
|
+
next
|
61
|
+
end
|
62
|
+
eid = Sinatra::RocketIO::Linda[space].__send__ func, tuple do |tuple|
|
63
|
+
Sinatra::RocketIO.push "__linda_#{func}_callback_#{callback}", tuple.data, :to => client.session
|
64
|
+
end
|
65
|
+
Sinatra::RocketIO.on :disconnect do |_client|
|
66
|
+
Sinatra::RocketIO::Linda[space].remove_callback eid if client.session == _client.session
|
67
|
+
end
|
91
68
|
end
|
92
69
|
end
|
@@ -4,8 +4,10 @@ module Sinatra
|
|
4
4
|
|
5
5
|
class TupleSpace
|
6
6
|
include Enumerable
|
7
|
+
attr_reader :name
|
7
8
|
|
8
|
-
def initialize
|
9
|
+
def initialize(name="__default__")
|
10
|
+
@name = name
|
9
11
|
@tuples = Array.new
|
10
12
|
@callbacks = Array.new
|
11
13
|
end
|
@@ -16,6 +18,10 @@ module Sinatra
|
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
21
|
+
def remove_callback(callback)
|
22
|
+
@callbacks.delete callback
|
23
|
+
end
|
24
|
+
|
19
25
|
def size
|
20
26
|
@tuples.size
|
21
27
|
end
|
@@ -60,7 +66,11 @@ module Sinatra
|
|
60
66
|
end
|
61
67
|
end
|
62
68
|
end
|
63
|
-
|
69
|
+
if block_given?
|
70
|
+
callback = {:type => :read, :callback => block, :tuple => tuple}
|
71
|
+
@callbacks.push callback
|
72
|
+
return callback
|
73
|
+
end
|
64
74
|
end
|
65
75
|
|
66
76
|
def take(tuple, &block)
|
@@ -80,20 +90,26 @@ module Sinatra
|
|
80
90
|
return matched_tuple
|
81
91
|
end
|
82
92
|
else
|
83
|
-
|
93
|
+
if block_given?
|
94
|
+
callback = {:type => :take, :callback => block, :tuple => tuple}
|
95
|
+
@callbacks.push callback
|
96
|
+
return callback
|
97
|
+
end
|
84
98
|
end
|
85
99
|
end
|
86
100
|
|
87
101
|
def watch(tuple, &block)
|
88
102
|
raise ArgumentError, "block not given" unless block_given?
|
89
103
|
tuple = Tuple.new tuple unless tuple.kind_of? Tuple
|
90
|
-
|
104
|
+
callback = {:type => :watch, :callback => block, :tuple => tuple}
|
105
|
+
@callbacks.unshift callback
|
106
|
+
callback
|
91
107
|
end
|
92
108
|
|
93
109
|
def check_expire
|
94
110
|
expires = []
|
95
|
-
each do |tuple|
|
96
|
-
expires.push tuple
|
111
|
+
self.each do |tuple|
|
112
|
+
expires.push(tuple) if tuple.expire_at and tuple.expire_at < Time.now
|
97
113
|
end
|
98
114
|
expires.each do |tuple|
|
99
115
|
@tuples.delete tuple
|
data/test/app.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
class App
|
2
|
+
|
3
|
+
def self.running
|
4
|
+
@running ? true : false
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.port
|
8
|
+
ENV['PORT'] || 5000
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.ws_port
|
12
|
+
ENV['WS_PORT'] || 5001
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.url
|
16
|
+
"http://localhost:#{port}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.websocketio_url
|
20
|
+
"ws://localhost:#{ws_port}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.cometio_url
|
24
|
+
"http://localhost:#{port}/cometio/io"
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.app_dir
|
28
|
+
File.expand_path 'app', File.dirname(__FILE__)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.start
|
32
|
+
return if running
|
33
|
+
@running = true
|
34
|
+
cmd = "cd #{app_dir} && WS_PORT=#{ws_port} rackup config.ru -p #{port}"
|
35
|
+
system cmd
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/test/app/config.ru
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'sinatra'
|
4
|
+
require 'sinatra/base'
|
5
|
+
$stdout.sync = true
|
6
|
+
$:.unshift File.expand_path '../../lib', File.dirname(__FILE__)
|
7
|
+
require 'sinatra/rocketio'
|
8
|
+
require 'sinatra/rocketio/linda'
|
9
|
+
require File.dirname(__FILE__)+'/main'
|
10
|
+
|
11
|
+
set :linda, :expire_check => 30
|
12
|
+
set :websocketio, :port => ENV['WS_PORT'].to_i
|
13
|
+
|
14
|
+
run TestApp
|
data/test/app/main.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
class TestApp < Sinatra::Base
|
2
|
+
register Sinatra::RocketIO
|
3
|
+
io = Sinatra::RocketIO
|
4
|
+
register Sinatra::RocketIO::Linda
|
5
|
+
linda = Sinatra::RocketIO::Linda
|
6
|
+
|
7
|
+
get '/' do
|
8
|
+
"sinatra-rocketio-linda v#{Sinatra::RocketIO::Linda::VERSION}"
|
9
|
+
end
|
10
|
+
|
11
|
+
io.on :connect do |client|
|
12
|
+
puts "new client <session:#{client.session}> <type:#{client.type}>"
|
13
|
+
end
|
14
|
+
|
15
|
+
io.on :disconnect do |client|
|
16
|
+
puts "disconnect client <session:#{client.session}> <type:#{client.type}>"
|
17
|
+
end
|
18
|
+
|
19
|
+
io.on :check_expire do |data, client|
|
20
|
+
puts "check_expire"
|
21
|
+
linda.check_expire
|
22
|
+
end
|
23
|
+
|
24
|
+
io.on :* do |event, data, client|
|
25
|
+
next unless event.to_s =~ /linda/
|
26
|
+
puts "#{event} - #{data} from #{client}"
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
2
|
+
require 'sinatra/rocketio/linda/client'
|
3
|
+
|
4
|
+
class TestClientDisconnect < MiniTest::Test
|
5
|
+
|
6
|
+
def test_client_disconnect
|
7
|
+
ts_name = "ts_#{Time.now.to_i}_#{Time.now.usec}"
|
8
|
+
client1 = Sinatra::RocketIO::Linda::Client.new App.url
|
9
|
+
_tuple1 = nil
|
10
|
+
_tuple2 = nil
|
11
|
+
_tuple3 = nil
|
12
|
+
_tuple4 = nil
|
13
|
+
client1.io.on :connect do
|
14
|
+
client2 = Sinatra::RocketIO::Linda::Client.new App.url
|
15
|
+
client2.io.on :connect do
|
16
|
+
ts1 = client1.tuplespace[ts_name]
|
17
|
+
ts2 = client2.tuplespace[ts_name]
|
18
|
+
ts1.read [1,2] do |tuple|
|
19
|
+
_tuple1 = tuple
|
20
|
+
end
|
21
|
+
ts1.take [1,2] do |tuple|
|
22
|
+
_tuple2 = tuple
|
23
|
+
end
|
24
|
+
ts1.watch [1,2] do |tuple|
|
25
|
+
_tuple3 = tuple
|
26
|
+
end
|
27
|
+
ts2.take [1,2] do |tuple|
|
28
|
+
_tuple4 = tuple
|
29
|
+
end
|
30
|
+
client1.io.close
|
31
|
+
sleep 3
|
32
|
+
ts2.write [1,2,3]
|
33
|
+
ts2.write [1,2,3,4]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
50.times do
|
37
|
+
sleep 0.1
|
38
|
+
break if _tuple4
|
39
|
+
end
|
40
|
+
assert_equal _tuple1, nil
|
41
|
+
assert_equal _tuple2, nil
|
42
|
+
assert_equal _tuple3, nil
|
43
|
+
assert_equal _tuple4, [1,2,3]
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -0,0 +1,125 @@
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
2
|
+
require 'sinatra/rocketio/linda/client'
|
3
|
+
|
4
|
+
class TestRubyClient < MiniTest::Test
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@client = Sinatra::RocketIO::Linda::Client.new App.url
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_write_read_take
|
11
|
+
ts_name = "ts_#{rand Time.now.to_i}"
|
12
|
+
ts = @client.tuplespace[ts_name]
|
13
|
+
_tuple1 = nil
|
14
|
+
_tuple2 = nil
|
15
|
+
_tuple3 = nil
|
16
|
+
_tuple4 = nil
|
17
|
+
@client.io.on :connect do
|
18
|
+
ts.write ["rw",1,2,3]
|
19
|
+
ts.write ["rw",1,2,"a"]
|
20
|
+
ts.write ["rw",1,"a",2]
|
21
|
+
ts.take ["rw",1,2] do |tuple|
|
22
|
+
_tuple1 = tuple
|
23
|
+
end
|
24
|
+
ts.read ["rw",1,2] do |tuple|
|
25
|
+
_tuple2 = tuple
|
26
|
+
end
|
27
|
+
ts.take ["rw",1,2] do |tuple|
|
28
|
+
_tuple3 = tuple
|
29
|
+
end
|
30
|
+
client2 = Sinatra::RocketIO::Linda::Client.new App.url
|
31
|
+
ts2 = client2.tuplespace[ts_name]
|
32
|
+
client2.io.on :connect do
|
33
|
+
ts2.take ["rw",1] do |tuple|
|
34
|
+
_tuple4 = tuple
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
50.times do
|
39
|
+
sleep 0.1
|
40
|
+
break if _tuple4
|
41
|
+
end
|
42
|
+
assert_equal _tuple1, ["rw",1,2,"a"] # take
|
43
|
+
assert_equal _tuple2, ["rw",1,2,3] # read
|
44
|
+
assert_equal _tuple3, ["rw",1,2,3] # take
|
45
|
+
assert_equal _tuple4, ["rw",1,"a",2]
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_watch
|
49
|
+
results = []
|
50
|
+
_tuple1 = nil
|
51
|
+
_tuple2 = nil
|
52
|
+
ts = @client.tuplespace["ts_#{rand Time.now.to_i}"]
|
53
|
+
@client.io.on :connect do
|
54
|
+
ts.take ["watch",1,2] do |tuple|
|
55
|
+
_tuple1 = tuple
|
56
|
+
end
|
57
|
+
ts.read ["watch",1,2] do |tuple|
|
58
|
+
_tuple2 = tuple
|
59
|
+
end
|
60
|
+
ts.watch ["watch",1,2] do |tuple|
|
61
|
+
results.push tuple
|
62
|
+
end
|
63
|
+
ts.write ["watch",1,2,3]
|
64
|
+
ts.write ["watch",1,"a",2]
|
65
|
+
ts.write ["watch",1,2,3,4]
|
66
|
+
end
|
67
|
+
50.times do
|
68
|
+
sleep 0.1
|
69
|
+
break if _tuple1 != nil and _tuple2 != nil
|
70
|
+
end
|
71
|
+
assert_equal _tuple1, ["watch",1,2,3]
|
72
|
+
assert_equal _tuple2, ["watch",1,2,3,4]
|
73
|
+
assert_equal results.size, 2
|
74
|
+
assert_equal results[0], ["watch",1,2,3]
|
75
|
+
assert_equal results[1], ["watch",1,2,3,4]
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_tuplespaces
|
79
|
+
ts1 = @client.tuplespace["ts1_#{rand Time.now.to_i}"]
|
80
|
+
ts2 = @client.tuplespace["ts2_#{rand Time.now.to_i}"]
|
81
|
+
_tuple1 = nil
|
82
|
+
_tuple2 = nil
|
83
|
+
@client.io.on :connect do
|
84
|
+
ts2.take ["a"] do |tuple|
|
85
|
+
_tuple2 = tuple
|
86
|
+
end
|
87
|
+
ts1.take [1] do |tuple|
|
88
|
+
_tuple1 = tuple
|
89
|
+
end
|
90
|
+
ts1.write [1,2,3]
|
91
|
+
ts2.write ["a","b","c"]
|
92
|
+
end
|
93
|
+
50.times do
|
94
|
+
sleep 0.1
|
95
|
+
break if _tuple1
|
96
|
+
end
|
97
|
+
assert_equal _tuple1, [1,2,3]
|
98
|
+
assert_equal _tuple2, ["a","b","c"]
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_tuple_expire
|
102
|
+
ts = @client.tuplespace["ts_#{rand Time.now.to_i}"]
|
103
|
+
_tuple1 = nil
|
104
|
+
_tuple2 = nil
|
105
|
+
@client.io.on :connect do
|
106
|
+
ts.write ["expire",1,2,999], :expire => false
|
107
|
+
ts.write ["expire",1,2,3], :expire => 10
|
108
|
+
ts.write ["expire",1,2,"a","b"], :expire => 2
|
109
|
+
ts.read ["expire",1,2] do |tuple|
|
110
|
+
_tuple1 = tuple
|
111
|
+
end
|
112
|
+
sleep 3
|
113
|
+
@client.io.push :check_expire, []
|
114
|
+
ts.read ["expire",1,2] do |tuple|
|
115
|
+
_tuple2 = tuple
|
116
|
+
end
|
117
|
+
end
|
118
|
+
50.times do
|
119
|
+
sleep 0.1
|
120
|
+
break if _tuple2
|
121
|
+
end
|
122
|
+
assert_equal _tuple1, ["expire",1,2,"a","b"]
|
123
|
+
assert_equal _tuple2, ["expire",1,2,3]
|
124
|
+
end
|
125
|
+
end
|
data/test/test_tuplespace.rb
CHANGED
@@ -117,13 +117,17 @@ class TestTupleSpace < MiniTest::Test
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def test_tuple_expire
|
120
|
+
@space.write [1,2,999], :expire => false
|
120
121
|
@space.write [1,2,3], :expire => 3
|
121
122
|
@space.write [1,2,"a","b"], :expire => 2
|
122
|
-
assert_equal @space.size,
|
123
|
+
assert_equal @space.size, 3
|
123
124
|
sleep 2
|
124
125
|
@space.check_expire
|
125
|
-
assert_equal @space.size,
|
126
|
+
assert_equal @space.size, 2
|
126
127
|
assert_equal @space.take([1,2]).data, [1,2,3]
|
128
|
+
assert_equal @space.size, 1
|
129
|
+
sleep 1
|
130
|
+
assert_equal @space.take([1,2]).data, [1,2,999]
|
127
131
|
assert_equal @space.size, 0
|
128
132
|
end
|
129
133
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-rocketio-linda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sho Hashimoto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -156,7 +156,12 @@ files:
|
|
156
156
|
- sample/views/index.haml
|
157
157
|
- sample/views/worker.haml
|
158
158
|
- sinatra-rocketio-linda.gemspec
|
159
|
+
- test/app.rb
|
160
|
+
- test/app/config.ru
|
161
|
+
- test/app/main.rb
|
162
|
+
- test/test_client_disconnect.rb
|
159
163
|
- test/test_helper.rb
|
164
|
+
- test/test_rubyclient.rb
|
160
165
|
- test/test_tuple.rb
|
161
166
|
- test/test_tuplespace.rb
|
162
167
|
homepage: https://github.com/shokai/sinatra-rocketio-linda
|
@@ -184,6 +189,11 @@ signing_key:
|
|
184
189
|
specification_version: 4
|
185
190
|
summary: Linda implementation on Sinatra RocketIO
|
186
191
|
test_files:
|
192
|
+
- test/app.rb
|
193
|
+
- test/app/config.ru
|
194
|
+
- test/app/main.rb
|
195
|
+
- test/test_client_disconnect.rb
|
187
196
|
- test/test_helper.rb
|
197
|
+
- test/test_rubyclient.rb
|
188
198
|
- test/test_tuple.rb
|
189
199
|
- test/test_tuplespace.rb
|