jlind-twitter 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/History +290 -0
  2. data/License +20 -0
  3. data/Notes +33 -0
  4. data/README.rdoc +19 -0
  5. data/Rakefile +40 -0
  6. data/VERSION.yml +5 -0
  7. data/examples/connect.rb +30 -0
  8. data/examples/friendship_existence.rb +13 -0
  9. data/examples/helpers/config_store.rb +38 -0
  10. data/examples/httpauth.rb +11 -0
  11. data/examples/ids.rb +13 -0
  12. data/examples/lists.rb +11 -0
  13. data/examples/oauth.rb +27 -0
  14. data/examples/search.rb +15 -0
  15. data/examples/timeline.rb +19 -0
  16. data/examples/tumblr.rb +9 -0
  17. data/examples/unauthorized.rb +16 -0
  18. data/examples/update.rb +11 -0
  19. data/examples/user.rb +5 -0
  20. data/lib/twitter.rb +156 -0
  21. data/lib/twitter/base.rb +390 -0
  22. data/lib/twitter/geo.rb +25 -0
  23. data/lib/twitter/httpauth.rb +53 -0
  24. data/lib/twitter/local_trends.rb +30 -0
  25. data/lib/twitter/oauth.rb +85 -0
  26. data/lib/twitter/request.rb +71 -0
  27. data/lib/twitter/search.rb +163 -0
  28. data/lib/twitter/trends.rb +55 -0
  29. data/test/fixtures/blocking.json +1632 -0
  30. data/test/fixtures/firehose.json +1 -0
  31. data/test/fixtures/follower_ids.json +1 -0
  32. data/test/fixtures/followers.json +1 -0
  33. data/test/fixtures/friend_ids.json +1 -0
  34. data/test/fixtures/friends_timeline.json +1 -0
  35. data/test/fixtures/friendship.json +1 -0
  36. data/test/fixtures/friendship_exists.json +1 -0
  37. data/test/fixtures/geo_place.json +1 -0
  38. data/test/fixtures/geo_reverse_geocode.json +1 -0
  39. data/test/fixtures/geo_reverse_geocode_granularity.json +1 -0
  40. data/test/fixtures/geo_reverse_geocode_limit.json +1 -0
  41. data/test/fixtures/geo_search.json +1 -0
  42. data/test/fixtures/geo_search_ip_address.json +1 -0
  43. data/test/fixtures/geo_search_query.json +1 -0
  44. data/test/fixtures/home_timeline.json +1 -0
  45. data/test/fixtures/ids.json +1 -0
  46. data/test/fixtures/list.json +1 -0
  47. data/test/fixtures/list_statuses.json +1 -0
  48. data/test/fixtures/list_statuses_1_1.json +1 -0
  49. data/test/fixtures/list_statuses_2_1.json +1 -0
  50. data/test/fixtures/list_subscriptions.json +1 -0
  51. data/test/fixtures/list_users.json +1 -0
  52. data/test/fixtures/lists.json +1 -0
  53. data/test/fixtures/memberships.json +1 -0
  54. data/test/fixtures/mentions.json +1 -0
  55. data/test/fixtures/not_found.json +1 -0
  56. data/test/fixtures/people_search.json +39 -0
  57. data/test/fixtures/rate_limit_exceeded.json +1 -0
  58. data/test/fixtures/report_spam.json +41 -0
  59. data/test/fixtures/retweet.json +1 -0
  60. data/test/fixtures/retweeted_by_me.json +1 -0
  61. data/test/fixtures/retweeted_to_me.json +1 -0
  62. data/test/fixtures/retweeters_of_tweet.json +166 -0
  63. data/test/fixtures/retweets.json +1 -0
  64. data/test/fixtures/retweets_of_me.json +1 -0
  65. data/test/fixtures/sample-image.png +0 -0
  66. data/test/fixtures/saved_search.json +7 -0
  67. data/test/fixtures/saved_searches.json +16 -0
  68. data/test/fixtures/search.json +1 -0
  69. data/test/fixtures/search_from_jnunemaker.json +1 -0
  70. data/test/fixtures/status.json +1 -0
  71. data/test/fixtures/status_show.json +1 -0
  72. data/test/fixtures/trends_available.json +253 -0
  73. data/test/fixtures/trends_current.json +1 -0
  74. data/test/fixtures/trends_current_exclude.json +1 -0
  75. data/test/fixtures/trends_daily.json +1925 -0
  76. data/test/fixtures/trends_daily_date.json +1 -0
  77. data/test/fixtures/trends_daily_exclude.json +1 -0
  78. data/test/fixtures/trends_location.json +57 -0
  79. data/test/fixtures/trends_weekly.json +1 -0
  80. data/test/fixtures/trends_weekly_date.json +1 -0
  81. data/test/fixtures/trends_weekly_exclude.json +1 -0
  82. data/test/fixtures/unauthorized.json +1 -0
  83. data/test/fixtures/update_profile_background_image.json +1 -0
  84. data/test/fixtures/update_profile_image.json +1 -0
  85. data/test/fixtures/user.json +1 -0
  86. data/test/fixtures/user_timeline.json +710 -0
  87. data/test/fixtures/users.json +1 -0
  88. data/test/test_helper.rb +47 -0
  89. data/test/twitter/base_test.rb +426 -0
  90. data/test/twitter/geo_test.rb +79 -0
  91. data/test/twitter/httpauth_test.rb +86 -0
  92. data/test/twitter/oauth_test.rb +127 -0
  93. data/test/twitter/request_test.rb +217 -0
  94. data/test/twitter/search_test.rb +208 -0
  95. data/test/twitter/trends_test.rb +112 -0
  96. data/test/twitter_test.rb +106 -0
  97. metadata +305 -0
