sinatra-rocketio-linda 0.1.1 → 0.1.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.
- checksums.yaml +4 -4
- data/History.txt +4 -0
- data/README.md +7 -0
- data/bin/linda-rocketio +122 -0
- data/lib/sinatra/rocketio/linda/client.rb +1 -0
- data/lib/sinatra/rocketio/linda/version.rb +1 -1
- data/linda.js +5 -4
- data/linda.min.js +2 -2
- data/sinatra-rocketio-linda.gemspec +1 -0
- metadata +19 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d0857d4b25976ea5ce37682c263f65dfe835a915
|
|
4
|
+
data.tar.gz: 4b50812ba66530ebe94bdf43aaea55e50f6eb577
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: efeffd1b6e4ecb925c2c003d368c4cfcfe4b1eaa1edd1f02a1ca78e42e06ebe8b337c87e02e6adf6eabd1714b2f0a0180181048658da9ca5bc168f683f6ec3b3
|
|
7
|
+
data.tar.gz: 675fca70a3d4da4af53382fff880c13c47e826f4ac7c95a8e3cb3d5d411d621d8563ee3e55c31fe241df58dbebcbc703fcf5588a66773e6d8d61c706bb2c3fe8
|
data/History.txt
CHANGED
data/README.md
CHANGED
|
@@ -147,6 +147,13 @@ linda.wait
|
|
|
147
147
|
```
|
|
148
148
|
|
|
149
149
|
|
|
150
|
+
linda-rocketio command
|
|
151
|
+
----------------------
|
|
152
|
+
|
|
153
|
+
% lidna-rocketio --help
|
|
154
|
+
% linda-rocketio --write '["say","hello"]' --base http://example.com --space test
|
|
155
|
+
|
|
156
|
+
|
|
150
157
|
JavaScript Lib for browser
|
|
151
158
|
--------------------------
|
|
152
159
|
|
data/bin/linda-rocketio
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
$:.unshift File.expand_path '../lib', File.dirname(__FILE__)
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'sinatra/rocketio/linda/client'
|
|
5
|
+
require 'args_parser'
|
|
6
|
+
|
|
7
|
+
args = ArgsParser.parse ARGV do
|
|
8
|
+
arg :write, 'write Tuple(s)'
|
|
9
|
+
arg :read, 'read a Tuple'
|
|
10
|
+
arg :take, 'take a Tuple'
|
|
11
|
+
arg :watch, 'watch Tuples'
|
|
12
|
+
arg :base, 'linda base URL', :default => 'http://linda.shokai.org'
|
|
13
|
+
arg :space, 'linda space name', :default => 'test'
|
|
14
|
+
arg :timeout, 'wait (sec)', :default => 10
|
|
15
|
+
arg :verbose, 'verbose mode', :alias => :v
|
|
16
|
+
arg :help, 'show help', :alias => :h
|
|
17
|
+
|
|
18
|
+
validate :base, "invalid linda URL" do |v|
|
|
19
|
+
v =~ /^https?:\/\/.+/
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
[:write, :read, :take, :watch].each do |arg|
|
|
23
|
+
filter arg do |v|
|
|
24
|
+
JSON.parse v
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class Console
|
|
30
|
+
def self.enable=(bool)
|
|
31
|
+
@@enable = bool
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.enable?
|
|
35
|
+
@@enable
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.log(str)
|
|
39
|
+
STDOUT.puts "* #{str}" if enable?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def self.error(str)
|
|
43
|
+
STDERR.puts "! #{str}" if enable?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
Console.enable = args.has_option? :verbose
|
|
48
|
+
|
|
49
|
+
if args.has_option? :help or !args.has_param? :base, :space
|
|
50
|
+
bin = $0.split("/").last
|
|
51
|
+
STDERR.puts "RocketIO::Linda v#{Sinatra::RocketIO::Linda::VERSION}"
|
|
52
|
+
STDERR.puts " - https://github.com/shokai/sinatra-rocketio-linda"
|
|
53
|
+
STDERR.puts
|
|
54
|
+
STDERR.puts args.help
|
|
55
|
+
STDERR.puts
|
|
56
|
+
STDERR.puts "e.g."
|
|
57
|
+
STDERR.puts %Q{write #{bin} --base http://example.com --space test --write '["say","hello"]'}
|
|
58
|
+
STDERR.puts %Q{ echo '["say","hello"]\\n["say","world"]' | #{bin} --base http://example.com --space test --write}
|
|
59
|
+
STDERR.puts %Q{read #{bin} --base http://example.com --space test --read '["say"]'}
|
|
60
|
+
STDERR.puts %Q{take #{bin} --base http://example.com --space test --take '["say"]'}
|
|
61
|
+
STDERR.puts %Q{watch #{bin} --base http://example.com --space test --watch '["say"]'}
|
|
62
|
+
exit 1
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
io = Sinatra::RocketIO::Client.new args[:base]
|
|
66
|
+
linda = Sinatra::RocketIO::Linda::Client.new io
|
|
67
|
+
ts = linda.tuplespace[ args[:space] ]
|
|
68
|
+
|
|
69
|
+
linda.io.on :connect do
|
|
70
|
+
Console.log "connect #{io.session} (#{io.type})"
|
|
71
|
+
if args.has_param? :write
|
|
72
|
+
Console.log "write #{args[:write].to_json}"
|
|
73
|
+
ts.write args[:write]
|
|
74
|
+
exit
|
|
75
|
+
elsif args.has_option? :write
|
|
76
|
+
while line = STDIN.gets do
|
|
77
|
+
begin
|
|
78
|
+
tuple = JSON.parse line.strip
|
|
79
|
+
Console.log "write #{tuple.to_json}"
|
|
80
|
+
puts tuple.to_json
|
|
81
|
+
ts.write tuple
|
|
82
|
+
rescue => e
|
|
83
|
+
Console.error e
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
exit
|
|
87
|
+
elsif args.has_param? :read
|
|
88
|
+
Console.log "read #{args[:read].to_json}"
|
|
89
|
+
ts.read args[:read] do |tuple|
|
|
90
|
+
puts tuple.to_json
|
|
91
|
+
exit
|
|
92
|
+
end
|
|
93
|
+
elsif args.has_param? :take
|
|
94
|
+
Console.log "take #{args[:take].to_json}"
|
|
95
|
+
ts.take args[:take] do |tuple|
|
|
96
|
+
puts tuple.to_json
|
|
97
|
+
exit
|
|
98
|
+
end
|
|
99
|
+
elsif args.has_param? :watch
|
|
100
|
+
Console.log "watch #{args[:watch].to_json}"
|
|
101
|
+
ts.watch args[:watch] do |tuple|
|
|
102
|
+
puts tuple.to_json
|
|
103
|
+
end
|
|
104
|
+
else
|
|
105
|
+
exit 1
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
linda.io.on :disconnect do
|
|
110
|
+
Console.log "disconnect #{io.session} (#{io.type})"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
Console.log "waiting #{args[:base]}"
|
|
114
|
+
io.connect
|
|
115
|
+
|
|
116
|
+
if [Fixnum, Float].include? args[:timeout].class and args[:timeout] > 0 and !args.has_option?(:write)
|
|
117
|
+
sleep args[:timeout]
|
|
118
|
+
else
|
|
119
|
+
linda.wait
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
Console.log "timeout (#{args[:timeout]}sec)"
|
data/linda.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Linda.js v0.
|
|
1
|
+
// Linda.js v0.1.1 (rocketio v0.2.6)
|
|
2
2
|
// https://github.com/shokai/sinatra-rocketio-linda
|
|
3
3
|
// (c) 2013 Sho Hashimoto <hashimoto@shokai.org>
|
|
4
4
|
// The MIT License
|
|
@@ -195,7 +195,7 @@ var CometIO = function(url, opts){
|
|
|
195
195
|
if(!running) return;
|
|
196
196
|
$.ajax(
|
|
197
197
|
{
|
|
198
|
-
url : self.url,
|
|
198
|
+
url : self.url+"?"+(new Date()-0),
|
|
199
199
|
data : {session : self.session},
|
|
200
200
|
success : function(data_arr){
|
|
201
201
|
if(data_arr !== null && typeof data_arr == "object" && !!data_arr.length){
|
|
@@ -245,13 +245,14 @@ var WebSocketIO = function(url, opts){
|
|
|
245
245
|
var url = self.session ? self.url+"/session="+self.session : self.url;
|
|
246
246
|
self.websocket = new WebSocket(url);
|
|
247
247
|
self.websocket.onmessage = function(e){
|
|
248
|
+
var data_ = null;
|
|
248
249
|
try{
|
|
249
|
-
|
|
250
|
-
self.emit(data_.type, data_.data);
|
|
250
|
+
data_ = JSON.parse(e.data);
|
|
251
251
|
}
|
|
252
252
|
catch(e){
|
|
253
253
|
self.emit("error", "WebSocketIO data parse error");
|
|
254
254
|
}
|
|
255
|
+
if(!!data_) self.emit(data_.type, data_.data);
|
|
255
256
|
};
|
|
256
257
|
self.websocket.onclose = function(){
|
|
257
258
|
if(self.connecting){
|
data/linda.min.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// Linda.js v0.
|
|
1
|
+
// Linda.js v0.1.1 (rocketio v0.2.6)
|
|
2
2
|
// https://github.com/shokai/sinatra-rocketio-linda
|
|
3
3
|
// (c) 2013 Sho Hashimoto <hashimoto@shokai.org>
|
|
4
4
|
// The MIT License
|
|
5
|
-
var Linda=function(io,opts){var self=this;this.io=null;if(io===null||typeof io==="undefined"){this.io=(new RocketIO).connect()}else{this.io=io}this.opts=opts||{};this.TupleSpace=function(name){if(name===null||typeof name!=="string")name="__default__";this.name=name;this.linda=self;var space=this;var make_callback_id=function(){return new Date-0+"_"+Math.floor(Math.random()*1e6)};this.write=function(tuple,opts){if(tuple===null||typeof tuple!=="object")return;if(opts===null||typeof opts==="undefined")opts={};self.io.push("__linda_write",[space.name,tuple,opts])};this.read=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=make_callback_id();self.io.once("__linda_read_callback_"+callback_id,callback);self.io.push("__linda_read",[space.name,tuple,callback_id])};this.take=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=make_callback_id();self.io.once("__linda_take_callback_"+callback_id,callback);self.io.push("__linda_take",[space.name,tuple,callback_id])};this.watch=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=make_callback_id();self.io.on("__linda_watch_callback_"+callback_id,callback);self.io.push("__linda_watch",[space.name,tuple,callback_id])}}};var RocketIO=function(opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.type=opts.type||null;this.session=opts.session||null;this.channel=null;if(typeof opts.channel!=="undefined"&&opts.channel!==null){this.channel=""+opts.channel}var setting={};this.io=null;var self=this;var ws_close_timer=null;self.on("__connect",function(session_id){self.session=session_id;self.io.push("__channel_id",self.channel);self.emit("connect")});this.connect=function(url){if(typeof url==="string"){$.getJSON(url+"/rocketio/settings",function(res){setting=res;connect_io()});return self}else{return connect_io()}};var connect_io=function(){self.io=function(){if(self.type==="comet")return;if(typeof WebSocketIO!=="function")return;var io=new WebSocketIO;if(typeof setting.websocket==="string")io.url=setting.websocket;io.session=self.session;return io.connect()}()||function(){if(typeof CometIO!=="function")return;var io=new CometIO;if(typeof setting.comet==="string")io.url=setting.comet;io.session=self.session;return io.connect()}();if(typeof self.io==="undefined"){setTimeout(function(){self.emit("error","WebSocketIO and CometIO are not available")},100);return self}if(self.io.url.match(/^ws:\/\/.+/))self.type="websocket";else if(self.io.url.match(/cometio/))self.type="comet";else self.type="unknown";self.io.on("*",function(event_name,args){if(event_name==="connect")event_name="__connect";self.emit(event_name,args)});ws_close_timer=setTimeout(function(){self.close();self.type="comet";connect_io()},3e3);self.once("connect",function(){if(ws_close_timer)clearTimeout(ws_close_timer);ws_close_timer=null});return self};this.close=function(){self.io.close()};this.push=function(type,data){self.io.push(type,data)}};var CometIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;var running=false;var self=this;var post_queue=[];var flush=function(){if(!running||post_queue.length<1)return;var post_data={json:JSON.stringify({session:self.session,events:post_queue})};$.ajax({url:self.url,data:post_data,success:function(data){},error:function(req,stat,e){self.emit("error","CometIO push error")},complete:function(e){},type:"POST",dataType:"json",timeout:1e4});post_queue=[]};setInterval(flush,1e3);this.push=function(type,data){if(!running||!self.session){self.emit("error","CometIO not connected");return}post_queue.push({type:type,data:data})};this.connect=function(){if(running)return self;self.on("__session_id",function(session){self.session=session;self.emit("connect",self.session)});running=true;get();return self};this.close=function(){running=false;self.removeListener("__session_id")};var get=function(){if(!running)return;$.ajax({url:self.url,data:{session:self.session},success:function(data_arr){if(data_arr!==null&&typeof data_arr=="object"&&!!data_arr.length){for(var i=0;i<data_arr.length;i++){var data=data_arr[i];if(data)self.emit(data.type,data.data)}}get()},error:function(req,stat,e){self.emit("error","CometIO get error");setTimeout(get,1e4)},complete:function(e){},type:"GET",dataType:"json",timeout:13e4})}};var WebSocketIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;this.websocket=null;this.connecting=false;var reconnect_timer_id=null;var running=false;var self=this;self.on("__session_id",function(session_id){self.session=session_id;self.emit("connect",self.session)});this.connect=function(){if(typeof WebSocket==="undefined"){self.emit("error","websocket not exists in this browser");return null}self.running=true;var url=self.session?self.url+"/session="+self.session:self.url;self.websocket=new WebSocket(url);self.websocket.onmessage=function(e){
|
|
5
|
+
var Linda=function(io,opts){var self=this;this.io=null;if(io===null||typeof io==="undefined"){this.io=(new RocketIO).connect()}else{this.io=io}this.opts=opts||{};this.TupleSpace=function(name){if(name===null||typeof name!=="string")name="__default__";this.name=name;this.linda=self;var space=this;var make_callback_id=function(){return new Date-0+"_"+Math.floor(Math.random()*1e6)};this.write=function(tuple,opts){if(tuple===null||typeof tuple!=="object")return;if(opts===null||typeof opts==="undefined")opts={};self.io.push("__linda_write",[space.name,tuple,opts])};this.read=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=make_callback_id();self.io.once("__linda_read_callback_"+callback_id,callback);self.io.push("__linda_read",[space.name,tuple,callback_id])};this.take=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=make_callback_id();self.io.once("__linda_take_callback_"+callback_id,callback);self.io.push("__linda_take",[space.name,tuple,callback_id])};this.watch=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=make_callback_id();self.io.on("__linda_watch_callback_"+callback_id,callback);self.io.push("__linda_watch",[space.name,tuple,callback_id])}}};var RocketIO=function(opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.type=opts.type||null;this.session=opts.session||null;this.channel=null;if(typeof opts.channel!=="undefined"&&opts.channel!==null){this.channel=""+opts.channel}var setting={};this.io=null;var self=this;var ws_close_timer=null;self.on("__connect",function(session_id){self.session=session_id;self.io.push("__channel_id",self.channel);self.emit("connect")});this.connect=function(url){if(typeof url==="string"){$.getJSON(url+"/rocketio/settings",function(res){setting=res;connect_io()});return self}else{return connect_io()}};var connect_io=function(){self.io=function(){if(self.type==="comet")return;if(typeof WebSocketIO!=="function")return;var io=new WebSocketIO;if(typeof setting.websocket==="string")io.url=setting.websocket;io.session=self.session;return io.connect()}()||function(){if(typeof CometIO!=="function")return;var io=new CometIO;if(typeof setting.comet==="string")io.url=setting.comet;io.session=self.session;return io.connect()}();if(typeof self.io==="undefined"){setTimeout(function(){self.emit("error","WebSocketIO and CometIO are not available")},100);return self}if(self.io.url.match(/^ws:\/\/.+/))self.type="websocket";else if(self.io.url.match(/cometio/))self.type="comet";else self.type="unknown";self.io.on("*",function(event_name,args){if(event_name==="connect")event_name="__connect";self.emit(event_name,args)});ws_close_timer=setTimeout(function(){self.close();self.type="comet";connect_io()},3e3);self.once("connect",function(){if(ws_close_timer)clearTimeout(ws_close_timer);ws_close_timer=null});return self};this.close=function(){self.io.close()};this.push=function(type,data){self.io.push(type,data)}};var CometIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;var running=false;var self=this;var post_queue=[];var flush=function(){if(!running||post_queue.length<1)return;var post_data={json:JSON.stringify({session:self.session,events:post_queue})};$.ajax({url:self.url,data:post_data,success:function(data){},error:function(req,stat,e){self.emit("error","CometIO push error")},complete:function(e){},type:"POST",dataType:"json",timeout:1e4});post_queue=[]};setInterval(flush,1e3);this.push=function(type,data){if(!running||!self.session){self.emit("error","CometIO not connected");return}post_queue.push({type:type,data:data})};this.connect=function(){if(running)return self;self.on("__session_id",function(session){self.session=session;self.emit("connect",self.session)});running=true;get();return self};this.close=function(){running=false;self.removeListener("__session_id")};var get=function(){if(!running)return;$.ajax({url:self.url+"?"+(new Date-0),data:{session:self.session},success:function(data_arr){if(data_arr!==null&&typeof data_arr=="object"&&!!data_arr.length){for(var i=0;i<data_arr.length;i++){var data=data_arr[i];if(data)self.emit(data.type,data.data)}}get()},error:function(req,stat,e){self.emit("error","CometIO get error");setTimeout(get,1e4)},complete:function(e){},type:"GET",dataType:"json",timeout:13e4})}};var WebSocketIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;this.websocket=null;this.connecting=false;var reconnect_timer_id=null;var running=false;var self=this;self.on("__session_id",function(session_id){self.session=session_id;self.emit("connect",self.session)});this.connect=function(){if(typeof WebSocket==="undefined"){self.emit("error","websocket not exists in this browser");return null}self.running=true;var url=self.session?self.url+"/session="+self.session:self.url;self.websocket=new WebSocket(url);self.websocket.onmessage=function(e){var data_=null;try{data_=JSON.parse(e.data)}catch(e){self.emit("error","WebSocketIO data parse error")}if(!!data_)self.emit(data_.type,data_.data)};self.websocket.onclose=function(){if(self.connecting){self.connecting=false;self.emit("disconnect")}if(self.running){reconnect_timer_id=setTimeout(self.connect,1e4)}};self.websocket.onopen=function(){self.connecting=true};return self};this.close=function(){clearTimeout(reconnect_timer_id);self.running=false;self.websocket.close()};this.push=function(type,data){if(!self.connecting){self.emit("error","websocket not connected");return}self.websocket.send(JSON.stringify({type:type,data:data,session:self.session}))}};var EventEmitter=function(){var self=this;this.apply=function(target,prefix){if(!prefix)prefix="";for(var func in self){if(self.hasOwnProperty(func)&&func!=="apply"){target[prefix+func]=this[func]}}};this.__events=new Array;this.on=function(type,listener,opts){if(typeof listener!=="function")return;var event_id=self.__events.length>0?1+self.__events[self.__events.length-1].id:0;var params={id:event_id,type:type,listener:listener};for(i in opts){if(!params[i])params[i]=opts[i]}self.__events.push(params);return event_id};this.once=function(type,listener){self.on(type,listener,{once:true})};this.emit=function(type,data){for(var i=0;i<self.__events.length;i++){var e=self.__events[i];switch(e.type){case type:e.listener(data);if(e.once)e.type=null;break;case"*":e.listener(type,data);if(e.once)e.type=null;break}}self.removeListener()};this.removeListener=function(id_or_type){for(var i=self.__events.length-1;i>=0;i--){var e=self.__events[i];switch(typeof id_or_type){case"number":if(e.id===id_or_type)self.__events.splice(i,1);break;case"string":case"object":if(e.type===id_or_type)self.__events.splice(i,1);break}}}};if(typeof module!=="undefined"&&typeof module.exports!=="undefined"){module.exports=EventEmitter}
|
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.1.
|
|
4
|
+
version: 0.1.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-
|
|
11
|
+
date: 2013-06-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -150,10 +150,25 @@ dependencies:
|
|
|
150
150
|
- - '>='
|
|
151
151
|
- !ruby/object:Gem::Version
|
|
152
152
|
version: '0'
|
|
153
|
+
- !ruby/object:Gem::Dependency
|
|
154
|
+
name: args_parser
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
156
|
+
requirements:
|
|
157
|
+
- - '>='
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: '0'
|
|
160
|
+
type: :runtime
|
|
161
|
+
prerelease: false
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - '>='
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: '0'
|
|
153
167
|
description: Linda implementation on Sinatra RocketIO
|
|
154
168
|
email:
|
|
155
169
|
- hashimoto@shokai.org
|
|
156
|
-
executables:
|
|
170
|
+
executables:
|
|
171
|
+
- linda-rocketio
|
|
157
172
|
extensions: []
|
|
158
173
|
extra_rdoc_files: []
|
|
159
174
|
files:
|
|
@@ -164,6 +179,7 @@ files:
|
|
|
164
179
|
- LICENSE.txt
|
|
165
180
|
- README.md
|
|
166
181
|
- Rakefile
|
|
182
|
+
- bin/linda-rocketio
|
|
167
183
|
- lib/js/linda.js
|
|
168
184
|
- lib/sinatra-rocketio-linda/application.rb
|
|
169
185
|
- lib/sinatra-rocketio-linda/helper.rb
|