protolink 0.1.0

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.
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
+