Commit 635b2a48ed59a97b6a49214f0f5ea46bac377545

Authored by Evandro Junior
1 parent 42ed698c

Using new twitter stream lib

lib/community_hub_plugin/hub.rb
1 -require File.dirname(__FILE__) + '/../../tweeter_stream/lib/twurl' 1 +require File.dirname(__FILE__) + '/../../twitter/stream.rb'
2 require File.dirname(__FILE__) + '/../../facebook_stream/lib_facebook_stream' 2 require File.dirname(__FILE__) + '/../../facebook_stream/lib_facebook_stream'
3 3
4 class CommunityHubPlugin::Hub < Folder 4 class CommunityHubPlugin::Hub < Folder
5 5
6 settings_items :proxy_url, :type => :string, :default => 'http://161.148.1.167:3128' # Remember to use add the port, in case needed. 6 settings_items :proxy_url, :type => :string, :default => 'http://161.148.1.167:3128' # Remember to use add the port, in case needed.
7 settings_items :twitter_enabled, :type => :boolean, :default => false 7 settings_items :twitter_enabled, :type => :boolean, :default => false
8 - settings_items :hashtags_twitter, :type => :string, :default => "participa.br,participabr,arenanetmundial,netmundial"  
9 - settings_items :twitter_token_file, :type => :string, :default => "twurlrc_mariajoseopinto" 8 + settings_items :twitter_hashtags, :type => :string, :default => "participa.br,participabr,arenanetmundial,netmundial"
  9 + settings_items :twitter_consumer_key, :type => :string, :default => ""
  10 + settings_items :twitter_consumer_secret, :type => :string, :default => ""
  11 + settings_items :twitter_access_token, :type => :string, :default => ""
  12 + settings_items :twitter_access_token_secret, :type => :string, :default => ""
