dustin-twitter 0.3.2.2 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +17 -0
- data/Manifest.txt +6 -1
- data/README.txt +9 -0
- data/bin/twitter +0 -0
- data/config/hoe.rb +1 -1
- data/examples/direct_messages.rb +15 -13
- data/examples/identica_timeline.rb +7 -0
- data/examples/posting.rb +9 -0
- data/examples/search.rb +17 -0
- data/lib/twitter.rb +1 -0
- data/lib/twitter/base.rb +34 -32
- data/lib/twitter/cli.rb +1 -1
- data/lib/twitter/search.rb +94 -0
- data/lib/twitter/version.rb +1 -1
- data/spec/fixtures/search_results.json +1 -0
- data/spec/search_spec.rb +89 -0
- data/spec/spec_helper.rb +7 -3
- data/tasks/deployment.rake +9 -0
- data/tasks/website.rake +1 -1
- data/twitter.gemspec +8 -8
- data/website/index.html +20 -2
- metadata +10 -6
- data/TODO.txt +0 -2
data/History.txt
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
0.3.7 - August 26, 2008
|
2
|
+
* Fixed source param not getting through
|
3
|
+
|
4
|
+
0.3.6 - August 11, 2008
|
5
|
+
* Fixed a few more methods that required post.
|
6
|
+
* Refactored the remaining methods that were not using #request to use it.
|
7
|
+
|
8
|
+
0.3.5 - August 4, 2008
|
9
|
+
* Removed sqlite-ruby 1.2.2 as a dependency due to install issues on linux
|
10
|
+
|
11
|
+
0.3.4 - August 3, 2008
|
12
|
+
* Added search support
|
13
|
+
|
14
|
+
0.3.3 - August 3, 2008
|
15
|
+
* Now has option for host when initializing to support identi.ca (Dustin Sallings)
|
16
|
+
* Twitter changed a bunch of methods to POST only so I updated those to now work
|
17
|
+
|
1
18
|
0.3.2 - July 26, 2008
|
2
19
|
* added the CLI gems as dependencies for now until I separate out the CLI from the API wrapper
|
3
20
|
* cleaner CLI errors for no active account or no accounts at all
|
data/Manifest.txt
CHANGED
@@ -3,7 +3,6 @@ License.txt
|
|
3
3
|
Manifest.txt
|
4
4
|
README.txt
|
5
5
|
Rakefile
|
6
|
-
TODO.txt
|
7
6
|
bin/twitter
|
8
7
|
config/hoe.rb
|
9
8
|
config/requirements.rb
|
@@ -12,8 +11,11 @@ examples/direct_messages.rb
|
|
12
11
|
examples/favorites.rb
|
13
12
|
examples/friends_followers.rb
|
14
13
|
examples/friendships.rb
|
14
|
+
examples/identica_timeline.rb
|
15
15
|
examples/location.rb
|
16
|
+
examples/posting.rb
|
16
17
|
examples/replies.rb
|
18
|
+
examples/search.rb
|
17
19
|
examples/sent_messages.rb
|
18
20
|
examples/timeline.rb
|
19
21
|
examples/twitter.rb
|
@@ -33,6 +35,7 @@ lib/twitter/cli/models/tweet.rb
|
|
33
35
|
lib/twitter/direct_message.rb
|
34
36
|
lib/twitter/easy_class_maker.rb
|
35
37
|
lib/twitter/rate_limit_status.rb
|
38
|
+
lib/twitter/search.rb
|
36
39
|
lib/twitter/status.rb
|
37
40
|
lib/twitter/user.rb
|
38
41
|
lib/twitter/version.rb
|
@@ -50,9 +53,11 @@ spec/fixtures/friends_lite.xml
|
|
50
53
|
spec/fixtures/friends_timeline.xml
|
51
54
|
spec/fixtures/public_timeline.xml
|
52
55
|
spec/fixtures/rate_limit_status.xml
|
56
|
+
spec/fixtures/search_results.json
|
53
57
|
spec/fixtures/status.xml
|
54
58
|
spec/fixtures/user.xml
|
55
59
|
spec/fixtures/user_timeline.xml
|
60
|
+
spec/search_spec.rb
|
56
61
|
spec/spec.opts
|
57
62
|
spec/spec_helper.rb
|
58
63
|
spec/status_spec.rb
|
data/README.txt
CHANGED
@@ -36,8 +36,17 @@ sudo gem install twitter will work just fine. For command line use, you'll need
|
|
36
36
|
puts u.name, u.status.text
|
37
37
|
puts
|
38
38
|
end
|
39
|
+
|
40
|
+
== Search Examples
|
41
|
+
|
42
|
+
Twitter::Search.new('httparty').each { |r| puts r.inspect }
|
43
|
+
Twitter::Search.new('httparty').from('jnunemaker').each { |r| puts r.inspect }
|
44
|
+
Twitter::Search.new.from('jnunemaker').to('oaknd1').each { |r| puts r.inspect }
|
45
|
+
|
39
46
|
|
40
47
|
== Command Line Use
|
48
|
+
|
49
|
+
Note: If you want to use twitter from the command line be sure that sqlite3 and the sqlite3-ruby gem are installed. I removed the sqlite3-ruby gem as a dependency because you shouldn't need that to just use the API wrapper. Eventually I'll move the CLI interface into another gem.
|
41
50
|
|
42
51
|
$ twitter
|
43
52
|
|
data/bin/twitter
CHANGED
File without changes
|
data/config/hoe.rb
CHANGED
@@ -63,7 +63,7 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
63
63
|
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
64
64
|
p.extra_deps = [['hpricot', '>= 0.6'], ['activesupport', '>= 2.1'],
|
65
65
|
['main', '>= 2.8.2'], ['highline', '>= 1.4.0'],
|
66
|
-
['activerecord', '>= 2.1'], ['
|
66
|
+
['activerecord', '>= 2.1'], ['httparty', '>= 0.1.0']]
|
67
67
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
68
68
|
|
69
69
|
end
|
data/examples/direct_messages.rb
CHANGED
@@ -6,21 +6,23 @@ twitter = Twitter::Base.new(config['email'], config['password'])
|
|
6
6
|
|
7
7
|
puts 'SINCE'
|
8
8
|
twitter.direct_messages(:since => Time.now - 5.day).each do |s|
|
9
|
-
puts "- #{s.text}"
|
9
|
+
puts "- #{s.id} #{s.text}"
|
10
10
|
end
|
11
11
|
puts
|
12
12
|
puts
|
13
13
|
|
14
|
-
puts 'SINCE_ID'
|
15
|
-
twitter.direct_messages(:since_id => 33505386).each do |s|
|
16
|
-
|
17
|
-
end
|
18
|
-
puts
|
19
|
-
puts
|
14
|
+
# puts 'SINCE_ID'
|
15
|
+
# twitter.direct_messages(:since_id => 33505386).each do |s|
|
16
|
+
# puts "- #{s.text}"
|
17
|
+
# end
|
18
|
+
# puts
|
19
|
+
# puts
|
20
|
+
#
|
21
|
+
# puts 'PAGE'
|
22
|
+
# twitter.direct_messages(:page => 1).each do |s|
|
23
|
+
# puts "- #{s.text}"
|
24
|
+
# end
|
25
|
+
# puts
|
26
|
+
# puts
|
20
27
|
|
21
|
-
puts
|
22
|
-
twitter.direct_messages(:page => 1).each do |s|
|
23
|
-
puts "- #{s.text}"
|
24
|
-
end
|
25
|
-
puts
|
26
|
-
puts
|
28
|
+
# puts twitter.destroy_direct_message(34489057).inspect
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'twitter')
|
3
|
+
config = YAML::load(open(ENV['HOME'] + '/.twitter'))
|
4
|
+
|
5
|
+
identica = Twitter::Base.new(config['email'], config['password'], :api_host => 'identi.ca/api')
|
6
|
+
|
7
|
+
identica.timeline(:public).each { |s| puts s.text, s.user.name, '' }
|
data/examples/posting.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'twitter')
|
3
|
+
config = YAML::load(open(ENV['HOME'] + '/.twitter'))
|
4
|
+
|
5
|
+
twitter = Twitter::Base.new(config['email'], config['password'])
|
6
|
+
puts twitter.post("This is a test from the example file").inspect
|
7
|
+
|
8
|
+
# sending a direct message
|
9
|
+
# puts twitter.d('jnunemaker', 'this is a test').inspect
|
data/examples/search.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'twitter')
|
3
|
+
|
4
|
+
Twitter::Search.new('httparty').each { |r| puts r.inspect,'' }
|
5
|
+
|
6
|
+
# search = Twitter::Search.new
|
7
|
+
# search.from('jnunemaker').to('oaknd1').each { |r| puts r.inspect, '' }
|
8
|
+
# pp search.result
|
9
|
+
# search.clear
|
10
|
+
|
11
|
+
# search.from('jnunemaker').to('oaknd1').since(814529437).containing('milk').each { |r| puts r.inspect, '' }
|
12
|
+
# search.clear
|
13
|
+
#
|
14
|
+
# search.geocode('40.757929', '-73.985506', '50mi').containing('holland').each { |r| puts r.inspect, '' }
|
15
|
+
# search.clear
|
16
|
+
|
17
|
+
# pp search.from('jnunemaker').fetch()
|
data/lib/twitter.rb
CHANGED
data/lib/twitter/base.rb
CHANGED
@@ -5,12 +5,15 @@
|
|
5
5
|
# http://groups.google.com/group/twitter-development-talk/web/api-documentation
|
6
6
|
module Twitter
|
7
7
|
class Base
|
8
|
-
|
9
8
|
# Initializes the configuration for making requests to twitter
|
10
|
-
|
9
|
+
# Twitter example:
|
10
|
+
# Twitter.new('email/username', 'password')
|
11
|
+
#
|
12
|
+
# Identi.ca example:
|
13
|
+
# Twitter.new('email/username', 'password', :api_host => 'identi.ca/api')
|
14
|
+
def initialize(email, password, options={})
|
11
15
|
@config, @config[:email], @config[:password] = {}, email, password
|
12
|
-
@api_host =
|
13
|
-
@api_path = path
|
16
|
+
@api_host = options.delete(:api_host) || 'twitter.com'
|
14
17
|
end
|
15
18
|
|
16
19
|
# Returns an array of statuses for a timeline; Defaults to your friends timeline.
|
@@ -83,27 +86,22 @@ module Twitter
|
|
83
86
|
|
84
87
|
# destroys a give direct message by id if the auth user is a recipient
|
85
88
|
def destroy_direct_message(id)
|
86
|
-
request("direct_messages/destroy/#{id}.xml", :auth => true)
|
89
|
+
DirectMessage.new_from_xml(request("direct_messages/destroy/#{id}.xml", :auth => true, :method => :post))
|
87
90
|
end
|
88
91
|
|
89
92
|
# Sends a direct message <code>text</code> to <code>user</code>
|
90
93
|
def d(user, text)
|
91
|
-
|
92
|
-
req = Net::HTTP::Post.new(url.path)
|
93
|
-
req.basic_auth(@config[:email], @config[:password])
|
94
|
-
req.set_form_data({'text' => text, 'user' => user})
|
95
|
-
response = Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
|
96
|
-
DirectMessage.new_from_xml(parse(response.body).at('direct_message'))
|
94
|
+
DirectMessage.new_from_xml(request('direct_messages/new.xml', :auth => true, :method => :post, :form_data => {'text' => text, 'user' => user}))
|
97
95
|
end
|
98
96
|
|
99
97
|
# Befriends id_or_screenname for the auth user
|
100
98
|
def create_friendship(id_or_screenname)
|
101
|
-
users(request("friendships/create/#{id_or_screenname}.xml", :auth => true)).first
|
99
|
+
users(request("friendships/create/#{id_or_screenname}.xml", :auth => true, :method => :post)).first
|
102
100
|
end
|
103
101
|
|
104
102
|
# Defriends id_or_screenname for the auth user
|
105
103
|
def destroy_friendship(id_or_screenname)
|
106
|
-
users(request("friendships/destroy/#{id_or_screenname}.xml", :auth => true)).first
|
104
|
+
users(request("friendships/destroy/#{id_or_screenname}.xml", :auth => true, :method => :post)).first
|
107
105
|
end
|
108
106
|
|
109
107
|
# Returns true if friendship exists, false if it doesn't.
|
@@ -114,22 +112,22 @@ module Twitter
|
|
114
112
|
|
115
113
|
# Updates your location and returns Twitter::User object
|
116
114
|
def update_location(location)
|
117
|
-
users(request(build_path('account/update_location.xml', {'location' => location}), :auth => true)).first
|
115
|
+
users(request(build_path('account/update_location.xml', {'location' => location}), :auth => true, :method => :post)).first
|
118
116
|
end
|
119
117
|
|
120
118
|
# Updates your deliver device and returns Twitter::User object
|
121
119
|
def update_delivery_device(device)
|
122
|
-
users(request(build_path('account/update_delivery_device.xml', {'device' => device}), :auth => true)).first
|
120
|
+
users(request(build_path('account/update_delivery_device.xml', {'device' => device}), :auth => true, :method => :post)).first
|
123
121
|
end
|
124
122
|
|
125
123
|
# Turns notifications by id_or_screenname on for auth user.
|
126
124
|
def follow(id_or_screenname)
|
127
|
-
users(request("notifications/follow/#{id_or_screenname}.xml", :auth => true)).first
|
125
|
+
users(request("notifications/follow/#{id_or_screenname}.xml", :auth => true, :method => :post)).first
|
128
126
|
end
|
129
127
|
|
130
128
|
# Turns notifications by id_or_screenname off for auth user.
|
131
129
|
def leave(id_or_screenname)
|
132
|
-
users(request("notifications/leave/#{id_or_screenname}.xml", :auth => true)).first
|
130
|
+
users(request("notifications/leave/#{id_or_screenname}.xml", :auth => true, :method => :post)).first
|
133
131
|
end
|
134
132
|
|
135
133
|
# Returns the most recent favorite statuses for the autenticating user
|
@@ -139,41 +137,36 @@ module Twitter
|
|
139
137
|
|
140
138
|
# Favorites the status specified by id for the auth user
|
141
139
|
def create_favorite(id)
|
142
|
-
statuses(request("favorites/create/#{id}.xml", :auth => true)).first
|
140
|
+
statuses(request("favorites/create/#{id}.xml", :auth => true, :method => :post)).first
|
143
141
|
end
|
144
142
|
|
145
143
|
# Un-favorites the status specified by id for the auth user
|
146
144
|
def destroy_favorite(id)
|
147
|
-
statuses(request("favorites/destroy/#{id}.xml", :auth => true)).first
|
145
|
+
statuses(request("favorites/destroy/#{id}.xml", :auth => true, :method => :post)).first
|
148
146
|
end
|
149
147
|
|
150
148
|
# Blocks the user specified by id for the auth user
|
151
149
|
def block(id)
|
152
|
-
users(request("blocks/create/#{id}.xml", :auth => true)).first
|
150
|
+
users(request("blocks/create/#{id}.xml", :auth => true, :method => :post)).first
|
153
151
|
end
|
154
152
|
|
155
153
|
# Unblocks the user specified by id for the auth user
|
156
154
|
def unblock(id)
|
157
|
-
users(request("blocks/destroy/#{id}.xml", :auth => true)).first
|
155
|
+
users(request("blocks/destroy/#{id}.xml", :auth => true, :method => :post)).first
|
158
156
|
end
|
159
157
|
|
160
158
|
# Posts a new update to twitter for auth user.
|
161
159
|
def post(status, options={})
|
162
160
|
form_data = {'status' => status}
|
163
|
-
form_data.merge({'source' => options[:source]}) if options[:source]
|
164
|
-
|
165
|
-
req = Net::HTTP::Post.new(url.path)
|
166
|
-
req.basic_auth(@config[:email], @config[:password])
|
167
|
-
req.set_form_data(form_data)
|
168
|
-
response = Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
|
169
|
-
Status.new_from_xml(parse(response.body).at('status'))
|
161
|
+
form_data.merge!({'source' => options[:source]}) if options[:source]
|
162
|
+
Status.new_from_xml(request('statuses/update.xml', :auth => true, :method => :post, :form_data => form_data))
|
170
163
|
end
|
171
164
|
alias :update :post
|
172
165
|
|
173
166
|
# Verifies the credentials for the auth user.
|
174
167
|
# raises Twitter::CantConnect on failure.
|
175
168
|
def verify_credentials
|
176
|
-
request('account/verify_credentials', :auth => true)
|
169
|
+
request('account/verify_credentials.xml', :auth => true)
|
177
170
|
end
|
178
171
|
|
179
172
|
private
|
@@ -200,16 +193,25 @@ module Twitter
|
|
200
193
|
|
201
194
|
# Makes a request to twitter.
|
202
195
|
def request(path, options={})
|
203
|
-
options.reverse_merge!({
|
196
|
+
options.reverse_merge!({
|
197
|
+
:headers => { "User-Agent" => @config[:email] },
|
198
|
+
:method => :get
|
199
|
+
})
|
204
200
|
unless options[:since].blank?
|
205
201
|
since = options[:since].kind_of?(Date) ? options[:since].strftime('%a, %d-%b-%y %T GMT') : options[:since].to_s
|
206
202
|
options[:headers]["If-Modified-Since"] = since
|
207
203
|
end
|
208
204
|
|
205
|
+
uri = URI.parse("http://#{@api_host}")
|
206
|
+
|
209
207
|
begin
|
210
|
-
response = Net::HTTP.start(
|
211
|
-
|
208
|
+
response = Net::HTTP.start(uri.host, 80) do |http|
|
209
|
+
klass = Net::HTTP.const_get options[:method].to_s.downcase.capitalize
|
210
|
+
req = klass.new("#{uri.path}/#{path}", options[:headers])
|
212
211
|
req.basic_auth(@config[:email], @config[:password]) if options[:auth]
|
212
|
+
if options[:method].to_s == 'post' && options[:form_data]
|
213
|
+
req.set_form_data(options[:form_data])
|
214
|
+
end
|
213
215
|
http.request(req)
|
214
216
|
end
|
215
217
|
rescue => error
|
data/lib/twitter/cli.rb
CHANGED
@@ -0,0 +1,94 @@
|
|
1
|
+
gem 'httparty'
|
2
|
+
require 'httparty'
|
3
|
+
|
4
|
+
module Twitter
|
5
|
+
class Search
|
6
|
+
include HTTParty
|
7
|
+
include Enumerable
|
8
|
+
base_uri 'search.twitter.com'
|
9
|
+
|
10
|
+
attr_reader :result, :query
|
11
|
+
|
12
|
+
def initialize(q=nil)
|
13
|
+
clear
|
14
|
+
containing(q) unless q.blank?
|
15
|
+
end
|
16
|
+
|
17
|
+
def from(user)
|
18
|
+
@query[:q] << "from:#{user}"
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def to(user)
|
23
|
+
@query[:q] << "to:#{user}"
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def referencing(user)
|
28
|
+
@query[:q] << "@#{user}"
|
29
|
+
self
|
30
|
+
end
|
31
|
+
alias :references :referencing
|
32
|
+
alias :ref :referencing
|
33
|
+
|
34
|
+
def containing(word)
|
35
|
+
@query[:q] << "#{word}"
|
36
|
+
self
|
37
|
+
end
|
38
|
+
alias :contains :containing
|
39
|
+
|
40
|
+
# adds filtering based on hash tag ie: #twitter
|
41
|
+
def hashed(tag)
|
42
|
+
@query[:q] << "##{tag}"
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
# lang must be ISO 639-1 code ie: en, fr, de, ja, etc.
|
47
|
+
#
|
48
|
+
# when I tried en it limited my results a lot and took
|
49
|
+
# out several tweets that were english so i'd avoid
|
50
|
+
# this unless you really want it
|
51
|
+
def lang(lang)
|
52
|
+
@query[:lang] = lang
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
# Limits the number of results per page
|
57
|
+
def per_page(num)
|
58
|
+
@query[:rpp] = num
|
59
|
+
self
|
60
|
+
end
|
61
|
+
|
62
|
+
# Only searches tweets since a given id.
|
63
|
+
# Recommended to use this when possible.
|
64
|
+
def since(since_id)
|
65
|
+
@query[:since_id] = since_id
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
# Search tweets by longitude, latitude and a given range.
|
70
|
+
# Ranges like 25km and 50mi work.
|
71
|
+
def geocode(long, lat, range)
|
72
|
+
@query[:geocode] = [long, lat, range].join(',')
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
# Clears all the query filters to make a new search
|
77
|
+
def clear
|
78
|
+
@query = {}
|
79
|
+
@query[:q] = []
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
# If you want to get results do something other than iterate over them.
|
84
|
+
def fetch
|
85
|
+
@query[:q] = @query[:q].join(' ')
|
86
|
+
self.class.get('/search.json', {:query => @query})
|
87
|
+
end
|
88
|
+
|
89
|
+
def each
|
90
|
+
@result = fetch()
|
91
|
+
@result['results'].each { |r| yield r }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/lib/twitter/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
{"max_id"=>876733347, "since_id"=>0, "results"=>[{"text"=>"post using httparty.", "from_user"=>"yuweijun", "to_user_id"=>nil, "id"=>876203197, "iso_language_code"=>"en", "from_user_id"=>1170048, "created_at"=>"Sun, 03 Aug 2008 06:40:42 +0000", "profile_image_url"=>"http://static.twitter.com/images/default_profile_normal.png"}, {"text"=>"HTTParty: Quick Web Service Consumption From Any Ruby Class: HTTParty is a new Ruby library by Joh.. http://tinyurl.com/5cb8e8", "from_user"=>"delicious_prog", "to_user_id"=>nil, "id"=>875881978, "iso_language_code"=>"en", "from_user_id"=>468104, "created_at"=>"Sat, 02 Aug 2008 20:47:02 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/54388004/delicious.42px_normal.gif"}, {"text"=>"[4Rails] HTTParty: Quick Web Service Consumption From Any Ruby Class: HTTParty: Quick Web Serv.. http://tinyurl.com/5uemxj", "from_user"=>"bumperbody", "to_user_id"=>nil, "id"=>875828918, "iso_language_code"=>"en", "from_user_id"=>476491, "created_at"=>"Sat, 02 Aug 2008 19:16:19 +0000", "profile_image_url"=>"http://static.twitter.com/images/default_profile_normal.png"}, {"text"=>"[ruby] HTTParty: Quick Web Service Consumption From Any Ruby Class", "from_user"=>"rubymentary", "to_user_id"=>nil, "id"=>875761343, "iso_language_code"=>"en", "from_user_id"=>474717, "created_at"=>"Sat, 02 Aug 2008 17:26:19 +0000", "profile_image_url"=>"http://static.twitter.com/images/default_profile_normal.png"}, {"text"=>"[ruby: RubyInside] HTTParty: Quick Web Service Consumption From Any Ruby Class http://tinyurl.com/5gryre", "from_user"=>"devfunnel", "to_user_id"=>nil, "id"=>875732752, "iso_language_code"=>"en", "from_user_id"=>465190, "created_at"=>"Sat, 02 Aug 2008 16:44:21 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/53748400/dev-funnel-logo-shiny-50x50_normal.png"}, {"text"=>"using the excellent OpenLibrary API, via HTTParty - i do like it that people have thought i'd want to do this in advance!", "from_user"=>"degsy", "to_user_id"=>nil, "id"=>875690354, "iso_language_code"=>"en", "from_user_id"=>164367, "created_at"=>"Sat, 02 Aug 2008 15:43:58 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/56185617/degsy_normal.jpg"}, {"text"=>"httparty gem rocks", "from_user"=>"shenie", "to_user_id"=>nil, "id"=>874139770, "iso_language_code"=>"en", "from_user_id"=>271831, "created_at"=>"Thu, 31 Jul 2008 22:58:19 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/42362902/Photo_28_normal.jpg"}, {"text"=>"httparty yup. that is what i was missing", "from_user"=>"bryanl", "to_user_id"=>nil, "id"=>873839285, "iso_language_code"=>"en", "from_user_id"=>5167, "created_at"=>"Thu, 31 Jul 2008 17:15:51 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/57603306/Photo_26_normal.jpg"}, {"text"=>"@timhaines thanks for the link to HTTParty, Xero api consumer for contacts (at least the get part) now only takes 18 lines of code.", "from_user"=>"buildmaster", "to_user"=>"timhaines", "to_user_id"=>159881, "id"=>873222820, "iso_language_code"=>"en", "from_user_id"=>26548, "created_at"=>"Thu, 31 Jul 2008 02:29:02 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/51894576/gold_o_normal.jpg"}, {"text"=>"refactoring code from yesterdays example to use HTTParty", "from_user"=>"buildmaster", "to_user_id"=>nil, "id"=>873020059, "iso_language_code"=>"en", "from_user_id"=>26548, "created_at"=>"Wed, 30 Jul 2008 21:55:19 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/51894576/gold_o_normal.jpg"}, {"text"=>"delicious: It's an HTTParty and Everyone Is Invited! // RailsTips.org by John Nunemaker http://tinyurl.com/6774gz", "from_user"=>"top_web", "to_user_id"=>nil, "id"=>872810034, "iso_language_code"=>"en", "from_user_id"=>780201, "created_at"=>"Wed, 30 Jul 2008 17:48:25 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/55853305/web_normal.jpg"}, {"text"=>"d: It's an HTTParty and Everyone Is Invited! // RailsTips.org by John Nunemaker http://tinyurl.com/6774gz", "from_user"=>"top_dedist", "to_user_id"=>nil, "id"=>872809988, "iso_language_code"=>"en", "from_user_id"=>760334, "created_at"=>"Wed, 30 Jul 2008 17:48:20 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/55845227/dedist_normal.jpg"}, {"text"=>"[4Rails] It's an HTTParty and Everyone Is Invited! // RailsTips.org by John Nunemaker: It's an.. http://tinyurl.com/57wjn4", "from_user"=>"bumperbody", "to_user_id"=>nil, "id"=>872549387, "iso_language_code"=>"en", "from_user_id"=>476491, "created_at"=>"Wed, 30 Jul 2008 13:16:57 +0000", "profile_image_url"=>"http://static.twitter.com/images/default_profile_normal.png"}, {"text"=>"New blog post: Sinatra, Passenger, HTTParty: Small, Fast, Now http://ruby.tie-rack.org/?p=70", "from_user"=>"tierack", "to_user_id"=>nil, "id"=>872275405, "iso_language_code"=>"no", "from_user_id"=>98800, "created_at"=>"Wed, 30 Jul 2008 04:55:40 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/52166714/mvb200_normal.jpg"}, {"text"=>"Tonight we're gonna HTTParty like it's 1999! - Time to boogie on down and consume some webservices! http://httparty.rubyforge.org/", "from_user"=>"hunternield", "to_user_id"=>nil, "id"=>872086627, "iso_language_code"=>"en", "from_user_id"=>47386, "created_at"=>"Wed, 30 Jul 2008 00:12:47 +0000", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/52133648/Photo_59_normal.jpg"}], "results_per_page"=>15, "next_page"=>"?page=2&max_id=876733347&q=httparty+", "query"=>"httparty ", "page"=>1}
|
data/spec/search_spec.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Twitter::Search do
|
4
|
+
before do
|
5
|
+
@search = Twitter::Search.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should be able to initialize with a search term" do
|
9
|
+
Twitter::Search.new('httparty').query[:q].should include('httparty')
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should be able to specify from" do
|
13
|
+
@search.from('jnunemaker').query[:q].should include('from:jnunemaker')
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should be able to specify to" do
|
17
|
+
@search.to('jnunemaker').query[:q].should include('to:jnunemaker')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be able to specify referencing" do
|
21
|
+
@search.referencing('jnunemaker').query[:q].should include('@jnunemaker')
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should alias references to referencing" do
|
25
|
+
@search.references('jnunemaker').query[:q].should include('@jnunemaker')
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should alias ref to referencing" do
|
29
|
+
@search.ref('jnunemaker').query[:q].should include('@jnunemaker')
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be able to specify containing" do
|
33
|
+
@search.containing('milk').query[:q].should include('milk')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should alias contains to containing" do
|
37
|
+
@search.contains('milk').query[:q].should include('milk')
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to specify hashed" do
|
41
|
+
@search.hashed('twitter').query[:q].should include('#twitter')
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should be able to specify the language" do
|
45
|
+
@search.lang('en').query[:lang].should == 'en'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should be able to specify the number of results per page" do
|
49
|
+
@search.per_page(25).query[:rpp].should == 25
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should be able to specify only returning results greater than an id" do
|
53
|
+
@search.since(1234).query[:since_id].should == 1234
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should be able to specify geo coordinates" do
|
57
|
+
@search.geocode('40.757929', '-73.985506', '25mi').query[:geocode].should == '40.757929,-73.985506,25mi'
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should be able to clear the filters set" do
|
61
|
+
@search.from('jnunemaker').to('oaknd1')
|
62
|
+
@search.clear.query.should == {:q => []}
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should be able to chain methods together" do
|
66
|
+
@search.from('jnunemaker').to('oaknd1').referencing('orderedlist').containing('milk').hashed('twitter').lang('en').per_page(20).since(1234).geocode('40.757929', '-73.985506', '25mi')
|
67
|
+
@search.query[:q].should == ['from:jnunemaker', 'to:oaknd1', '@orderedlist', 'milk', '#twitter']
|
68
|
+
@search.query[:lang].should == 'en'
|
69
|
+
@search.query[:rpp].should == 20
|
70
|
+
@search.query[:since_id].should == 1234
|
71
|
+
@search.query[:geocode].should == '40.757929,-73.985506,25mi'
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "fetching" do
|
75
|
+
before do
|
76
|
+
@response = open(File.dirname(__FILE__) + '/fixtures/friends_timeline.xml').read
|
77
|
+
@search.class.stub!(:get).and_return(@response)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should return results" do
|
81
|
+
@search.class.should_receive(:get).and_return(@response)
|
82
|
+
@search.from('jnunemaker').fetch().should == @response
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should be able to iterate over results" do
|
87
|
+
@search.respond_to?(:each).should == true
|
88
|
+
end
|
89
|
+
end
|
data/spec/spec_helper.rb
CHANGED
data/tasks/deployment.rake
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
desc 'Preps the gem for a new release'
|
2
|
+
task :prep_for_release do
|
3
|
+
require 'rio'
|
4
|
+
Rake::Task['manifest:refresh'].invoke
|
5
|
+
gemspec = %x[rake debug_gem]
|
6
|
+
lines = gemspec.split("\n")
|
7
|
+
rio('twitter.gemspec') < lines[1, lines.length-1].join("\n")
|
8
|
+
end
|
9
|
+
|
1
10
|
desc 'Release the website and new gem version'
|
2
11
|
task :deploy => [:check_version, :website, :release] do
|
3
12
|
puts "Remember to create SVN tag:"
|
data/tasks/website.rake
CHANGED
data/twitter.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{twitter}
|
3
|
-
s.version = "0.3.
|
3
|
+
s.version = "0.3.7"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["John Nunemaker"]
|
7
|
-
s.date = %q{2008-
|
7
|
+
s.date = %q{2008-08-26}
|
8
8
|
s.default_executable = %q{twitter}
|
9
9
|
s.description = %q{a command line interface for twitter, also a library which wraps the twitter api}
|
10
10
|
s.email = %q{nunemaker@gmail.com}
|
11
11
|
s.executables = ["twitter"]
|
12
|
-
s.extra_rdoc_files = ["History.txt", "License.txt", "Manifest.txt", "README.txt"
|
13
|
-
s.files = ["History.txt", "License.txt", "Manifest.txt", "README.txt", "Rakefile", "
|
12
|
+
s.extra_rdoc_files = ["History.txt", "License.txt", "Manifest.txt", "README.txt"]
|
13
|
+
s.files = ["History.txt", "License.txt", "Manifest.txt", "README.txt", "Rakefile", "bin/twitter", "config/hoe.rb", "config/requirements.rb", "examples/blocks.rb", "examples/direct_messages.rb", "examples/favorites.rb", "examples/friends_followers.rb", "examples/friendships.rb", "examples/identica_timeline.rb", "examples/location.rb", "examples/posting.rb", "examples/replies.rb", "examples/search.rb", "examples/sent_messages.rb", "examples/timeline.rb", "examples/twitter.rb", "examples/verify_credentials.rb", "lib/twitter.rb", "lib/twitter/base.rb", "lib/twitter/cli.rb", "lib/twitter/cli/config.rb", "lib/twitter/cli/helpers.rb", "lib/twitter/cli/migrations/20080722194500_create_accounts.rb", "lib/twitter/cli/migrations/20080722194508_create_tweets.rb", "lib/twitter/cli/migrations/20080722214605_add_account_id_to_tweets.rb", "lib/twitter/cli/migrations/20080722214606_create_configurations.rb", "lib/twitter/cli/models/account.rb", "lib/twitter/cli/models/configuration.rb", "lib/twitter/cli/models/tweet.rb", "lib/twitter/direct_message.rb", "lib/twitter/easy_class_maker.rb", "lib/twitter/rate_limit_status.rb", "lib/twitter/search.rb", "lib/twitter/status.rb", "lib/twitter/user.rb", "lib/twitter/version.rb", "script/destroy", "script/generate", "script/txt2html", "setup.rb", "spec/base_spec.rb", "spec/cli/helper_spec.rb", "spec/direct_message_spec.rb", "spec/fixtures/followers.xml", "spec/fixtures/friends.xml", "spec/fixtures/friends_for.xml", "spec/fixtures/friends_lite.xml", "spec/fixtures/friends_timeline.xml", "spec/fixtures/public_timeline.xml", "spec/fixtures/rate_limit_status.xml", "spec/fixtures/search_results.json", "spec/fixtures/status.xml", "spec/fixtures/user.xml", "spec/fixtures/user_timeline.xml", "spec/search_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/status_spec.rb", "spec/user_spec.rb", "tasks/deployment.rake", "tasks/environment.rake", "tasks/website.rake", "twitter.gemspec", "website/css/common.css", "website/images/terminal_output.png", "website/index.html"]
|
14
14
|
s.has_rdoc = true
|
15
15
|
s.homepage = %q{http://twitter.rubyforge.org}
|
16
16
|
s.rdoc_options = ["--main", "README.txt"]
|
@@ -29,14 +29,14 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_runtime_dependency(%q<main>, [">= 2.8.2"])
|
30
30
|
s.add_runtime_dependency(%q<highline>, [">= 1.4.0"])
|
31
31
|
s.add_runtime_dependency(%q<activerecord>, [">= 2.1"])
|
32
|
-
s.add_runtime_dependency(%q<
|
32
|
+
s.add_runtime_dependency(%q<httparty>, [">= 0.1.0"])
|
33
33
|
else
|
34
34
|
s.add_dependency(%q<hpricot>, [">= 0.6"])
|
35
35
|
s.add_dependency(%q<activesupport>, [">= 2.1"])
|
36
36
|
s.add_dependency(%q<main>, [">= 2.8.2"])
|
37
37
|
s.add_dependency(%q<highline>, [">= 1.4.0"])
|
38
38
|
s.add_dependency(%q<activerecord>, [">= 2.1"])
|
39
|
-
s.add_dependency(%q<
|
39
|
+
s.add_dependency(%q<httparty>, [">= 0.1.0"])
|
40
40
|
end
|
41
41
|
else
|
42
42
|
s.add_dependency(%q<hpricot>, [">= 0.6"])
|
@@ -44,6 +44,6 @@ Gem::Specification.new do |s|
|
|
44
44
|
s.add_dependency(%q<main>, [">= 2.8.2"])
|
45
45
|
s.add_dependency(%q<highline>, [">= 1.4.0"])
|
46
46
|
s.add_dependency(%q<activerecord>, [">= 2.1"])
|
47
|
-
s.add_dependency(%q<
|
47
|
+
s.add_dependency(%q<httparty>, [">= 0.1.0"])
|
48
48
|
end
|
49
|
-
end
|
49
|
+
end
|
data/website/index.html
CHANGED
@@ -15,6 +15,7 @@
|
|
15
15
|
<ul id="nav">
|
16
16
|
<li><a href="rdoc/">Docs</a></li>
|
17
17
|
<li><a href="http://github.com/jnunemaker/twitter">Github</a></li>
|
18
|
+
<li><a href="http://jnunemaker.lighthouseapp.com/projects/14843-twitter-gem/overview">Lighthouse</a></li>
|
18
19
|
<li><a href="http://rubyforge.org/projects/twitter/">Rubyforge</a></li>
|
19
20
|
</ul>
|
20
21
|
</div>
|
@@ -67,10 +68,27 @@ twit.followers.each do |u|
|
|
67
68
|
end
|
68
69
|
</code></pre>
|
69
70
|
|
70
|
-
<h2>
|
71
|
+
<h2>Search API Examples</h2>
|
72
|
+
|
73
|
+
<pre><code>#searches all tweets for httparty
|
74
|
+
Twitter::Search.new('httparty').each { |r| puts r.inspect }
|
75
|
+
|
76
|
+
# searches all of jnunemaker's tweets for httparty
|
77
|
+
Twitter::Search.new('httparty').from('jnunemaker').each { |r| puts r.inspect }
|
78
|
+
|
79
|
+
# searches all tweets from jnunemaker to oaknd1
|
80
|
+
Twitter::Search.new.from('jnunemaker').to('oaknd1').each { |r| puts r.inspect }
|
71
81
|
|
82
|
+
# you can also use fetch to actually just get the parsed response
|
83
|
+
Twitter::Search.new.from('jnunemaker').to('oaknd1').fetch()
|
84
|
+
</code></pre>
|
85
|
+
|
86
|
+
<h2>Command Line</h2>
|
87
|
+
|
72
88
|
<p><img src="images/terminal_output.png" alt="Terminal Output" style="width:560px;" /></p>
|
73
89
|
|
90
|
+
<p><strong>Note: If you want to use twitter from the command line be sure that sqlite3 and the sqlite3-ruby gem are installed.</strong> I removed the sqlite3-ruby gem as a dependency because you shouldn't need that to just use the API wrapper. Eventually I'll move the CLI interface into another gem.</p>
|
91
|
+
|
74
92
|
<p>The first thing you'll want to do is install the database so your account(s) can be stored.</p>
|
75
93
|
|
76
94
|
<pre><code>$ twitter install</code></pre>
|
@@ -108,7 +126,7 @@ Account List
|
|
108
126
|
|
109
127
|
|
110
128
|
<h2>Support</h2>
|
111
|
-
<p>
|
129
|
+
<p>Conversations welcome in the <a href="http://groups.google.com/group/ruby-twitter-gem">google group</a> and bugs/features over at <a href="http://jnunemaker.lighthouseapp.com/projects/14843-twitter-gem/overview">lighthouse</a></p>
|
112
130
|
|
113
131
|
<h2>Uses</h2>
|
114
132
|
<ul>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dustin-twitter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-08-26 00:00:00 -07:00
|
13
13
|
default_executable: twitter
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -58,13 +58,13 @@ dependencies:
|
|
58
58
|
version: "2.1"
|
59
59
|
version:
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
61
|
+
name: httparty
|
62
62
|
version_requirement:
|
63
63
|
version_requirements: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - ">="
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: 1.
|
67
|
+
version: 0.1.0
|
68
68
|
version:
|
69
69
|
description: a command line interface for twitter, also a library which wraps the twitter api
|
70
70
|
email: nunemaker@gmail.com
|
@@ -77,14 +77,12 @@ extra_rdoc_files:
|
|
77
77
|
- License.txt
|
78
78
|
- Manifest.txt
|
79
79
|
- README.txt
|
80
|
-
- TODO.txt
|
81
80
|
files:
|
82
81
|
- History.txt
|
83
82
|
- License.txt
|
84
83
|
- Manifest.txt
|
85
84
|
- README.txt
|
86
85
|
- Rakefile
|
87
|
-
- TODO.txt
|
88
86
|
- bin/twitter
|
89
87
|
- config/hoe.rb
|
90
88
|
- config/requirements.rb
|
@@ -93,8 +91,11 @@ files:
|
|
93
91
|
- examples/favorites.rb
|
94
92
|
- examples/friends_followers.rb
|
95
93
|
- examples/friendships.rb
|
94
|
+
- examples/identica_timeline.rb
|
96
95
|
- examples/location.rb
|
96
|
+
- examples/posting.rb
|
97
97
|
- examples/replies.rb
|
98
|
+
- examples/search.rb
|
98
99
|
- examples/sent_messages.rb
|
99
100
|
- examples/timeline.rb
|
100
101
|
- examples/twitter.rb
|
@@ -114,6 +115,7 @@ files:
|
|
114
115
|
- lib/twitter/direct_message.rb
|
115
116
|
- lib/twitter/easy_class_maker.rb
|
116
117
|
- lib/twitter/rate_limit_status.rb
|
118
|
+
- lib/twitter/search.rb
|
117
119
|
- lib/twitter/status.rb
|
118
120
|
- lib/twitter/user.rb
|
119
121
|
- lib/twitter/version.rb
|
@@ -131,9 +133,11 @@ files:
|
|
131
133
|
- spec/fixtures/friends_timeline.xml
|
132
134
|
- spec/fixtures/public_timeline.xml
|
133
135
|
- spec/fixtures/rate_limit_status.xml
|
136
|
+
- spec/fixtures/search_results.json
|
134
137
|
- spec/fixtures/status.xml
|
135
138
|
- spec/fixtures/user.xml
|
136
139
|
- spec/fixtures/user_timeline.xml
|
140
|
+
- spec/search_spec.rb
|
137
141
|
- spec/spec.opts
|
138
142
|
- spec/spec_helper.rb
|
139
143
|
- spec/status_spec.rb
|
data/TODO.txt
DELETED