sinatra-rocketio-linda 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 523bf63e3fe852d759d5e75b62e82d8b5900ffa9
4
- data.tar.gz: ca656ff542d98f73c942542ddeaf5654566f5b60
3
+ metadata.gz: ebfcd893b6fd6ef33fa0c366cb796c70896b76f2
4
+ data.tar.gz: 85c84d5d7b420570cf6ed9a806dd2c94e2ea42ab
5
5
  SHA512:
6
- metadata.gz: 6328614db8c10c14410d515d7aad2a0885335165e4aaeae081852fae8dd13cf45687cf4ae30e6caf571a8b2d5cca7b08434d8387b962bf30f350c3a83290792f
7
- data.tar.gz: 0f41f574bbcace16a210b0f4e3a93f29d0aca235ae1dd3e9b85b52f1dd0ffe548a123e125f6cdd87c9d1d3590af7e723c7fe6a2de837c995847f50e1ef3b50c6
6
+ metadata.gz: d2f78eeef9f0237a405a87684b7d832a986dcafa6b3aad4194036190efeef7859af3b811c72783820294d1bccd7826e13b9f6d0b9df2a0c78b8f833a66c9b47b
7
+ data.tar.gz: a73311f2263b81720aa7c6963af7ea7e8eaf1b590637dfd43184da1409c7486dd613ec835d0bbec666d8ed65feb222154f418518985ae50262087ecaf588f2ff
data/History.txt CHANGED
@@ -1,8 +1,11 @@
1
- === 0.0.1 2013-05-15
1
+ === 0.0.2 2013-05-15
2
+ * update README
3
+ * TupleSpace#watch(tuple, callback(tuple))
2
4
 
5
+ === 0.0.1 2013-05-15
3
6
  * JavaScript Linda Client for WebBrowser
4
7
  * Ruby Linda Client
5
8
  * TupleSpace#write(tuple)
6
9
  * TupleSpace#take(tuple, callback(tuple))
7
10
  * TupleSpace#read(tuple, callback(tuple))
8
- * sinatra config - set :linda, :expire_check => 60 (sec)
11
+ * sinatra config - set :linda, :check_expire => 60 (sec)
data/README.md CHANGED
@@ -5,13 +5,6 @@ sinatra-rocketio-linda
5
5
  * https://github.com/shokai/sinatra-rocketio-linda
6
6
 
7
7
 
8
- Linda
9
- -----
10
-
11
- * http://en.wikipedia.org/wiki/Linda_(coordination_language)
12
- * http://ja.wikipedia.org/wiki/Linda
13
-
14
-
15
8
  Installation
16
9
  ------------
17
10
 
