livedata 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +0 -0
- data/MIT-LICENSE +20 -0
- data/README +43 -0
- data/Rakefile +67 -0
- data/install.rb +0 -0
- data/lib/live_data/channel.rb +102 -0
- data/lib/live_data/group.rb +74 -0
- data/lib/live_data/user.rb +94 -0
- data/lib/live_data/version.rb +4 -0
- data/lib/live_data.rb +38 -0
- data/lib/livedata.rb +1 -0
- data/test/live_data_test.rb +80 -0
- data/test/test_helper.rb +2 -0
- metadata +68 -0
data/CHANGELOG
ADDED
File without changes
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 siddick
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
== LiveData
|
2
|
+
LiveData is a rubygem. This gem is used to implement the applications like chat, live process montior, etc.,
|
3
|
+
|
4
|
+
|
5
|
+
== Installation
|
6
|
+
Step 1 :-
|
7
|
+
Add the livedata gem in config/environment.rb
|
8
|
+
config.gem "livedata"
|
9
|
+
Step 2 :-
|
10
|
+
Add the following configuration in the config/environments/development.rb, config/environments/production.rb and config/environments/test.rb
|
11
|
+
config.threadsafe!
|
12
|
+
|
13
|
+
== Example
|
14
|
+
Class MainController < ApplicationController
|
15
|
+
|
16
|
+
def get_msg
|
17
|
+
user_id = params[:id] || "test"
|
18
|
+
chat = LiveData.get_channel('chat') || LiveData.create_channel('chat')
|
19
|
+
user = chat.get_user( user_id ) || chat.create_user( user_id )
|
20
|
+
render :text => user.read
|
21
|
+
end
|
22
|
+
|
23
|
+
def send_msg
|
24
|
+
user_id = params[:id] || "test"
|
25
|
+
message = params[:msg] || "Nothing"
|
26
|
+
|
27
|
+
chat = LiveData.get_channel('chat') || LiveData.create_channel('chat')
|
28
|
+
user = chat.get_user( user_id ) || chat.create_user( user_id )
|
29
|
+
|
30
|
+
user.write( message )
|
31
|
+
render :text => 'Finesh'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
== Run Webrick Server
|
36
|
+
ruby script/server -b 0.0.0.0 -p 3000
|
37
|
+
== Browser
|
38
|
+
Open two tabs in the web browser
|
39
|
+
First tab :-
|
40
|
+
http://localhost:3000/main/get_msg/tester
|
41
|
+
Second Tab :-
|
42
|
+
http://localhost:3000/main/send_msg/tester?msg=Hello World
|
43
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require File.join(File.dirname(__FILE__), 'lib', 'live_data', 'version')
|
6
|
+
|
7
|
+
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
8
|
+
PKG_NAME = 'livedata'
|
9
|
+
PKG_VERSION = LiveData::VERSION + PKG_BUILD
|
10
|
+
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
11
|
+
|
12
|
+
RELEASE_NAME = "REL #{PKG_VERSION}"
|
13
|
+
|
14
|
+
|
15
|
+
desc 'Default: run unit tests.'
|
16
|
+
task :default => :test
|
17
|
+
|
18
|
+
desc 'Test the live_data plugin.'
|
19
|
+
Rake::TestTask.new(:test) do |t|
|
20
|
+
t.libs << 'lib'
|
21
|
+
t.libs << 'test'
|
22
|
+
t.pattern = 'test/**/*_test.rb'
|
23
|
+
t.verbose = true
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'Generate documentation for the live_data plugin.'
|
27
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
28
|
+
rdoc.rdoc_dir = 'rdoc'
|
29
|
+
rdoc.title = 'LiveData'
|
30
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
31
|
+
rdoc.rdoc_files.include('README')
|
32
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
33
|
+
end
|
34
|
+
|
35
|
+
dist_dirs = [ "lib", "test", "examples" ]
|
36
|
+
|
37
|
+
spec = Gem::Specification.new do |s|
|
38
|
+
s.platform = Gem::Platform::RUBY
|
39
|
+
s.name = PKG_NAME
|
40
|
+
s.version = PKG_VERSION
|
41
|
+
s.summary = "Handle live data"
|
42
|
+
s.description = %q{Using the livedata plugin, we can implement application like chat, status monitoring, etc.}
|
43
|
+
|
44
|
+
s.files = [ "Rakefile","MIT-LICENSE", "install.rb", "README", "CHANGELOG" ]
|
45
|
+
dist_dirs.each do |dir|
|
46
|
+
s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
|
47
|
+
end
|
48
|
+
|
49
|
+
s.require_path = 'lib'
|
50
|
+
s.autorequire = 'live_data'
|
51
|
+
|
52
|
+
s.has_rdoc = true
|
53
|
+
s.extra_rdoc_files = %w( README )
|
54
|
+
s.rdoc_options.concat ['--main', 'README']
|
55
|
+
|
56
|
+
s.author = "Mohammed Siddick. E"
|
57
|
+
s.email = "siddick007@yahoo.co.in"
|
58
|
+
s.homepage = "http://siddick.github.com/"
|
59
|
+
#s.rubyforge_project = "live_data"
|
60
|
+
end
|
61
|
+
|
62
|
+
Rake::GemPackageTask.new(spec) do |p|
|
63
|
+
p.gem_spec = spec
|
64
|
+
p.need_tar = true
|
65
|
+
p.need_zip = true
|
66
|
+
end
|
67
|
+
|
data/install.rb
ADDED
File without changes
|
@@ -0,0 +1,102 @@
|
|
1
|
+
|
2
|
+
module LiveData
|
3
|
+
|
4
|
+
# Channel is used to maintain users, groups and user-group relation
|
5
|
+
class Channel
|
6
|
+
|
7
|
+
attr :users, :groups, :user_in_groups, :group_have_users, :name
|
8
|
+
|
9
|
+
# Create a new channel
|
10
|
+
def initialize( name = nil )
|
11
|
+
@name = name || self
|
12
|
+
@users = {}
|
13
|
+
@groups = {}
|
14
|
+
@user_in_groups = {}
|
15
|
+
@group_have_users = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Write yaml data
|
19
|
+
# ==== Parameters
|
20
|
+
# * +yaml_data+ - String which contain data in yaml format
|
21
|
+
def write_yaml( yaml_data )
|
22
|
+
@users.each{|user_name, user|
|
23
|
+
user.write_yaml( yaml_data )
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
# Write json data
|
28
|
+
# ==== Parameters
|
29
|
+
# * +json_data+ - String which contain data in json format
|
30
|
+
def write_json( json_data )
|
31
|
+
@users.each{|user_name, user|
|
32
|
+
user.write_json( json_data )
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
# Write data in any format
|
37
|
+
# ==== Parameters
|
38
|
+
# * +data+ - it may be any Object.
|
39
|
+
def write( data )
|
40
|
+
@users.each{|user_name, user|
|
41
|
+
user.write( data )
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
# Create a user, if he is not present in the user list
|
46
|
+
# ==== Parameters
|
47
|
+
# * +name+ - User name
|
48
|
+
def create_user( name )
|
49
|
+
unless( @users[name] )
|
50
|
+
@users[name] = LiveData::User.new( name, self )
|
51
|
+
@user_in_groups[name] = @users[name].groups
|
52
|
+
end
|
53
|
+
return @users[name]
|
54
|
+
end
|
55
|
+
|
56
|
+
# Create a group, if the group is not present in the group list
|
57
|
+
# ==== Parameters
|
58
|
+
# * +name+ - Group name
|
59
|
+
def create_group( name )
|
60
|
+
unless( @groups[name] )
|
61
|
+
@groups[name] = LiveData::Group.new( name, self )
|
62
|
+
@group_have_users[name] = @groups[name].users
|
63
|
+
end
|
64
|
+
return @groups[name]
|
65
|
+
end
|
66
|
+
|
67
|
+
# Get user object
|
68
|
+
def get_user( name )
|
69
|
+
@users[name]
|
70
|
+
end
|
71
|
+
|
72
|
+
# Get group object
|
73
|
+
def get_group( name )
|
74
|
+
@groups[name]
|
75
|
+
end
|
76
|
+
|
77
|
+
# Destroy a user
|
78
|
+
# ==== Parameters
|
79
|
+
# * +name+ - User name
|
80
|
+
def destroy_user( name )
|
81
|
+
@users[name].destroy()
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# Destroy a group
|
86
|
+
# ==== Parameters
|
87
|
+
# * +name+ - Group name
|
88
|
+
def destroy_group( name )
|
89
|
+
@groups[name].destroy()
|
90
|
+
end
|
91
|
+
|
92
|
+
# Destroy current channel
|
93
|
+
def destroy
|
94
|
+
@users.each{|name,obj|
|
95
|
+
obj.destroy()
|
96
|
+
}
|
97
|
+
@groups.each{|name,obj|
|
98
|
+
obj.destroy()
|
99
|
+
}
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module LiveData
|
2
|
+
|
3
|
+
# Group is used to maintain collection of users
|
4
|
+
# ==== Example
|
5
|
+
#
|
6
|
+
# chat = LiveData::Channel.new
|
7
|
+
# guest1 = chat.create_user('guest1')
|
8
|
+
# guest2 = chat.create_user('guest2')
|
9
|
+
# user_grp = chat.create_group('user')
|
10
|
+
#
|
11
|
+
# user_grp.add_user( guest1 )
|
12
|
+
# user_grp.add_user( guest2 )
|
13
|
+
#
|
14
|
+
# user_grp.write( { :title => "Greeting",
|
15
|
+
# :message => "Wecome to LiveData" } )
|
16
|
+
#
|
17
|
+
# group1.read # { :title => "Greeti..... }
|
18
|
+
# group2.read # { :title => "Greeti..... }
|
19
|
+
class Group
|
20
|
+
|
21
|
+
attr :users, :name
|
22
|
+
|
23
|
+
# Create a group
|
24
|
+
def initialize( name = nil, channel = nil )
|
25
|
+
@name = name || self
|
26
|
+
@channel = channel
|
27
|
+
@users = []
|
28
|
+
end
|
29
|
+
|
30
|
+
# Write data, which contain yaml format
|
31
|
+
def write_yaml( yaml_data )
|
32
|
+
@users.each{|user|
|
33
|
+
user.write_yaml( yaml_data )
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
# Write data, which contain json format
|
38
|
+
def write_json( json_data )
|
39
|
+
@users.each{|user|
|
40
|
+
user.write_json( json_data )
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
# Write any object
|
45
|
+
def write( data )
|
46
|
+
@users.each{|user|
|
47
|
+
user.write( data )
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
# Add user to the group
|
52
|
+
def add_user( user )
|
53
|
+
@users.push( user )
|
54
|
+
user.groups.push( self )
|
55
|
+
end
|
56
|
+
|
57
|
+
# Delete user from the group
|
58
|
+
def remove_user( user )
|
59
|
+
@users.delete( user )
|
60
|
+
user.groups.delete( self )
|
61
|
+
end
|
62
|
+
|
63
|
+
def destroy
|
64
|
+
@users.each{|user|
|
65
|
+
user.groups.delete( self )
|
66
|
+
}
|
67
|
+
if( @channel )
|
68
|
+
@channel.groups.delete( @name )
|
69
|
+
@channel.group_have_users.delete( @name )
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
|
2
|
+
module LiveData
|
3
|
+
class User
|
4
|
+
|
5
|
+
IntegerPackCode = "I"
|
6
|
+
|
7
|
+
attr :groups, :name
|
8
|
+
|
9
|
+
# Create a user object
|
10
|
+
def initialize( name = nil, channel = nil )
|
11
|
+
@name = name || self
|
12
|
+
@channel = channel
|
13
|
+
@lock = Mutex.new
|
14
|
+
@read_pipe, @write_pipe = IO.pipe
|
15
|
+
@groups = []
|
16
|
+
end
|
17
|
+
|
18
|
+
# Reset the write pipe and read pipe
|
19
|
+
def reset
|
20
|
+
begin
|
21
|
+
@write_pipe.close
|
22
|
+
@read_pipe.close
|
23
|
+
rescue => err
|
24
|
+
end
|
25
|
+
@read_pipe, @write_pipe = IO.pipe
|
26
|
+
end
|
27
|
+
|
28
|
+
# Clean the Contain in the pipe
|
29
|
+
def clean
|
30
|
+
begin
|
31
|
+
while( @read_pipe.read_nonblock( 10000 ) )
|
32
|
+
end
|
33
|
+
rescue => err
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Read json contain
|
38
|
+
def read_json
|
39
|
+
@read_pipe.gets()
|
40
|
+
end
|
41
|
+
|
42
|
+
# Read yaml contain
|
43
|
+
def read_yaml
|
44
|
+
len, etc = @read_pipe.read(4).unpack( IntegerPackCode )
|
45
|
+
@read_pipe.read( len )
|
46
|
+
end
|
47
|
+
|
48
|
+
# read a Object
|
49
|
+
def read
|
50
|
+
YAML.load( read_yaml )
|
51
|
+
end
|
52
|
+
|
53
|
+
# Write a string, which contain json format
|
54
|
+
# ==== Parameters
|
55
|
+
# * +json_data+ - json string
|
56
|
+
def write_json( json_data )
|
57
|
+
@write_pipe.write( json_data + "\n" )
|
58
|
+
end
|
59
|
+
|
60
|
+
# Write a string, which contain yam format
|
61
|
+
# ==== Parameters
|
62
|
+
# * +yaml_data+ - yaml string
|
63
|
+
def write_yaml( yaml_data )
|
64
|
+
return unless yaml_data and yaml_data.class == String
|
65
|
+
len = [ yaml_data.length ].pack( IntegerPackCode )
|
66
|
+
@write_pipe.write( len )
|
67
|
+
@write_pipe.write( yaml_data )
|
68
|
+
end
|
69
|
+
|
70
|
+
# Write a Object
|
71
|
+
# ==== Parameters
|
72
|
+
# * +data+ - any Object
|
73
|
+
def write( data )
|
74
|
+
write_yaml( data.to_yaml )
|
75
|
+
end
|
76
|
+
|
77
|
+
# Destroy the user
|
78
|
+
def destroy
|
79
|
+
@groups.dup.each{|grp|
|
80
|
+
grp.remove_user( self )
|
81
|
+
}
|
82
|
+
if( @channel )
|
83
|
+
@channel.users.delete( @name )
|
84
|
+
@channel.user_in_groups.delete( @name )
|
85
|
+
end
|
86
|
+
begin
|
87
|
+
@read_pipe.close
|
88
|
+
@write_pipe.close
|
89
|
+
rescue => err
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
data/lib/live_data.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# LiveData
|
2
|
+
|
3
|
+
require 'thread'
|
4
|
+
require 'yaml'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
require 'live_data/version'
|
8
|
+
require 'live_data/channel'
|
9
|
+
require 'live_data/user'
|
10
|
+
require 'live_data/group'
|
11
|
+
module LiveData
|
12
|
+
Channels = {}
|
13
|
+
|
14
|
+
def self.create_channel( name )
|
15
|
+
unless( Channels[name] )
|
16
|
+
Channels[name] = LiveData::Channel.new( name )
|
17
|
+
end
|
18
|
+
return Channels[name]
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.destroy_channel( name )
|
22
|
+
channel = self.get_channel( name )
|
23
|
+
channel.destroy()
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.get_channel( name, create = true )
|
27
|
+
channel = Channels[name]
|
28
|
+
if( !channel and create )
|
29
|
+
channel = LiveData.create_channel( name )
|
30
|
+
end
|
31
|
+
return channel
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.check_channel( name )
|
35
|
+
Channels[name]
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/lib/livedata.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'live_data'
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LiveDataTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_channel
|
6
|
+
chat = LiveData.create_channel( 'chat' )
|
7
|
+
|
8
|
+
assert chat.class == LiveData::Channel
|
9
|
+
assert chat.name == 'chat'
|
10
|
+
assert chat == LiveData.get_channel( 'chat' )
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_user
|
14
|
+
chat = LiveData.create_channel( 'chat' )
|
15
|
+
guest1 = chat.create_user( 'guest1' )
|
16
|
+
|
17
|
+
assert guest1.class == LiveData::User
|
18
|
+
assert guest1.name == 'guest1'
|
19
|
+
assert guest1 == chat.get_user( 'guest1' )
|
20
|
+
assert guest1 == chat.create_user( 'guest1' )
|
21
|
+
|
22
|
+
chat.destroy_user( 'guest1' )
|
23
|
+
|
24
|
+
assert chat.get_user( 'guest1') == nil
|
25
|
+
assert chat.users['guest1'] == nil
|
26
|
+
assert chat.user_in_groups['guest1'] == nil
|
27
|
+
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_group
|
32
|
+
chat = LiveData.create_channel( 'chat' )
|
33
|
+
users_grp = chat.create_group( 'users' )
|
34
|
+
|
35
|
+
assert users_grp.class == LiveData::Group
|
36
|
+
assert users_grp.name == 'users'
|
37
|
+
assert users_grp == chat.get_group( 'users' )
|
38
|
+
assert users_grp == chat.create_group( 'users' )
|
39
|
+
|
40
|
+
guest1 = chat.create_user( 'guest1' )
|
41
|
+
users_grp.add_user( guest1 )
|
42
|
+
assert users_grp.users.include? guest1
|
43
|
+
assert guest1.groups.include? users_grp
|
44
|
+
|
45
|
+
users_grp.remove_user( guest1 )
|
46
|
+
assert !users_grp.users.include?(guest1)
|
47
|
+
assert !guest1.groups.include?(users_grp)
|
48
|
+
|
49
|
+
chat.destroy_group( 'users' )
|
50
|
+
|
51
|
+
assert chat.get_group('users' ) == nil
|
52
|
+
assert chat.group_have_users['users'] == nil
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_process_data
|
56
|
+
chat = LiveData.create_channel( 'chat' )
|
57
|
+
guest1 = chat.create_user( 'guest1' )
|
58
|
+
guest2 = chat.create_user( 'guest2' )
|
59
|
+
grp = chat.create_group( 'users')
|
60
|
+
data = { :title => "Greating", :message => "Welcome you all" }
|
61
|
+
data1 = { :title => "Greating1", :message => "Welcome you all" }
|
62
|
+
data2 = { :title => "Greating2", :message => "Welcome you all" }
|
63
|
+
grp.add_user( guest1 )
|
64
|
+
grp.add_user( guest2 )
|
65
|
+
|
66
|
+
guest1.write( data )
|
67
|
+
assert data == guest1.read
|
68
|
+
|
69
|
+
guest2.write( data1 )
|
70
|
+
tmp_data = guest2.read
|
71
|
+
assert data1 == tmp_data
|
72
|
+
assert data != tmp_data
|
73
|
+
|
74
|
+
|
75
|
+
grp.write( data2 )
|
76
|
+
assert data2 == guest1.read
|
77
|
+
assert data2 == guest2.read
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: livedata
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mohammed Siddick. E
|
8
|
+
autorequire: live_data
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-02-13 00:00:00 +05:30
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Using the livedata plugin, we can implement application like chat, status monitoring, etc.
|
17
|
+
email: siddick007@yahoo.co.in
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
24
|
+
files:
|
25
|
+
- Rakefile
|
26
|
+
- MIT-LICENSE
|
27
|
+
- install.rb
|
28
|
+
- README
|
29
|
+
- CHANGELOG
|
30
|
+
- lib/live_data/channel.rb
|
31
|
+
- lib/live_data/group.rb
|
32
|
+
- lib/live_data/user.rb
|
33
|
+
- lib/live_data/version.rb
|
34
|
+
- lib/livedata.rb
|
35
|
+
- lib/live_data.rb
|
36
|
+
- test/live_data_test.rb
|
37
|
+
- test/test_helper.rb
|
38
|
+
has_rdoc: true
|
39
|
+
homepage: http://siddick.github.com/
|
40
|
+
licenses: []
|
41
|
+
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options:
|
44
|
+
- --main
|
45
|
+
- README
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
53
|
+
version:
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
version:
|
60
|
+
requirements: []
|
61
|
+
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 1.3.5
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: Handle live data
|
67
|
+
test_files: []
|
68
|
+
|