protolink 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown ADDED
@@ -0,0 +1,150 @@
1
+ # ProtoLink - Access your ProtoNet
2
+
3
+ ProtoLink is a library for interfacing with ProtoNet, the next-gen internet infrastructure. Truly social and people-powered.
4
+
5
+ Version: 0.1.0
6
+
7
+ Sorry, there are no tests at all yet...
8
+
9
+
10
+ ## Dependencies
11
+
12
+ activesupport
13
+ faraday -v 0.5.1
14
+ multipart-post
15
+ mime-types
16
+ twitter-stream (for streaming listening in future)
17
+ eventmachine
18
+
19
+
20
+ ## Usage
21
+
22
+ # CHANNELS
23
+
24
+ # simple message
25
+ require 'rubygems'
26
+ require 'protolink'
27
+
28
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
29
+ channel = protonet.channels.first
30
+ channel.speak 'Hello world!'
31
+
32
+
33
+ # post message in specific channel
34
+ require 'rubygems'
35
+ require 'protolink'
36
+
37
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
38
+ channel = protonet.find_channel_by_name("test")
39
+ channel.speak 'Hello world!'
40
+
41
+
42
+ # create a channel
43
+ require 'rubygems'
44
+ require 'protolink'
45
+
46
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
47
+ channel = protonet.create_channel("test", "This is the description... woah")
48
+ channel.speak 'Hello world!'
49
+
50
+
51
+ # find or create a channel
52
+ require 'rubygems'
53
+ require 'protolink'
54
+
55
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
56
+ channel = protonet.find_or_create_channel_by_name("test", "This is the description... woah")
57
+ channel.speak 'Hello world!'
58
+
59
+
60
+ # USERS
61
+
62
+ # find user by login
63
+ require 'rubygems'
64
+ require 'protolink'
65
+
66
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
67
+ user = protonet.find_user_by_login("bjoern.dorra")
68
+
69
+
70
+ # create a user
71
+ require 'rubygems'
72
+ require 'protolink'
73
+
74
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
75
+ user = protonet.create_user("testuser", "mymassword", "Test-User", "test@test.de")
76
+
77
+
78
+ # find or create a user
79
+ require 'rubygems'
80
+ require 'protolink'
81
+
82
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
83
+ user = protonet.find_or_create_user_by_login("testuser", "mymassword", "Test-User", "test@test.de")
84
+
85
+
86
+ # get users auth_token for auto-login
87
+ require 'rubygems'
88
+ require 'protolink'
89
+
90
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
91
+ user = protonet.find_user_by_name("bjoern.dorra")
92
+ user.auth_token
93
+ => "A19zNgCzgv4RGDGPc2mL"
94
+
95
+
96
+ # LISTENS
97
+
98
+ # create a listen
99
+ require 'rubygems'
100
+ require 'protolink'
101
+
102
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
103
+ user = protonet.find_user_by_login("bjoern.dorra")
104
+ channel = protonet.find_channel_by_name("test")
105
+ protonet.create_listen(user.id, channel.id)
106
+
107
+ # destroy a listen
108
+ require 'rubygems'
109
+ require 'protolink'
110
+
111
+ protonet = Protolink::Protonet.new('SUBDOMAIN.DOMAIN.DE', 'USERLOGIN', 'PASSWORD', :ssl => false)
112
+ user = protonet.find_user_by_login("bjoern.dorra")
113
+ channel = protonet.find_channel_by_name("test")
114
+ protonet.destroy_listen(user.id, channel.id)
115
+
116
+
117
+ # CREATE AND SUBSCRIBE
118
+
119
+ require 'rubygems'
120
+ require 'protolink'
121
+
122
+ protonet = Protolink::Protonet.new('localhost:3000', 'bjoern.dorra', 'geheim')
123
+
124
+ user = protonet.find_or_create_user_by_login("johndoe", "password", "JohnDoe", "john@doe.com")
125
+ auth_token = user.auth_token
126
+ channel = protonet.find_or_create_channel_by_name("test", "This is a test channel!")
127
+ protonet.create_listen(user.id, channel.id)
128
+ "\nhttp://localhost:3000/?auth_token=#{auth_token}"
129
+
130
+
131
+ ## Installation
132
+
133
+ gem install protolink
134
+
135
+
136
+ ## How to contribute
137
+
138
+ If you find what looks like a bug:
139
+
140
+ 1. Check the GitHub issue tracker to see if anyone else has had the same issue.
141
+ http://github.com/protonet/protolink/issues/
142
+ 2. If you don't see anything, create an issue with information on how to reproduce it.
143
+
144
+ If you want to contribute an enhancement or a fix:
145
+
146
+ 1. Fork the project on github.
147
+ http://github.com/protonet/protolink
148
+ 2. Make your changes with tests.
149
+ 3. Commit the changes without making changes to the Rakefile, VERSION, or any other files that aren't related to your enhancement or fix
150
+ 4. Send a pull request.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ # require 'rspec/core/rake_task'
5
+ # desc 'Run the specs'
6
+ # RSpec::Core::RakeTask.new do |r|
7
+ # r.verbose = false
8
+ # end
9
+
10
+ # task :default => :spec
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'protolink'
3
+
4
+ protonet = Protolink::Protonet.new('localhost:3000', 'bjoern.dorra', 'geheim')
5
+
6
+ user = protonet.find_or_create_user_by_login("johndoe", "password", "John Doe", "john@doe.com")
7
+ auth_token = user.auth_token
8
+ puts "user_id : #{user.id}"
9
+ puts "user_login : #{user.login}"
10
+ puts "auth_token : #{auth_token}"
11
+
12
+ channel = protonet.find_or_create_channel_by_name("test", "This is a test channel!")
13
+ puts "channel_id : #{channel.id}"
14
+ puts "channel_name: #{channel.name}"
15
+ puts "channel_desc: #{channel.description}"
16
+
17
+ protonet.create_listen(user.id, channel.id)
18
+
19
+ puts "\nhttp://localhost:3000/?auth_token=#{auth_token}"
data/lib/protolink.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'active_support'
2
+ require 'active_support/json'
3
+ require 'mime/types'
4
+
5
+ require 'protolink/connection'
6
+ require 'protolink/protonet'
7
+ require 'protolink/channel'
8
+ require 'protolink/user'
9
+ require 'protolink/listen'
10
+ require 'protolink/middleware'
11
+
12
+ module Protolink
13
+ class Error < StandardError; end
14
+ class SSLRequiredError < Error; end
15
+ class AuthenticationFailed < Error; end
16
+ class ListenFailed < Error; end
17
+ end
@@ -0,0 +1,45 @@
1
+ module Protolink
2
+ class Channel
3
+ attr_reader :id, :name, :description
4
+
5
+ def initialize(connection, attributes = {})
6
+ @connection = connection
7
+ @id = attributes['id']
8
+ @name = attributes['name']
9
+ @description = attributes['description']
10
+ @loaded = false
11
+ end
12
+
13
+
14
+ # Post a new message to the chat channel
15
+ def speak(message, options = {})
16
+ send_message(message)
17
+ end
18
+
19
+
20
+ protected
21
+
22
+ def load
23
+ reload! unless @loaded
24
+ end
25
+
26
+ # does not work yet
27
+ def reload!
28
+ attributes = connection.get("/api/v1/channels/#{@id}.json")['channel']
29
+
30
+ @id = attributes['id']
31
+ @name = attributes['name']
32
+ @description = attributes['description']
33
+ @loaded = true
34
+ end
35
+
36
+ def send_message(message)
37
+ connection.post("/api/v1/meeps/create", {:channel_id => self.id, :message => message})
38
+ end
39
+
40
+ def connection
41
+ @connection
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,83 @@
1
+ require 'uri'
2
+ require 'faraday'
3
+
4
+ module Protolink
5
+ class Connection
6
+
7
+ attr_reader :domain, :username, :password, :uri, :options
8
+
9
+ def self.connection
10
+ @connection ||= Faraday::Connection.new do |conn|
11
+ conn.use Faraday::Request::ActiveSupportJson
12
+ conn.adapter :net_http
13
+ conn.use Protolink::FaradayResponse::RaiseOnAuthenticationFailure
14
+ conn.use Faraday::Response::ActiveSupportJson
15
+ conn.use Protolink::FaradayResponse::WithIndifferentAccess
16
+
17
+ conn.headers['Content-Type'] = 'application/json'
18
+ end
19
+ end
20
+
21
+ def self.raw_connection
22
+ @raw_connection ||= Faraday::Connection.new do |conn|
23
+ conn.adapter Faraday.default_adapter
24
+ conn.use Protolink::FaradayResponse::RaiseOnAuthenticationFailure
25
+ conn.use Faraday::Response::ActiveSupportJson
26
+ conn.use Protolink::FaradayResponse::WithIndifferentAccess
27
+ end
28
+ end
29
+
30
+ def initialize(domainname, username, password, options = {})
31
+ @domainname = domainname
32
+ @username = username
33
+ @password = password
34
+ @options = { :ssl => false, :proxy => ENV['HTTP_PROXY'] }.merge(options)
35
+ @uri = URI.parse("#{@options[:ssl] ? 'https' : 'http' }://#{domainname}")
36
+
37
+ connection.basic_auth username, password
38
+ raw_connection.basic_auth username, password
39
+ end
40
+
41
+ def connection
42
+ @connection ||= begin
43
+ conn = self.class.connection.dup
44
+ conn.url_prefix = @uri.to_s
45
+ conn.proxy options[:proxy]
46
+ conn
47
+ end
48
+ end
49
+
50
+ def raw_connection
51
+ @raw_connection ||= begin
52
+ conn = self.class.raw_connection.dup
53
+ conn.url_prefix = @uri.to_s
54
+ conn.proxy options[:proxy]
55
+ conn
56
+ end
57
+ end
58
+
59
+ def get(url, *args)
60
+ response = connection.get(url, *args)
61
+ response.body
62
+ end
63
+
64
+ def post(url, body = nil, *args)
65
+ response = connection.post(url, body, *args)
66
+ response.body
67
+ end
68
+
69
+ def raw_post(url, body = nil, *args)
70
+ response = raw_connection.post(url, body, *args)
71
+ end
72
+
73
+ def put(url, body = nil, *args)
74
+ response = connection.put(url, body, *args)
75
+ response.body
76
+ end
77
+
78
+ # Is the connection using ssl?
79
+ def ssl?
80
+ uri.scheme == 'https'
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,35 @@
1
+ module Protolink
2
+ class Listen
3
+ attr_reader :id, :user_id, :channel_id
4
+
5
+ def initialize(connection, attributes = {})
6
+ @connection = connection
7
+ @id = attributes['id']
8
+ @user_id = attributes['user_id']
9
+ @channel_id = attributes['channel_id']
10
+ @loaded = false
11
+ end
12
+
13
+
14
+ protected
15
+
16
+ def load
17
+ reload! unless @loaded
18
+ end
19
+
20
+ # does not work yet
21
+ def reload!
22
+ attributes = connection.get("/api/v1/listens/#{@id}.json")['listen']
23
+
24
+ @id = attributes['id']
25
+ @user_id = attributes['user_id']
26
+ @channel_id = attributes['channel_id']
27
+ @loaded = true
28
+ end
29
+
30
+ def connection
31
+ @connection
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ module Protolink
2
+ module FaradayResponse
3
+ class WithIndifferentAccess < ::Faraday::Response::Middleware
4
+ begin
5
+ require 'active_support/core_ext/hash/indifferent_access'
6
+ rescue LoadError, NameError => error
7
+ self.load_error = error
8
+ end
9
+
10
+ def self.register_on_complete(env)
11
+ env[:response].on_complete do |response|
12
+ json = response[:body]
13
+ if json.is_a?(Hash)
14
+ response[:body] = ::HashWithIndifferentAccess.new(json)
15
+ elsif json.is_a?(Array) and json.first.is_a?(Hash)
16
+ response[:body] = json.map{|item| ::HashWithIndifferentAccess.new(item) }
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ class RaiseOnAuthenticationFailure < ::Faraday::Response::Middleware
23
+ def self.register_on_complete(env)
24
+ env[:response].on_complete do |response|
25
+ raise AuthenticationFailed if response[:status] == 401
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,86 @@
1
+ module Protolink
2
+
3
+ # protonet = Protolink::Protonet.new 'domain', :user => 'john.doe', :password => 'secret', :token => 'xyz'
4
+ #
5
+ # channel = protonet.find_channel_by_name 'home'
6
+ # channel.speak 'Hello world!'
7
+ class Protonet
8
+ attr_reader :connection
9
+
10
+ # Create a new connection to the account with the given +domain+.
11
+ #
12
+ # == Options:
13
+ # * +:ssl+: use SSL for the connection, which is required if you have a Protonet SSL account.
14
+ # Defaults to false
15
+ # * +:proxy+: a proxy URI. (e.g. :proxy => 'http://user:pass@example.com:8000')
16
+ #
17
+ def initialize(domainname, username, password, options = {})
18
+ @connection = Connection.new(domainname, username, password, options)
19
+ end
20
+
21
+
22
+ # CHANNELS
23
+
24
+ # Get an array of all the available channels
25
+ def channels
26
+ s = connection.get('/api/v1/channels.json')
27
+ s = Hash["channels", s]
28
+ s['channels'].map do |channel|
29
+ Channel.new(connection, channel)
30
+ end
31
+ end
32
+
33
+ # Find a Channel by name
34
+ def find_channel_by_name(name)
35
+ channels.detect { |channel| channel.name == name }
36
+ end
37
+
38
+ # Creates and returns a new Channel with the given +name+ and optionally a +description+
39
+ def create_channel(name, description = nil)
40
+ connection.post('/api/v1/channels/create.json', { :name => name, :description => description } )
41
+ find_channel_by_name(name)
42
+ end
43
+
44
+ def find_or_create_channel_by_name(name, description = nil)
45
+ find_channel_by_name(name) || create_channel(name, description)
46
+ end
47
+
48
+
49
+ # USERS
50
+
51
+ # Get an array of all the available users
52
+ def users
53
+ s = connection.get('/api/v1/users.json')
54
+ s = Hash["users", s]
55
+ s['users'].map do |user|
56
+ User.new(connection, user)
57
+ end
58
+ end
59
+
60
+ # Creates and returns a new user with the given attributes
61
+ def create_user(login, password, name, email, avatar_url = nil, channels = nil)
62
+ connection.post('/api/v1/users/create.json', {:login => login, :name => name, :password => password, :email => email, :avatar_url => avatar_url, :channels => channels } )
63
+ find_user_by_login(login)
64
+ end
65
+
66
+ # Find a user by name
67
+ def find_user_by_login(login)
68
+ users.detect { |user| user.login == login }
69
+ end
70
+
71
+ def find_or_create_user_by_login(login, password, name, email, avatar_url = nil, channels = nil)
72
+ find_user_by_login(name) || create_user(login, password, name, email, avatar_url = nil, channels = nil)
73
+ end
74
+
75
+
76
+ # LISTENS
77
+ def create_listen(user_id, channel_id)
78
+ connection.post('/api/v1/listens/create.json', {:user_id => user_id, :channel_id => channel_id } )
79
+ end
80
+
81
+ def destroy_listen(user_id, channel_id)
82
+ connection.post('/api/v1/listens/destroy.json', {:user_id => user_id, :channel_id => channel_id } )
83
+ end
84
+
85
+ end
86
+ end
@@ -0,0 +1,47 @@
1
+ module Protolink
2
+ class User
3
+ attr_reader :id, :name, :login, :email, :avatar_url
4
+
5
+ def initialize(connection, attributes = {})
6
+ @connection = connection
7
+ @id = attributes['id']
8
+ @name = attributes['name']
9
+ @login = attributes['login']
10
+ @email = attributes['email']
11
+ @avatar_url = attributes['avatar_url']
12
+ @loaded = false
13
+ end
14
+
15
+ # get token for autologin
16
+ def auth_token
17
+ receive_auth_token
18
+ end
19
+
20
+ protected
21
+
22
+ def receive_auth_token
23
+ connection.get("/api/v1/users/auth_token.json?user_id=#{self.id}")['token']
24
+ end
25
+
26
+ def load
27
+ reload! unless @loaded
28
+ end
29
+
30
+ # does not work yet
31
+ def reload!
32
+ attributes = connection.get("/api/v1/users/#{@id}.json")['user']
33
+
34
+ @id = attributes['id']
35
+ @name = attributes['name']
36
+ @login = attributes['login']
37
+ @email = attributes['email']
38
+ @avatar_url = attributes['avatar_url']
39
+ @loaded = true
40
+ end
41
+
42
+ def connection
43
+ @connection
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module Protolink
2
+ VERSION = '0.1.0' unless defined?(::Protolink::VERSION)
3
+ end
data/protolink.gemspec ADDED
@@ -0,0 +1,57 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "protolink/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{protolink}
7
+ s.version = Protolink::VERSION
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
+ s.authors = ["Björn B. Dorra"]
10
+ s.description = %q{A Ruby API for interfacing with Protonet, the next-gen internet infrastructure. Truly social and people-powered.}
11
+ s.email = %q{dorra@d-1.comg}
12
+ s.extra_rdoc_files = [
13
+ "README.markdown"
14
+ ]
15
+ s.homepage = %q{http://github.com/protonet/protolink}
16
+ s.rubyforge_project = %q{protolink}
17
+ s.rubygems_version = %q{1.3.6}
18
+ s.summary = %q{Ruby wrapper for the ProtoNet API}
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- spec/*`.split("\n")
21
+ s.require_paths = ["lib"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 3
26
+
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
29
+ s.add_runtime_dependency(%q<faraday>, ["~> 0.5.1"])
30
+ s.add_runtime_dependency(%q<multipart-post>, [">= 0"])
31
+ s.add_runtime_dependency(%q<mime-types>, [">= 0"])
32
+ s.add_runtime_dependency(%q<twitter-stream>, [">= 0"])
33
+ s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
34
+ s.add_development_dependency(%q<rspec>, [">= 0"])
35
+ s.add_development_dependency(%q<fakeweb>, [">= 0"])
36
+ else
37
+ s.add_dependency(%q<activesupport>, [">= 0"])
38
+ s.add_dependency(%q<faraday>, ["~> 0.5.1"])
39
+ s.add_dependency(%q<multipart-post>, [">= 0"])
40
+ s.add_dependency(%q<mime-types>, [">= 0"])
41
+ s.add_dependency(%q<twitter-stream>, [">= 0"])
42
+ s.add_dependency(%q<eventmachine>, [">= 0"])
43
+ s.add_dependency(%q<rspec>, [">= 0"])
44
+ s.add_dependency(%q<fakeweb>, [">= 0"])
45
+ end
46
+ else
47
+ s.add_dependency(%q<activesupport>, [">= 0"])
48
+ s.add_dependency(%q<faraday>, ["~> 0.5.1"])
49
+ s.add_dependency(%q<multipart-post>, [">= 0"])
50
+ s.add_dependency(%q<mime-types>, [">= 0"])
51
+ s.add_dependency(%q<twitter-stream>, [">= 0"])
52
+ s.add_dependency(%q<eventmachine>, [">= 0"])
53
+ s.add_dependency(%q<rspec>, [">= 0"])
54
+ s.add_dependency(%q<fakeweb>, [">= 0"])
55
+ end
56
+ end
57
+
metadata ADDED
@@ -0,0 +1,191 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: protolink
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - "Bj\xC3\xB6rn B. Dorra"
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-06-14 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: activesupport
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: faraday
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 9
44
+ segments:
45
+ - 0
46
+ - 5
47
+ - 1
48
+ version: 0.5.1
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: multipart-post
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: mime-types
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ type: :runtime
78
+ version_requirements: *id004
79
+ - !ruby/object:Gem::Dependency
80
+ name: twitter-stream
81
+ prerelease: false
82
+ requirement: &id005 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ type: :runtime
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
94
+ name: eventmachine
95
+ prerelease: false
96
+ requirement: &id006 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ type: :runtime
106
+ version_requirements: *id006
107
+ - !ruby/object:Gem::Dependency
108
+ name: rspec
109
+ prerelease: false
110
+ requirement: &id007 !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ type: :development
120
+ version_requirements: *id007
121
+ - !ruby/object:Gem::Dependency
122
+ name: fakeweb
123
+ prerelease: false
124
+ requirement: &id008 !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: 3
130
+ segments:
131
+ - 0
132
+ version: "0"
133
+ type: :development
134
+ version_requirements: *id008
135
+ description: A Ruby API for interfacing with Protonet, the next-gen internet infrastructure. Truly social and people-powered.
136
+ email: dorra@d-1.comg
137
+ executables: []
138
+
139
+ extensions: []
140
+
141
+ extra_rdoc_files:
142
+ - README.markdown
143
+ files:
144
+ - README.markdown
145
+ - Rakefile
146
+ - example/create_and_subscribe.rb
147
+ - lib/protolink.rb
148
+ - lib/protolink/channel.rb
149
+ - lib/protolink/connection.rb
150
+ - lib/protolink/listen.rb
151
+ - lib/protolink/middleware.rb
152
+ - lib/protolink/protonet.rb
153
+ - lib/protolink/user.rb
154
+ - lib/protolink/version.rb
155
+ - protolink.gemspec
156
+ has_rdoc: true
157
+ homepage: http://github.com/protonet/protolink
158
+ licenses: []
159
+
160
+ post_install_message:
161
+ rdoc_options: []
162
+
163
+ require_paths:
164
+ - lib
165
+ required_ruby_version: !ruby/object:Gem::Requirement
166
+ none: false
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ hash: 3
171
+ segments:
172
+ - 0
173
+ version: "0"
174
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
+ none: false
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ hash: 3
180
+ segments:
181
+ - 0
182
+ version: "0"
183
+ requirements: []
184
+
185
+ rubyforge_project: protolink
186
+ rubygems_version: 1.3.7
187
+ signing_key:
188
+ specification_version: 3
189
+ summary: Ruby wrapper for the ProtoNet API
190
+ test_files: []
191
+