10 settings_items :facebook_enabled, :type => :boolean, :default => false 13 settings_items :facebook_enabled, :type => :boolean, :default => false
11 settings_items :facebook_page_id, :type => :string, :default => "participabr" 14 settings_items :facebook_page_id, :type => :string, :default => "participabr"
12 settings_items :facebook_pooling_time, :type => :integer, :default => 5 # Time in seconds 15 settings_items :facebook_pooling_time, :type => :integer, :default => 5 # Time in seconds
lib/community_hub_plugin/listener.rb
@@ -5,8 +5,7 @@ class CommunityHubPlugin::Listener @@ -5,8 +5,7 @@ class CommunityHubPlugin::Listener
5 class << self 5 class << self
6 6
7 def twitter_service(hub) 7 def twitter_service(hub)
8 - hub.twitter_token_file ||= 'twurlrc'  
9 - Twurl::Stream.run(hub, nil, hub.hashtags_twitter, File.dirname(__FILE__) + '/../../tweeter_stream/config/' + hub.twitter_token_file, hub.proxy_url) 8 + listen_twitter_stream(hub, nil)
10 end 9 end
11 10
12 def facebook_service(hub) 11 def facebook_service(hub)
tweeter_stream/.gemtest
tweeter_stream/.gitignore
@@ -1,39 +0,0 @@ @@ -1,39 +0,0 @@
1 -*.gem  
2 -*.rbc  
3 -*.sw[a-p]  
4 -*.tmproj  
5 -*.tmproject  
6 -*.un~  
7 -*~  
8 -.Spotlight-V100  
9 -.Trashes  
10 -._*  
11 -.bundle  
12 -.config  
13 -.directory  
14 -.elc  
15 -.emacs.desktop  
16 -.emacs.desktop.lock  
17 -.redcar  
18 -.yardoc  
19 -Desktop.ini  
20 -Gemfile.lock  
21 -Icon?  
22 -InstalledFiles  
23 -Session.vim  
24 -\#*\#  
25 -_yardoc  
26 -auto-save-list  
27 -coverage  
28 -doc  
29 -lib/bundler/man  
30 -pkg  
31 -pkg/*  
32 -rdoc  
33 -spec/reports  
34 -test/tmp  
35 -test/version_tmp  
36 -tmp  
37 -tmtags  
38 -tramp  
39 -/nbproject/private/  
40 \ No newline at end of file 0 \ No newline at end of file
tweeter_stream/.travis.yml
@@ -1,15 +0,0 @@ @@ -1,15 +0,0 @@
1 -bundler_args: --without development  
2 -language: ruby  
3 -rvm:  
4 - - 1.8.7  
5 - - 1.9.2  
6 - - 1.9.3  
7 - - 2.0.0  
8 - - jruby-head  
9 - - rbx-2  
10 - - ruby-head  
11 -matrix:  
12 - allow_failures:  
13 - - rvm: jruby-head  
14 - - rvm: ruby-head  
15 - fast_finish: true  
tweeter_stream/COPYING
@@ -1,18 +0,0 @@ @@ -1,18 +0,0 @@
1 -# Copyright (c) 2009 Marcel Molina <marcel@twitter.com>, Twitter, Inc.  
2 -#  
3 -# Permission is hereby granted, free of charge, to any person obtaining a copy of  
4 -# this software and associated documentation files (the "Software"), to deal in the  
5 -# Software without restriction, including without limitation the rights to use,  
6 -# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the  
7 -# Software, and to permit persons to whom the Software is furnished to do so,  
8 -# subject to the following conditions:  
9 -#  
10 -# The above copyright notice and this permission notice shall be included in all  
11 -# copies or substantial portions of the Software.  
12 -#  
13 -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
14 -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS  
15 -# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR  
16 -# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN  
17 -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
18 -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
tweeter_stream/Gemfile
@@ -1,15 +0,0 @@ @@ -1,15 +0,0 @@
1 -source 'https://rubygems.org'  
2 -  
3 -gem 'jruby-openssl', :platforms => :jruby  
4 -gem 'rake'  
5 -gem 'json'  
6 -  
7 -group :test do  
8 - gem 'coveralls', :require => false  
9 - gem 'mime-types', '~> 1.25', :platforms => :ruby_18  
10 - gem 'minitest', '>= 5'  
11 - gem 'rr', '>= 1.1'  
12 - gem 'simplecov', :require => false  
13 -end  
14 -  
15 -gemspec  
tweeter_stream/Gemfile.lock
@@ -1,49 +0,0 @@ @@ -1,49 +0,0 @@
1 -PATH  
2 - remote: .  
3 - specs:  
4 - twurl (0.9.2)  
5 - oauth (~> 0.4)  
6 -  
7 -GEM  
8 - remote: https://rubygems.org/  
9 - specs:  
10 - coveralls (0.7.0)  
11 - multi_json (~> 1.3)  
12 - rest-client  
13 - simplecov (>= 0.7)  
14 - term-ansicolor  
15 - thor  
16 - docile (1.1.3)  
17 - json (1.8.1)  
18 - mime-types (1.25.1)  
19 - minitest (5.3.2)  
20 - multi_json (1.9.2)  
21 - oauth (0.4.7)  
22 - rake (10.2.2)  
23 - rest-client (1.6.7)  
24 - mime-types (>= 1.16)  
25 - rr (1.1.2)  
26 - simplecov (0.8.2)  
27 - docile (~> 1.1.0)  
28 - multi_json  
29 - simplecov-html (~> 0.8.0)  
30 - simplecov-html (0.8.0)  
31 - term-ansicolor (1.3.0)  
32 - tins (~> 1.0)  
33 - thor (0.19.1)  
34 - tins (1.1.0)  
35 -  
36 -PLATFORMS  
37 - ruby  
38 -  
39 -DEPENDENCIES  
40 - bundler (~> 1.0)  
41 - coveralls  
42 - jruby-openssl  
43 - json  
44 - mime-types (~> 1.25)  
45 - minitest (>= 5)  
46 - rake  
47 - rr (>= 1.1)  
48 - simplecov  
49 - twurl!  
tweeter_stream/INSTALL
@@ -1,18 +0,0 @@ @@ -1,18 +0,0 @@
1 -+-----------------------+  
2 -| Install with RubyGems |  
3 -+-----------------------+  
4 -  
5 - sudo gem i twurl --source http://rubygems.org  
6 -  
7 -+---------------------+  
8 -| Install from source |  
9 -+---------------------+  
10 -  
11 - rake dist:gem  
12 - sudo gem i pkg/twurl*gem  
13 -  
14 -+--------------+  
15 -| Dependencies |  
16 -+--------------+  
17 -  
18 - sudo gem i oauth  
tweeter_stream/README
@@ -1,119 +0,0 @@ @@ -1,119 +0,0 @@
1 -+-------+  
2 -| Twurl |  
3 -+-------+  
4 -  
5 -Twurl is like curl, but tailored specifically for the Twitter API.  
6 -It knows how to grant an access token to a client application for  
7 -a specified user and then sign all requests with that access token.  
8 -  
9 -It also provides other development and debugging conveniences such  
10 -as defining aliases for common requests, as well as support for  
11 -multiple access tokens to easily switch between different client  
12 -applications and Twitter accounts.  
13 -  
14 -+-----------------+  
15 -| Getting Started |  
16 -+-----------------+  
17 -  
18 -The first thing you have to do is register an OAuth application  
19 -to get a consumer key and secret.  
20 -  
21 - http://dev.twitter.com/apps/new  
22 -  
23 -When you have your consumer key and its secret you authorize  
24 -your Twitter account to make API requests with your consumer key  
25 -and secret.  
26 -  
27 - % twurl authorize --consumer-key key \  
28 - --consumer-secret secret  
29 -  
30 -This will return an URL that you should open up in your browser.  
31 -Authenticate to Twitter, and then enter the returned PIN back into  
32 -the terminal. Assuming all that works well, you will beauthorized  
33 -to make requests with the API. Twurl will tell you as much.  
34 -  
35 -If your consumer application has xAuth enabled, then you can use  
36 -a variant of the above  
37 -  
38 - % twurl authorize -u username -p password \  
39 - --consumer-key key \  
40 - --consumer-secret secret  
41 -  
42 -And, again assuming your username, password, key and secret is  
43 -correct, will authorize you in one step.  
44 -  
45 -+-----------------+  
46 -| Making Requests |  
47 -+-----------------+  
48 -  
49 -The simplest request just requires that you specify the path you  
50 -want to request.  
51 -  
52 - % twurl /1.1/statuses/home_timeline.json  
53 -  
54 -Similar to curl, a GET request is performed by default.  
55 -  
56 -You can implicitly perform a POST request by passing the -d option,  
57 -which specifies POST parameters.  
58 -  
59 - % twurl -d 'status=Testing twurl' /1.1/statuses/update.json  
60 -  
61 -You can explicitly specify what request method to perform with  
62 -the -X (or --request-method) option.  
63 -  
64 - % twurl -X POST /1.1/statuses/destroy/1234567890.json  
65 -  
66 -+------------------+  
67 -| Creating aliases |  
68 -+------------------+  
69 -  
70 - % twurl alias h /1.1/statuses/home_timeline.json  
71 -  
72 -You can then use "h" in place of the full path.  
73 -  
74 - % twurl h  
75 -  
76 -Paths that require additional options such as request parameters for example can  
77 -be used with aliases the same as with full explicit paths, just as you might  
78 -expect.  
79 -  
80 - % twurl alias tweet /1.1/statuses/update.json  
81 - % twurl tweet -d "status=Aliases in twurl are convenient"  
82 -  
83 -+-------------------------------+  
84 -| Changing your default profile |  
85 -+-------------------------------+  
86 -  
87 -The first time you authorize a client application to make requests on behalf of your account, twurl stores your access token information in its .twurlrc file. Subsequent requests will use this profile as the default profile. You can use the 'accounts' subcommand to see what client applications have been authorized for what user names:  
88 -  
89 - % twurl accounts  
90 - noradio  
91 - HQsAGcBm5MQT4n6j7qVJw  
92 - hhC7Koy2zRsTZvQh1hVlSA (default)  
93 - testiverse  
94 - guT9RsJbNQgVe6AwoY9BA  
95 -  
96 -Notice that one of those consumer keys is marked as the default. To change the default use the 'set' subcommand, passing then either just the username, if it's unambiguous, or the username and consumer key pair if it isn't unambiguous:  
97 -  
98 - % twurl set default testiverse  
99 - % twurl accounts  
100 - noradio  
101 - HQsAGcBm5MQT4n6j7qVJw  
102 - hhC7Koy2zRsTZvQh1hVlSA  
103 - testiverse  
104 - guT9RsJbNQgVe6AwoY9BA (default)  
105 -  
106 - % twurl set default noradio HQsAGcBm5MQT4n6j7qVJw  
107 - % twurl accounts  
108 - noradio  
109 - HQsAGcBm5MQT4n6j7qVJw (default)  
110 - hhC7Koy2zRsTZvQh1hVlSA  
111 - testiverse  
112 - guT9RsJbNQgVe6AwoY9BA  
113 -  
114 -+--------------+  
115 -| Contributors |  
116 -+--------------+  
117 -  
118 -Marcel Molina <marcel@twitter.com> / @noradio  
119 -Erik Michaels-Ober / @sferik  
tweeter_stream/Rakefile
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 -require 'rake/testtask'  
2 -require 'rubygems/package_task'  
3 -require 'bundler'  
4 -  
5 -task :default => :test  
6 -  
7 -Rake::TestTask.new do |test|  
8 - test.pattern = 'test/*_test.rb'  
9 - test.verbose = true  
10 -end  
11 -  
12 -Bundler::GemHelper.install_tasks  
tweeter_stream/config/twurlrc
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 ----  
2 -profiles:  
3 - evandro:  
4 - QkiWnQvutoV63ty0Afg:  
5 - token: 8601482-U3qvrGvZmKgm5HnTCskdYU2bAoMPzNpXcLtdVzhKQx  
6 - consumer_key: QkiWnQvutoV63ty0Afg  
7 - username: evandro  
8 - consumer_secret: kCLHpOG2p3073mYsxrTYyvwkOulYbtIcxpQkthJU  
9 - secret: eCzPWQOcUdcADRmFjqQTIXPbmieOxMpXDj7RUS6mVrPru  
10 -configuration:  
11 - default_profile:  
12 - - evandro  
13 - - QkiWnQvutoV63ty0Afg  
tweeter_stream/config/twurlrc_mariajoseopinto
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 ----  
2 -profiles:  
3 - MariaJoseOPinto:  
4 - c7dZNecaM2gF5Jx0bRHxocLmv:  
5 - token: 2450103578-CXZK39hmoZhLuGecQou9jympNl9uXG0vB9Xmuks  
6 - consumer_key: c7dZNecaM2gF5Jx0bRHxocLmv  
7 - username: MariaJoseOPinto  
8 - consumer_secret: uDIuSmCJaCgDMk1uuumaibzBQk4imlw4g9IdpVtC7Xo3Jj6mog  
9 - secret: HE7gKVgEl11PkGlKUtUwWj9XYwOFOf4DprhlZxOZ25GXl  
10 -configuration:  
11 - default_profile:  
12 - - MariaJoseOPinto  
13 - - c7dZNecaM2gF5Jx0bRHxocLmv  
tweeter_stream/lib/cli.rb
@@ -1,368 +0,0 @@ @@ -1,368 +0,0 @@
1 -module Twurl  
2 - class CLI  
3 - SUPPORTED_COMMANDS = %w(authorize accounts alias set)  
4 - DEFAULT_COMMAND = 'request'  
5 - PATH_PATTERN = /^\/\w+/  
6 - PROTOCOL_PATTERN = /^\w+:\/\//  
7 - README = File.dirname(__FILE__) + '/../../README'  
8 - @output ||= STDOUT  
9 - class NoPathFound < Exception  
10 - end  
11 -  
12 - class << self  
13 - attr_accessor :output  
14 -  
15 - def run(args)  
16 - begin  
17 - options = parse_options(args)  
18 - rescue NoPathFound => e  
19 - exit  
20 - end  
21 - dispatch(options)  
22 - end  
23 -  
24 - def dispatch(options)  
25 - client = OAuthClient.load_from_options(options)  
26 - controller = case options.command  
27 - when 'authorize'  
28 - AuthorizationController  
29 - when 'accounts'  
30 - AccountInformationController  
31 - when 'alias'  
32 - AliasesController  
33 - when 'set'  
34 - ConfigurationController  
35 - when 'request'  
36 - RequestController  
37 - end  
38 - controller.dispatch(client, options)  
39 - rescue Twurl::Exception => exception  
40 - abort(exception.message)  
41 - end  
42 -  
43 - def parse_options(args)  
44 - arguments = args.dup  
45 -  
46 - Twurl.options = Options.new  
47 - Twurl.options.trace = false  
48 - Twurl.options.data = {}  
49 - Twurl.options.headers = {}  
50 - Twurl.options.upload = {}  
51 - Twurl.options.upload['file'] = []  
52 -  
53 - option_parser = OptionParser.new do |o|  
54 - o.extend AvailableOptions  
55 -  
56 - o.banner = <<-BANNER  
57 -Usage: twurl authorize --consumer-key key --consumer-secret secret  
58 - twurl [options] /1.1/statuses/home_timeline.json  
59 -  
60 -Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}  
61 - BANNER  
62 -  
63 - o.section "Getting started:" do  
64 - tutorial  
65 - end  
66 -  
67 - o.section "Authorization options:" do  
68 - username  
69 - password  
70 - consumer_key  
71 - consumer_secret  
72 - access_token  
73 - token_secret  
74 - end  
75 -  
76 - o.section "Common options:" do  
77 - trace  
78 - data  
79 - headers  
80 - host  
81 - quiet  
82 - disable_ssl  
83 - request_method  
84 - help  
85 - version  
86 - proxy  
87 - file  
88 - filefield  
89 - base64  
90 - read_timeout  
91 - end  
92 - end  
93 -  
94 - arguments = option_parser.parse!(args)  
95 - Twurl.options.command = extract_command!(arguments)  
96 - Twurl.options.path = extract_path!(arguments)  
97 -  
98 - if Twurl.options.command == DEFAULT_COMMAND and Twurl.options.path.nil?  
99 - CLI.puts option_parser  
100 - raise NoPathFound, "No path found"  
101 - end  
102 -  
103 - Twurl.options.subcommands = arguments  
104 - Twurl.options  
105 - end  
106 -  
107 - def output  
108 - if Twurl.options && Twurl.options.output  
109 - Twurl.options.output  
110 - else  
111 - @output  
112 - end  
113 - end  
114 -  
115 - def print(*args, &block)  
116 - output.print(*args, &block)  
117 - output.flush if output.respond_to?(:flush)  
118 - end  
119 -  
120 - def puts(*args, &block)  
121 - output.puts(*args, &block)  
122 - output.flush if output.respond_to?(:flush)  
123 - end  
124 -  
125 - def prompt_for(label)  
126 - system "stty -echo"  
127 - CLI.print "#{label}: "  
128 - result = STDIN.gets.chomp  
129 - CLI.puts  
130 - result  
131 - rescue Interrupt  
132 - exit  
133 - ensure  
134 - system "stty echo"  
135 - end  
136 -  
137 - private  
138 - def extract_command!(arguments)  
139 - if SUPPORTED_COMMANDS.include?(arguments.first)  
140 - arguments.shift  
141 - else  
142 - DEFAULT_COMMAND  
143 - end  
144 - end  
145 -  
146 - def extract_path!(arguments)  
147 - path = nil  
148 - arguments.each_with_index do |argument, index|  
149 - if argument[PATH_PATTERN]  
150 - path_with_params = arguments.slice!(index)  
151 - path, params = path_with_params.split("?", 2)  
152 - if params  
153 - path += "?" + escape_params(params)  
154 - end  
155 - break  
156 - end  
157 - end  
158 - path  
159 - end  
160 -  
161 - def escape_params(params)  
162 - split_params = params.split("&").map do |param|  
163 - key, value = param.split('=', 2)  
164 - CGI::escape(key) + '=' + CGI::escape(value)  
165 - end  
166 - split_params.join("&")  
167 - end  
168 - end  
169 -  
170 - module AvailableOptions  
171 - def options  
172 - Twurl.options  
173 - end  
174 -  
175 - def section(heading, &block)  
176 - separator ""  
177 - separator heading  
178 -  
179 - instance_eval(&block)  
180 - end  
181 -  
182 - def tutorial  
183 - on('-T', '--tutorial', "Narrative overview of how to get started using Twurl") do  
184 - CLI.puts IO.read(README)  
185 - exit  
186 - end  
187 - end  
188 -  
189 - def consumer_key  
190 - on('-c', '--consumer-key [key]', "Your consumer key (required)") do |key|  
191 - options.consumer_key = key ? key : CLI.prompt_for('Consumer key')  
192 - end  
193 - end  
194 -  
195 - def consumer_secret  
196 - on('-s', '--consumer-secret [secret]', "Your consumer secret (required)") do |secret|  
197 - options.consumer_secret = secret ? secret : CLI.prompt_for('Consumer secret')  
198 - end  
199 - end  
200 -  
201 - def access_token  
202 - on('-a', '--access-token [token]', 'Your access token') do |token|  
203 - options.access_token = token  
204 - end  
205 - end  
206 -  
207 - def token_secret  
208 - on('-S', '--token-secret [secret]', "Your token secret") do |secret|  
209 - options.token_secret = secret  
210 - end  
211 - end  
212 -  
213 - def username  
214 - on('-u', '--username [username]', 'Username of account to authorize (required)') do |username|  
215 - options.username = username  
216 - end  
217 - end  
218 -  
219 - def password  
220 - on('-p', '--password [password]', 'Password of account to authorize (required)') do |password|  
221 - options.password = password ? password : CLI.prompt_for('Password')  
222 - end  
223 - end  
224 -  
225 - def trace  
226 - on('-t', '--[no-]trace', 'Trace request/response traffic (default: --no-trace)') do |trace|  
227 - options.trace = trace  
228 - end  
229 - end  
230 -  
231 - def data  
232 - on('-d', '--data [data]', 'Sends the specified data in a POST request to the HTTP server.') do |data|  
233 - data.split('&').each do |pair|  
234 - key, value = pair.split('=', 2)  
235 - options.data[key] = value  
236 - end  
237 - end  
238 - end  
239 -  
240 - def headers  
241 - on('-A', '--header [header]', 'Adds the specified header to the request to the HTTP server.') do |header|  
242 - key, value = header.split(': ')  
243 - options.headers[key] = value  
244 - end  
245 - end  
246 -  
247 - def host  
248 - on('-H', '--host [host]', 'Specify host to make requests to (default: api.twitter.com)') do |host|  
249 - if host[PROTOCOL_PATTERN]  
250 - protocol, protocolless_host = host.split(PROTOCOL_PATTERN, 2)  
251 - options.host = protocolless_host  
252 - else  
253 - options.host = host  
254 - end  
255 - end  
256 - end  
257 -  
258 - def quiet  
259 - on('-q', '--quiet', 'Suppress all output (default: output is printed to STDOUT)') do |quiet|  
260 - options.output = StringIO.new  
261 - end  
262 - end  
263 -  
264 - def disable_ssl  
265 - on('-U', '--no-ssl', 'Disable SSL (default: SSL is enabled)') do |use_ssl|  
266 - options.protocol = 'http'  
267 - end  
268 - end  
269 -  
270 - def request_method  
271 - on('-X', '--request-method [method]', 'Request method (default: GET)') do |request_method|  
272 - options.request_method = request_method.downcase  
273 - end  
274 - end  
275 -  
276 - def help  
277 - on_tail("-h", "--help", "Show this message") do  
278 - CLI.puts self  
279 - exit  
280 - end  
281 - end  
282 -  
283 - def version  
284 - on_tail("-v", "--version", "Show version") do  
285 - CLI.puts Version  
286 - exit  
287 - end  
288 - end  
289 -  
290 - def proxy  
291 - on('-P', '--proxy [proxy]', 'Specify HTTP proxy to forward requests to (default: No proxy)') do |proxy|  
292 - options.proxy = proxy  
293 - end  
294 - end  
295 -  
296 - def file  
297 - on('-f', '--file [path_to_file]', 'Specify the path to the file to upload') do |file|  
298 - if File.file?(file)  
299 - options.upload['file'] << file  
300 - else  
301 - CLI.puts "ERROR: File not found"  
302 - exit  
303 - end  
304 - end  
305 - end  
306 -  
307 - def filefield  
308 - on('-F', '--file-field [field_name]', 'Specify the POST parameter name for the file upload data (default: media)') do |filefield|  
309 - options.upload['filefield'] = filefield  
310 - end  
311 - end  
312 -  
313 - def base64  
314 - on('-b', '--base64', 'Encode the uploaded file as base64 (default: false)') do |base64|  
315 - options.upload['base64'] = base64  
316 - end  
317 - end  
318 -  
319 - def read_timeout  
320 - on('-y', '--read-timeout [read_timeout]', 'Http Read Timeout (default: Net::HTTP read_timeout)') do |read_timeout|  
321 - options.read_timeout = read_timeout.to_i  
322 - end  
323 - end  
324 - end  
325 - end  
326 -  
327 -  
328 - class Options < OpenStruct  
329 - DEFAULT_REQUEST_METHOD = 'get'  
330 - DEFAULT_HOST = 'api.twitter.com'  
331 - DEFAULT_PROTOCOL = 'https'  
332 -  
333 - def oauth_client_options  
334 - OAuthClient::OAUTH_CLIENT_OPTIONS.inject({}) do |options, option|  
335 - options[option] = send(option)  
336 - options  
337 - end  
338 - end  
339 -  
340 - def base_url  
341 - "#{protocol}://#{host}"  
342 - end  
343 -  
344 - def ssl?  
345 - protocol == 'https'  
346 - end  
347 -  
348 - def debug_output_io  
349 - super || STDERR  
350 - end  
351 -  
352 - def request_method  
353 - super || (data.empty? ? DEFAULT_REQUEST_METHOD : 'post')  
354 - end  
355 -  
356 - def protocol  
357 - super || DEFAULT_PROTOCOL  
358 - end  
359 -  
360 - def host  
361 - super || DEFAULT_HOST  
362 - end  
363 -  
364 - def proxy  
365 - super || nil  
366 - end  
367 - end  
368 -end  
tweeter_stream/lib/twurl.rb
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -require 'rubygems'  
2 -require 'oauth'  
3 -require 'optparse'  
4 -require 'ostruct'  
5 -require 'stringio'  
6 -require 'yaml'  
7 -  
8 -library_files = Dir[File.join(File.dirname(__FILE__), "/twurl/**/*.rb")].sort  
9 -library_files.each do |file|  
10 - require file  
11 -end  
12 -  
13 -module Twurl  
14 - @options ||= Options.new  
15 - class << self  
16 - attr_accessor :options  
17 - end  
18 -  
19 - class Exception < ::Exception  
20 - end  
21 -end  
tweeter_stream/lib/twurl/abstract_command_controller.rb
@@ -1,16 +0,0 @@ @@ -1,16 +0,0 @@
1 -module Twurl  
2 - # Subclasses need to implement a `dispatch' instance method.  
3 - class AbstractCommandController  
4 - attr_reader :client, :options  
5 - class << self  
6 - def dispatch(*args, &block)  
7 - new(*args, &block).dispatch  
8 - end  
9 - end  
10 -  
11 - def initialize(client, options)  
12 - @client = client  
13 - @options = options  
14 - end  
15 - end  
16 -end  
tweeter_stream/lib/twurl/oauth_client.rb
@@ -1,213 +0,0 @@ @@ -1,213 +0,0 @@
1 -module Twurl  
2 - class OAuthClient  
3 - class << self  
4 - def rcfile(reload = false)  
5 - if reload || @rcfile.nil?  
6 - @rcfile = RCFile.new  
7 - end  
8 - @rcfile  
9 - end  
10 -  
11 - def load_from_options(options)  
12 - if rcfile.has_oauth_profile_for_username_with_consumer_key?(options.username, options.consumer_key)  
13 - load_client_for_username_and_consumer_key(options.username, options.consumer_key)  
14 - elsif options.username || (options.command == 'authorize')  
15 - load_new_client_from_options(options)  
16 - else  
17 - load_default_client  
18 - end  
19 - end  
20 -  
21 - def load_client_for_username_and_consumer_key(username, consumer_key)  
22 - user_profiles = rcfile[username]  
23 - if user_profiles && attributes = user_profiles[consumer_key]  
24 - new(attributes)  
25 - else  
26 - raise Exception, "No profile for #{username}"  
27 - end  
28 - end  
29 -  
30 - def load_client_for_username(username)  
31 - if user_profiles = rcfile[username]  
32 - if user_profiles.values.size == 1  
33 - new(user_profiles.values.first)  
34 - else  
35 - raise Exception, "There is more than one consumer key associated with #{username}. Please specify which consumer key you want as well."  
36 - end  
37 - else  
38 - raise Exception, "No profile for #{username}"  
39 - end  
40 - end  
41 -  
42 - def load_new_client_from_options(options)  
43 - new(options.oauth_client_options.merge('password' => options.password, 'token' => options.access_token, 'secret' => options.token_secret))  
44 - end  
45 -  
46 - def load_default_client  
47 - raise Exception, "You must authorize first" unless rcfile.default_profile  
48 - load_client_for_username_and_consumer_key(*rcfile.default_profile)  
49 - end  
50 - end  
51 -  
52 - OAUTH_CLIENT_OPTIONS = %w[username consumer_key consumer_secret token secret]  
53 - attr_reader *OAUTH_CLIENT_OPTIONS  
54 - attr_reader :username, :password  
55 - def initialize(options = {})  
56 - @username = options['username']  
57 - @password = options['password']  
58 - @consumer_key = options['consumer_key']  
59 - @consumer_secret = options['consumer_secret']  
60 - @token = options['token']  
61 - @secret = options['secret']  
62 - configure_http!  
63 - end  
64 -  
65 - METHODS = {  
66 - :post => Net::HTTP::Post,  
67 - :get => Net::HTTP::Get,  
68 - :put => Net::HTTP::Put,  
69 - :delete => Net::HTTP::Delete,  
70 - :options => Net::HTTP::Options,  
71 - :head => Net::HTTP::Head,  
72 - :copy => Net::HTTP::Copy  
73 - }  
74 -  
75 - def perform_request_from_options(options, &block)  
76 - request_class = METHODS.fetch(options.request_method.to_sym)  
77 - request = request_class.new(options.path, options.headers)  
78 -  
79 - if options.upload && options.upload['file'].count > 0  
80 - boundary = "00Twurl" + rand(1000000000000000000).to_s + "lruwT99"  
81 - multipart_body = []  
82 - file_field = options.upload['filefield'] ? options.upload['filefield'] : 'media[]'  
83 -  
84 - options.data.each {|key, value|  
85 - multipart_body << "--#{boundary}\r\n"  
86 - multipart_body << "Content-Disposition: form-data; name=\"#{key}\"\r\n"  
87 - multipart_body << "\r\n"  
88 - multipart_body << value  
89 - multipart_body << "\r\n"  
90 - }  
91 -  
92 - options.upload['file'].each {|filename|  
93 - multipart_body << "--#{boundary}\r\n"  
94 - multipart_body << "Content-Disposition: form-data; name=\"#{file_field}\"; filename=\"#{File.basename(filename)}\"\r\n"  
95 - multipart_body << "Content-Type: application/octet-stream\r\n"  
96 - multipart_body << "Content-Transfer-Encoding: base64\r\n" if options.upload['base64']  
97 - multipart_body << "\r\n"  
98 -  
99 - if options.upload['base64']  
100 - enc = Base64.encode64(File.read(filename))  
101 - multipart_body << enc  
102 - else  
103 - multipart_body << File.read(filename)  
104 - end  
105 - }  
106 -  
107 - multipart_body << "\r\n--#{boundary}--\r\n"  
108 -  
109 - request.body = multipart_body.join  
110 - request['Content-Type'] = "multipart/form-data, boundary=\"#{boundary}\""  
111 - elsif options.data  
112 - request.set_form_data(options.data)  
113 - end  
114 -  
115 - request.oauth!(consumer.http, consumer, access_token)  
116 - consumer.http.read_timeout = options.read_timeout if options.read_timeout  
117 - consumer.http.request(request, &block)  
118 - end  
119 -  
120 - def exchange_credentials_for_access_token  
121 - response = begin  
122 - consumer.token_request(:post, consumer.access_token_path, nil, {}, client_auth_parameters)  
123 - rescue OAuth::Unauthorized  
124 - perform_pin_authorize_workflow  
125 - end  
126 - @token = response[:oauth_token]  
127 - @secret = response[:oauth_token_secret]  
128 - end  
129 -  
130 - def client_auth_parameters  
131 - {'x_auth_username' => username, 'x_auth_password' => password, 'x_auth_mode' => 'client_auth'}  
132 - end  
133 -  
134 - def perform_pin_authorize_workflow  
135 - @request_token = consumer.get_request_token  
136 - CLI.puts("Go to #{generate_authorize_url} and paste in the supplied PIN")  
137 - pin = gets  
138 - access_token = @request_token.get_access_token(:oauth_verifier => pin.chomp)  
139 - {:oauth_token => access_token.token, :oauth_token_secret => access_token.secret}  
140 - end  
141 -  
142 - def generate_authorize_url  
143 - request = consumer.create_signed_request(:get, consumer.authorize_path, @request_token, pin_auth_parameters)  
144 - params = request['Authorization'].sub(/^OAuth\s+/, '').split(/,\s+/).map { |p|  
145 - k, v = p.split('=')  
146 - v =~ /"(.*?)"/  
147 - "#{k}=#{CGI::escape($1)}"  
148 - }.join('&')  
149 - "#{Twurl.options.base_url}#{request.path}?#{params}"  
150 - end  
151 -  
152 - def pin_auth_parameters  
153 - {'oauth_callback' => 'oob'}  
154 - end  
155 -  
156 - def fetch_verify_credentials  
157 - access_token.get('/1.1/account/verify_credentials.json?include_entities=false&skip_status=true')  
158 - end  
159 -  
160 - def authorized?  
161 - oauth_response = fetch_verify_credentials  
162 - oauth_response.class == Net::HTTPOK  
163 - end  
164 -  
165 - def needs_to_authorize?  
166 - token.nil? || secret.nil?  
167 - end  
168 -  
169 - def save  
170 - verify_has_username  
171 - self.class.rcfile << self  
172 - end  
173 -  
174 - def verify_has_username  
175 - if username.nil? || username == ''  
176 - oauth_response = fetch_verify_credentials  
177 - oauth_response.body =~ /"screen_name"\s*:\s*"(.*?)"/  
178 - @username = $1  
179 - end  
180 - end  
181 -  
182 - def to_hash  
183 - OAUTH_CLIENT_OPTIONS.inject({}) do |hash, attribute|  
184 - if value = send(attribute)  
185 - hash[attribute] = value  
186 - end  
187 - hash  
188 - end  
189 - end  
190 -  
191 - def configure_http!  
192 - consumer.http.set_debug_output(Twurl.options.debug_output_io) if Twurl.options.trace  
193 - if Twurl.options.ssl?  
194 - consumer.http.use_ssl = true  
195 - consumer.http.verify_mode = OpenSSL::SSL::VERIFY_NONE  
196 - end  
197 - end  
198 -  
199 - def consumer  
200 - @consumer ||=  
201 - OAuth::Consumer.new(  
202 - consumer_key,  
203 - consumer_secret,  
204 - :site => Twurl.options.base_url,  
205 - :proxy => Twurl.options.proxy  
206 - )  
207 - end  
208 -  
209 - def access_token  
210 - @access_token ||= OAuth::AccessToken.new(consumer, token, secret)  
211 - end  
212 - end  
213 -end  
tweeter_stream/lib/twurl/rcfile.rb
@@ -1,103 +0,0 @@ @@ -1,103 +0,0 @@
1 -module Twurl  
2 - class RCFile  
3 -  
4 - class << self  
5 - def directory  
6 - @@directory ||= File.expand_path('~')  
7 - end  
8 -  
9 - def directory=(dir)  
10 - @@directory = dir  
11 - end  
12 -  
13 - def file_path  
14 - Stream.file_path  
15 - end  
16 -  
17 - def load  
18 - YAML.load_file(file_path)  
19 - rescue Errno::ENOENT  
20 - default_rcfile_structure  
21 - end  
22 -  
23 - def default_rcfile_structure  
24 - {'profiles' => {}, 'configuration' => {}}  
25 - end  
26 - end  
27 -  
28 - attr_reader :data  
29 - def initialize  
30 - @data = self.class.load  
31 - end  
32 -  
33 - def set_path(p)  
34 - puts "entro set path #{p}"  
35 - @@file_path = p  
36 - end  
37 -  
38 - def empty?  
39 - data == self.class.default_rcfile_structure  
40 - end  
41 -  
42 - def save  
43 - File.open(self.class.file_path, File::RDWR|File::CREAT|File::TRUNC, 0600) do |rcfile|  
44 - rcfile.write data.to_yaml  
45 - end  
46 - end  
47 -  
48 - def [](username)  
49 - profiles[username]  
50 - end  
51 -  
52 - def profiles  
53 - data['profiles']  
54 - end  
55 -  
56 - def default_profile  
57 - configuration['default_profile']  
58 - end  
59 -  
60 - def default_profile=(profile)  
61 - configuration['default_profile'] = [profile.username, profile.consumer_key]  
62 - end  
63 -  
64 - def configuration  
65 - data['configuration']  
66 - end  
67 -  
68 - def alias(name, path)  
69 - data['aliases'] ||= {}  
70 - data['aliases'][name] = path  
71 - save  
72 - end  
73 -  
74 - def aliases  
75 - data['aliases']  
76 - end  
77 -  
78 - def alias_from_options(options)  
79 - options.subcommands.each do |potential_alias|  
80 - if path = alias_from_name(potential_alias)  
81 - break path  
82 - end  
83 - end  
84 - end  
85 -  
86 - def alias_from_name(name)  
87 - aliases[name]  
88 - end  
89 -  
90 - def has_oauth_profile_for_username_with_consumer_key?(username, consumer_key)  
91 - user_profiles = self[username]  
92 - !user_profiles.nil? && !user_profiles[consumer_key].nil?  
93 - end  
94 -  
95 - def <<(oauth_client)  
96 - client_from_file = self[oauth_client.username] || {}  
97 - client_from_file[oauth_client.consumer_key] = oauth_client.to_hash  
98 - (profiles[oauth_client.username] ||= {}).update(client_from_file)  
99 - self.default_profile = oauth_client unless default_profile  
100 - save  
101 - end  
102 - end  
103 -end  
tweeter_stream/lib/twurl/request_controller.rb
@@ -1,62 +0,0 @@ @@ -1,62 +0,0 @@
1 -require "json"  
2 -require 'iconv'  
3 -  
4 -module Twurl  
5 - class RequestController < AbstractCommandController  
6 - NO_URI_MESSAGE = "No URI specified"  
7 -  
8 - def dispatch  
9 - if client.needs_to_authorize?  
10 - raise Exception, "You need to authorize first."  
11 - end  
12 - options.path ||= OAuthClient.rcfile.alias_from_options(options)  
13 - perform_request  
14 - end  
15 -  
16 - def perform_request  
17 - client.perform_request_from_options(options) { |response|  
18 - chunk_begining = ""  
19 - puts "Connecting to tweeter stream: " + response.inspect  
20 - if response.inspect.to_s.include?('HTTPClientError 420')  
21 - puts "<<<<<<Error connecting to tweeter stream, maybe need another token!!!!!>>>>>>"  
22 - return  
23 - end  
24 - response.read_body { |chunk|  
25 - chunk = chunk_begining + chunk  
26 - chunk_complete = false  
27 - unless chunk.blank?  
28 - begin  
29 - parsed = JSON.parse(chunk)  
30 - chunk_complete = true  
31 - chunk_begining = ""  
32 - rescue JSON::ParserError => e  
33 - chunk_begining = chunk  
34 - chunk_complete = false  
35 - end  
36 - begin  
37 - if chunk_complete  
38 - ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')  
39 - #Attention please, don't remove + ' ')[0..-2] it is used for UTF8 validation  
40 - comment_text = ic.iconv(parsed["text"] + ' ')[0..-2]  
41 - comment = Comment.new  
42 - comment.title = 'hub-message-twitter'  
43 - comment.source = options.page  
44 - comment.body = comment_text  
45 - comment.author_id = options.author_id  
46 - #Attention please, don't remove + ' ')[0..-2] it is used for UTF8 validation  
47 - comment.name = ic.iconv(parsed["user"]["name"] + ' ')[0..-2]  
48 - puts "@#{comment.name} " +_('said') + ": #{comment.body}"  
49 - comment.email = 'admin@localhost.local'  
50 - comment.save!  
51 - end  
52 - rescue => e  
53 - puts "Erro gravando comentário twitter #{e.inspect}"  
54 - end  
55 - end  
56 - }  
57 - }  
58 - rescue URI::InvalidURIError  
59 - Stream.puts NO_URI_MESSAGE  
60 - end  
61 - end  
62 -end  
63 \ No newline at end of file 0 \ No newline at end of file
tweeter_stream/lib/twurl/sample.json
@@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
1 -{  
2 - "name": "root"  
3 -}  
tweeter_stream/lib/twurl/stream.rb
@@ -1,156 +0,0 @@ @@ -1,156 +0,0 @@
1 -module Twurl  
2 - class Stream  
3 -  
4 - SUPPORTED_COMMANDS = %w(authorize accounts alias set)  
5 - DEFAULT_COMMAND = 'request'  
6 - PATH_PATTERN = /^\/\w+/  
7 - PROTOCOL_PATTERN = /^\w+:\/\//  
8 - README = File.dirname(__FILE__) + '/../../README'  
9 - @output ||= STDOUT  
10 - class NoPathFound < Exception  
11 - end  
12 -  
13 - class << self  
14 - attr_accessor :output  
15 - def run(page, author_id, tags, config_file_path, proxy=nil)  
16 - begin  
17 - @@file_path = config_file_path  
18 - Twurl.options = Options.new  
19 - Twurl.options.command = 'request' # Not necessary anymore  
20 - Twurl.options.data = {"track"=>tags}  
21 -# Twurl.options.proxy = 'http://161.148.1.167:3128' # Use for production mode at SERPRO  
22 - Twurl.options.proxy = proxy unless proxy.nil? or proxy == ''  
23 - Twurl.options.trace = false  
24 - Twurl.options.headers = {}  
25 - Twurl.options.subcommands=[]  
26 - Twurl.options.upload = {}  
27 - Twurl.options.upload['file'] = []  
28 - Twurl.options.path="/1.1/statuses/filter.json"  
29 - Twurl.options.host="stream.twitter.com"  
30 - Twurl.options.read_timeout= 0  
31 - Twurl.options.page = page  
32 - Twurl.options.author_id = author_id  
33 - rescue NoPathFound => e  
34 - exit  
35 - end  
36 - dispatch(Twurl.options)  
37 - end  
38 -  
39 - def file_path  
40 - @@file_path  
41 - end  
42 -  
43 - def dispatch(options)  
44 - client = OAuthClient.load_from_options(options)  
45 - controller = RequestController  
46 - controller.dispatch(client, options)  
47 - rescue Twurl::Exception => exception  
48 - abort(exception.message)  
49 - end  
50 -  
51 - def output  
52 - if Twurl.options && Twurl.options.output  
53 - Twurl.options.output  
54 - else  
55 - @output  
56 - end  
57 - end  
58 -  
59 - def print(*args, &block)  
60 - output.print(*args, &block)  
61 - output.flush if output.respond_to?(:flush)  
62 - end  
63 -  
64 - def puts(*args, &block)  
65 - output.puts(*args, &block)  
66 - output.flush if output.respond_to?(:flush)  
67 - end  
68 -  
69 - def prompt_for(label)  
70 - system "stty -echo"  
71 - CLI.print "#{label}: "  
72 - result = STDIN.gets.chomp  
73 - CLI.puts  
74 - result  
75 - rescue Interrupt  
76 - exit  
77 - ensure  
78 - system "stty echo"  
79 - end  
80 -  
81 - private  
82 - def extract_command!(arguments)  
83 - if SUPPORTED_COMMANDS.include?(arguments.first)  
84 - arguments.shift  
85 - else  
86 - DEFAULT_COMMAND  
87 - end  
88 - end  
89 -  
90 - def extract_path!(arguments)  
91 - path = nil  
92 - arguments.each_with_index do |argument, index|  
93 - if argument[PATH_PATTERN]  
94 - path_with_params = arguments.slice!(index)  
95 - path, params = path_with_params.split("?", 2)  
96 - if params  
97 - path += "?" + escape_params(params)  
98 - end  
99 - break  
100 - end  
101 - end  
102 - path  
103 - end  
104 -  
105 - def escape_params(params)  
106 - split_params = params.split("&").map do |param|  
107 - key, value = param.split('=', 2)  
108 - CGI::escape(key) + '=' + CGI::escape(value)  
109 - end  
110 - split_params.join("&")  
111 - end  
112 - end  
113 - end  
114 -  
115 -  
116 - class Options < OpenStruct  
117 - DEFAULT_REQUEST_METHOD = 'get'  
118 - DEFAULT_HOST = 'api.twitter.com'  
119 - DEFAULT_PROTOCOL = 'https'  
120 -  
121 - def oauth_client_options  
122 - OAuthClient::OAUTH_CLIENT_OPTIONS.inject({}) do |options, option|  
123 - options[option] = send(option)  
124 - options  
125 - end  
126 - end  
127 -  
128 - def base_url  
129 - "#{protocol}://#{host}"  
130 - end  
131 -  
132 - def ssl?  
133 - protocol == 'https'  
134 - end  
135 -  
136 - def debug_output_io  
137 - super || STDERR  
138 - end  
139 -  
140 - def request_method  
141 - super || (data.empty? ? DEFAULT_REQUEST_METHOD : 'post')  
142 - end  
143 -  
144 - def protocol  
145 - super || DEFAULT_PROTOCOL  
146 - end  
147 -  
148 - def host  
149 - super || DEFAULT_HOST  
150 - end  
151 -  
152 - def proxy  
153 - super || nil  
154 - end  
155 - end  
156 -end  
tweeter_stream/lib/twurl/version.rb
@@ -1,17 +0,0 @@ @@ -1,17 +0,0 @@
1 -module Twurl  
2 - class Version  
3 - MAJOR = 0 unless defined? Twurl::Version::MAJOR  
4 - MINOR = 9 unless defined? Twurl::Version::MINOR  
5 - PATCH = 2 unless defined? Twurl::Version::PATCH  
6 - BETA = nil unless defined? Twurl::Version::BETA # Time.now.to_i.to_s  
7 -  
8 - class << self  
9 - # @return [String]  
10 - def to_s  
11 - [MAJOR, MINOR, PATCH, BETA].compact.join('.')  
12 - end  
13 - end  
14 - end  
15 -  
16 - VERSION = Version.to_s  
17 -end  
tweeter_stream/noosfero.rb
@@ -1,6 +0,0 @@ @@ -1,6 +0,0 @@
1 -#!/usr/bin/env ruby  
2 -require 'rubygems' # if you use RubyGems  
3 -  
4 -require File.dirname(__FILE__) + '/lib/twurl'  
5 -  
6 -Twurl::Stream.run(Article.last, 1, '#nba', '/home/00838716598/participa/noosfero/plugins/community_hub/tweeter_stream/config/twurlrc')  
tweeter_stream/test/account_information_controller_test.rb
@@ -1,61 +0,0 @@ @@ -1,61 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::AccountInformationController::DispatchWithNoAuthorizedAccountsTest < Minitest::Test  
4 - attr_reader :options, :client, :controller  
5 - def setup  
6 - @options = Twurl::Options.new  
7 - @client = Twurl::OAuthClient.load_new_client_from_options(options)  
8 - @controller = Twurl::AccountInformationController.new(client, options)  
9 - mock(Twurl::OAuthClient.rcfile).empty? { true }  
10 - end  
11 -  
12 - def test_message_indicates_when_no_accounts_are_authorized  
13 - mock(Twurl::CLI).puts(Twurl::AccountInformationController::NO_AUTHORIZED_ACCOUNTS_MESSAGE).times(1)  
14 -  
15 - controller.dispatch  
16 - end  
17 -end  
18 -  
19 -class Twurl::AccountInformationController::DispatchWithOneAuthorizedAccountTest < Minitest::Test  
20 - attr_reader :options, :client, :controller  
21 - def setup  
22 - @options = Twurl::Options.test_exemplar  
23 - @client = Twurl::OAuthClient.load_new_client_from_options(options)  
24 - mock(Twurl::OAuthClient.rcfile).save.times(1)  
25 - Twurl::OAuthClient.rcfile << client  
26 - @controller = Twurl::AccountInformationController.new(client, options)  
27 - end  
28 -  
29 - def test_authorized_account_is_displayed_and_marked_as_the_default  
30 - mock(Twurl::CLI).puts(client.username).times(1).ordered  
31 - mock(Twurl::CLI).puts(" #{client.consumer_key} (default)").times(1).ordered  
32 -  
33 - controller.dispatch  
34 - end  
35 -end  
36 -  
37 -class Twurl::AccountInformationController::DispatchWithOneUsernameThatHasAuthorizedMultipleAccountsTest < Minitest::Test  
38 - attr_reader :default_client_options, :default_client, :other_client_options, :other_client, :controller  
39 - def setup  
40 - @default_client_options = Twurl::Options.test_exemplar  
41 - @default_client = Twurl::OAuthClient.load_new_client_from_options(default_client_options)  
42 -  
43 - @other_client_options = Twurl::Options.test_exemplar  
44 - other_client_options.consumer_key = default_client_options.consumer_key.reverse  
45 - @other_client = Twurl::OAuthClient.load_new_client_from_options(other_client_options)  
46 - mock(Twurl::OAuthClient.rcfile).save.times(2)  
47 -  
48 - Twurl::OAuthClient.rcfile << default_client  
49 - Twurl::OAuthClient.rcfile << other_client  
50 -  
51 - @controller = Twurl::AccountInformationController.new(other_client, other_client_options)  
52 - end  
53 -  
54 - def test_authorized_account_is_displayed_and_marked_as_the_default  
55 - mock(Twurl::CLI).puts(default_client.username).times(1)  
56 - mock(Twurl::CLI).puts(" #{default_client.consumer_key} (default)").times(1)  
57 - mock(Twurl::CLI).puts(" #{other_client.consumer_key}").times(1)  
58 -  
59 - controller.dispatch  
60 - end  
61 -end  
tweeter_stream/test/alias_controller_test.rb
@@ -1,53 +0,0 @@ @@ -1,53 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::AliasesController::DispatchTest < Minitest::Test  
4 - attr_reader :options, :client  
5 - def setup  
6 - @options = Twurl::Options.test_exemplar  
7 - @client = Twurl::OAuthClient.test_exemplar  
8 -  
9 - # Clean slate  
10 - if Twurl::OAuthClient.rcfile.aliases  
11 - Twurl::OAuthClient.rcfile.aliases.clear  
12 - end  
13 -  
14 - stub(Twurl::OAuthClient.rcfile).save  
15 - end  
16 -  
17 - def test_when_no_subcommands_are_provided_and_no_aliases_exist_nothing_is_displayed  
18 - assert options.subcommands.empty?  
19 - mock(Twurl::CLI).puts(Twurl::AliasesController::NO_ALIASES_MESSAGE).times(1)  
20 -  
21 - controller = Twurl::AliasesController.new(client, options)  
22 - controller.dispatch  
23 - end  
24 -  
25 - def test_when_no_subcommands_are_provided_and_aliases_exist_they_are_displayed  
26 - assert options.subcommands.empty?  
27 -  
28 - Twurl::OAuthClient.rcfile.alias('h', '/1.1/statuses/home_timeline.json')  
29 - mock(Twurl::CLI).puts("h: /1.1/statuses/home_timeline.json").times(1)  
30 -  
31 - controller = Twurl::AliasesController.new(client, options)  
32 - controller.dispatch  
33 - end  
34 -  
35 - def test_when_alias_and_value_are_provided_they_are_added  
36 - options.subcommands = ['h']  
37 - options.path = '/1.1/statuses/home_timeline.json'  
38 - mock(Twurl::OAuthClient.rcfile).alias('h', '/1.1/statuses/home_timeline.json').times(1)  
39 -  
40 - controller = Twurl::AliasesController.new(client, options)  
41 - controller.dispatch  
42 - end  
43 -  
44 - def test_when_no_path_is_provided_nothing_happens  
45 - options.subcommands = ['a']  
46 - assert_nil options.path  
47 -  
48 - mock(Twurl::CLI).puts(Twurl::AliasesController::NO_PATH_PROVIDED_MESSAGE).times(1)  
49 -  
50 - controller = Twurl::AliasesController.new(client, options)  
51 - controller.dispatch  
52 - end  
53 -end  
tweeter_stream/test/authorization_controller_test.rb
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::AuthorizationController::DispatchTest < Minitest::Test  
4 - attr_reader :options, :client, :controller  
5 - def setup  
6 - @options = Twurl::Options.new  
7 - @client = Twurl::OAuthClient.load_new_client_from_options(options)  
8 - @controller = Twurl::AuthorizationController.new(client, options)  
9 - end  
10 -  
11 - def test_successful_authentication_saves_retrieved_access_token  
12 - mock(client).exchange_credentials_for_access_token.times(1)  
13 - mock(client).save.times(1)  
14 - mock(controller).raise(Twurl::Exception, Twurl::AuthorizationController::AUTHORIZATION_FAILED_MESSAGE).never  
15 - mock(Twurl::CLI).puts(Twurl::AuthorizationController::AUTHORIZATION_SUCCEEDED_MESSAGE).times(1)  
16 -  
17 - controller.dispatch  
18 - end  
19 -  
20 - module ErrorCases  
21 - def test_failed_authorization_does_not_save_client  
22 - mock(client).exchange_credentials_for_access_token { raise OAuth::Unauthorized }  
23 - mock(client).save.never  
24 - mock(controller).raise(Twurl::Exception, Twurl::AuthorizationController::AUTHORIZATION_FAILED_MESSAGE).times(1)  
25 -  
26 - controller.dispatch  
27 - end  
28 - end  
29 - include ErrorCases  
30 -end  
tweeter_stream/test/cli_options_test.rb
@@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::Options::Test < Minitest::Test  
4 - attr_reader :options  
5 - def setup  
6 - @options = Twurl::Options.new  
7 - end  
8 -  
9 - def test_base_url_is_built_from_protocol_and_host  
10 - options.protocol = 'http'  
11 - options.host = 'api.twitter.com'  
12 -  
13 - assert_equal 'http://api.twitter.com', options.base_url  
14 - end  
15 -  
16 - def test_ssl_is_enabled_if_the_protocol_is_https  
17 - options.protocol = 'http'  
18 - assert !options.ssl?  
19 -  
20 - options.protocol = 'https'  
21 - assert options.ssl?  
22 - end  
23 -end  
tweeter_stream/test/cli_test.rb
@@ -1,192 +0,0 @@ @@ -1,192 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::CLI::OptionParsingTest < Minitest::Test  
4 - TEST_PATH = '/1.1/url/does/not/matter.json'  
5 -  
6 - module CommandParsingTests  
7 - def test_no_command_specified_falls_to_default_command  
8 - options = Twurl::CLI.parse_options([TEST_PATH])  
9 - assert_equal Twurl::CLI::DEFAULT_COMMAND, options.command  
10 - end  
11 -  
12 - def test_supported_command_specified_extracts_the_command  
13 - expected_command = Twurl::CLI::SUPPORTED_COMMANDS.first  
14 - options = Twurl::CLI.parse_options([expected_command])  
15 - assert_equal expected_command, options.command  
16 - end  
17 -  
18 - def test_unsupported_command_specified_sets_default_command  
19 - unsupported_command = 'unsupported'  
20 - options = Twurl::CLI.parse_options([TEST_PATH, unsupported_command])  
21 - assert_equal Twurl::CLI::DEFAULT_COMMAND, options.command  
22 - end  
23 - end  
24 - include CommandParsingTests  
25 -  
26 - module PathParsingTests  
27 - def test_missing_path_throws_no_path_found  
28 - stub(Twurl::CLI).puts  
29 - assert_raises Twurl::CLI::NoPathFound do  
30 - Twurl::CLI.parse_options([])  
31 - end  
32 - end  
33 -  
34 - def test_uri_params_are_encoded  
35 - options = Twurl::CLI.parse_options(["/1.1/url?baz=bamf:rofl"])  
36 - assert_equal options.path, "/1.1/url?baz=bamf%3Arofl"  
37 - end  
38 - end  
39 - include PathParsingTests  
40 -  
41 - module RequestMethodParsingTests  
42 - def test_request_method_is_default_if_unspecified  
43 - options = Twurl::CLI.parse_options([TEST_PATH])  
44 - assert_equal Twurl::Options::DEFAULT_REQUEST_METHOD, options.request_method  
45 - end  
46 -  
47 - def test_specifying_a_request_method_extracts_and_normalizes_request_method  
48 - variations = [%w[-X put], %w[-X PUT], %w[--request-method PUT], %w[--request-method put]]  
49 - variations.each do |option_variation|  
50 - order_variant_1 = [option_variation, TEST_PATH].flatten  
51 - order_variant_2 = [TEST_PATH, option_variation].flatten  
52 - [order_variant_1, order_variant_2].each do |args|  
53 - options = Twurl::CLI.parse_options(args)  
54 - assert_equal 'put', options.request_method  
55 - end  
56 - end  
57 - end  
58 -  
59 - def test_specifying_unsupported_request_method_returns_an_error  
60 - Twurl::CLI.parse_options([TEST_PATH, '-X', 'UNSUPPORTED'])  
61 - end  
62 - end  
63 - include RequestMethodParsingTests  
64 -  
65 - module OAuthClientOptionParsingTests  
66 - def test_extracting_the_consumer_key  
67 - mock(Twurl::CLI).prompt_for('Consumer key').never  
68 -  
69 - options = Twurl::CLI.parse_options([TEST_PATH, '-c', 'the-key'])  
70 - assert_equal 'the-key', options.consumer_key  
71 - end  
72 -  
73 - def test_consumer_key_option_with_no_value_prompts_user_for_value  
74 - mock(Twurl::CLI).prompt_for('Consumer key').times(1) { 'inputted-key'}  
75 - options = Twurl::CLI.parse_options([TEST_PATH, '-c'])  
76 - assert_equal 'inputted-key', options.consumer_key  
77 - end  
78 - end  
79 - include OAuthClientOptionParsingTests  
80 -  
81 - module DataParsingTests  
82 - def test_extracting_a_single_key_value_pair  
83 - options = Twurl::CLI.parse_options([TEST_PATH, '-d', 'key=value'])  
84 - assert_equal({'key' => 'value'}, options.data)  
85 -  
86 - options = Twurl::CLI.parse_options([TEST_PATH, '--data', 'key=value'])  
87 - assert_equal({'key' => 'value'}, options.data)  
88 - end  
89 -  
90 - def test_passing_data_and_no_explicit_request_method_defaults_request_method_to_post  
91 - options = Twurl::CLI.parse_options([TEST_PATH, '-d', 'key=value'])  
92 - assert_equal 'post', options.request_method  
93 - end  
94 -  
95 - def test_passing_data_and_an_explicit_request_method_uses_the_specified_method  
96 - options = Twurl::CLI.parse_options([TEST_PATH, '-d', 'key=value', '-X', 'DELETE'])  
97 - assert_equal({'key' => 'value'}, options.data)  
98 - assert_equal 'delete', options.request_method  
99 - end  
100 -  
101 - def test_multiple_pairs_when_option_is_specified_multiple_times_on_command_line_collects_all  
102 - options = Twurl::CLI.parse_options([TEST_PATH, '-d', 'key=value', '-d', 'another=pair'])  
103 - assert_equal({'key' => 'value', 'another' => 'pair'}, options.data)  
104 - end  
105 -  
106 - def test_multiple_pairs_separated_by_ampersand_are_all_captured  
107 - options = Twurl::CLI.parse_options([TEST_PATH, '-d', 'key=value&another=pair'])  
108 - assert_equal({'key' => 'value', 'another' => 'pair'}, options.data)  
109 - end  
110 -  
111 - def test_extracting_an_empty_key_value_pair  
112 - options = Twurl::CLI.parse_options([TEST_PATH, '-d', 'key='])  
113 - assert_equal({'key' => ''}, options.data)  
114 -  
115 - options = Twurl::CLI.parse_options([TEST_PATH, '--data', 'key='])  
116 - assert_equal({'key' => ''}, options.data)  
117 - end  
118 - end  
119 - include DataParsingTests  
120 -  
121 - module HeaderParsingTests  
122 - def test_extracting_a_single_header  
123 - options = Twurl::CLI.parse_options([TEST_PATH, '-A', 'Key: Value'])  
124 - assert_equal({'Key' => 'Value'}, options.headers)  
125 -  
126 - options = Twurl::CLI.parse_options([TEST_PATH, '--header', 'Key: Value'])  
127 - assert_equal({'Key' => 'Value'}, options.headers)  
128 - end  
129 -  
130 - def test_multiple_headers_when_option_is_specified_multiple_times_on_command_line_collects_all  
131 - options = Twurl::CLI.parse_options([TEST_PATH, '-A', 'Key: Value', '-A', 'Another: Pair'])  
132 - assert_equal({'Key' => 'Value', 'Another' => 'Pair'}, options.headers)  
133 - end  
134 - end  
135 - include HeaderParsingTests  
136 -  
137 - module SSLDisablingTests  
138 - def test_ssl_is_on_by_default  
139 - options = Twurl::CLI.parse_options([TEST_PATH])  
140 - assert options.ssl?  
141 - end  
142 -  
143 - def test_passing_no_ssl_option_disables_ssl  
144 - ['-U', '--no-ssl'].each do |switch|  
145 - options = Twurl::CLI.parse_options([TEST_PATH, switch])  
146 - assert !options.ssl?  
147 - end  
148 - end  
149 - end  
150 - include SSLDisablingTests  
151 -  
152 - module HostOptionTests  
153 - def test_not_specifying_host_sets_it_to_the_default  
154 - options = Twurl::CLI.parse_options([TEST_PATH])  
155 - assert_equal Twurl::Options::DEFAULT_HOST, options.host  
156 - end  
157 -  
158 - def test_setting_host_updates_to_requested_value  
159 - custom_host = 'localhost:3000'  
160 - assert Twurl::Options::DEFAULT_HOST != custom_host  
161 -  
162 - [[TEST_PATH, '-H', custom_host], [TEST_PATH, '--host', custom_host]].each do |option_combination|  
163 - options = Twurl::CLI.parse_options(option_combination)  
164 - assert_equal custom_host, options.host  
165 - end  
166 - end  
167 -  
168 - def test_protocol_is_stripped_from_host  
169 - custom_host = 'localhost:3000'  
170 - options = Twurl::CLI.parse_options([TEST_PATH, '-H', "https://"+custom_host])  
171 - assert_equal custom_host, options.host  
172 - end  
173 - end  
174 - include HostOptionTests  
175 -  
176 - module ProxyOptionTests  
177 - def test_not_specifying_proxy_sets_it_to_nil  
178 - options = Twurl::CLI.parse_options([TEST_PATH])  
179 - assert_equal nil, options.proxy  
180 - end  
181 -  
182 - def test_setting_proxy_updates_to_requested_value  
183 - custom_proxy = 'localhost:80'  
184 -  
185 - [[TEST_PATH, '-P', custom_proxy], [TEST_PATH, '--proxy', custom_proxy]].each do |option_combination|  
186 - options = Twurl::CLI.parse_options(option_combination)  
187 - assert_equal custom_proxy, options.proxy  
188 - end  
189 - end  
190 - end  
191 - include ProxyOptionTests  
192 -end  
tweeter_stream/test/configuration_controller_test.rb
@@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::ConfigurationController::DispatchTest < Minitest::Test  
4 - def test_error_message_is_displayed_if_setting_is_unrecognized  
5 - options = Twurl::Options.test_exemplar  
6 - client = Twurl::OAuthClient.test_exemplar  
7 -  
8 - options.subcommands = ['unrecognized', 'value']  
9 -  
10 - mock(Twurl::CLI).puts(Twurl::ConfigurationController::UNRECOGNIZED_SETTING_MESSAGE % 'unrecognized').times(1)  
11 - mock(Twurl::OAuthClient.rcfile).save.times(0)  
12 -  
13 - controller = Twurl::ConfigurationController.new(client, options)  
14 - controller.dispatch  
15 - end  
16 -end  
17 -  
18 -class Twurl::ConfigurationController::DispatchDefaultSettingTest < Minitest::Test  
19 - def test_setting_default_profile_just_by_username  
20 - options = Twurl::Options.test_exemplar  
21 - client = Twurl::OAuthClient.test_exemplar  
22 -  
23 - options.subcommands = ['default', client.username]  
24 - mock(Twurl::OAuthClient).load_client_for_username(client.username).times(1) { client }  
25 - mock(Twurl::OAuthClient.rcfile).default_profile = client  
26 - mock(Twurl::OAuthClient.rcfile).save.times(1)  
27 -  
28 - controller = Twurl::ConfigurationController.new(client, options)  
29 - controller.dispatch  
30 - end  
31 -  
32 - def test_setting_default_profile_by_username_and_consumer_key  
33 - options = Twurl::Options.test_exemplar  
34 - client = Twurl::OAuthClient.test_exemplar  
35 -  
36 - options.subcommands = ['default', client.username, client.consumer_key]  
37 - mock(Twurl::OAuthClient).load_client_for_username_and_consumer_key(client.username, client.consumer_key).times(1) { client }  
38 - mock(Twurl::OAuthClient.rcfile).default_profile = client  
39 - mock(Twurl::OAuthClient.rcfile).save.times(1)  
40 -  
41 - controller = Twurl::ConfigurationController.new(client, options)  
42 - controller.dispatch  
43 - end  
44 -end  
tweeter_stream/test/oauth_client_test.rb
@@ -1,165 +0,0 @@ @@ -1,165 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::OAuthClient::AbstractOAuthClientTest < Minitest::Test  
4 - attr_reader :client, :options  
5 - def setup  
6 - Twurl::OAuthClient.instance_variable_set(:@rcfile, nil)  
7 -  
8 - @options = Twurl::Options.test_exemplar  
9 - @client = Twurl::OAuthClient.test_exemplar  
10 - options.base_url = 'api.twitter.com'  
11 - options.request_method = 'get'  
12 - options.path = '/path/does/not/matter.json'  
13 - options.data = {}  
14 - options.headers = {}  
15 -  
16 - Twurl.options = options  
17 - end  
18 -  
19 - def teardown  
20 - super  
21 - Twurl.options = Twurl::Options.new  
22 - # Make sure we don't do any disk IO in these tests  
23 - assert !File.exists?(Twurl::RCFile.file_path)  
24 - end  
25 -  
26 - def test_nothing  
27 - # Appeasing test/unit  
28 - end  
29 -end  
30 -  
31 -class Twurl::OAuthClient::BasicRCFileLoadingTest < Twurl::OAuthClient::AbstractOAuthClientTest  
32 - def test_rcfile_is_memoized  
33 - mock.proxy(Twurl::RCFile).new.times(1)  
34 -  
35 - Twurl::OAuthClient.rcfile  
36 - Twurl::OAuthClient.rcfile  
37 - end  
38 -  
39 - def test_forced_reloading  
40 - mock.proxy(Twurl::RCFile).new.times(2)  
41 -  
42 - Twurl::OAuthClient.rcfile  
43 - Twurl::OAuthClient.rcfile(:reload)  
44 - Twurl::OAuthClient.rcfile  
45 - end  
46 -end  
47 -  
48 -class Twurl::OAuthClient::ClientLoadingFromOptionsTest < Twurl::OAuthClient::AbstractOAuthClientTest  
49 - def test_if_username_is_supplied_and_no_profile_exists_for_username_then_new_client_is_created  
50 - mock(Twurl::OAuthClient).load_client_for_username(options.username).never  
51 - mock(Twurl::OAuthClient).load_new_client_from_options(options).times(1)  
52 - mock(Twurl::OAuthClient).load_default_client.never  
53 -  
54 - Twurl::OAuthClient.load_from_options(options)  
55 - end  
56 -  
57 - def test_if_username_is_supplied_and_profile_exists_for_username_then_client_is_loaded  
58 - mock(Twurl::OAuthClient.rcfile).save.times(1)  
59 - Twurl::OAuthClient.rcfile << client  
60 -  
61 - mock(Twurl::OAuthClient).load_client_for_username_and_consumer_key(options.username, options.consumer_key).times(1)  
62 - mock(Twurl::OAuthClient).load_new_client_from_options(options).never  
63 - mock(Twurl::OAuthClient).load_default_client.never  
64 -  
65 - Twurl::OAuthClient.load_from_options(options)  
66 - end  
67 -  
68 - def test_if_username_is_not_provided_then_the_default_client_is_loaded  
69 - options.username = nil  
70 -  
71 - mock(Twurl::OAuthClient).load_client_for_username(options.username).never  
72 - mock(Twurl::OAuthClient).load_new_client_from_options(options).never  
73 - mock(Twurl::OAuthClient).load_default_client.times(1)  
74 -  
75 - Twurl::OAuthClient.load_from_options(options)  
76 - end  
77 -end  
78 -  
79 -class Twurl::OAuthClient::ClientLoadingForUsernameTest < Twurl::OAuthClient::AbstractOAuthClientTest  
80 - def test_attempting_to_load_a_username_that_is_not_in_the_file_fails  
81 - assert_nil Twurl::OAuthClient.rcfile[client.username]  
82 -  
83 - assert_raises Twurl::Exception do  
84 - Twurl::OAuthClient.load_client_for_username_and_consumer_key(client.username, client.consumer_key)  
85 - end  
86 - end  
87 -  
88 - def test_loading_a_username_that_exists  
89 - mock(Twurl::OAuthClient.rcfile).save.times(1)  
90 -  
91 - Twurl::OAuthClient.rcfile << client  
92 -  
93 - client_from_file = Twurl::OAuthClient.load_client_for_username_and_consumer_key(client.username, client.consumer_key)  
94 - assert_equal client.to_hash, client_from_file.to_hash  
95 - end  
96 -end  
97 -  
98 -class Twurl::OAuthClient::DefaultClientLoadingTest < Twurl::OAuthClient::AbstractOAuthClientTest  
99 - def test_loading_default_client_when_there_is_none_fails  
100 - assert_nil Twurl::OAuthClient.rcfile.default_profile  
101 -  
102 - assert_raises Twurl::Exception do  
103 - Twurl::OAuthClient.load_default_client  
104 - end  
105 - end  
106 -  
107 - def test_loading_default_client_from_file  
108 - mock(Twurl::OAuthClient.rcfile).save.times(1)  
109 -  
110 - Twurl::OAuthClient.rcfile << client  
111 - assert_equal [client.username, client.consumer_key], Twurl::OAuthClient.rcfile.default_profile  
112 -  
113 - client_from_file = Twurl::OAuthClient.load_default_client  
114 -  
115 - assert_equal client.to_hash, client_from_file.to_hash  
116 - end  
117 -end  
118 -  
119 -class Twurl::OAuthClient::NewClientLoadingFromOptionsTest < Twurl::OAuthClient::AbstractOAuthClientTest  
120 - attr_reader :new_client  
121 - def setup  
122 - super  
123 - @new_client = Twurl::OAuthClient.load_new_client_from_options(options)  
124 - end  
125 -  
126 - def test_password_is_included  
127 - assert_equal options.password, new_client.password  
128 - end  
129 -  
130 - def test_oauth_options_are_passed_through  
131 - assert_equal client.to_hash, new_client.to_hash  
132 - end  
133 -end  
134 -  
135 -class Twurl::OAuthClient::PerformingRequestsFromOptionsTest < Twurl::OAuthClient::AbstractOAuthClientTest  
136 - def test_request_is_made_using_request_method_and_path_and_data_in_options  
137 - client = Twurl::OAuthClient.test_exemplar  
138 - mock(client.consumer.http).request(satisfy { |req|  
139 - req.is_a?(Net::HTTP::Get) && (req.path == options.path)  
140 - })  
141 -  
142 - client.perform_request_from_options(options)  
143 - end  
144 -end  
145 -  
146 -class Twurl::OAuthClient::CredentialsForAccessTokenExchangeTest < Twurl::OAuthClient::AbstractOAuthClientTest  
147 - def test_successful_exchange_parses_token_and_secret_from_response_body  
148 - parsed_response = {:oauth_token => "123456789",  
149 - :oauth_token_secret => "abcdefghi",  
150 - :user_id => "3191321",  
151 - :screen_name => "noradio",  
152 - :x_auth_expires => "0"}  
153 -  
154 - mock(client.consumer).  
155 - token_request(:post,  
156 - client.consumer.access_token_path,  
157 - nil,  
158 - {},  
159 - client.client_auth_parameters) { parsed_response }  
160 -  
161 - assert client.needs_to_authorize?  
162 - client.exchange_credentials_for_access_token  
163 - assert !client.needs_to_authorize?  
164 - end  
165 -end  
tweeter_stream/test/rcfile_test.rb
@@ -1,147 +0,0 @@ @@ -1,147 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::RCFile::PathConstructionTest < Minitest::Test  
4 - def test_file_path_appends_file_to_directory  
5 - assert_equal File.join(Twurl::RCFile.directory, Twurl::RCFile::FILE), Twurl::RCFile.file_path  
6 - end  
7 -end  
8 -  
9 -class Twurl::RCFile::LoadingTest < Minitest::Test  
10 - def test_load_parses_and_loads_file_if_it_exists  
11 - mock(YAML).load_file(Twurl::RCFile.file_path).times(1)  
12 - mock(Twurl::RCFile).default_rcfile_structure.never  
13 -  
14 - Twurl::RCFile.load  
15 - end  
16 -  
17 - def test_load_returns_default_file_structure_if_file_does_not_exist  
18 - mock(YAML).load_file(Twurl::RCFile.file_path) { raise Errno::ENOENT }.times(1)  
19 - mock(Twurl::RCFile).default_rcfile_structure.times(1)  
20 -  
21 - Twurl::RCFile.load  
22 - end  
23 -end  
24 -  
25 -class Twurl::RCFile::InitializationTest < Minitest::Test  
26 - def test_initializing_when_the_file_does_not_exist_loads_default_rcfile_structure  
27 - mock(YAML).load_file(Twurl::RCFile.file_path) { raise Errno::ENOENT }.times(1)  
28 -  
29 - rcfile = Twurl::RCFile.new  
30 - assert_equal Twurl::RCFile.default_rcfile_structure, rcfile.data  
31 - end  
32 -  
33 - def test_initializing_when_the_file_does_exists_loads_content_of_file  
34 - mock_content_of_rcfile = {'this data' => 'does not matter'}  
35 - mock(YAML).load_file(Twurl::RCFile.file_path) { mock_content_of_rcfile }.times(1)  
36 - mock(Twurl::RCFile).default_rcfile_structure.never  
37 -  
38 - rcfile = Twurl::RCFile.new  
39 - assert_equal mock_content_of_rcfile, rcfile.data  
40 - end  
41 -end  
42 -  
43 -class Twurl::RCFile::DefaultProfileFromDefaultRCFileTest < Minitest::Test  
44 - attr_reader :rcfile  
45 - def setup  
46 - mock(YAML).load_file(Twurl::RCFile.file_path) { raise Errno::ENOENT }.times(1)  
47 - mock.proxy(Twurl::RCFile).default_rcfile_structure.times(any_times)  
48 -  
49 - @rcfile = Twurl::RCFile.new  
50 - end  
51 -  
52 - def test_default_rcfile_structure_has_no_default_profile  
53 - assert_nil rcfile.default_profile  
54 - end  
55 -  
56 - def test_rcfile_is_considered_empty_at_first  
57 - assert rcfile.empty?  
58 - end  
59 -  
60 - def test_setting_default_profile  
61 - options = Twurl::Options.test_exemplar  
62 -  
63 - client = Twurl::OAuthClient.load_new_client_from_options(options)  
64 - rcfile.default_profile = client  
65 - assert_equal [options.username, options.consumer_key], rcfile.default_profile  
66 - end  
67 -end  
68 -  
69 -class Twurl::RCFile::UpdatingTest < Minitest::Test  
70 - attr_reader :rcfile  
71 - def setup  
72 - mock(YAML).load_file(Twurl::RCFile.file_path) { raise Errno::ENOENT }.times(1)  
73 -  
74 - @rcfile = Twurl::RCFile.new  
75 - assert rcfile.profiles.empty?  
76 - assert_nil rcfile.default_profile  
77 - mock(rcfile).save.times(any_times)  
78 - end  
79 -  
80 - def test_adding_the_first_client_sets_it_as_default_profile  
81 - client = Twurl::OAuthClient.test_exemplar  
82 -  
83 - rcfile << client  
84 - assert_equal [client.username, client.consumer_key], rcfile.default_profile  
85 - assert rcfile.has_oauth_profile_for_username_with_consumer_key?(client.username, client.consumer_key)  
86 - assert_equal({client.username => {client.consumer_key => client.to_hash}}, rcfile.profiles)  
87 - end  
88 -  
89 - def test_adding_additional_clients_does_not_change_default_profile  
90 - first_client = Twurl::OAuthClient.test_exemplar  
91 -  
92 - rcfile << first_client  
93 - assert_equal [first_client.username, first_client.consumer_key], rcfile.default_profile  
94 - assert rcfile.has_oauth_profile_for_username_with_consumer_key?(first_client.username, first_client.consumer_key)  
95 -  
96 - additional_client = Twurl::OAuthClient.test_exemplar(:username => 'additional_exemplar_username')  
97 -  
98 - rcfile << additional_client  
99 - assert_equal [first_client.username, first_client.consumer_key], rcfile.default_profile  
100 - assert rcfile.has_oauth_profile_for_username_with_consumer_key?(additional_client.username, additional_client.consumer_key)  
101 -  
102 - expected_profiles = {  
103 - first_client.username => {first_client.consumer_key => first_client.to_hash},  
104 - additional_client.username => {additional_client.consumer_key => additional_client.to_hash}  
105 - }  
106 -  
107 - assert_equal expected_profiles, rcfile.profiles  
108 - end  
109 -end  
110 -  
111 -class Twurl::RCFile::SavingTest < Minitest::Test  
112 - attr_reader :rcfile  
113 - def setup  
114 - delete_rcfile  
115 - assert !rcfile_exists?  
116 - @rcfile = Twurl::RCFile.new  
117 - assert !rcfile_exists?  
118 - end  
119 -  
120 - def teardown  
121 - super  
122 - delete_rcfile  
123 - end  
124 -  
125 - def test_save_writes_profiles_to_disk  
126 - client = Twurl::OAuthClient.test_exemplar  
127 - rcfile << client  
128 - assert rcfile_exists?  
129 - end  
130 -  
131 - def test_file_is_not_world_readable  
132 - client = Twurl::OAuthClient.test_exemplar  
133 - rcfile << client  
134 - assert_equal 33152, File.stat(Twurl::RCFile.file_path).mode  
135 - end  
136 -  
137 - private  
138 - def rcfile_exists?  
139 - File.exists?(Twurl::RCFile.file_path)  
140 - end  
141 -  
142 - def delete_rcfile  
143 - File.unlink(Twurl::RCFile.file_path)  
144 - rescue Errno::ENOENT  
145 - # Do nothing  
146 - end  
147 -end  
tweeter_stream/test/request_controller_test.rb
@@ -1,58 +0,0 @@ @@ -1,58 +0,0 @@
1 -require File.dirname(__FILE__) + '/test_helper'  
2 -  
3 -class Twurl::RequestController::AbstractTestCase < Minitest::Test  
4 - attr_reader :options, :client, :controller  
5 - def setup  
6 - Twurl::CLI.output = StringIO.new  
7 - @options = Twurl::Options.test_exemplar  
8 - @client = Twurl::OAuthClient.test_exemplar  
9 - @controller = Twurl::RequestController.new(client, options)  
10 - end  
11 -  
12 - def teardown  
13 - super  
14 - Twurl::CLI.output = STDOUT  
15 - end  
16 -  
17 - def test_nothing  
18 - # Appeasing test/unit  
19 - end  
20 -end  
21 -  
22 -class Twurl::RequestController::DispatchTest < Twurl::RequestController::AbstractTestCase  
23 - def test_request_will_be_made_if_client_is_authorized  
24 - mock(client).needs_to_authorize? { false }.times(1)  
25 - mock(controller).perform_request.times(1)  
26 -  
27 - controller.dispatch  
28 - end  
29 -  
30 - def test_request_will_not_be_made_if_client_is_not_authorized  
31 - mock(client).needs_to_authorize? { true }.times(1)  
32 - mock(controller).perform_request.never  
33 -  
34 - assert_raises Twurl::Exception do  
35 - controller.dispatch  
36 - end  
37 - end  
38 -end  
39 -  
40 -class Twurl::RequestController::RequestTest < Twurl::RequestController::AbstractTestCase  
41 - def test_request_response_is_written_to_output  
42 - expected_body = 'this is a fake response body'  
43 - response = Object.new  
44 - mock(response).read_body { |block| block.call expected_body }  
45 - mock(client).perform_request_from_options(options).times(1) { |options, block| block.call(response) }  
46 -  
47 - controller.perform_request  
48 -  
49 - assert_equal expected_body, Twurl::CLI.output.string  
50 - end  
51 -  
52 - def test_invalid_or_unspecified_urls_report_error  
53 - mock(Twurl::CLI).puts(Twurl::RequestController::NO_URI_MESSAGE).times(1)  
54 - mock(client).perform_request_from_options(options).times(1) { raise URI::InvalidURIError }  
55 -  
56 - controller.perform_request  
57 - end  
58 -end  
tweeter_stream/test/test_helper.rb
@@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
1 -require 'simplecov'  
2 -require 'coveralls'  
3 -  
4 -SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[  
5 - SimpleCov::Formatter::HTMLFormatter,  
6 - Coveralls::SimpleCov::Formatter  
7 -]  
8 -SimpleCov.start  
9 -  
10 -require 'twurl'  
11 -require 'minitest/autorun'  
12 -require 'rr'  
13 -  
14 -Twurl::RCFile.directory = ENV['TMPDIR']  
15 -  
16 -module Twurl  
17 - class Options  
18 - class << self  
19 - def test_exemplar  
20 - options = new  
21 - options.username = 'exemplar_user_name'  
22 - options.password = 'secret'  
23 - options.consumer_key = '123456789'  
24 - options.consumer_secret = '987654321'  
25 - options.subcommands = []  
26 - options  
27 - end  
28 - end  
29 - end  
30 -  
31 - class OAuthClient  
32 - class << self  
33 - def test_exemplar(overrides = {})  
34 - options = Twurl::Options.test_exemplar  
35 -  
36 - overrides.each do |attribute, value|  
37 - options.send("#{attribute}=", value)  
38 - end  
39 -  
40 - load_new_client_from_options(options)  
41 - end  
42 - end  
43 - end  
44 -end  
tweeter_stream/twurl.gemspec
@@ -1,25 +0,0 @@ @@ -1,25 +0,0 @@
1 -# coding: utf-8  
2 -lib = File.expand_path('../lib', __FILE__)  
3 -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)  
4 -require 'twurl/version'  
5 -  
6 -Gem::Specification.new do |spec|  
7 - spec.add_dependency 'oauth', '~> 0.4'  
8 - spec.add_development_dependency 'bundler', '~> 1.0'  
9 - spec.authors = ["Marcel Molina", "Erik Michaels-Ober"]  
10 - spec.description = %q{Curl for the Twitter API}  
11 - spec.email = ['marcel@twitter.com']  
12 - spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }  
13 - spec.extra_rdoc_files = %w(COPYING INSTALL README)  
14 - spec.files = `git ls-files`.split("\n")  
15 - spec.homepage = 'http://github.com/twitter/twurl'  
16 - spec.licenses = ['MIT']  
17 - spec.name = 'twurl'  
18 - spec.rdoc_options = ['--title', 'twurl -- OAuth-enabled curl for the Twitter API', '--main', 'README', '--line-numbers', '--inline-source']  
19 - spec.require_paths = ['lib']  
20 - spec.required_rubygems_version = '>= 1.3.5'  
21 - spec.rubyforge_project = 'twurl'  
22 - spec.summary = spec.description  
23 - spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")  
24 - spec.version = Twurl::Version  
25 -end  
twitter/stream.rb 0 → 100644
@@ -0,0 +1,54 @@ @@ -0,0 +1,54 @@
  1 +require 'rubygems'
  2 +require 'twitter'
  3 +require 'iconv'
  4 +
  5 +#Filters non-UTF8 octets
  6 +def UTF8Filter(string)
  7 + ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
  8 + #Attention please, don't remove + ' ')[0..-2] it is used for UTF8 validation
  9 + ic.iconv(string + ' ')[0..-2]
  10 +end
  11 +
  12 +def listen_twitter_stream(hub, author_id)
  13 + connected = false
  14 + while !connected
  15 + begin
  16 + client = Twitter::Streaming::Client.new do |config|
  17 + config.consumer_key = hub.twitter_consumer_key
  18 + config.consumer_secret = hub.twitter_consumer_secret
  19 + config.access_token = hub.twitter_access_token
  20 + config.access_token_secret = hub.twitter_access_token_secret
  21 + end
  22 + connected = true
  23 + rescue => e
  24 + puts "Error connecting to twitter stream: #{e.inspect}"
  25 + sleep 10
  26 + end
  27 + end
  28 + while true
  29 + begin
  30 + client.filter(:track => hub.twitter_hashtags) do |object|
  31 + if object.is_a?(Twitter::Tweet)
  32 + puts '@' + object.user.screen_name + ' said: ' + object.text
  33 +# puts object.user.profile_image_url
  34 + comment = Comment.new
  35 + comment.title = 'hub-message-twitter'
  36 + comment.source = hub
  37 + comment.body = UTF8Filter(object.text)
  38 + comment.author_id = author_id
  39 + comment.name = UTF8Filter(object.user.screen_name)
  40 + comment.email = 'admin@localhost.local'
  41 + begin
  42 + comment.save!
  43 + rescue => e
  44 + puts "Erro gravando comentário twitter #{e.inspect}"
  45 + end
  46 + end
  47 + end
  48 + rescue => e
  49 + puts "Erro lendo stream #{e.inspect}"
  50 + sleep 10
  51 + break
  52 + end
  53 + end
  54 +end