@@ -0,0 +1,208 @@
1
+ require 'test_helper'
2
+
3
+ class SearchTest < Test::Unit::TestCase
4
+ context "searching" do
5
+ setup do
6
+ @search = Twitter::Search.new
7
+ end
8
+
9
+ should "should be able to initialize with a search term" do
10
+ Twitter::Search.new('httparty').query[:q].should include('httparty')
11
+ end
12
+
13
+ should "default user agent to Ruby Twitter Gem" do
14
+ search = Twitter::Search.new('foo')
15
+ search.user_agent.should == 'Ruby Twitter Gem'
16
+ end
17
+
18
+ should "allow overriding default user agent" do
19
+ search = Twitter::Search.new('foo', :user_agent => 'Foobar')
20
+ search.user_agent.should == 'Foobar'
21
+ end
22
+
23
+ should "pass user agent along with headers when making request" do
24
+ Twitter::Search.expects(:get).with('http://search.twitter.com/search.json', {:format => :json, :query => {:q => 'foo'}, :headers => {'User-Agent' => 'Foobar'}})
25
+ Twitter::Search.new('foo', :user_agent => 'Foobar').fetch()
26
+ end
27
+
28
+ should "should be able to specify from" do
29
+ @search.from('jnunemaker').query[:q].should include('from:jnunemaker')
30
+ end
31
+
32
+ should "should be able to specify not from" do
33
+ @search.from('jnunemaker',true).query[:q].should include('-from:jnunemaker')
34
+ end
35
+
36
+ should "should be able to specify to" do
37
+ @search.to('jnunemaker').query[:q].should include('to:jnunemaker')
38
+ end
39
+
40
+ should "should be able to specify not to" do
41
+ @search.to('jnunemaker',true).query[:q].should include('-to:jnunemaker')
42
+ end
43
+
44
+ should "should be able to specify not referencing" do
45
+ @search.referencing('jnunemaker',true).query[:q].should include('-@jnunemaker')
46
+ end
47
+
48
+ should "should alias references to referencing" do
49
+ @search.references('jnunemaker').query[:q].should include('@jnunemaker')
50
+ end
51
+
52
+ should "should alias ref to referencing" do
53
+ @search.ref('jnunemaker').query[:q].should include('@jnunemaker')
54
+ end
55
+
56
+ should "should be able to specify containing" do
57
+ @search.containing('milk').query[:q].should include('milk')
58
+ end
59
+
60
+ should "should be able to specify not containing" do
61
+ @search.containing('milk',true).query[:q].should include('-milk')
62
+ end
63
+
64
+ should "should alias contains to containing" do
65
+ @search.contains('milk').query[:q].should include('milk')
66
+ end
67
+
68
+ should "should be able to specify hashed" do
69
+ @search.hashed('twitter').query[:q].should include('#twitter')
70
+ end
71
+
72
+ should "should be able to specify not hashed" do
73
+ @search.hashed('twitter',true).query[:q].should include('-#twitter')
74
+ end
75
+
76
+ should "should be able to specify the language" do
77
+ @search.lang('en')
78
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => {:lang => 'en', :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
79
+ @search.fetch()
80
+ end
81
+
82
+ should "should be able to specify the number of results per page" do
83
+ @search.per_page(25)
84
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => {:rpp => 25, :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
85
+ @search.fetch()
86
+ end
87
+
88
+ should "should be able to specify the page number" do
89
+ @search.page(20)
90
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => {:page => 20, :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
91
+ @search.fetch()
92
+ end
93
+
94
+ should "should be able to specify only returning results greater than an id" do
95
+ @search.since(1234)
96
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => {:since_id => 1234, :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
97
+ @search.fetch()
98
+ end
99
+
100
+ should "should be able to specify since a date" do
101
+ @search.since_date('2009-04-14')
102
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => { :since => '2009-04-14', :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({ 'foo' => 'bar'})
103
+ @search.fetch
104
+ end
105
+
106
+ should "should be able to specify until a date" do
107
+ @search.until_date('2009-04-14')
108
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => { :until => '2009-04-14', :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({ 'foo' => 'bar'})
109
+ @search.fetch
110
+ end
111
+
112
+ should "should be able to specify geo coordinates" do
113
+ @search.geocode('40.757929', '-73.985506', '25mi')
114
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => {:geocode => '40.757929,-73.985506,25mi', :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
115
+ @search.fetch()
116
+ end
117
+
118
+ should "should be able to specify max id" do
119
+ @search.max(1234)
120
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => {:max_id => 1234, :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
121
+ @search.fetch()
122
+ end
123
+
124
+ should "should be able to set the phrase" do
125
+ @search.phrase("Who Dat")
126
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => {:phrase => "Who Dat", :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
127
+ @search.fetch()
128
+ end
129
+
130
+ should "should be able to set the result type" do
131
+ @search.result_type("popular")
132
+ @search.class.expects(:get).with('http://search.twitter.com/search.json', :query => {:result_type => 'popular', :q => ''}, :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
133
+ @search.fetch()
134
+ end
135
+
136
+ should "should be able to clear the filters set" do
137
+ @search.from('jnunemaker').to('oaknd1')
138
+ @search.clear.query.should == {:q => []}
139
+ end
140
+
141
+ should "should be able to chain methods together" do
142
+ @search.from('jnunemaker').to('oaknd1').referencing('orderedlist').containing('milk').hashed('twitter').lang('en').per_page(20).since(1234).geocode('40.757929', '-73.985506', '25mi')
143
+ @search.query[:q].should == ['from:jnunemaker', 'to:oaknd1', '@orderedlist', 'milk', '#twitter']
144
+ @search.query[:lang].should == 'en'
145
+ @search.query[:rpp].should == 20
146
+ @search.query[:since_id].should == 1234
147
+ @search.query[:geocode].should == '40.757929,-73.985506,25mi'
148
+ end
149
+
150
+ context "fetching" do
151
+ setup do
152
+ stub_get('http://search.twitter.com:80/search.json?q=%40jnunemaker', 'search.json')
153
+ @search = Twitter::Search.new('@jnunemaker')
154
+ @response = @search.fetch
155
+ end
156
+
157
+ should "should return results" do
158
+ @response.results.size.should == 15
159
+ end
160
+
161
+ should "should support dot notation" do
162
+ first = @response.results.first
163
+ first.text.should == %q(Someone asked about a tweet reader. Easy to do in ruby with @jnunemaker's twitter gem and the win32-sapi gem, if you are on windows.)
164
+ first.from_user.should == 'PatParslow'
165
+ end
166
+
167
+ should "cache fetched results so multiple fetches don't keep hitting api" do
168
+ Twitter::Search.expects(:get).never
169
+ @search.fetch
170
+ end
171
+
172
+ should "rehit api if fetch is called with true" do
173
+ Twitter::Search.expects(:get).once
174
+ @search.fetch(true)
175
+ end
176
+
177
+ should "tell if another page is available" do
178
+ @search.next_page?.should == true
179
+ end
180
+
181
+ should "be able to fetch the next page" do
182
+ Twitter::Search.expects(:get).with('http://search.twitter.com/search.json', :query => 'page=2&max_id=1446791544&q=%40jnunemaker', :format => :json, :headers => {'User-Agent' => 'Ruby Twitter Gem'}).returns({'foo' => 'bar'})
183
+ @search.fetch_next_page
184
+ end
185
+ end
186
+
187
+ context "iterating over results" do
188
+ setup do
189
+ stub_get('http://search.twitter.com:80/search.json?q=from%3Ajnunemaker', 'search_from_jnunemaker.json')
190
+ @search.from('jnunemaker')
191
+ end
192
+
193
+ should "work" do
194
+ @search.each { |result| result.should_not be(nil) }
195
+ end
196
+
197
+ should "work multiple times in a row" do
198
+ @search.each { |result| result.should_not be(nil) }
199
+ @search.each { |result| result.should_not be(nil) }
200
+ end
201
+ end
202
+
203
+ should "should be able to iterate over results" do
204
+ @search.respond_to?(:each).should be(true)
205
+ end
206
+ end
207
+
208
+ end
@@ -0,0 +1,112 @@
1
+ require 'test_helper'
2
+
3
+ class TrendsTest < Test::Unit::TestCase
4
+ include Twitter
5
+
6
+ context "Getting current trends" do
7
+ should "work" do
8
+ stub_get 'http://search.twitter.com:80/trends/current.json', 'trends_current.json'
9
+ trends = Trends.current
10
+ trends.size.should == 10
11
+ trends[0].name.should == '#musicmonday'
12
+ trends[0].query.should == '#musicmonday'
13
+ trends[1].name.should == '#newdivide'
14
+ trends[1].query.should == '#newdivide'
15
+ end
16
+
17
+ should "be able to exclude hashtags" do
18
+ stub_get 'http://search.twitter.com:80/trends/current.json?exclude=hashtags', 'trends_current_exclude.json'
19
+ trends = Trends.current(:exclude => 'hashtags')
20
+ trends.size.should == 10
21
+ trends[0].name.should == 'New Divide'
22
+ trends[0].query.should == %Q(\"New Divide\")
23
+ trends[1].name.should == 'Star Trek'
24
+ trends[1].query.should == %Q(\"Star Trek\")
25
+ end
26
+ end
27
+
28
+ context "Getting daily trends" do
29
+ should "work" do
30
+ stub_get 'http://search.twitter.com:80/trends/daily.json?', 'trends_daily.json'
31
+ trends = Trends.daily
32
+ trends.size.should == 480
33
+ trends[0].name.should == '#3turnoffwords'
34
+ trends[0].query.should == '#3turnoffwords'
35
+ end
36
+
37
+ should "be able to exclude hastags" do
38
+ stub_get 'http://search.twitter.com:80/trends/daily.json?exclude=hashtags', 'trends_daily_exclude.json'
39
+ trends = Trends.daily(:exclude => 'hashtags')
40
+ trends.size.should == 480
41
+ trends[0].name.should == 'Kobe'
42
+ trends[0].query.should == %Q(Kobe)
43
+ end
44
+
45
+ should "be able to get for specific date (with date string)" do
46
+ stub_get 'http://search.twitter.com:80/trends/daily.json?date=2009-05-01', 'trends_daily_date.json'
47
+ trends = Trends.daily(:date => '2009-05-01')
48
+ trends.size.should == 440
49
+ trends[0].name.should == 'Swine Flu'
50
+ trends[0].query.should == %Q(\"Swine Flu\" OR Flu)
51
+ end
52
+
53
+ should "be able to get for specific date (with date object)" do
54
+ stub_get 'http://search.twitter.com:80/trends/daily.json?date=2009-05-01', 'trends_daily_date.json'
55
+ trends = Trends.daily(:date => Date.new(2009, 5, 1))
56
+ trends.size.should == 440
57
+ trends[0].name.should == 'Swine Flu'
58
+ trends[0].query.should == %Q(\"Swine Flu\" OR Flu)
59
+ end
60
+ end
61
+
62
+ context "Getting weekly trends" do
63
+ should "work" do
64
+ stub_get 'http://search.twitter.com:80/trends/weekly.json?', 'trends_weekly.json'
65
+ trends = Trends.weekly
66
+ trends.size.should == 210
67
+ trends[0].name.should == 'Happy Mothers Day'
68
+ trends[0].query.should == %Q(\"Happy Mothers Day\" OR \"Mothers Day\")
69
+ end
70
+
71
+ should "be able to exclude hastags" do
72
+ stub_get 'http://search.twitter.com:80/trends/weekly.json?exclude=hashtags', 'trends_weekly_exclude.json'
73
+ trends = Trends.weekly(:exclude => 'hashtags')
74
+ trends.size.should == 210
75
+ trends[0].name.should == 'Happy Mothers Day'
76
+ trends[0].query.should == %Q(\"Happy Mothers Day\" OR \"Mothers Day\")
77
+ end
78
+
79
+ should "be able to get for specific date (with date string)" do
80
+ stub_get 'http://search.twitter.com:80/trends/weekly.json?date=2009-05-01', 'trends_weekly_date.json'
81
+ trends = Trends.weekly(:date => '2009-05-01')
82
+ trends.size.should == 210
83
+ trends[0].name.should == 'TGIF'
84
+ trends[0].query.should == 'TGIF'
85
+ end
86
+
87
+ should "be able to get for specific date (with date object)" do
88
+ stub_get 'http://search.twitter.com:80/trends/weekly.json?date=2009-05-01', 'trends_weekly_date.json'
89
+ trends = Trends.weekly(:date => Date.new(2009, 5, 1))
90
+ trends.size.should == 210
91
+ trends[0].name.should == 'TGIF'
92
+ trends[0].query.should == 'TGIF'
93
+ end
94
+ end
95
+
96
+ context "Getting local trends" do
97
+
98
+ should "return a list of available locations" do
99
+ stub_get 'http://api.twitter.com/1/trends/available.json?lat=33.237593417&lng=-96.960559033', 'trends_available.json'
100
+ locations = Trends.available(:lat => 33.237593417, :lng => -96.960559033)
101
+ locations.first.country.should == 'Ireland'
102
+ locations.first.placeType.code.should == 12
103
+ end
104
+
105
+ should "return a list of trends for a given location" do
106
+ stub_get 'http://api.twitter.com/1/trends/2487956.json', 'trends_location.json'
107
+ trends = Trends.for_location(2487956).first.trends
108
+ trends.last.name.should == 'Gmail'
109
+ end
110
+ end
111
+
112
+ end
@@ -0,0 +1,106 @@
1
+ require 'test_helper'
2
+
3
+ class TwitterTest < Test::Unit::TestCase
4
+ should "have firehose method for public timeline" do
5
+ stub_get('http://api.twitter.com:80/1/statuses/public_timeline.json', 'firehose.json')
6
+ hose = Twitter.firehose
7
+ hose.size.should == 20
8
+ first = hose.first
9
+ first.text.should == '#torrents Ultimativer Flirt Guide - In 10 Minuten jede Frau erobern: Ultimativer Flirt Guide - In 10 Mi.. http://tinyurl.com/d3okh4'
10
+ first.user.name.should == 'P2P Torrents'
11
+ end
12
+
13
+ should "have user method for unauthenticated calls to get a user's information" do
14
+ stub_get('http://api.twitter.com:80/1/users/show/jnunemaker.json', 'user.json')
15
+ user = Twitter.user('jnunemaker')
16
+ user.name.should == 'John Nunemaker'
17
+ user.description.should == 'Loves his wife, ruby, notre dame football and iu basketball'
18
+ end
19
+
20
+ should "have status method for unauthenticated calls to get a status" do
21
+ stub_get('http://api.twitter.com:80/1/statuses/show/1533815199.json', 'status_show.json')
22
+ status = Twitter.status(1533815199)
23
+ status.id.should == 1533815199
24
+ status.text.should == 'Eating some oatmeal and butterscotch cookies with a cold glass of milk for breakfast. Tasty!'
25
+ end
26
+
27
+ should "raise NotFound for unauthenticated calls to get a deleted or nonexistent status" do
28
+ stub_get('http://api.twitter.com:80/1/statuses/show/1.json', 'not_found.json', 404)
29
+ lambda {
30
+ Twitter.status(1)
31
+ }.should raise_error(Twitter::NotFound)
32
+ end
33
+
34
+ should "have a timeline method for unauthenticated calls to get a user's timeline" do
35
+ stub_get('http://api.twitter.com:80/1/statuses/user_timeline/jnunemaker.json', 'user_timeline.json')
36
+ statuses = Twitter.timeline('jnunemaker')
37
+ statuses.first.id.should == 1445986256
38
+ statuses.first.user.screen_name.should == 'jnunemaker'
39
+ end
40
+
41
+ should "raise Unauthorized for unauthenticated calls to get a protected user's timeline" do
42
+ stub_get('http://api.twitter.com:80/1/statuses/user_timeline/protected.json', 'unauthorized.json', 401)
43
+ lambda {
44
+ Twitter.timeline('protected')
45
+ }.should raise_error(Twitter::Unauthorized)
46
+ end
47
+
48
+ should "have friend_ids method" do
49
+ stub_get('http://api.twitter.com:80/1/friends/ids/jnunemaker.json', 'friend_ids.json')
50
+ ids = Twitter.friend_ids('jnunemaker')
51
+ ids.size.should == 161
52
+ end
53
+
54
+ should "raise Unauthorized for unauthenticated calls to get a protected user's friend_ids" do
55
+ stub_get('http://api.twitter.com:80/1/friends/ids/protected.json', 'unauthorized.json', 401)
56
+ lambda {
57
+ Twitter.friend_ids('protected')
58
+ }.should raise_error(Twitter::Unauthorized)
59
+ end
60
+
61
+ should "have follower_ids method" do
62
+ stub_get('http://api.twitter.com:80/1/followers/ids/jnunemaker.json', 'follower_ids.json')
63
+ ids = Twitter.follower_ids('jnunemaker')
64
+ ids.size.should == 1252
65
+ end
66
+
67
+ should "raise Unauthorized for unauthenticated calls to get a protected user's follower_ids" do
68
+ stub_get('http://api.twitter.com:80/1/followers/ids/protected.json', 'unauthorized.json', 401)
69
+ lambda {
70
+ Twitter.follower_ids('protected')
71
+ }.should raise_error(Twitter::Unauthorized)
72
+ end
73
+
74
+ context "when using lists" do
75
+
76
+ should "be able to view list timeline" do
77
+ stub_get('http://api.twitter.com:80/1/pengwynn/lists/rubyists/statuses.json', 'list_statuses.json')
78
+ tweets = Twitter.list_timeline('pengwynn', 'rubyists')
79
+ tweets.size.should == 20
80
+ tweets.first.id.should == 5272535583
81
+ tweets.first.user.name.should == 'John Nunemaker'
82
+ end
83
+
84
+ should "be able to limit number of tweets in list timeline" do
85
+ stub_get('http://api.twitter.com:80/1/pengwynn/lists/rubyists/statuses.json?per_page=1', 'list_statuses_1_1.json')
86
+ tweets = Twitter.list_timeline('pengwynn', 'rubyists', :per_page => 1)
87
+ tweets.size.should == 1
88
+ tweets.first.id.should == 5272535583
89
+ tweets.first.user.name.should == 'John Nunemaker'
90
+ end
91
+
92
+ should "be able to paginate through the timeline" do
93
+ stub_get('http://api.twitter.com:80/1/pengwynn/lists/rubyists/statuses.json?page=1&per_page=1', 'list_statuses_1_1.json')
94
+ stub_get('http://api.twitter.com:80/1/pengwynn/lists/rubyists/statuses.json?page=2&per_page=1', 'list_statuses_2_1.json')
95
+ tweets = Twitter.list_timeline('pengwynn', 'rubyists', { :page => 1, :per_page => 1 })
96
+ tweets.size.should == 1
97
+ tweets.first.id.should == 5272535583
98
+ tweets.first.user.name.should == 'John Nunemaker'
99
+ tweets = Twitter.list_timeline('pengwynn', 'rubyists', { :page => 2, :per_page => 1 })
100
+ tweets.size.should == 1
101
+ tweets.first.id.should == 5264324712
102
+ tweets.first.user.name.should == 'John Nunemaker'
103
+ end
104
+
105
+ end
106
+ end
metadata ADDED
@@ -0,0 +1,305 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jlind-twitter
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 9
8
+ - 9
9
+ version: 0.9.9
10
+ platform: ruby
11
+ authors:
12
+ - John Nunemaker
13
+ - Wynn Netherland
14
+ - Joe Lind
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2010-07-15 00:00:00 -04:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: oauth
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ segments:
30
+ - 0
31
+ - 4
32
+ - 1
33
+ version: 0.4.1
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: hashie
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 0
45
+ - 2
46
+ - 0
47
+ version: 0.2.0
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: httparty
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
59
+ - 6
60
+ - 1
61
+ version: 0.6.1
62
+ type: :runtime
63
+ version_requirements: *id003
64
+ - !ruby/object:Gem::Dependency
65
+ name: yajl-ruby
66
+ prerelease: false
67
+ requirement: &id004 !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ~>
70
+ - !ruby/object:Gem::Version
71
+ segments:
72
+ - 0
73
+ - 7
74
+ - 0
75
+ version: 0.7.0
76
+ type: :runtime
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: shoulda
80
+ prerelease: false
81
+ requirement: &id005 !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ segments:
86
+ - 2
87
+ - 10
88
+ - 0
89
+ version: 2.10.0
90
+ type: :development
91
+ version_requirements: *id005
92
+ - !ruby/object:Gem::Dependency
93
+ name: jnunemaker-matchy
94
+ prerelease: false
95
+ requirement: &id006 !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ~>
98
+ - !ruby/object:Gem::Version
99
+ segments:
100
+ - 0
101
+ - 4
102
+ - 0
103
+ version: 0.4.0
104
+ type: :development
105
+ version_requirements: *id006
106
+ - !ruby/object:Gem::Dependency
107
+ name: mocha
108
+ prerelease: false
109
+ requirement: &id007 !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ~>
112
+ - !ruby/object:Gem::Version
113
+ segments:
114
+ - 0
115
+ - 9
116
+ - 0
117
+ version: 0.9.0
118
+ type: :development
119
+ version_requirements: *id007
120
+ - !ruby/object:Gem::Dependency
121
+ name: fakeweb
122
+ prerelease: false
123
+ requirement: &id008 !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ~>
126
+ - !ruby/object:Gem::Version
127
+ segments:
128
+ - 1
129
+ - 2
130
+ - 0
131
+ version: 1.2.0
132
+ type: :development
133
+ version_requirements: *id008
134
+ - !ruby/object:Gem::Dependency
135
+ name: redgreen
136
+ prerelease: false
137
+ requirement: &id009 !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ segments:
142
+ - 1
143
+ - 2
144
+ - 2
145
+ version: 1.2.2
146
+ type: :development
147
+ version_requirements: *id009
148
+ description:
149
+ email: joelind@gmail.com
150
+ executables: []
151
+
152
+ extensions: []
153
+
154
+ extra_rdoc_files:
155
+ - README.rdoc
156
+ files:
157
+ - History
158
+ - License
159
+ - Notes
160
+ - README.rdoc
161
+ - Rakefile
162
+ - VERSION.yml
163
+ - examples/connect.rb
164
+ - examples/friendship_existence.rb
165
+ - examples/helpers/config_store.rb
166
+ - examples/httpauth.rb
167
+ - examples/ids.rb
168
+ - examples/lists.rb
169
+ - examples/oauth.rb
170
+ - examples/search.rb
171
+ - examples/timeline.rb
172
+ - examples/tumblr.rb
173
+ - examples/unauthorized.rb
174
+ - examples/update.rb
175
+ - examples/user.rb
176
+ - lib/twitter.rb
177
+ - lib/twitter/base.rb
178
+ - lib/twitter/geo.rb
179
+ - lib/twitter/httpauth.rb
180
+ - lib/twitter/local_trends.rb
181
+ - lib/twitter/oauth.rb
182
+ - lib/twitter/request.rb
183
+ - lib/twitter/search.rb
184
+ - lib/twitter/trends.rb
185
+ - test/fixtures/blocking.json
186
+ - test/fixtures/firehose.json
187
+ - test/fixtures/follower_ids.json
188
+ - test/fixtures/followers.json
189
+ - test/fixtures/friend_ids.json
190
+ - test/fixtures/friends_timeline.json
191
+ - test/fixtures/friendship.json
192
+ - test/fixtures/friendship_exists.json
193
+ - test/fixtures/geo_place.json
194
+ - test/fixtures/geo_reverse_geocode.json
195
+ - test/fixtures/geo_reverse_geocode_granularity.json
196
+ - test/fixtures/geo_reverse_geocode_limit.json
197
+ - test/fixtures/geo_search.json
198
+ - test/fixtures/geo_search_ip_address.json
199
+ - test/fixtures/geo_search_query.json
200
+ - test/fixtures/home_timeline.json
201
+ - test/fixtures/ids.json
202
+ - test/fixtures/list.json
203
+ - test/fixtures/list_statuses.json
204
+ - test/fixtures/list_statuses_1_1.json
205
+ - test/fixtures/list_statuses_2_1.json
206
+ - test/fixtures/list_subscriptions.json
207
+ - test/fixtures/list_users.json
208
+ - test/fixtures/lists.json
209
+ - test/fixtures/memberships.json
210
+ - test/fixtures/mentions.json
211
+ - test/fixtures/not_found.json
212
+ - test/fixtures/people_search.json
213
+ - test/fixtures/rate_limit_exceeded.json
214
+ - test/fixtures/report_spam.json
215
+ - test/fixtures/retweet.json
216
+ - test/fixtures/retweeted_by_me.json
217
+ - test/fixtures/retweeted_to_me.json
218
+ - test/fixtures/retweeters_of_tweet.json
219
+ - test/fixtures/retweets.json
220
+ - test/fixtures/retweets_of_me.json
221
+ - test/fixtures/sample-image.png
222
+ - test/fixtures/saved_search.json
223
+ - test/fixtures/saved_searches.json
224
+ - test/fixtures/search.json
225
+ - test/fixtures/search_from_jnunemaker.json
226
+ - test/fixtures/status.json
227
+ - test/fixtures/status_show.json
228
+ - test/fixtures/trends_available.json
229
+ - test/fixtures/trends_current.json
230
+ - test/fixtures/trends_current_exclude.json
231
+ - test/fixtures/trends_daily.json
232
+ - test/fixtures/trends_daily_date.json
233
+ - test/fixtures/trends_daily_exclude.json
234
+ - test/fixtures/trends_location.json
235
+ - test/fixtures/trends_weekly.json
236
+ - test/fixtures/trends_weekly_date.json
237
+ - test/fixtures/trends_weekly_exclude.json
238
+ - test/fixtures/unauthorized.json
239
+ - test/fixtures/update_profile_background_image.json
240
+ - test/fixtures/update_profile_image.json
241
+ - test/fixtures/user.json
242
+ - test/fixtures/user_timeline.json
243
+ - test/fixtures/users.json
244
+ - test/test_helper.rb
245
+ - test/twitter/base_test.rb
246
+ - test/twitter/geo_test.rb
247
+ - test/twitter/httpauth_test.rb
248
+ - test/twitter/oauth_test.rb
249
+ - test/twitter/request_test.rb
250
+ - test/twitter/search_test.rb
251
+ - test/twitter/trends_test.rb
252
+ - test/twitter_test.rb
253
+ has_rdoc: true
254
+ homepage: http://github.com/joelind/twitter
255
+ licenses: []
256
+
257
+ post_install_message:
258
+ rdoc_options:
259
+ - --charset=UTF-8
260
+ require_paths:
261
+ - lib
262
+ required_ruby_version: !ruby/object:Gem::Requirement
263
+ requirements:
264
+ - - ">="
265
+ - !ruby/object:Gem::Version
266
+ segments:
267
+ - 0
268
+ version: "0"
269
+ required_rubygems_version: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - ">="
272
+ - !ruby/object:Gem::Version
273
+ segments:
274
+ - 0
275
+ version: "0"
276
+ requirements: []
277
+
278
+ rubyforge_project:
279
+ rubygems_version: 1.3.6
280
+ signing_key:
281
+ specification_version: 3
282
+ summary: wrapper for the twitter api
283
+ test_files:
284
+ - test/test_helper.rb
285
+ - test/twitter/base_test.rb
286
+ - test/twitter/geo_test.rb
287
+ - test/twitter/httpauth_test.rb
288
+ - test/twitter/oauth_test.rb
289
+ - test/twitter/request_test.rb
290
+ - test/twitter/search_test.rb
291
+ - test/twitter/trends_test.rb
292
+ - test/twitter_test.rb
293
+ - examples/connect.rb
294
+ - examples/friendship_existence.rb
295
+ - examples/helpers/config_store.rb
296
+ - examples/httpauth.rb
297
+ - examples/ids.rb
298
+ - examples/lists.rb
299
+ - examples/oauth.rb
300
+ - examples/search.rb
301
+ - examples/timeline.rb
302
+ - examples/tumblr.rb
303
+ - examples/unauthorized.rb
304
+ - examples/update.rb
305
+ - examples/user.rb