em-twitter-client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ examples/mykeys
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm ruby-1.9.2-p180@twitter-client --create
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+ gem 'em-http-request', '>=1.0.0.beta.4', :require => ['em-http', 'em-http/middleware/oauth','em-http/middleware/json_response'], :git => "git://github.com/igrigorik/em-http-request.git"
6
+ gem 'em-synchrony', :git => 'https://github.com/igrigorik/em-synchrony.git', :require => ['em-synchrony', 'em-synchrony/em-http']
7
+ gem 'rack-fiber_pool','0.9.0', :require => 'rack/fiber_pool'
8
+ gem 'oauth', :git => "git://github.com/sujal/oauth-ruby.git"
data/Gemfile.lock ADDED
@@ -0,0 +1,67 @@
1
+ GIT
2
+ remote: git://github.com/igrigorik/em-http-request.git
3
+ revision: c7848ff95a603c0d97b465ed1f2058178b3f78c0
4
+ specs:
5
+ em-http-request (1.0.0.beta.4)
6
+ addressable (>= 2.2.3)
7
+ em-socksify
8
+ eventmachine (>= 1.0.0.beta.3)
9
+ http_parser.rb (>= 0.5.1)
10
+
11
+ GIT
12
+ remote: git://github.com/sujal/oauth-ruby.git
13
+ revision: 6e2249fd1130dbc5fb9991e6ade8cd4abdbf3b5c
14
+ specs:
15
+ oauth (0.4.4)
16
+
17
+ GIT
18
+ remote: https://github.com/igrigorik/em-synchrony.git
19
+ revision: 20172584779485f1c8c46333943e5582750698d2
20
+ specs:
21
+ em-synchrony (0.3.0.beta.1)
22
+ eventmachine (>= 1.0.0.beta.1)
23
+
24
+ PATH
25
+ remote: .
26
+ specs:
27
+ em-twitter-client (0.0.1)
28
+ addressable (>= 2.2.3)
29
+ em-http-request (= 1.0.0.beta.4)
30
+ em-synchrony
31
+ eventmachine (>= 1.0.0.beta.3)
32
+ yajl-ruby
33
+
34
+ GEM
35
+ remote: http://rubygems.org/
36
+ specs:
37
+ addressable (2.2.6)
38
+ diff-lcs (1.1.2)
39
+ em-socksify (0.1.0)
40
+ eventmachine
41
+ eventmachine (1.0.0.beta.3)
42
+ http_parser.rb (0.5.1)
43
+ rack-fiber_pool (0.9.0)
44
+ rake (0.8.7)
45
+ rspec (2.5.0)
46
+ rspec-core (~> 2.5.0)
47
+ rspec-expectations (~> 2.5.0)
48
+ rspec-mocks (~> 2.5.0)
49
+ rspec-core (2.5.1)
50
+ rspec-expectations (2.5.0)
51
+ diff-lcs (~> 1.1.2)
52
+ rspec-mocks (2.5.0)
53
+ yajl-ruby (0.8.2)
54
+
55
+ PLATFORMS
56
+ ruby
57
+
58
+ DEPENDENCIES
59
+ bundler
60
+ em-http-request (>= 1.0.0.beta.4)!
61
+ em-synchrony!
62
+ em-twitter-client!
63
+ oauth!
64
+ rack-fiber_pool (= 0.9.0)
65
+ rake
66
+ rspec
67
+ rspec-core
data/README.markdown ADDED
@@ -0,0 +1,28 @@
1
+ em-twitter-client
2
+ =================
3
+
4
+ It provides a simple api to access twitter rest api using event machine. This has provided us with really fast and efficient way of retriving twitter data.
5
+
6
+ The current api is based on pages of information and will retrieve
7
+ It is based on em-http-request and event-machine.
8
+
9
+ There are some usage examples in the examples folder.
10
+
11
+ The current implementation blocks for each api call to finish. Ie. 5 pages of user_timeline is fetched asynchronously but it waits for the call to complete.
12
+
13
+ That's sort of what we needed, but the complete async api is coming soon as well.
14
+
15
+
16
+ Here are some examples. It's based on em-synchrony. So remember to wrap it into the EM.synchrony
17
+
18
+ EM.synchrony do
19
+ twitter = EM::TwitterClient.new(oauth)
20
+ twitter.rate_limit
21
+ twitter.home_timeline(2) do |data|
22
+ @data = data
23
+ puts data.flatten.inspect
24
+ EM.stop
25
+ end
26
+ end
27
+
28
+ Will hopefully publish the gem then as well, when that is done.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+
6
+ desc "Run all RSpec tests"
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ require 'irb'
3
+ require 'irb/completion'
4
+ require 'bundler'
5
+ # Set up gems listed in the Gemfile.
6
+ begin
7
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
8
+ require 'bundler'
9
+ Bundler.setup
10
+ rescue Bundler::GemNotFound => e
11
+ STDERR.puts e.message
12
+ STDERR.puts "Try running 'bundle install'."
13
+ exit!
14
+ end
15
+
16
+ Bundler.require(:default)
17
+
18
+ require File.expand_path("../../lib/em-twitter-client/twitter_client", __FILE__)
19
+
20
+ IRB.start
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "em-twitter-client/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "em-twitter-client"
7
+ s.version = EM::TwitterClient::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["V Sreekanth"]
10
+ s.email = ["sreeix@gmail.com"]
11
+ s.summary = %q{Event Machined API to access twitter via rest}
12
+ s.description = %q{Event Machined API to access twitter via rest}
13
+
14
+ s.rubyforge_project = "em-twitter-client"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+
20
+ s.require_paths = ["lib"]
21
+
22
+
23
+ s.add_dependency('eventmachine', ">=1.0.0.beta.3")
24
+ s.add_dependency('yajl-ruby')
25
+ s.add_dependency('addressable', ">= 2.2.3")
26
+ s.add_dependency('em-synchrony')
27
+ s.add_dependency('em-http-request', "=1.0.0.beta.4")
28
+ s.add_development_dependency('rspec')
29
+ s.add_development_dependency('rspec-core')
30
+ s.add_development_dependency('rake')
31
+ s.add_development_dependency('bundler')
32
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path('../../lib/em-twitter-client/twitter_client', __FILE__)
2
+ require 'eventmachine'
3
+ require 'em-http'
4
+ require 'em-http/middleware/oauth'
5
+ require 'em-http/middleware/json_response'
6
+ require 'em-synchrony/em-http'
7
+ require "em-synchrony"
8
+ require "em-synchrony/em-http"
9
+ @data = []
10
+
11
+ oauth = {:consumer_key => 'LALA',
12
+ :consumer_secret => 'FOO',
13
+ :access_token => 'LALA',
14
+ :access_token_secret => 'LALA'
15
+ }
16
+
17
+
18
+ EM.synchrony do
19
+ twitter = EM::TwitterClient.new(oauth)
20
+ twitter.rate_limit
21
+ twitter.mentions do |data|
22
+ @data = data
23
+ puts data.flatten.inspect
24
+ EM.stop
25
+ end
26
+ end
27
+
28
+ EM.synchrony do
29
+ twitter = EM::TwitterClient.new(oauth)
30
+ twitter.rate_limit
31
+ twitter.home_timeline(2) do |data|
32
+ @data = data
33
+ puts data.flatten.inspect
34
+ EM.stop
35
+ end
36
+ end
37
+
38
+ EM.synchrony do
39
+ twitter = EM::TwitterClient.new(oauth)
40
+ twitter.rate_limit
41
+ twitter.user_timeline('sreeix', 2) do |data|
42
+ @data = data
43
+ puts data.flatten.inspect
44
+ EM.stop
45
+ end
46
+ end
47
+
48
+ EM.synchrony do
49
+ twitter = EM::TwitterClient.new(oauth)
50
+ twitter.rate_limit
51
+ twitter.user_friends('sreeix', 8) do |data|
52
+ @data = data
53
+ puts "sreeix friends = #{data.flatten.size}"
54
+ end
55
+ twitter.user_friends('shufflr', 20) do |data|
56
+ @data = data
57
+ puts "shufflr friends = #{data.flatten.size}"
58
+ end
59
+ twitter.user_friends('markhneedham', 20) do |data|
60
+ @data = data
61
+ puts "markneedham = #{data.flatten.size}"
62
+ end
63
+ twitter.user_friends('WardCunningham', 10) do |data|
64
+ @data = data
65
+ puts "Wardcunningham friends #{data.flatten.size}"
66
+ EM.stop
67
+ end
68
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../../lib/em-twitter-client/twitter_client', __FILE__)
2
+ require 'eventmachine'
3
+ require 'em-http'
4
+ require 'em-http/middleware/oauth'
5
+ require 'em-http/middleware/json_response'
6
+ require 'em-synchrony/em-http'
7
+ require "em-synchrony"
8
+ require "em-synchrony/em-http"
9
+
10
+ oauth = {:consumer_key => 'tVcGxZZx9L2g7bFg2uiwGA',
11
+ :consumer_secret => 'Rxh9kk8lqPgQgX04kPNr5TSp2kxgIvIZSbEcMUpC1Hg',
12
+ :access_token => '237729849-imrgHKImaNXgSC9eThYGg0f0IMy9CkDCUhbyXwAU',
13
+ :access_token_secret => 'esWHYtuPnmnzMqAP6OC85SOOmUhUpbaLMoHFnO3vFuI'
14
+ }
15
+
16
+ EM.synchrony do
17
+ twitter = EM::TwitterClient.new(oauth)
18
+ twitter.search('tour de france', 4, :lang => 'fr' ) do |data|
19
+ puts data.inspect
20
+ EM.stop
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path('../../lib/em-twitter-client/twitter_client', __FILE__)
2
+ # require 'eventmachine'
3
+ # require 'em-http'
4
+ # require 'em-http/middleware/oauth'
5
+ # require 'em-http/middleware/json_response'
6
+ # require 'em-synchrony/em-http'
7
+ require 'eventmachine'
8
+ require 'em-http'
9
+ require 'em-http/middleware/oauth'
10
+ require 'em-http/middleware/json_response'
11
+ require 'em-synchrony/em-http'
12
+ require "em-synchrony"
13
+ require "em-synchrony/em-http"
14
+
15
+ oauth = {:consumer_key => 'YOUR KEY',
16
+ :consumer_secret => 'YOUR SECRED',
17
+ :access_token => 'TOKEN',
18
+ :access_token_secret => 'SECRET'
19
+ }
20
+
21
+ EM.synchrony do
22
+ twitter = EM::TwitterClient.new(oauth)
23
+ twitter.user_info('sreeix') do |data|
24
+ puts data.inspect
25
+ EM.stop
26
+ end
27
+ end
@@ -0,0 +1,111 @@
1
+ module EventMachine
2
+
3
+ ## Takes the following hash
4
+ ## {:consumer_key => '',
5
+ ## :consumer_secret => '',
6
+ ## :access_token => '',
7
+ ## :access_token_secret => ''
8
+ ## }
9
+
10
+ class TwitterClient
11
+ attr_accessor :errback
12
+
13
+ def initialize(oauth_config)
14
+ EventMachine::HttpRequest.use EventMachine::Middleware::JSONResponse
15
+ @host = {:api => 'http://api.twitter.com', :search => 'http://search.twitter.com'}
16
+ @oauth = oauth_config
17
+ @errback = Proc.new {|data| puts data.inspect}
18
+ end
19
+
20
+ def rate_limit(&blk)
21
+ http = connection("1/account/rate_limit_status.json").aget
22
+ http.callback do
23
+ @current_ratelimit = http.response
24
+ puts http.response.inspect
25
+ blk(@current_ratelimit) if block_given?
26
+ end
27
+ end
28
+
29
+ def user_info(user, &blk)
30
+ path = "1/users/show.json?screen_name=#{user.strip}"
31
+ http = connection(path).aget
32
+ http.callback { yield(http.response) if block_given?}
33
+ http.errback { @errback.call(http.response) }
34
+ self
35
+ end
36
+
37
+ def search( text, pages = 1 ,search_opts = {}, &blk)
38
+ multi = EventMachine::Synchrony::Multi.new
39
+ Array(1..pages).each do |page|
40
+ conn = connection("search.json?q=#{URI::escape(text)}&page=#{page}", :search)
41
+ multi.add(page, conn.aget)
42
+ puts "q=#{URI::escape(text)}&page=#{page}"
43
+ end
44
+
45
+ process_paged_responses multi.perform, blk
46
+ end
47
+
48
+ def user_friends(user, pages = 1, &blk)
49
+ multi = EventMachine::Synchrony::Multi.new
50
+ Array(1..pages).each do |page|
51
+ conn = connection("1/statuses/friends.json?screen_name=#{user}&page=#{page}")
52
+ multi.add(page, conn.aget)
53
+ puts "Adding 1/statuses/friends.json?screen_name=#{user}&page=#{page}"
54
+ end
55
+
56
+ process_paged_responses multi.perform, blk
57
+ self
58
+ end
59
+
60
+ def user_timeline(user, pages = 1, &blk)
61
+ multi = EventMachine::Synchrony::Multi.new
62
+ Array(1..pages).each do |page|
63
+ conn = connection("1/statuses/user_timeline.json?screen_name=#{user}&page=#{page}&count=200")
64
+ multi.add(page, conn.aget)
65
+ end
66
+ process_paged_responses multi.perform, blk
67
+ self
68
+ end
69
+
70
+ # these are private for the user. as in only available for that user.
71
+ def home_timeline(pages = 1, &blk)
72
+ multi = EventMachine::Synchrony::Multi.new
73
+ Array(1..pages).each do |page|
74
+ conn = connection("1/statuses/home_timeline.json?page=#{page}&count=200")
75
+ multi.add(page, conn.aget)
76
+ puts "Adding 1/statuses/home_timeline.json?page=#{page}"
77
+ end
78
+ process_paged_responses multi.perform, blk
79
+ self
80
+ end
81
+
82
+ def mentions(pages = 1, &blk)
83
+ multi = EventMachine::Synchrony::Multi.new
84
+ Array(1..pages).each do |page|
85
+ conn = connection("1/statuses/mentions.json?page=#{page}&count=200")
86
+ multi.add(page, conn.aget)
87
+ puts "Adding 1/statuses/mentions.json?page=#{page}"
88
+ end
89
+ process_paged_responses multi.perform, blk
90
+ self
91
+ end
92
+
93
+ private
94
+ def process_paged_responses(res, blk)
95
+ response = Array(res.responses[:callback]).sort{|a,b| a.first <=> b.first}.collect{|a,b| b.response}
96
+ blk.call(response)
97
+ errors = Array(res.responses[:errback]).sort{|a,b| a.first <=> b.first}.collect{|a,b| b.response}
98
+ puts res.responses[:errback].inspect
99
+ @errback.call(errors) unless errors.empty?
100
+ end
101
+
102
+ def connection(url, to=:api)
103
+ puts "#{@host[to]}/#{url}"
104
+ EventMachine::HttpRequest.new("#{@host[to]}/#{url}").tap {|c| c.use EventMachine::Middleware::OAuth, @oauth}
105
+ end
106
+ end
107
+ end
108
+
109
+
110
+
111
+
@@ -0,0 +1,23 @@
1
+ class TwitterUser
2
+
3
+ def initialize(user, oauth_config)
4
+ @user = user
5
+ @twitter = TwitterClient.new(oauth_config)
6
+ end
7
+
8
+ def info(&blk)
9
+ @twitter.info(@user, blk)
10
+ end
11
+
12
+ def mentions(page = 1, &blk)
13
+ @twitter.mentions(page, blk)
14
+ end
15
+
16
+ def timeline(page = 1, &blk)
17
+ @twitter.home_timeline(page, blk)
18
+ end
19
+
20
+ def user_timeline(page = 1, &blk)
21
+ @twitter.user_timeline(@user, page, blk)
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ module EM
2
+ class TwitterClient
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ require 'eventmachine'
2
+ require "em-synchrony"
3
+ require 'em-twitter-client/twitter_client'
@@ -0,0 +1,20 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ module EM
3
+ describe TwitterClient do
4
+ it "gets userinfo" do
5
+ credentials = {:consumer_key => 'LALA',
6
+ :consumer_secret => 'FOO',
7
+ :access_token => 'LALA',
8
+ :access_token_secret => 'LALA'
9
+ }
10
+ EM.run do
11
+ tc = EM::TwitterClient.new(credentials)
12
+ timeline = tc.user_timeline('sreeix')
13
+ timeline.callback do
14
+ timeline.size.should_not == 0
15
+ EM.stop
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ ROOT = File.expand_path("../..", __FILE__)
5
+ $LOAD_PATH.unshift(File.join(ROOT, "lib"))
6
+ require 'em/twitter_client'
7
+
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: em-twitter-client
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - V Sreekanth
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-07-13 00:00:00 +05:30
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: eventmachine
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 1.0.0.beta.3
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: yajl-ruby
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: "0"
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: addressable
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.2.3
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: em-synchrony
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: em-http-request
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - "="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.0.beta.4
69
+ type: :runtime
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ type: :development
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec-core
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ type: :development
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: rake
95
+ prerelease: false
96
+ requirement: &id008 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: "0"
102
+ type: :development
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
105
+ name: bundler
106
+ prerelease: false
107
+ requirement: &id009 !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: "0"
113
+ type: :development
114
+ version_requirements: *id009
115
+ description: Event Machined API to access twitter via rest
116
+ email:
117
+ - sreeix@gmail.com
118
+ executables:
119
+ - console
120
+ extensions: []
121
+
122
+ extra_rdoc_files: []
123
+
124
+ files:
125
+ - .gitignore
126
+ - .rvmrc
127
+ - Gemfile
128
+ - Gemfile.lock
129
+ - README.markdown
130
+ - Rakefile
131
+ - bin/console
132
+ - em-twitter-client.gemspec
133
+ - examples/everything_else.rb
134
+ - examples/search.rb
135
+ - examples/user_info.rb
136
+ - lib/em-twitter-client/twitter_client.rb
137
+ - lib/em-twitter-client/twitter_user.rb
138
+ - lib/em-twitter-client/version.rb
139
+ - lib/em_twitter_client.rb
140
+ - spec/lib/twitter_client_spec.rb
141
+ - spec/spec_helper.rb
142
+ has_rdoc: true
143
+ homepage:
144
+ licenses: []
145
+
146
+ post_install_message:
147
+ rdoc_options: []
148
+
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: "0"
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: "0"
163
+ requirements: []
164
+
165
+ rubyforge_project: em-twitter-client
166
+ rubygems_version: 1.6.2
167
+ signing_key:
168
+ specification_version: 3
169
+ summary: Event Machined API to access twitter via rest
170
+ test_files:
171
+ - spec/lib/twitter_client_spec.rb
172
+ - spec/spec_helper.rb