@@ -27,6 +20,29 @@ Requirements
27
20
  * [jQuery](http://jquery.com)
28
21
 
29
22
 
23
+ Linda
24
+ -----
25
+ Linda is a coordination launguage for parallel programming.
26
+
27
+ * http://en.wikipedia.org/wiki/Linda_(coordination_language)
28
+ * http://ja.wikipedia.org/wiki/Linda
29
+
30
+
31
+ ### TupleSpace
32
+ Shared memory on Sinatra.
33
+
34
+
35
+ ### Tuple Operations
36
+ - write( tuple, options )
37
+ - put a Tuple into the TupleSpace
38
+ - take( tuple, callback(tuple) )
39
+ - get a matched Tuple from the TupleSpace and delete
40
+ - read( tuple, callback(tuple) )
41
+ - get a matched Tuple from the TupleSpace
42
+ - watch( tuple, callback(tuple) )
43
+ - overwatch written Tuples in the TupleSpace
44
+
45
+
30
46
  Usage
31
47
  -----
32
48
 
@@ -99,6 +115,37 @@ var calc = function(){
99
115
  io.on("connect", calc); // RocketIO's "connect" event
100
116
  ```
101
117
 
118
+ worker side (Ruby)
119
+
120
+ ```ruby
121
+ require 'rubygems'
122
+ require 'sinatra/rocketio/linda/client'
123
+
124
+ ## create tuplespace
125
+ linda = Sinatra::RocketIO::Linda::Client.new 'http://localhost:5000'
126
+ ts = linda.tuplespace["calc"]
127
+
128
+ ## calculate
129
+ calc = lambda{
130
+ ts.take ["calc_request"] do |tuple|
131
+ query = tuple[1] ## => "1-2+3*4"
132
+ result = eval(query)
133
+ puts "calc: #{query} = #{result}" ## => "1-2+3*4 = 11"
134
+ ts.write ["calc_result", result] ## return to 'client' side
135
+ calc.call ## recursive call
136
+ end
137
+ }
138
+
139
+ linda.io.on :connect do ## RocketIO's "connect" event
140
+ puts "connect #{io.session}"
141
+ calc.call
142
+ end
143
+
144
+ loop do
145
+ end
146
+ ```
147
+
148
+
102
149
  Test
103
150
  ----
104
151
 
data/lib/js/linda.js CHANGED
@@ -32,5 +32,12 @@ var Linda = function(io, opts){
32
32
  self.io.once("__linda_take_callback_"+callback_id, callback);
33
33
  self.io.push("__linda_take", [space.name, tuple, callback_id]);
34
34
  };
35
+ this.watch = function(tuple, callback){
36
+ if(tuple === null || typeof tuple !== "object") return;
37
+ if(typeof callback !== "function") return;
38
+ var callback_id = new Date()-0+"";
39
+ self.io.on("__linda_watch_callback_"+callback_id, callback);
40
+ self.io.push("__linda_watch", [space.name, tuple, callback_id]);
41
+ };
35
42
  };
36
43
  };
@@ -74,3 +74,19 @@ Sinatra::RocketIO.on :__linda_take do |data, client|
74
74
  Sinatra::RocketIO.push "__linda_take_callback_#{callback}", tuple.data, :to => client.session
75
75
  end
76
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
91
+ end
92
+ end
@@ -35,7 +35,7 @@ module Sinatra
35
35
  @callbacks.each do |callback|
36
36
  next unless callback[:tuple].match? tuple
37
37
  callback[:callback].call tuple
38
- calleds.push callback
38
+ calleds.push callback unless callback[:type] == :watch
39
39
  if callback[:type] == :take
40
40
  taked = tuple
41
41
  break
@@ -84,6 +84,12 @@ module Sinatra
84
84
  end
85
85
  end
86
86
 
87
+ def watch(tuple, &block)
88
+ raise ArgumentError, "block not given" unless block_given?
89
+ tuple = Tuple.new tuple unless tuple.kind_of? Tuple
90
+ @callbacks.unshift(:type => :watch, :callback => block, :tuple => tuple)
91
+ end
92
+
87
93
  def check_expire
88
94
  expires = []
89
95
  each do |tuple|
@@ -51,6 +51,16 @@ module Sinatra
51
51
  @linda.io.once "__linda_take_callback_#{callback_id}", &block
52
52
  @linda.io.push "__linda_take", [@name, tuple, callback_id]
53
53
  end
54
+
55
+ def watch(tuple, &block)
56
+ unless [Hash, Array].include? tuple.class
57
+ raise ArgumentError, "tuple must be Array or Hash"
58
+ end
59
+ callback_id = "#{Time.now.to_i}#{Time.now.usec}"
60
+ @linda.io.on "__linda_watch_callback_#{callback_id}", &block
61
+ @linda.io.push "__linda_watch", [@name, tuple, callback_id]
62
+ end
63
+
54
64
  end
55
65
 
56
66
  end
@@ -1,7 +1,7 @@
1
1
  module Sinatra
2
2
  module RocketIO
3
3
  module Linda
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.2"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,21 @@
1
+ $:.unshift File.expand_path '../../lib', File.dirname(__FILE__)
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'sinatra/rocketio/linda/client'
5
+
6
+ linda = Sinatra::RocketIO::Linda::Client.new 'http://localhost:5000'
7
+ ts = linda.tuplespace["calc"]
8
+
9
+ linda.io.on :connect do
10
+ puts "connect #{io.session}"
11
+ ts.watch [] do |tuple|
12
+ puts "watch #{tuple}"
13
+ end
14
+ end
15
+
16
+ linda.io.on :disconnect do
17
+ puts "disconnect #{io.session}"
18
+ end
19
+
20
+ loop do
21
+ end
@@ -18,3 +18,8 @@ var take_result = function(){
18
18
  };
19
19
 
20
20
  io.on("connect", take_result);
21
+ io.on("connect", function(){
22
+ ts.watch(["calc_request"], function(tuple){
23
+ console.log(tuple);
24
+ });
25
+ });
@@ -96,6 +96,26 @@ class TestTupleSpace < MiniTest::Test
96
96
  assert_equal @space.size, 0
97
97
  end
98
98
 
99
+ def test_watch
100
+ assert_equal @space.size, 0
101
+ _tuple1 = nil
102
+ @space.take [1] do |tuple|
103
+ _tuple1 = tuple
104
+ end
105
+ results = []
106
+ @space.watch [1,2] do |tuple|
107
+ results << tuple
108
+ end
109
+ @space.write [1,2,3]
110
+ @space.write [1,2,"aa"]
111
+ @space.write [1,"a",3]
112
+ assert_equal _tuple1.data, [1,2,3]
113
+ assert_equal @space.size, 2
114
+ assert_equal results.size, 2
115
+ assert_equal results[0].data, [1,2,3]
116
+ assert_equal results[1].data, [1,2,"aa"]
117
+ end
118
+
99
119
  def test_tuple_expire
100
120
  @space.write [1,2,3], :expire => 3
101
121
  @space.write [1,2,"a","b"], :expire => 2
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.1
4
+ version: 0.0.2
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-14 00:00:00.000000000 Z
11
+ date: 2013-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -146,6 +146,7 @@ files:
146
146
  - lib/sinatra/rocketio/linda.rb
147
147
  - lib/sinatra/rocketio/linda/client.rb
148
148
  - lib/sinatra/rocketio/linda/version.rb
149
+ - sample/bin/cui_calc_watcher.rb
149
150
  - sample/bin/cui_calc_worker.rb
150
151
  - sample/config.ru
151
152
  - sample/main.rb