0 \ No newline at end of file 55 \ No newline at end of file
views/cms/community_hub_plugin/_hub.rhtml
@@ -9,7 +9,6 @@ @@ -9,7 +9,6 @@
9 <%= required labelled_form_field(_('Description'), text_area(:article, 'body', :style => 'width: 100%;', :class => 'mceEditor')) %> 9 <%= required labelled_form_field(_('Description'), text_area(:article, 'body', :style => 'width: 100%;', :class => 'mceEditor')) %>
10 </div> 10 </div>
11 <br /> 11 <br />
12 -  
13 <div> 12 <div>
14 <%= _('General Streaming Settings:') %> 13 <%= _('General Streaming Settings:') %>
15 </div> 14 </div>
@@ -19,8 +18,21 @@ @@ -19,8 +18,21 @@
19 </div> 18 </div>
20 <br /> 19 <br />
21 <%= check_box(:article, :twitter_enabled) %> <span><%= _("Turn on TWITTER") %></span> 20 <%= check_box(:article, :twitter_enabled) %> <span><%= _("Turn on TWITTER") %></span>
22 - <br /><br />  
23 - <span><%= required labelled_form_field(_('Twitter\'s Hashtags, comma separated words<br>(example: participa.br,participabr,arenanetmundial,netmundial'), text_field(:article, :hashtags_twitter)) %></span> 21 + <br />
  22 + <br />
  23 + <span><%= required labelled_form_field(_('Twitter\'s Hashtags, comma separated words<br>(example: participa.br,participabr,arenanetmundial,netmundial'), text_field(:article, :twitter_hashtags)) %></span>
  24 + <br />
  25 + <br />
  26 + <span><%= required labelled_form_field(_('Twitter\'s consumer key'), text_field(:article, :twitter_consumer_key)) %></span>
  27 + <br />
  28 + <br />
  29 + <span><%= required labelled_form_field(_('Twitter\'s consumer secret'), text_field(:article, :twitter_consumer_secret)) %></span>
  30 + <br />
  31 + <br />
  32 + <span><%= required labelled_form_field(_('Twitter\'s access token'), text_field(:article, :twitter_access_token)) %></span>
  33 + <br />
  34 + <br />
  35 + <span><%= required labelled_form_field(_('Twitter\'s access token secret'), text_field(:article, :twitter_access_token_secret)) %></span>
24 <br /> 36 <br />
25 <div> 37 <div>
26 <%= _('Facebook Settings:') %> 38 <%= _('Facebook Settings:') %>