twitter 4.0.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +12 -1
- data/README.md +108 -113
- data/lib/twitter/api.rb +57 -11
- data/lib/twitter/error/{rate_limited.rb → too_many_requests.rb} +3 -2
- data/lib/twitter/error/unprocessable_entity.rb +10 -0
- data/lib/twitter/response/raise_error.rb +2 -1
- data/lib/twitter/tweet.rb +7 -0
- data/lib/twitter/user.rb +32 -9
- data/lib/twitter/version.rb +1 -1
- data/spec/fixtures/empty.json +0 -0
- data/spec/fixtures/lists.json +1 -1
- data/spec/fixtures/memberships.json +1 -0
- data/spec/fixtures/sferik.json +1 -1
- data/spec/fixtures/subscriptions.json +1 -0
- data/spec/twitter/api/account_spec.rb +32 -0
- data/spec/twitter/api/lists_spec.rb +8 -11
- data/spec/twitter/tweet_spec.rb +11 -0
- data/spec/twitter/user_spec.rb +118 -6
- metadata +10 -3
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
4.1.0
|
2
|
+
-----
|
3
|
+
* [Handle new API v1.1 list response format](https://github.com/sferik/twitter/commit/2aace25fcf946de995e5ce1788f24ad35bc79438)
|
4
|
+
|
1
5
|
4.0.0
|
2
6
|
-----
|
3
7
|
* [Update all endpoints to Twitter API v1.1](https://github.com/sferik/twitter/commit/f55471a03dd0a428d5c0aa57a3c34809dbfde5cf)
|
@@ -15,7 +19,6 @@
|
|
15
19
|
* [Remove notification methods; use `Twitter::API#friendship_update` instead](https://github.com/sferik/twitter/commit/3b2d2b86599b4d054e7daa0d69b5e088cd776450)
|
16
20
|
* [Remove `Twitter::API#end_session`](https://github.com/sferik/twitter/commit/23668bc68209a032e9193ade1cdf6d8462980954)
|
17
21
|
* [Add `Twitter::Tweet#retweet?` method and `Twitter::Tweet#retweet` alias](https://github.com/sferik/twitter/commit/1e6ad051f488cae7bf18a45eea8008b448323fe4)
|
18
|
-
* [Do not attempt to parse redirects](https://github.com/sferik/twitter/commit/282971088c0942e38bcd3635d3cf8cd05da5d1c4) ([@twoism](http://twitter.com/twoism))
|
19
22
|
* [Major changes for Twitter API v1.1](https://github.com/sferik/twitter/commit/eab13be653c1b54aa679dbf16f252a2b6977b80e)
|
20
23
|
* [Remove `Twitter::API#no_retweet_ids`](https://github.com/sferik/twitter/commit/e179ab6d81c1c4931b67940463f414693671fb96)
|
21
24
|
* [Remove `Twitter::API#retweeted_to_user`](https://github.com/sferik/twitter/commit/e179ab6d81c1c4931b67940463f414693671fb96)
|
@@ -30,6 +33,14 @@
|
|
30
33
|
* [Remove `Twitter::API#recommendations`](https://github.com/sferik/twitter/commit/e4bcec169faafb78772e60d6cdeb5583a40f32e3)
|
31
34
|
* [Remove `Twitter::API#network_timeline`](https://github.com/sferik/twitter/commit/93c65f25eafb3051a86140ab7e980d03431040f1)
|
32
35
|
|
36
|
+
3.8.0
|
37
|
+
-----
|
38
|
+
* [Do not attempt to parse redirects](https://github.com/sferik/twitter/commit/30ee1c733cfea091f60b18a51d01eab1d0cc6f30) ([@twoism](http://twitter.com/twoism))
|
39
|
+
* [Add profile banner methods to `Twitter::User` class](https://github.com/sferik/twitter/commit/d0200d72e71639ad3e7f7e2b7243889f2f39e8b3)
|
40
|
+
* [Add `Twitter::Error::UnprocessableEntity`](https://github.com/sferik/twitter/commit/fca4d174e8237655c82992edf67fcc846497fd54)
|
41
|
+
* [Add `Twitter::API#update_profile_banner` and `Twitter::API#remove_profile_banner`](https://github.com/sferik/twitter/commit/74b17f58549b06885ab49c56271cb571886e67f0)
|
42
|
+
* [Add `Twitter::Tweet#reply?`](https://github.com/sferik/twitter/commit/029d815815c99a7921a9b396c6c45b9f4cbd8fc3)
|
43
|
+
|
33
44
|
3.7.0
|
34
45
|
-----
|
35
46
|
* [Remove support for `IO` hash syntax](https://github.com/sferik/twitter/commit/bfe842d714a77b8edda90d0e2b547be434dc0148)
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
[gemnasium]: https://gemnasium.com/sferik/twitter
|
8
8
|
[codeclimate]: https://codeclimate.com/github/sferik/twitter
|
9
9
|
|
10
|
-
|
10
|
+
A Ruby interface to the Twitter API.
|
11
11
|
|
12
12
|
## Installation
|
13
13
|
```sh
|
@@ -63,7 +63,7 @@ Twitter:
|
|
63
63
|
|
64
64
|
Despite the removal of certain underlying functionality in Twitter API v1.1,
|
65
65
|
this library aims to preserve backward-compatibility wherever possible. For
|
66
|
-
example, despite the
|
66
|
+
example, despite the removal of the [`GET
|
67
67
|
statuses/retweeted_by_user`][retweeted_by_user] resource, the
|
68
68
|
`Twitter::API#retweeted_by_user` method continues to exist, implemented by
|
69
69
|
making multiple requests to the [`GET statuses/user_timeline`][user_timeline]
|
@@ -94,7 +94,7 @@ num_attempts = 0
|
|
94
94
|
begin
|
95
95
|
num_attempts += 1
|
96
96
|
retweets = Twitter.retweeted_by_user("sferik")
|
97
|
-
rescue Twitter::Error::
|
97
|
+
rescue Twitter::Error::TooManyRequests => error
|
98
98
|
if num_attempts <= MAX_ATTEMPTS
|
99
99
|
# NOTE: Your process could go to sleep for up to 15 minutes but if you
|
100
100
|
# retry any sooner, it will almost certainly fail with the same exception.
|
@@ -136,17 +136,18 @@ removed.
|
|
136
136
|
|
137
137
|
### Errors
|
138
138
|
|
139
|
-
It's worth mentioning
|
139
|
+
It's worth mentioning new error classes:
|
140
140
|
|
141
141
|
* `Twitter::Error::GatewayTimeout`
|
142
|
-
* `Twitter::Error::
|
142
|
+
* `Twitter::Error::TooManyRequests`
|
143
|
+
* `Twitter::Error::UnprocessableEntity`
|
143
144
|
|
144
145
|
In previous versions of this library, rate limit errors were indicated by
|
145
146
|
raising either `Twitter::Error::BadRequest` or
|
146
147
|
`Twitter::Error::EnhanceYourCalm` (for the Search API). As of version 4, the
|
147
|
-
library will raise `Twitter::Error::
|
148
|
-
`Twitter::Error::EnhanceYourCalm` class has been aliased to
|
149
|
-
`Twitter::Error::
|
148
|
+
library will raise `Twitter::Error::TooManyRequests` for all rate limit errors.
|
149
|
+
The `Twitter::Error::EnhanceYourCalm` class has been aliased to
|
150
|
+
`Twitter::Error::TooManyRequests`.
|
150
151
|
|
151
152
|
### Identity Map
|
152
153
|
|
@@ -164,8 +165,25 @@ Twitter.identity_map = Twitter::IdentityMap
|
|
164
165
|
|
165
166
|
## Configuration
|
166
167
|
|
167
|
-
|
168
|
-
|
168
|
+
Twitter API v1.1 requires you to authenticate via OAuth, so you'll need a
|
169
|
+
registered Twitter application. To register a new application, sign-in using
|
170
|
+
your Twitter account and the fill out the form at
|
171
|
+
http://dev.twitter.com/apps/new. If you've previously registered a Twitter
|
172
|
+
application, it will be listed at http://dev.twitter.com/apps. Once you've
|
173
|
+
registered an application, make sure to set the correct access level, otherwise
|
174
|
+
you may see the error:
|
175
|
+
|
176
|
+
Read-only application cannot POST
|
177
|
+
|
178
|
+
Your new application will be assigned a consumer key/secret pair and you will
|
179
|
+
be assigned an OAuth access token/secret pair for that application. You'll need
|
180
|
+
to configure these values before you make a request or else you'll get the
|
181
|
+
error:
|
182
|
+
|
183
|
+
Bad Authentication data
|
184
|
+
|
185
|
+
Applications that make requests on behalf of a single Twitter user can pass
|
186
|
+
global configuration options as a block to the `Twitter.configure` method.
|
169
187
|
|
170
188
|
```ruby
|
171
189
|
Twitter.configure do |config|
|
@@ -191,14 +209,12 @@ After configuration, requests can be made like so:
|
|
191
209
|
Twitter.update("I'm tweeting with @gem!")
|
192
210
|
```
|
193
211
|
|
194
|
-
###
|
212
|
+
### Thread Safety
|
195
213
|
|
196
214
|
Applications that make requests on behalf of multiple Twitter users should
|
197
|
-
avoid using global configuration.
|
198
|
-
|
199
|
-
|
200
|
-
You can still specify the `consumer_key` and `consumer_secret` globally. (In a
|
201
|
-
Rails application, this could go in `config/initiliazers/twitter.rb`.)
|
215
|
+
avoid using global configuration. In this case, you may still specify the
|
216
|
+
`consumer_key` and `consumer_secret` globally. (In a Rails application, this
|
217
|
+
could go in `config/initiliazers/twitter.rb`.)
|
202
218
|
|
203
219
|
```ruby
|
204
220
|
Twitter.configure do |config|
|
@@ -207,25 +223,26 @@ Twitter.configure do |config|
|
|
207
223
|
end
|
208
224
|
```
|
209
225
|
|
210
|
-
Then, for each user's token/secret pair, instantiate a
|
226
|
+
Then, for each user's access token/secret pair, instantiate a
|
227
|
+
`Twitter::Client`:
|
211
228
|
|
212
229
|
```ruby
|
213
|
-
@
|
214
|
-
:oauth_token => "Erik's
|
215
|
-
:oauth_token_secret => "Erik's
|
230
|
+
@client_erik = Twitter::Client.new(
|
231
|
+
:oauth_token => "Erik's access token",
|
232
|
+
:oauth_token_secret => "Erik's access secret"
|
216
233
|
)
|
217
234
|
|
218
|
-
@
|
219
|
-
:oauth_token => "John's
|
220
|
-
:oauth_token_secret => "John's
|
235
|
+
@client_john = Twitter::Client.new(
|
236
|
+
:oauth_token => "John's access token",
|
237
|
+
:oauth_token_secret => "John's access secret"
|
221
238
|
)
|
222
239
|
```
|
223
240
|
|
224
|
-
You can now make threadsafe requests as the authenticated user
|
241
|
+
You can now make threadsafe requests as the authenticated user:
|
225
242
|
|
226
243
|
```ruby
|
227
|
-
@
|
228
|
-
@
|
244
|
+
Thread.new{@client_erik.update("Tweeting as Erik!")}
|
245
|
+
Thread.new{@client_john.update("Tweeting as John!")}
|
229
246
|
```
|
230
247
|
|
231
248
|
Or, if you prefer, you can specify all configuration options when instantiating
|
@@ -233,10 +250,10 @@ a `Twitter::Client`:
|
|
233
250
|
|
234
251
|
```ruby
|
235
252
|
@client = Twitter::Client.new(
|
236
|
-
:consumer_key => "
|
237
|
-
:consumer_secret => "
|
238
|
-
:oauth_token => "a user's
|
239
|
-
:oauth_token_secret => "a user's
|
253
|
+
:consumer_key => "an application's consumer key",
|
254
|
+
:consumer_secret => "an application's consumer secret",
|
255
|
+
:oauth_token => "a user's access token",
|
256
|
+
:oauth_token_secret => "a user's access secret"
|
240
257
|
)
|
241
258
|
```
|
242
259
|
|
@@ -263,38 +280,66 @@ Twitter.middleware = Faraday::Builder.new(
|
|
263
280
|
```
|
264
281
|
|
265
282
|
## Usage Examples
|
266
|
-
|
283
|
+
All examples require an authenticated Twitter client. See the section on <a
|
284
|
+
href="#configuration">configuration</a> above.
|
285
|
+
|
286
|
+
**Tweet (as the authenticated user)**
|
287
|
+
|
267
288
|
```ruby
|
268
|
-
Twitter.
|
289
|
+
Twitter.update("I'm tweeting with @gem!")
|
269
290
|
```
|
270
|
-
|
291
|
+
**Follow a user (by screen name or user ID)**
|
292
|
+
|
271
293
|
```ruby
|
272
|
-
Twitter.
|
294
|
+
Twitter.follow("gem")
|
295
|
+
Twitter.follow(213747670)
|
273
296
|
```
|
274
|
-
|
297
|
+
**Fetch a user (by screen name or user ID)**
|
298
|
+
|
275
299
|
```ruby
|
276
|
-
Twitter.
|
300
|
+
Twitter.user("gem")
|
301
|
+
Twitter.user(213747670)
|
277
302
|
```
|
278
|
-
|
303
|
+
**Fetch the timeline of Tweets by a user**
|
304
|
+
|
279
305
|
```ruby
|
280
|
-
Twitter.
|
281
|
-
|
282
|
-
end
|
306
|
+
Twitter.user_timeline("gem")
|
307
|
+
Twitter.user_timeline(213747670)
|
283
308
|
```
|
284
|
-
|
309
|
+
**Fetch the timeline of Tweets from the authenticated user's home page**
|
310
|
+
|
285
311
|
```ruby
|
286
|
-
Twitter.
|
312
|
+
Twitter.home_timeline
|
287
313
|
```
|
288
|
-
|
314
|
+
**Fetch the timeline of Tweets mentioning the authenticated user**
|
315
|
+
|
289
316
|
```ruby
|
290
|
-
Twitter.
|
317
|
+
Twitter.mentions_timeline
|
291
318
|
```
|
292
|
-
|
319
|
+
**Fetch a particular Tweet by ID**
|
320
|
+
|
293
321
|
```ruby
|
294
|
-
Twitter.
|
322
|
+
Twitter.status(27558893223)
|
323
|
+
```
|
324
|
+
**Find the 3 most recent marriage proposals to @justinbieber**
|
295
325
|
|
296
|
-
|
326
|
+
```ruby
|
327
|
+
Twitter.search("to:justinbieber marry me", :count => 3, :result_type => "recent").results.map do |status|
|
328
|
+
"#{status.from_user}: #{status.text}"
|
329
|
+
end
|
330
|
+
```
|
331
|
+
**Find a Japanese-language Tweet tagged #ruby (excluding retweets)**
|
332
|
+
|
333
|
+
```ruby
|
334
|
+
Twitter.search("#ruby -rt", :lang => "ja", :count => 1).results.first.text
|
297
335
|
```
|
336
|
+
For more usage examples, please see the full [documentation][].
|
337
|
+
|
338
|
+
## Streaming
|
339
|
+
|
340
|
+
To access the Twitter Streaming API, we recommend [TweetStream][].
|
341
|
+
|
342
|
+
[tweetstream]: https://github.com/intridea/tweetstream
|
298
343
|
|
299
344
|
## Performance
|
300
345
|
You can improve performance by loading a faster JSON parsing library. By
|
@@ -304,22 +349,7 @@ recommend [Oj][].
|
|
304
349
|
[okjson]: https://github.com/ddollar/okjson
|
305
350
|
[oj]: https://rubygems.org/gems/oj
|
306
351
|
|
307
|
-
##
|
308
|
-
This will be the last major version of this library to support Ruby 1.8.
|
309
|
-
Requiring Ruby 1.9 will allow us to [remove][class_variable_get]
|
310
|
-
[various][each_with_object] [hacks][singleton_class] put in place to maintain
|
311
|
-
Ruby 1.8 compatibility. [The first stable version of Ruby 1.9 was released on
|
312
|
-
August 19, 2010.][ruby192] If you haven't found the opportunity to upgrade your
|
313
|
-
Ruby interpreter since then, let this be your nudge. Once version 5 of this
|
314
|
-
library is released, all previous versions will cease to be supported, even if
|
315
|
-
critical security vulnerabilities are discovered.
|
316
|
-
|
317
|
-
[class_variable_get]: https://github.com/sferik/twitter/commit/88c5a0513d1b58a1d4ae1a1e3deeb012c9d19547
|
318
|
-
[each_with_object]: https://github.com/sferik/twitter/commit/6052252a07baf7aefe0f100bba0abd2cbb7139bb
|
319
|
-
[singleton_class]: https://github.com/sferik/twitter/commit/2ed9db21c87d1218b15373e42a36ad536b07dcbb
|
320
|
-
[ruby192]: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/367983
|
321
|
-
|
322
|
-
## Stats
|
352
|
+
## Statistics
|
323
353
|
|
324
354
|
Here are some fun facts about this library:
|
325
355
|
|
@@ -339,56 +369,6 @@ Here are some fun facts about this library:
|
|
339
369
|
|
340
370
|
[stats]: https://rubygems.org/gems/twitter
|
341
371
|
|
342
|
-
## Contributing
|
343
|
-
In the spirit of [free software][free-sw], **everyone** is encouraged to help
|
344
|
-
improve this project.
|
345
|
-
|
346
|
-
[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
|
347
|
-
|
348
|
-
Here are some ways *you* can contribute:
|
349
|
-
|
350
|
-
* by using alpha, beta, and prerelease versions
|
351
|
-
* by reporting bugs
|
352
|
-
* by suggesting new features
|
353
|
-
* by writing or editing documentation
|
354
|
-
* by writing specifications
|
355
|
-
* by writing code (**no patch is too small**: fix typos, add comments, clean up
|
356
|
-
inconsistent whitespace)
|
357
|
-
* by refactoring code
|
358
|
-
* by fixing [issues][]
|
359
|
-
* by reviewing patches
|
360
|
-
|
361
|
-
[issues]: https://github.com/sferik/twitter/issues
|
362
|
-
|
363
|
-
## Submitting an Issue
|
364
|
-
We use the [GitHub issue tracker][issues] to track bugs and features. Before
|
365
|
-
submitting a bug report or feature request, check to make sure it hasn't
|
366
|
-
already been submitted. When submitting a bug report, please include a [Gist][]
|
367
|
-
that includes a stack trace and any details that may be necessary to reproduce
|
368
|
-
the bug, including your gem version, Ruby version, and operating system.
|
369
|
-
Ideally, a bug report should include a pull request with failing specs.
|
370
|
-
|
371
|
-
[gist]: https://gist.github.com/
|
372
|
-
|
373
|
-
## Submitting a Pull Request
|
374
|
-
1. [Fork the repository.][fork]
|
375
|
-
2. [Create a topic branch.][branch]
|
376
|
-
3. Add specs for your unimplemented feature or bug fix.
|
377
|
-
4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
|
378
|
-
5. Implement your feature or bug fix.
|
379
|
-
6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
|
380
|
-
7. Run `open coverage/index.html`. If your changes are not completely covered
|
381
|
-
by your tests, return to step 3.
|
382
|
-
8. Add documentation for your feature or bug fix.
|
383
|
-
9. Run `bundle exec rake yard`. If your changes are not 100% documented, go
|
384
|
-
back to step 8.
|
385
|
-
10. Add, commit, and push your changes.
|
386
|
-
11. [Submit a pull request.][pr]
|
387
|
-
|
388
|
-
[fork]: http://help.github.com/fork-a-repo/
|
389
|
-
[branch]: http://learn.github.com/p/branching.html
|
390
|
-
[pr]: http://help.github.com/send-pull-requests/
|
391
|
-
|
392
372
|
## Supported Ruby Versions
|
393
373
|
This library aims to support and is [tested against][travis] the following Ruby
|
394
374
|
version:
|
@@ -408,6 +388,21 @@ implementation, you will be personally responsible for providing patches in a
|
|
408
388
|
timely fashion. If critical issues for a particular implementation exist at the
|
409
389
|
time of a major release, support for that Ruby version may be dropped.
|
410
390
|
|
391
|
+
## Additional Notes
|
392
|
+
This will be the last major version of this library to support Ruby 1.8.
|
393
|
+
Requiring Ruby 1.9 will allow us to [remove][class_variable_get]
|
394
|
+
[various][each_with_object] [hacks][singleton_class] put in place to maintain
|
395
|
+
Ruby 1.8 compatibility. [The first stable version of Ruby 1.9 was released on
|
396
|
+
August 19, 2010.][ruby192] If you haven't found the opportunity to upgrade your
|
397
|
+
Ruby interpreter since then, let this be your nudge. Once version 5 of this
|
398
|
+
library is released, all previous versions will cease to be supported, even if
|
399
|
+
critical security vulnerabilities are discovered.
|
400
|
+
|
401
|
+
[class_variable_get]: https://github.com/sferik/twitter/commit/88c5a0513d1b58a1d4ae1a1e3deeb012c9d19547
|
402
|
+
[each_with_object]: https://github.com/sferik/twitter/commit/6052252a07baf7aefe0f100bba0abd2cbb7139bb
|
403
|
+
[singleton_class]: https://github.com/sferik/twitter/commit/2ed9db21c87d1218b15373e42a36ad536b07dcbb
|
404
|
+
[ruby192]: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/367983
|
405
|
+
|
411
406
|
## Copyright
|
412
407
|
Copyright (c) 2006-2012 John Nunemaker, Wynn Netherland, Erik Michaels-Ober, Steve Richert.
|
413
408
|
See [LICENSE][] for details.
|
data/lib/twitter/api.rb
CHANGED
@@ -85,7 +85,7 @@ module Twitter
|
|
85
85
|
# @authentication_required Requires user context
|
86
86
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
87
87
|
# @return [Twitter::User] The authenticated user.
|
88
|
-
# @param image [File
|
88
|
+
# @param image [File] The background image for the profile, base64-encoded. Must be a valid GIF, JPG, or PNG image of less than 800 kilobytes in size. Images with width larger than 2048 pixels will be forcibly scaled down. The image must be provided as raw multipart data, not a URL.
|
89
89
|
# @param options [Hash] A customizable set of options.
|
90
90
|
# @option options [Boolean] :tile Whether or not to tile the background image. If set to true the background image will be displayed tiled. The image will not be tiled otherwise.
|
91
91
|
# @example Update the authenticating user's profile background image
|
@@ -116,12 +116,13 @@ module Twitter
|
|
116
116
|
# Updates the authenticating user's profile image
|
117
117
|
#
|
118
118
|
# @see https://dev.twitter.com/docs/api/1.1/post/account/update_profile_image
|
119
|
-
# @note
|
119
|
+
# @note Updates the authenticating user's profile image. Note that this method expects raw multipart data, not a URL to an image.
|
120
|
+
# @note This method asynchronously processes the uploaded file before updating the user's profile image URL. You can either update your local cache the next time you request the user's information, or, at least 5 seconds after uploading the image, ask for the updated URL using GET users/show.
|
120
121
|
# @rate_limited No
|
121
122
|
# @authentication_required Requires user context
|
122
123
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
123
124
|
# @return [Twitter::User] The authenticated user.
|
124
|
-
# @param image [File
|
125
|
+
# @param image [File] The avatar image for the profile, base64-encoded. Must be a valid GIF, JPG, or PNG image of less than 700 kilobytes in size. Images with width larger than 500 pixels will be scaled down. Animated GIFs will be converted to a static GIF of the first frame, removing the animation.
|
125
126
|
# @param options [Hash] A customizable set of options.
|
126
127
|
# @example Update the authenticating user's profile image
|
127
128
|
# Twitter.update_profile_image(File.new("me.jpeg"))
|
@@ -129,6 +130,43 @@ module Twitter
|
|
129
130
|
object_from_response(Twitter::User, :post, "/1.1/account/update_profile_image.json", options.merge(:image => image))
|
130
131
|
end
|
131
132
|
|
133
|
+
# Updates the authenticating user's profile banner image
|
134
|
+
#
|
135
|
+
# @see https://dev.twitter.com/docs/api/1.1/post/account/update_profile_banner
|
136
|
+
# @note Uploads a profile banner on behalf of the authenticating user. For best results, upload an <5MB image that is exactly 1252px by 626px. Images will be resized for a number of display options. Users with an uploaded profile banner will have a profile_banner_url node in their Users objects. More information about sizing variations can be found in User Profile Images and Banners.
|
137
|
+
# @note Profile banner images are processed asynchronously. The profile_banner_url and its variant sizes will not necessary be available directly after upload.
|
138
|
+
# @rate_limited No
|
139
|
+
# @authentication_required Requires user context
|
140
|
+
# @raise [Twitter::Error::BadRequest] Error raised when either an image was not provided or the image data could not be processed.
|
141
|
+
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
142
|
+
# @raise [Twitter::Error::UnprocessableEntity] Error raised when the image could not be resized or is too large.
|
143
|
+
# @return [nil]
|
144
|
+
# @param image [File] The Base64-encoded or raw image data being uploaded as the user's new profile banner.
|
145
|
+
# @param options [Hash] A customizable set of options.
|
146
|
+
# @option options [Integer] :width The width of the preferred section of the image being uploaded in pixels. Use with height, offset_left, and offset_top to select the desired region of the image to use.
|
147
|
+
# @option options [Integer] :height The height of the preferred section of the image being uploaded in pixels. Use with width, offset_left, and offset_top to select the desired region of the image to use.
|
148
|
+
# @option options [Integer] :offset_left The number of pixels by which to offset the uploaded image from the left. Use with height, width, and offset_top to select the desired region of the image to use.
|
149
|
+
# @option options [Integer] :offset_top The number of pixels by which to offset the uploaded image from the top. Use with height, width, and offset_left to select the desired region of the image to use.
|
150
|
+
# @example Update the authenticating user's profile banner
|
151
|
+
# Twitter.update_profile_banner(File.new("me.jpeg"))
|
152
|
+
def update_profile_banner(banner, options={})
|
153
|
+
post("/1.1/account/update_profile_banner.json", options.merge(:banner => banner))[:body]
|
154
|
+
end
|
155
|
+
|
156
|
+
# Removes the authenticating user's profile banner image
|
157
|
+
#
|
158
|
+
# @see https://dev.twitter.com/docs/api/1.1/post/account/remove_profile_banner
|
159
|
+
# @rate_limited No
|
160
|
+
# @authentication_required Requires user context
|
161
|
+
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
162
|
+
# @return [nil]
|
163
|
+
# @param options [Hash] A customizable set of options.
|
164
|
+
# @example Remove the authenticating user's profile banner image
|
165
|
+
# Twitter.remove_profile_banner
|
166
|
+
def remove_profile_banner(options={})
|
167
|
+
post("/1.1/account/remove_profile_banner.json", options)[:body]
|
168
|
+
end
|
169
|
+
|
132
170
|
# Updates the authenticating user's settings.
|
133
171
|
# Or, if no options supplied, returns settings (including current trend, geo and sleep time information) for the authenticating user.
|
134
172
|
#
|
@@ -792,12 +830,14 @@ module Twitter
|
|
792
830
|
# @overload memberships(options={})
|
793
831
|
# @param options [Hash] A customizable set of options.
|
794
832
|
# @option options [Integer] :cursor (-1) Breaks the results into pages. Provide values as returned in the response objects's next_cursor and previous_cursor attributes to page back and forth in the list.
|
833
|
+
# @option options [Boolean, String, Integer] :filter_to_owned_lists When set to true, t or 1, will return just lists the authenticating user owns, and the user represented by user_id or screen_name is a member of.
|
795
834
|
# @example List the lists the authenticated user has been added to
|
796
835
|
# Twitter.memberships
|
797
836
|
# @overload memberships(user, options={})
|
798
837
|
# @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, or object.
|
799
838
|
# @param options [Hash] A customizable set of options.
|
800
839
|
# @option options [Integer] :cursor (-1) Breaks the results into pages. Provide values as returned in the response objects's next_cursor and previous_cursor attributes to page back and forth in the list.
|
840
|
+
# @option options [Boolean, String, Integer] :filter_to_owned_lists When set to true, t or 1, will return just lists the authenticating user owns, and the user represented by user_id or screen_name is a member of.
|
801
841
|
# @example List the lists that @sferik has been added to
|
802
842
|
# Twitter.memberships('sferik')
|
803
843
|
# Twitter.memberships(7505382)
|
@@ -1159,20 +1199,25 @@ module Twitter
|
|
1159
1199
|
object_from_response(Twitter::List, :post, "/1.1/lists/create.json", options.merge(:name => name))
|
1160
1200
|
end
|
1161
1201
|
|
1162
|
-
#
|
1163
|
-
# Returns all lists the authenticating or specified user subscribes to, including their own.
|
1202
|
+
# Returns all lists the authenticating or specified user subscribes to, including their own
|
1164
1203
|
#
|
1165
1204
|
# @see https://dev.twitter.com/docs/api/1.1/get/lists/list
|
1166
1205
|
# @rate_limited Yes
|
1167
1206
|
# @authentication_required Requires user context
|
1168
1207
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
1169
|
-
# @return [Twitter::
|
1170
|
-
# @
|
1171
|
-
#
|
1172
|
-
#
|
1173
|
-
#
|
1208
|
+
# @return [Array<Twitter::List>]
|
1209
|
+
# @overload memberships(options={})
|
1210
|
+
# @param options [Hash] A customizable set of options.
|
1211
|
+
# @example Returns all lists the authenticating user subscribes to
|
1212
|
+
# Twitter.lists
|
1213
|
+
# @overload memberships(user, options={})
|
1214
|
+
# @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, or object.
|
1215
|
+
# @param options [Hash] A customizable set of options.
|
1216
|
+
# @example Returns all lists that @sferik subscribes to
|
1217
|
+
# Twitter.lists('sferik')
|
1218
|
+
# Twitter.lists(7505382)
|
1174
1219
|
def lists(*args)
|
1175
|
-
|
1220
|
+
objects_from_response(Twitter::List, :get, "/1.1/lists/list.json", args)
|
1176
1221
|
end
|
1177
1222
|
alias lists_subscribed_to lists
|
1178
1223
|
|
@@ -1809,6 +1854,7 @@ module Twitter
|
|
1809
1854
|
# @see https://dev.twitter.com/docs/api/1.1/post/statuses/retweet/:id
|
1810
1855
|
# @rate_limited Yes
|
1811
1856
|
# @authentication_required Requires user context
|
1857
|
+
# @raise [Twitter::Error::Forbidden] Error raised when tweet has already been retweeted.
|
1812
1858
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
1813
1859
|
# @return [Array<Twitter::Tweet>] The original tweets with retweet details embedded.
|
1814
1860
|
# @overload retweet(*ids)
|
@@ -3,9 +3,10 @@ require 'twitter/error/client_error'
|
|
3
3
|
module Twitter
|
4
4
|
class Error
|
5
5
|
# Raised when Twitter returns the HTTP status code 429
|
6
|
-
class
|
6
|
+
class TooManyRequests < Twitter::Error::ClientError
|
7
7
|
HTTP_STATUS_CODE = 429
|
8
8
|
end
|
9
|
-
EnhanceYourCalm =
|
9
|
+
EnhanceYourCalm = TooManyRequests
|
10
|
+
RateLimited = TooManyRequests
|
10
11
|
end
|
11
12
|
end
|
@@ -6,9 +6,10 @@ require 'twitter/error/gateway_timeout'
|
|
6
6
|
require 'twitter/error/internal_server_error'
|
7
7
|
require 'twitter/error/not_acceptable'
|
8
8
|
require 'twitter/error/not_found'
|
9
|
-
require 'twitter/error/rate_limited'
|
10
9
|
require 'twitter/error/service_unavailable'
|
10
|
+
require 'twitter/error/too_many_requests'
|
11
11
|
require 'twitter/error/unauthorized'
|
12
|
+
require 'twitter/error/unprocessable_entity'
|
12
13
|
|
13
14
|
module Twitter
|
14
15
|
module Response
|
data/lib/twitter/tweet.rb
CHANGED
@@ -79,6 +79,12 @@ module Twitter
|
|
79
79
|
end
|
80
80
|
alias reply_count repliers_count
|
81
81
|
|
82
|
+
# @return [Boolean]
|
83
|
+
def reply?
|
84
|
+
!!in_reply_to_status_id
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [Boolean]
|
82
88
|
def retweet?
|
83
89
|
!!retweeted_status
|
84
90
|
end
|
@@ -116,6 +122,7 @@ module Twitter
|
|
116
122
|
@user_mentions ||= entities(Twitter::Entity::UserMention, :user_mentions)
|
117
123
|
end
|
118
124
|
|
125
|
+
# @return [Boolean]
|
119
126
|
def entities?
|
120
127
|
!@attrs[:entities].nil?
|
121
128
|
end
|
data/lib/twitter/user.rb
CHANGED
@@ -41,18 +41,33 @@ module Twitter
|
|
41
41
|
alias updates_count statuses_count
|
42
42
|
alias verified? verified
|
43
43
|
|
44
|
+
# Return the URL to the user's profile banner image
|
45
|
+
#
|
46
|
+
# @param size [String, Symbol] The size of the image. Must be one of: 'mobile', 'mobile_retina', 'web', 'web_retina', 'ipad', or 'ipad_retina'
|
47
|
+
# @return [String]
|
48
|
+
def profile_banner_url(size=:web)
|
49
|
+
insecure_url([@attrs[:profile_banner_url], size].join('/')) if profile_banner_url?
|
50
|
+
end
|
51
|
+
|
52
|
+
# Return the secure URL to the user's profile banner image
|
53
|
+
#
|
54
|
+
# @param size [String, Symbol] The size of the image. Must be one of: 'mobile', 'mobile_retina', 'web', 'web_retina', 'ipad', or 'ipad_retina'
|
55
|
+
# @return [String]
|
56
|
+
def profile_banner_url_https(size=:web)
|
57
|
+
[@attrs[:profile_banner_url], size].join('/') if profile_banner_url?
|
58
|
+
end
|
59
|
+
|
60
|
+
def profile_banner_url?
|
61
|
+
!@attrs[:profile_banner_url].nil?
|
62
|
+
end
|
63
|
+
alias profile_banner_url_https? profile_banner_url?
|
64
|
+
|
44
65
|
# Return the URL to the user's profile image
|
45
66
|
#
|
46
67
|
# @param size [String, Symbol] The size of the image. Must be one of: 'mini', 'normal', 'bigger' or 'original'
|
47
68
|
# @return [String]
|
48
69
|
def profile_image_url(size=:normal)
|
49
|
-
|
50
|
-
# http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png
|
51
|
-
# It can be converted to any of the following sizes:
|
52
|
-
# http://a0.twimg.com/profile_images/1759857427/image1326743606.png
|
53
|
-
# http://a0.twimg.com/profile_images/1759857427/image1326743606_mini.png
|
54
|
-
# http://a0.twimg.com/profile_images/1759857427/image1326743606_bigger.png
|
55
|
-
resize_profile_image_url(@attrs[:profile_image_url], size)
|
70
|
+
insecure_url(profile_image_url_https(size)) if profile_image_url?
|
56
71
|
end
|
57
72
|
|
58
73
|
# Return the secure URL to the user's profile image
|
@@ -66,9 +81,14 @@ module Twitter
|
|
66
81
|
# https://a0.twimg.com/profile_images/1759857427/image1326743606.png
|
67
82
|
# https://a0.twimg.com/profile_images/1759857427/image1326743606_mini.png
|
68
83
|
# https://a0.twimg.com/profile_images/1759857427/image1326743606_bigger.png
|
69
|
-
resize_profile_image_url(@attrs[:profile_image_url_https], size)
|
84
|
+
resize_profile_image_url(@attrs[:profile_image_url_https], size) if profile_image_url?
|
70
85
|
end
|
71
86
|
|
87
|
+
def profile_image_url?
|
88
|
+
!@attrs[:profile_image_url_https].nil?
|
89
|
+
end
|
90
|
+
alias profile_image_url_https? profile_image_url?
|
91
|
+
|
72
92
|
# @return [Twitter::Tweet]
|
73
93
|
def status
|
74
94
|
@status ||= Twitter::Tweet.fetch_or_new(@attrs.dup[:status].merge(:user => @attrs.except(:status))) if status?
|
@@ -80,8 +100,11 @@ module Twitter
|
|
80
100
|
|
81
101
|
private
|
82
102
|
|
103
|
+
def insecure_url(url)
|
104
|
+
url.sub(/^https/i, 'http')
|
105
|
+
end
|
106
|
+
|
83
107
|
def resize_profile_image_url(url, size)
|
84
|
-
return if url.nil?
|
85
108
|
url.sub(PROFILE_IMAGE_SUFFIX_REGEX, profile_image_suffix(size))
|
86
109
|
end
|
87
110
|
|
data/lib/twitter/version.rb
CHANGED
File without changes
|
data/spec/fixtures/lists.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"lists":[{"mode":"public","description":"","id_str":"1129440","member_count":494,"uri":"\/pengwynn\/rubyists","subscriber_count":28,"full_name":"@pengwynn\/rubyists","user":{"statuses_count":3950,"profile_background_image_url":"http:\/\/a1.twimg.com\/profile_background_images\/61741268\/twitter-small.png","profile_link_color":"35abe9","description":"Christian husband and father. Dev Experience @ HP Cloud Services. Co-host of the @changelogshow. Mashup of design & development.","screen_name":"pengwynn","show_all_inline_media":false,"friends_count":1919,"id_str":"14100886","contributors_enabled":false,"profile_background_tile":false,"profile_sidebar_fill_color":"dddddd","geo_enabled":true,"favourites_count":32,"profile_sidebar_border_color":"cccccc","followers_count":2788,"url":"http:\/\/wynnnetherland.com","verified":false,"follow_request_sent":false,"lang":"en","time_zone":"Central Time (US & Canada)","created_at":"Sat Mar 08 16:34:22 +0000 2008","location":"Dallas, TX","profile_background_color":"efefef","protected":false,"name":"Wynn Netherland","following":true,"profile_use_background_image":true,"profile_text_color":"666666","profile_image_url":"http:\/\/a2.twimg.com\/profile_images\/485575482\/komikazee_normal.png","id":14100886,"listed_count":186,"notifications":false,"utc_offset":-21600},"name":"Rubyists","following":true,"slug":"rubyists","id":1129440},{"mode":"public","description":"","id_str":"574","member_count":308,"uri":"\/twitter\/team","subscriber_count":76189,"full_name":"@twitter\/team","user":{"follow_request_sent":false,"profile_background_image_url":"http:\/\/s.twimg.com\/a\/1288202850\/images\/themes\/theme18\/bg.gif","profile_link_color":"038543","description":"Always wondering what's happening. ","screen_name":"twitter","id_str":"783214","profile_background_tile":false,"profile_sidebar_fill_color":"F6F6F6","listed_count":49543,"favourites_count":0,"profile_sidebar_border_color":"EEEEEE","followers_count":3916812,"url":"http:\/\/twitter.com","statuses_count":896,"show_all_inline_media":true,"lang":"en","time_zone":"Pacific Time (US & Canada)","created_at":"Tue Feb 20 14:35:54 +0000 2007","friends_count":340,"location":"San Francisco, CA","contributors_enabled":true,"profile_background_color":"ACDED6","protected":false,"geo_enabled":true,"name":"Twitter","following":false,"profile_use_background_image":true,"profile_text_color":"333333","profile_image_url":"http:\/\/a1.twimg.com\/profile_images\/1124040897\/at-twitter_normal.png","id":783214,"verified":true,"notifications":false,"utc_offset":-28800},"name":"Team","following":true,"slug":"team","id":574}], "next_cursor":0, "previous_cursor":0, "next_cursor_str":"0", "previous_cursor_str":"0"}
|
1
|
+
[{"uri":"\/pengwynn\/rubyists","name":"Rubyists","full_name":"@pengwynn\/rubyists","description":"","mode":"public","user":{"id":14100886,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png","time_zone":"Central Time (US & Canada)","location":"Denton, TX","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png","id_str":"14100886","profile_link_color":"0084B4","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2221455972\/wynn-mic-bw_normal.jpg","utc_offset":-21600,"profile_use_background_image":false,"statuses_count":7384,"name":"Wynn Netherland","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"pengwynn","listed_count":397,"protected":false,"is_translator":false,"followers_count":6182,"profile_sidebar_border_color":"FFFFFF","description":"Christian, husband, father, GitHubber, Co-host of @thechangelog, Co-author of Sass, Compass, #CSS book http:\/\/wynn.fm\/sass-meap","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2221455972\/wynn-mic-bw_normal.jpg","profile_background_tile":false,"following":true,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"http:\/\/wynnnetherland.com","profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/14100886\/1347987369","favourites_count":338,"created_at":"Sat Mar 08 16:34:22 +0000 2008","friends_count":3528,"verified":false,"notifications":false,"profile_background_color":"292929","contributors_enabled":false},"following":true,"created_at":"Fri Oct 30 14:39:25 +0000 2009","member_count":499,"id_str":"1129440","subscriber_count":39,"slug":"rubyists","id":1129440},{"uri":"\/twitter\/team","name":"Team","full_name":"@twitter\/team","description":"","mode":"public","user":{"id":783214,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/657090062\/l1uqey5sy82r9ijhke1i.png","time_zone":"Pacific Time (US & Canada)","location":"San Francisco, CA","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/657090062\/l1uqey5sy82r9ijhke1i.png","id_str":"783214","profile_link_color":"038543","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2284174758\/v65oai7fxn47qv9nectx_normal.png","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":1433,"name":"Twitter","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"twitter","listed_count":73287,"protected":false,"followers_count":13711595,"profile_sidebar_border_color":"EEEEEE","is_translator":false,"description":"Always wondering what's happening. ","profile_background_tile":true,"following":true,"profile_sidebar_fill_color":"F6F6F6","default_profile_image":false,"url":"http:\/\/blog.twitter.com\/","profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/783214\/1347405327","favourites_count":18,"created_at":"Tue Feb 20 14:35:54 +0000 2007","friends_count":1249,"verified":true,"notifications":false,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2284174758\/v65oai7fxn47qv9nectx_normal.png","profile_background_color":"ACDED6","contributors_enabled":true},"following":true,"created_at":"Wed Sep 23 01:18:01 +0000 2009","member_count":1199,"id_str":"574","subscriber_count":78078,"slug":"team","id":574},{"uri":"\/sferik\/test","name":"test","full_name":"@sferik\/test","description":"","mode":"private","user":{"id":7505382,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","time_zone":"Pacific Time (US & Canada)","location":"San Francisco","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","id_str":"7505382","profile_link_color":"0084B4","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":8576,"name":"Erik Michaels-Ober","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"sferik","listed_count":129,"protected":false,"followers_count":2449,"profile_sidebar_border_color":"000000","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","description":"An ingredient in your recipe.","is_translator":false,"profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"https:\/\/github.com\/sferik","favourites_count":4321,"created_at":"Mon Jul 16 12:59:01 +0000 2007","friends_count":203,"verified":false,"notifications":false,"profile_background_color":"000000","contributors_enabled":false},"following":false,"created_at":"Sun Jul 08 22:19:05 +0000 2012","member_count":2,"id_str":"73546689","subscriber_count":0,"slug":"test","id":73546689},{"uri":"\/sferik\/interesting","name":"interesting","full_name":"@sferik\/interesting","description":"People who are interesting.","mode":"private","user":{"id":7505382,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","time_zone":"Pacific Time (US & Canada)","location":"San Francisco","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","id_str":"7505382","profile_link_color":"0084B4","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":8576,"name":"Erik Michaels-Ober","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"sferik","listed_count":129,"protected":false,"followers_count":2449,"profile_sidebar_border_color":"000000","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","description":"An ingredient in your recipe.","is_translator":false,"profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"https:\/\/github.com\/sferik","favourites_count":4321,"created_at":"Mon Jul 16 12:59:01 +0000 2007","friends_count":203,"verified":false,"notifications":false,"profile_background_color":"000000","contributors_enabled":false},"following":false,"created_at":"Sat Sep 04 00:46:03 +0000 2010","member_count":4,"id_str":"20817728","subscriber_count":0,"slug":"interesting","id":20817728},{"uri":"\/sferik\/recommended","name":"recommended","full_name":"@sferik\/recommended","description":"Users recommended to me by Twitter","mode":"private","user":{"id":7505382,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","time_zone":"Pacific Time (US & Canada)","location":"San Francisco","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","id_str":"7505382","profile_link_color":"0084B4","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":8576,"name":"Erik Michaels-Ober","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"sferik","listed_count":129,"protected":false,"followers_count":2449,"profile_sidebar_border_color":"000000","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","description":"An ingredient in your recipe.","is_translator":false,"profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"https:\/\/github.com\/sferik","favourites_count":4321,"created_at":"Mon Jul 16 12:59:01 +0000 2007","friends_count":203,"verified":false,"notifications":false,"profile_background_color":"000000","contributors_enabled":false},"following":false,"created_at":"Thu Sep 02 18:29:24 +0000 2010","member_count":71,"id_str":"20712515","subscriber_count":0,"slug":"recommended","id":20712515},{"uri":"\/sferik\/presidents","name":"presidents","full_name":"@sferik\/presidents","description":"Presidents of the United States of America","mode":"public","user":{"id":7505382,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","time_zone":"Pacific Time (US & Canada)","location":"San Francisco","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","id_str":"7505382","profile_link_color":"0084B4","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":8576,"name":"Erik Michaels-Ober","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"sferik","listed_count":129,"protected":false,"followers_count":2449,"profile_sidebar_border_color":"000000","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","description":"An ingredient in your recipe.","is_translator":false,"profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"https:\/\/github.com\/sferik","favourites_count":4321,"created_at":"Mon Jul 16 12:59:01 +0000 2007","friends_count":203,"verified":false,"notifications":false,"profile_background_color":"000000","contributors_enabled":false},"following":false,"created_at":"Mon Mar 15 06:10:13 +0000 2010","member_count":2,"id_str":"8863586","subscriber_count":1,"slug":"presidents","id":8863586}]
|
@@ -0,0 +1 @@
|
|
1
|
+
{"lists":[{"uri":"\/DavidBahia\/developer","name":"developer","full_name":"@DavidBahia\/developer","description":"","mode":"public","user":{"id":20647833,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/16339914\/twit3.JPG","time_zone":"London","location":"Rochester, Medway Towns, Kent","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/16339914\/twit3.JPG","id_str":"20647833","entities":{"description":{"urls":[]}},"profile_link_color":"1F98C7","geo_enabled":false,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/272062257\/Irandb4_normal.JPG","utc_offset":0,"profile_use_background_image":true,"statuses_count":4920,"name":"David Bahia","follow_request_sent":false,"profile_text_color":"663B12","lang":"en","screen_name":"DavidBahia","listed_count":31,"protected":false,"followers_count":953,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/272062257\/Irandb4_normal.JPG","profile_sidebar_border_color":"C6E2EE","description":"I wonder. why?","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DAECF4","default_profile_image":false,"url":null,"is_translator":false,"favourites_count":15128,"created_at":"Thu Feb 12 02:11:49 +0000 2009","friends_count":1997,"verified":false,"notifications":false,"profile_background_color":"C6E2EE","contributors_enabled":false},"following":false,"created_at":"Fri Apr 01 09:16:02 +0000 2011","member_count":382,"id_str":"41944715","subscriber_count":2,"slug":"developer","id":41944715},{"uri":"\/nguyenkhanh\/ruby-on-rails","name":"ruby on rails","full_name":"@nguyenkhanh\/ruby-on-rails","description":"","mode":"public","user":{"id":23034559,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/288359465\/background.jpg","time_zone":"Hanoi","location":"Ho Chi Minh, Viet Nam","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/288359465\/background.jpg","id_str":"23034559","entities":{"url":{"urls":[{"url":"http:\/\/khanhnam.herokuapp.com","display_url":null,"indices":[0,29],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"93A644","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1525164375\/2.2_normal.jpg","utc_offset":25200,"profile_use_background_image":true,"statuses_count":363,"name":"Khanh Nam","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"nguyenkhanh","listed_count":5,"protected":false,"followers_count":207,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1525164375\/2.2_normal.jpg","profile_sidebar_border_color":"FFFFFF","description":"Currently I am a Ruby on Rails web application developer working in Vietnam. Very excited to get more involved in the Ruby community!","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"FFFFFF","default_profile_image":false,"url":"http:\/\/khanhnam.herokuapp.com","is_translator":false,"favourites_count":2,"created_at":"Fri Mar 06 05:22:19 +0000 2009","friends_count":1987,"verified":false,"notifications":false,"profile_background_color":"B2DFDA","contributors_enabled":false},"following":false,"created_at":"Sat Sep 15 13:16:43 +0000 2012","member_count":19,"id_str":"77430573","subscriber_count":0,"slug":"ruby-on-rails","id":77430573},{"uri":"\/freefrancisco\/ruby","name":"ruby","full_name":"@freefrancisco\/ruby","description":"Ruby related","mode":"public","user":{"id":6045802,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif","time_zone":"Pacific Time (US & Canada)","location":"San Francisco, CA","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif","id_str":"6045802","entities":{"url":{"urls":[{"url":"http:\/\/www.facebook.com\/freefrancisco","display_url":null,"indices":[0,37],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"2FC2EF","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/61901717\/Sara_Jean_in_Suite_200-0_normal.jpg","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":373,"name":"Francisco Gutierrez","follow_request_sent":false,"profile_text_color":"666666","lang":"en","screen_name":"freefrancisco","listed_count":19,"protected":false,"followers_count":567,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/61901717\/Sara_Jean_in_Suite_200-0_normal.jpg","profile_sidebar_border_color":"181A1E","description":"Ruby developer, nightlife promoter, model agent, rock band manager, Objectivist, Techer, math and AI geek","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"252429","default_profile_image":false,"url":"http:\/\/www.facebook.com\/freefrancisco","is_translator":false,"favourites_count":3,"created_at":"Mon May 14 23:11:50 +0000 2007","friends_count":769,"verified":false,"notifications":false,"profile_background_color":"1A1B1F","contributors_enabled":false},"following":false,"created_at":"Wed Dec 09 10:30:41 +0000 2009","member_count":44,"id_str":"4416212","subscriber_count":0,"slug":"ruby","id":4416212},{"uri":"\/legion\/development","name":"Development","full_name":"@legion\/development","description":"Software development","mode":"public","user":{"id":6453622,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/4303288\/screenshot_03.jpg","time_zone":"Central Time (US & Canada)","location":"Texas","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/4303288\/screenshot_03.jpg","id_str":"6453622","entities":{"url":{"urls":[{"url":"http:\/\/www.economyofeffort.com","display_url":null,"indices":[0,30],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"0000FF","geo_enabled":false,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/422924487\/area-128_normal.jpg","utc_offset":-21600,"profile_use_background_image":true,"statuses_count":4233,"name":"*Legion*","follow_request_sent":false,"profile_text_color":"000000","lang":"en","screen_name":"legion","listed_count":28,"protected":false,"followers_count":388,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/422924487\/area-128_normal.jpg","profile_sidebar_border_color":"000000","description":"Programmer. Gamer. Amateur NFL expert. Funny guy. Technophile.","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"82C8FF","default_profile_image":false,"url":"http:\/\/www.economyofeffort.com","is_translator":false,"favourites_count":197,"created_at":"Wed May 30 20:59:35 +0000 2007","friends_count":226,"verified":false,"notifications":false,"profile_background_color":"9AE4E8","contributors_enabled":false},"following":false,"created_at":"Wed May 25 20:37:19 +0000 2011","member_count":107,"id_str":"46083047","subscriber_count":1,"slug":"development","id":46083047},{"uri":"\/msgbi\/math2","name":"math2","full_name":"@msgbi\/math2","description":"","mode":"public","user":{"id":53472182,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme19\/bg.gif","time_zone":"Berlin","location":"Ulm, Germany","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme19\/bg.gif","id_str":"53472182","entities":{"url":{"urls":[{"url":"http:\/\/de.linkedin.com\/pub\/markus-sagebiel\/1a\/785\/300","display_url":null,"indices":[0,53],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"0099CC","geo_enabled":false,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1764003155\/image1326895263_normal.png","utc_offset":3600,"profile_use_background_image":true,"statuses_count":15512,"name":"Markus Sagebiel","follow_request_sent":false,"profile_text_color":"333333","lang":"de","screen_name":"msgbi","listed_count":75,"protected":false,"followers_count":1120,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1764003155\/image1326895263_normal.png","profile_sidebar_border_color":"fff8ad","description":"Mathematics, Economics, Statistics, Risk, Econometrics, OR, Data,Dipl.-Math.oec.,Running,EnduranceSport,G+ http:\/\/bit.ly\/ybQGYz Xing http:\/\/bit.ly\/RpYB4k faceb","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"f6ffd1","default_profile_image":false,"url":"http:\/\/de.linkedin.com\/pub\/markus-sagebiel\/1a\/785\/300","is_translator":false,"profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/53472182\/1347985216","favourites_count":2680,"created_at":"Fri Jul 03 19:17:27 +0000 2009","friends_count":689,"verified":false,"notifications":false,"profile_background_color":"FFF04D","contributors_enabled":false},"following":false,"created_at":"Tue Sep 04 09:21:31 +0000 2012","member_count":211,"id_str":"76761365","subscriber_count":0,"slug":"math2","id":76761365},{"uri":"\/greerjacob\/brilliant-data-wizards","name":"brilliant data wizards","full_name":"@greerjacob\/brilliant-data-wizards","description":"","mode":"public","user":{"id":12973252,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png","time_zone":"Pacific Time (US & Canada)","location":"Portland, OR","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png","id_str":"12973252","entities":{"url":{"urls":[{"url":"http:\/\/trendsient.com\/whoisthisguy\/","display_url":null,"indices":[0,35],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"202426","geo_enabled":false,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2356268899\/q7guwfq0st6vtfvflehk_normal.jpeg","utc_offset":-28800,"profile_use_background_image":false,"statuses_count":3314,"name":"Jacob Greer","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"greerjacob","listed_count":19,"protected":false,"followers_count":228,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2356268899\/q7guwfq0st6vtfvflehk_normal.jpeg","profile_sidebar_border_color":"000","description":"\u201cWhen a man loves cats, I am his friend and comrade, without further introduction.\u201d\n\u2014Mark Twain\n\n[code. global mindshift. soda.]","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"http:\/\/trendsient.com\/whoisthisguy\/","is_translator":false,"profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/12973252\/1348923140","favourites_count":990,"created_at":"Sat Feb 02 07:18:35 +0000 2008","friends_count":61,"verified":false,"notifications":false,"profile_background_color":"766C8A","contributors_enabled":false},"following":false,"created_at":"Sun Jul 22 17:10:38 +0000 2012","member_count":321,"id_str":"74289046","subscriber_count":0,"slug":"brilliant-data-wizards","id":74289046},{"uri":"\/alsemyonov\/ruby","name":"Ruby","full_name":"@alsemyonov\/ruby","description":"????????????-?????????","mode":"public","user":{"id":14215161,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme6\/bg.gif","time_zone":"Moscow","location":"59.923569,30.345172","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme6\/bg.gif","id_str":"14215161","entities":{"url":{"urls":[{"url":"http:\/\/al.semyonov.us\/","display_url":null,"indices":[0,22],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"FF3300","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2669793445\/12c9a486661e8437350cf5c56b1a1eb7_normal.jpeg","utc_offset":14400,"profile_use_background_image":true,"statuses_count":1416,"name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0421\u0435\u043c\u0451\u043d\u043e\u0432","follow_request_sent":false,"profile_text_color":"333333","lang":"ru","screen_name":"alsemyonov","listed_count":11,"protected":false,"followers_count":289,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2669793445\/12c9a486661e8437350cf5c56b1a1eb7_normal.jpeg","profile_sidebar_border_color":"86A4A6","description":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0435\u0431\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"A0C5C7","default_profile_image":false,"url":"http:\/\/al.semyonov.us\/","is_translator":false,"profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/14215161\/1347982619","favourites_count":106,"created_at":"Tue Mar 25 12:58:46 +0000 2008","friends_count":608,"verified":false,"notifications":false,"profile_background_color":"709397","contributors_enabled":false},"following":false,"created_at":"Sun Mar 21 15:29:57 +0000 2010","member_count":53,"id_str":"9180479","subscriber_count":2,"slug":"ruby","id":9180479},{"uri":"\/gogaruco\/speakers","name":"speakers","full_name":"@gogaruco\/speakers","description":"","mode":"public","user":{"id":19278778,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/150437177\/wallpaper_ipad_clouds.jpg","time_zone":"Alaska","location":"San Francisco","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/150437177\/wallpaper_ipad_clouds.jpg","id_str":"19278778","entities":{"url":{"urls":[{"url":"http:\/\/gogaruco.com\/","display_url":null,"indices":[0,20],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"9D582E","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2305637396\/mbhyx1x0azuf6c4p2yt1_normal.png","utc_offset":-32400,"profile_use_background_image":true,"statuses_count":591,"name":"Golden Gate RubyConf","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"gogaruco","listed_count":102,"protected":false,"followers_count":1126,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2305637396\/mbhyx1x0azuf6c4p2yt1_normal.png","profile_sidebar_border_color":"D9B17E","description":"The Annual Golden Gate Ruby Conference","profile_background_tile":true,"following":false,"profile_sidebar_fill_color":"EADEAA","default_profile_image":false,"url":"http:\/\/gogaruco.com\/","is_translator":false,"favourites_count":3,"created_at":"Wed Jan 21 06:25:33 +0000 2009","friends_count":478,"verified":false,"notifications":false,"profile_background_color":"8B542B","contributors_enabled":false},"following":false,"created_at":"Sat Jul 17 16:13:04 +0000 2010","member_count":20,"id_str":"17037309","subscriber_count":3,"slug":"speakers","id":17037309},{"uri":"\/absoludicrous\/friends","name":"Friends","full_name":"@absoludicrous\/friends","description":"","mode":"public","user":{"id":16196361,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme18\/bg.gif","time_zone":"Pacific Time (US & Canada)","location":"Oakland","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme18\/bg.gif","id_str":"16196361","entities":{"description":{"urls":[]}},"profile_link_color":"038543","geo_enabled":false,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2241565982\/orangesmile_normal.jpg","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":147,"name":"Evan Willey","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"absoludicrous","listed_count":2,"protected":false,"followers_count":66,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2241565982\/orangesmile_normal.jpg","profile_sidebar_border_color":"EEEEEE","description":"Agile guy @ Salesforce.com","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"F6F6F6","default_profile_image":false,"url":null,"is_translator":false,"favourites_count":3,"created_at":"Tue Sep 09 02:19:45 +0000 2008","friends_count":185,"verified":false,"notifications":false,"profile_background_color":"ACDED6","contributors_enabled":false},"following":false,"created_at":"Sun Jun 03 16:33:52 +0000 2012","member_count":19,"id_str":"71655172","subscriber_count":0,"slug":"friends","id":71655172},{"uri":"\/rossfuhrman\/main","name":"main","full_name":"@rossfuhrman\/main","description":"","mode":"public","user":{"id":87370098,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif","time_zone":"Mountain Time (US & Canada)","location":"Kansas, USA","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif","id_str":"87370098","entities":{"url":{"urls":[{"url":"http:\/\/thetalkingwalnut.com","display_url":null,"indices":[0,27],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"2FC2EF","geo_enabled":false,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2570652779\/k5h4oxvgur0iwg1xls4f_normal.jpeg","utc_offset":-25200,"profile_use_background_image":true,"statuses_count":476,"name":"Ross Fuhrman","follow_request_sent":false,"profile_text_color":"666666","lang":"en","screen_name":"rossfuhrman","listed_count":5,"protected":false,"followers_count":123,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2570652779\/k5h4oxvgur0iwg1xls4f_normal.jpeg","profile_sidebar_border_color":"181A1E","description":"Official Twitter account of Ross Fuhrman. Developer of software.","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"252429","default_profile_image":false,"url":"http:\/\/thetalkingwalnut.com","is_translator":false,"favourites_count":189,"created_at":"Wed Nov 04 05:16:51 +0000 2009","friends_count":261,"verified":false,"notifications":false,"profile_background_color":"1A1B1F","contributors_enabled":false},"following":false,"created_at":"Mon Aug 20 17:53:31 +0000 2012","member_count":146,"id_str":"75933278","subscriber_count":0,"slug":"main","id":75933278},{"uri":"\/_wasim\/following-2012-08-17","name":"following-2012-08-17","full_name":"@_wasim\/following-2012-08-17","description":"","mode":"public","user":{"id":169265024,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif","time_zone":"Central Time (US & Canada)","location":"Lahore","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif","id_str":"169265024","entities":{"url":{"urls":[{"url":"http:\/\/k-not.com","display_url":null,"indices":[0,16],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"2FC2EF","geo_enabled":false,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1550453164\/IMG_5568_normal.jpg","utc_offset":-21600,"profile_use_background_image":true,"statuses_count":122,"name":"Wasim Akram","follow_request_sent":false,"profile_text_color":"666666","lang":"en","screen_name":"_wasim","listed_count":0,"protected":false,"followers_count":27,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1550453164\/IMG_5568_normal.jpg","profile_sidebar_border_color":"181A1E","description":"Ruby on Rails Developer and Front End Engineer","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"252429","default_profile_image":false,"url":"http:\/\/k-not.com","is_translator":false,"favourites_count":2,"created_at":"Wed Jul 21 23:08:39 +0000 2010","friends_count":78,"verified":false,"notifications":false,"profile_background_color":"1A1B1F","contributors_enabled":false},"following":false,"created_at":"Fri Aug 17 11:57:39 +0000 2012","member_count":69,"id_str":"75757614","subscriber_count":0,"slug":"following-2012-08-17","id":75757614},{"uri":"\/SoldierCoder\/ror","name":"RoR","full_name":"@SoldierCoder\/ror","description":"","mode":"public","user":{"id":26954221,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/508572084\/jabberjay.jpg","time_zone":"Eastern Time (US & Canada)","location":"","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/508572084\/jabberjay.jpg","id_str":"26954221","entities":{"url":{"urls":[{"url":"http:\/\/wefollow.com\/soldiercoder","display_url":null,"indices":[0,32],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"0099B9","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2407494808\/xnh7l242u0stbib1x50r_normal.jpeg","utc_offset":-18000,"profile_use_background_image":true,"statuses_count":2047,"name":"Ed Drain","follow_request_sent":false,"profile_text_color":"3C3940","lang":"en","screen_name":"SoldierCoder","listed_count":14,"protected":false,"followers_count":427,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2407494808\/xnh7l242u0stbib1x50r_normal.jpeg","profile_sidebar_border_color":"5ED4DC","description":"If you would fight human-trafficking, child-trafficking or blatant misogyny, check out http:\/\/bit.ly\/bestsara & strike a blow for Sara Kruzan. \r\n","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"95E8EC","default_profile_image":false,"url":"http:\/\/wefollow.com\/soldiercoder","is_translator":false,"favourites_count":12,"created_at":"Fri Mar 27 05:01:11 +0000 2009","friends_count":919,"verified":false,"notifications":false,"profile_background_color":"0099B9","contributors_enabled":false},"following":false,"created_at":"Fri Aug 10 02:57:41 +0000 2012","member_count":33,"id_str":"75323033","subscriber_count":0,"slug":"ror","id":75323033},{"uri":"\/tayebM\/ruby-on-rails","name":"Ruby On rails","full_name":"@tayebM\/ruby-on-rails","description":"Pour mes contacts qui travaillent sur Ruby et Rails","mode":"public","user":{"id":123875891,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png","time_zone":"Athens","location":"France","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png","id_str":"123875891","entities":{"url":{"urls":[{"url":"http:\/\/tayeb83.github.com\/dtmdeblog\/","display_url":null,"indices":[0,36],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"0084B4","geo_enabled":false,"default_profile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2369723752\/ok9ix6z3rfmn2m7k02d2_normal.jpeg","utc_offset":7200,"profile_use_background_image":true,"statuses_count":179,"name":"\u0637\u064a\u0628 \u0645\u0631\u0627\u0628\u0637\u064a","follow_request_sent":false,"profile_text_color":"333333","lang":"fr","screen_name":"tayebM","listed_count":0,"protected":false,"followers_count":48,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2369723752\/ok9ix6z3rfmn2m7k02d2_normal.jpeg","profile_sidebar_border_color":"C0DEED","description":"","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"http:\/\/tayeb83.github.com\/dtmdeblog\/","is_translator":false,"favourites_count":5,"created_at":"Wed Mar 17 13:51:17 +0000 2010","friends_count":501,"verified":false,"notifications":false,"profile_background_color":"C0DEED","contributors_enabled":false},"following":false,"created_at":"Mon Jul 09 08:27:12 +0000 2012","member_count":97,"id_str":"73566072","subscriber_count":0,"slug":"ruby-on-rails","id":73566072},{"uri":"\/eurucamp\/speakers-2012","name":"speakers 2012","full_name":"@eurucamp\/speakers-2012","description":"","mode":"public","user":{"id":263762253,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/546159154\/tree.png","time_zone":"Berlin","location":"Berlin, Germany","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/546159154\/tree.png","id_str":"263762253","entities":{"url":{"urls":[{"url":"http:\/\/2012.eurucamp.org","display_url":null,"indices":[0,24],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"C2124F","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2388566722\/37gny66xyjkuazqg0a03_normal.png","utc_offset":3600,"profile_use_background_image":true,"statuses_count":1286,"name":"eurucamp 2012","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"eurucamp","listed_count":28,"protected":false,"followers_count":425,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2388566722\/37gny66xyjkuazqg0a03_normal.png","profile_sidebar_border_color":"DBE9ED","description":"european ruby camp | summer edition.\r\nTaking place on August 17-19 on Berlin's largest lake, the M\u00fcggelsee.","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"E6F6F9","default_profile_image":false,"url":"http:\/\/2012.eurucamp.org","is_translator":false,"favourites_count":31,"created_at":"Thu Mar 10 17:58:15 +0000 2011","friends_count":472,"verified":false,"notifications":false,"profile_background_color":"C2124F","contributors_enabled":false},"following":false,"created_at":"Fri Jul 13 14:25:53 +0000 2012","member_count":19,"id_str":"73797247","subscriber_count":1,"slug":"speakers-2012","id":73797247},{"uri":"\/Citizinvestor\/disrupting-government","name":"Disrupting Government","full_name":"@Citizinvestor\/disrupting-government","description":"People we respect who are disrupting government through technology.","mode":"public","user":{"id":554730384,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/568704470\/l4hmvqr7hockav5qan7v.png","time_zone":"Eastern Time (US & Canada)","location":"Boston, MA","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/568704470\/l4hmvqr7hockav5qan7v.png","id_str":"554730384","entities":{"url":{"urls":[{"url":"http:\/\/citizinvestor.com","display_url":null,"indices":[0,24],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"1AA6CF","geo_enabled":false,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2257696371\/Untitled-2_normal.png","utc_offset":-18000,"profile_use_background_image":true,"statuses_count":230,"name":"Citizinvestor","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"Citizinvestor","listed_count":25,"protected":false,"followers_count":895,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2257696371\/Untitled-2_normal.png","profile_sidebar_border_color":"C0DEED","description":"A crowdfunding platform for civic projects, now launched in Boston! Help put tech in the hands of blind Boston students here: http:\/\/bit.ly\/BlindTech","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"http:\/\/citizinvestor.com","is_translator":false,"favourites_count":8,"created_at":"Sun Apr 15 21:21:16 +0000 2012","friends_count":1000,"verified":false,"notifications":false,"profile_background_color":"FFFFFF","contributors_enabled":false},"following":false,"created_at":"Thu Jun 14 14:28:06 +0000 2012","member_count":143,"id_str":"72266637","subscriber_count":1,"slug":"disrupting-government","id":72266637},{"uri":"\/katgironpe\/developers","name":"developers","full_name":"@katgironpe\/developers","description":"Developers (often those who write in English) ","mode":"public","user":{"id":552680871,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif","time_zone":"Beijing","location":"Baguio City","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif","id_str":"552680871","entities":{"url":{"urls":[{"url":"http:\/\/www.blog.bridgeutopiaweb.com","display_url":null,"indices":[0,35],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"009999","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2617342438\/m9p9cyijzboyqfh3jx90_normal.png","utc_offset":28800,"profile_use_background_image":true,"statuses_count":468,"name":"Katherine Pe","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"katgironpe","listed_count":6,"protected":false,"followers_count":121,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2617342438\/m9p9cyijzboyqfh3jx90_normal.png","profile_sidebar_border_color":"eeeeee","description":"Developer (web & mobile apps). http:\/\/www.katherinepe.com\/ ","profile_background_tile":true,"following":false,"profile_sidebar_fill_color":"efefef","default_profile_image":false,"url":"http:\/\/www.blog.bridgeutopiaweb.com","is_translator":false,"favourites_count":122,"created_at":"Fri Apr 13 10:47:31 +0000 2012","friends_count":135,"verified":false,"notifications":false,"profile_background_color":"131516","contributors_enabled":false},"following":false,"created_at":"Tue May 15 17:08:44 +0000 2012","member_count":44,"id_str":"70615436","subscriber_count":2,"slug":"developers","id":70615436},{"uri":"\/katgironpe\/ruby","name":"ruby","full_name":"@katgironpe\/ruby","description":"Ruby developers all over the world","mode":"public","user":{"id":552680871,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif","time_zone":"Beijing","location":"Baguio City","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif","id_str":"552680871","entities":{"url":{"urls":[{"url":"http:\/\/www.blog.bridgeutopiaweb.com","display_url":null,"indices":[0,35],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"009999","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2617342438\/m9p9cyijzboyqfh3jx90_normal.png","utc_offset":28800,"profile_use_background_image":true,"statuses_count":468,"name":"Katherine Pe","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"katgironpe","listed_count":6,"protected":false,"followers_count":121,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2617342438\/m9p9cyijzboyqfh3jx90_normal.png","profile_sidebar_border_color":"eeeeee","description":"Developer (web & mobile apps). http:\/\/www.katherinepe.com\/ ","profile_background_tile":true,"following":false,"profile_sidebar_fill_color":"efefef","default_profile_image":false,"url":"http:\/\/www.blog.bridgeutopiaweb.com","is_translator":false,"favourites_count":122,"created_at":"Fri Apr 13 10:47:31 +0000 2012","friends_count":135,"verified":false,"notifications":false,"profile_background_color":"131516","contributors_enabled":false},"following":false,"created_at":"Tue May 15 13:50:22 +0000 2012","member_count":27,"id_str":"70604695","subscriber_count":1,"slug":"ruby","id":70604695},{"uri":"\/ksornberger\/developers","name":"Developers","full_name":"@ksornberger\/developers","description":"","mode":"public","user":{"id":17368301,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png","time_zone":"Eastern Time (US & Canada)","location":"Oakville, Ontario","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png","id_str":"17368301","entities":{"url":{"urls":[{"url":"http:\/\/www.ksornberger.com","display_url":null,"indices":[0,26],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"0084B4","geo_enabled":false,"default_profile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/774928074\/kevin_normal.jpg","utc_offset":-18000,"profile_use_background_image":true,"statuses_count":1531,"name":"Kevin Sornberger","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"ksornberger","listed_count":13,"protected":false,"followers_count":277,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/774928074\/kevin_normal.jpg","profile_sidebar_border_color":"C0DEED","description":"Co-Founder and Developer for @DevBBQ - www.devbbq.com | Co-Founder @UserClues - www.userclues.com","profile_background_tile":false,"following":false,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"http:\/\/www.ksornberger.com","is_translator":false,"favourites_count":84,"created_at":"Thu Nov 13 16:36:58 +0000 2008","friends_count":349,"verified":false,"notifications":false,"profile_background_color":"C0DEED","contributors_enabled":false},"following":false,"created_at":"Thu Mar 10 04:45:35 +0000 2011","member_count":5,"id_str":"40091270","subscriber_count":0,"slug":"developers","id":40091270},{"uri":"\/yuletide\/codeforamerica","name":"CodeForAmerica","full_name":"@yuletide\/codeforamerica","description":"","mode":"public","user":{"id":12329722,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/134104376\/x16e3c06a315f173482318b7588b1a82.png","time_zone":"Pacific Time (US & Canada)","location":"San Francisco & Philadelphia","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/134104376\/x16e3c06a315f173482318b7588b1a82.png","id_str":"12329722","entities":{"url":{"urls":[{"url":"https:\/\/www.vizify.com\/yuletide","display_url":null,"indices":[0,31],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"50857F","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1748360672\/381894_619091932685_4402402_33003257_1063084351_n_normal.jpg","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":5060,"name":"Alex Yule","follow_request_sent":false,"profile_text_color":"1C1F23","lang":"en","screen_name":"yuletide","listed_count":36,"protected":false,"followers_count":826,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1748360672\/381894_619091932685_4402402_33003257_1063084351_n_normal.jpg","profile_sidebar_border_color":"803C22","description":"I love building meaningful things for the web. Lifetime geographer, coder, metalhead, writer, enviro & web dood. @codeforamerica fellow 2012. @textizen dev","profile_background_tile":true,"following":false,"profile_sidebar_fill_color":"EDEACB","default_profile_image":false,"url":"https:\/\/www.vizify.com\/yuletide","is_translator":false,"favourites_count":1182,"created_at":"Wed Jan 16 19:37:35 +0000 2008","friends_count":379,"verified":false,"notifications":false,"profile_background_color":"07090B","contributors_enabled":false},"following":false,"created_at":"Thu Nov 17 22:44:44 +0000 2011","member_count":40,"id_str":"59192144","subscriber_count":0,"slug":"codeforamerica","id":59192144},{"uri":"\/IntellectAssets\/entrepreneurs","name":"Entrepreneurs","full_name":"@IntellectAssets\/entrepreneurs","description":"Entrepreneurs & StartUp Guys","mode":"public","user":{"id":69552540,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/675045909\/9bc0778d5883eefa3f02a82025b0fc5c.jpeg","time_zone":"New Delhi","location":"New Delhi, India","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/675045909\/9bc0778d5883eefa3f02a82025b0fc5c.jpeg","id_str":"69552540","entities":{"url":{"urls":[{"url":"http:\/\/www.StoreMonk.com","display_url":null,"indices":[0,24],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"000000","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2673977440\/c438321c0d6e5fc410b603778fff95c3_normal.png","utc_offset":19800,"profile_use_background_image":true,"statuses_count":10536,"name":"Deepak Sharma","follow_request_sent":false,"profile_text_color":"400000","lang":"en","screen_name":"IntellectAssets","listed_count":30,"protected":false,"followers_count":2665,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2673977440\/c438321c0d6e5fc410b603778fff95c3_normal.png","profile_sidebar_border_color":"FFFFFF","description":"Challenging the Status Quo. Founder of @StoreMonk & Ninja Extraordinaire at @PeerHack. Fellow at @startlead. Foodie & Adventurer. Redbull Drinker & Coffee Nut. ","profile_background_tile":true,"following":false,"profile_sidebar_fill_color":"E6F3FA","default_profile_image":false,"url":"http:\/\/www.StoreMonk.com","is_translator":false,"profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/69552540\/1348432221","favourites_count":248,"created_at":"Fri Aug 28 10:01:42 +0000 2009","friends_count":287,"verified":false,"notifications":false,"profile_background_color":"B8B8B8","contributors_enabled":false},"following":false,"created_at":"Mon Sep 27 17:58:42 +0000 2010","member_count":500,"id_str":"22785828","subscriber_count":2,"slug":"entrepreneurs","id":22785828}], "next_cursor":1401037770457540712, "previous_cursor":0, "next_cursor_str":"1401037770457540712", "previous_cursor_str":"0"}
|
data/spec/fixtures/sferik.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"
|
1
|
+
{"id":7505382,"id_str":"7505382","name":"Erik Michaels-Ober","screen_name":"sferik","location":"San Francisco","description":"An ingredient in your recipe.","url":"https:\/\/github.com\/sferik","entities":{"url":{"urls":[{"url":"https:\/\/github.com\/sferik","expanded_url":null,"indices":[0,25]}]},"description":{"urls":[]}},"protected":false,"followers_count":2449,"friends_count":203,"listed_count":130,"created_at":"Mon Jul 16 12:59:01 +0000 2007","favourites_count":4306,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":8554,"lang":"en","status":{"created_at":"Tue Oct 02 23:21:06 +0000 2012","id":253273430739283969,"id_str":"253273430739283969","text":"@dakami RAM drives are the new SSDs","source":"\u003ca href=\"http:\/\/itunes.apple.com\/us\/app\/twitter\/id409789998?mt=12\" rel=\"nofollow\"\u003eTwitter for Mac\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":253272860473298944,"in_reply_to_status_id_str":"253272860473298944","in_reply_to_user_id":8917142,"in_reply_to_user_id_str":"8917142","in_reply_to_screen_name":"dakami","geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"entities":{"hashtags":[],"urls":[],"user_mentions":[{"screen_name":"dakami","name":"Dan Kaminsky","id":8917142,"id_str":"8917142","indices":[0,7]}]},"favorited":false,"retweeted":false},"contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/665875854\/bb0b3653dcf0644e344823e0a2eb3382.png","profile_background_tile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/7505382\/1348266581","profile_link_color":"0084B4","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"lists":[{"uri":"\/pengwynn\/rubyists","name":"Rubyists","full_name":"@pengwynn\/rubyists","description":"","mode":"public","user":{"id":14100886,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png","time_zone":"Central Time (US & Canada)","location":"Denton, TX","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png","id_str":"14100886","entities":{"url":{"urls":[{"url":"http:\/\/wynnnetherland.com","display_url":null,"indices":[0,25],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"0084B4","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2221455972\/wynn-mic-bw_normal.jpg","utc_offset":-21600,"profile_use_background_image":false,"statuses_count":7384,"name":"Wynn Netherland","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"pengwynn","listed_count":397,"protected":false,"is_translator":false,"followers_count":6182,"profile_sidebar_border_color":"FFFFFF","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2221455972\/wynn-mic-bw_normal.jpg","description":"Christian, husband, father, GitHubber, Co-host of @thechangelog, Co-author of Sass, Compass, #CSS book http:\/\/wynn.fm\/sass-meap","profile_background_tile":false,"following":true,"profile_sidebar_fill_color":"DDEEF6","default_profile_image":false,"url":"http:\/\/wynnnetherland.com","profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/14100886\/1347987369","favourites_count":338,"created_at":"Sat Mar 08 16:34:22 +0000 2008","friends_count":3528,"verified":false,"notifications":false,"profile_background_color":"292929","contributors_enabled":false},"following":true,"created_at":"Fri Oct 30 14:39:25 +0000 2009","member_count":499,"id_str":"1129440","subscriber_count":39,"slug":"rubyists","id":1129440},{"uri":"\/twitter\/team","name":"Team","full_name":"@twitter\/team","description":"","mode":"public","user":{"id":783214,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/657090062\/l1uqey5sy82r9ijhke1i.png","time_zone":"Pacific Time (US & Canada)","location":"San Francisco, CA","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/657090062\/l1uqey5sy82r9ijhke1i.png","id_str":"783214","entities":{"url":{"urls":[{"url":"http:\/\/blog.twitter.com\/","display_url":null,"indices":[0,24],"expanded_url":null}]},"description":{"urls":[]}},"profile_link_color":"038543","geo_enabled":true,"default_profile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2284174758\/v65oai7fxn47qv9nectx_normal.png","utc_offset":-28800,"profile_use_background_image":true,"statuses_count":1433,"name":"Twitter","follow_request_sent":false,"profile_text_color":"333333","lang":"en","screen_name":"twitter","listed_count":73289,"protected":false,"is_translator":false,"followers_count":13711744,"profile_sidebar_border_color":"EEEEEE","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2284174758\/v65oai7fxn47qv9nectx_normal.png","description":"Always wondering what's happening. ","profile_background_tile":true,"following":true,"profile_sidebar_fill_color":"F6F6F6","default_profile_image":false,"url":"http:\/\/blog.twitter.com\/","profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/783214\/1347405327","favourites_count":18,"created_at":"Tue Feb 20 14:35:54 +0000 2007","friends_count":1249,"verified":true,"notifications":false,"profile_background_color":"ACDED6","contributors_enabled":true},"following":true,"created_at":"Wed Sep 23 01:18:01 +0000 2009","member_count":1199,"id_str":"574","subscriber_count":78079,"slug":"team","id":574}], "next_cursor":0, "previous_cursor":0, "next_cursor_str":"0", "previous_cursor_str":"0"}
|
@@ -114,6 +114,38 @@ describe Twitter::API do
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
+
describe "#update_profile_banner" do
|
118
|
+
before do
|
119
|
+
stub_post("/1.1/account/update_profile_banner.json").
|
120
|
+
to_return(:body => fixture("empty.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
121
|
+
end
|
122
|
+
it "requests the correct resource" do
|
123
|
+
@client.update_profile_banner(fixture("me.jpeg"))
|
124
|
+
a_post("/1.1/account/update_profile_banner.json").
|
125
|
+
should have_been_made
|
126
|
+
end
|
127
|
+
it "returns a user" do
|
128
|
+
user = @client.update_profile_banner(fixture("me.jpeg"))
|
129
|
+
user.should be_nil
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "#remove_profile_banner" do
|
134
|
+
before do
|
135
|
+
stub_post("/1.1/account/remove_profile_banner.json").
|
136
|
+
to_return(:body => fixture("empty.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
137
|
+
end
|
138
|
+
it "requests the correct resource" do
|
139
|
+
@client.remove_profile_banner
|
140
|
+
a_post("/1.1/account/remove_profile_banner.json").
|
141
|
+
should have_been_made
|
142
|
+
end
|
143
|
+
it "returns a user" do
|
144
|
+
user = @client.remove_profile_banner
|
145
|
+
user.should be_nil
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
117
149
|
describe "#settings" do
|
118
150
|
before do
|
119
151
|
stub_get("/1.1/account/settings.json").
|
@@ -84,7 +84,7 @@ describe Twitter::API do
|
|
84
84
|
before do
|
85
85
|
stub_get("/1.1/lists/memberships.json").
|
86
86
|
with(:query => {:screen_name => 'pengwynn', :cursor => "-1"}).
|
87
|
-
to_return(:body => fixture("
|
87
|
+
to_return(:body => fixture("memberships.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
88
88
|
end
|
89
89
|
it "requests the correct resource" do
|
90
90
|
@client.memberships("pengwynn")
|
@@ -97,7 +97,7 @@ describe Twitter::API do
|
|
97
97
|
memberships.should be_a Twitter::Cursor
|
98
98
|
memberships.lists.should be_an Array
|
99
99
|
memberships.lists.first.should be_a Twitter::List
|
100
|
-
memberships.lists.first.name.should eq "
|
100
|
+
memberships.lists.first.name.should eq "developer"
|
101
101
|
end
|
102
102
|
end
|
103
103
|
context "without a screen name passed" do
|
@@ -106,7 +106,7 @@ describe Twitter::API do
|
|
106
106
|
to_return(:body => fixture("sferik.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
107
107
|
stub_get("/1.1/lists/memberships.json").
|
108
108
|
with(:query => {:cursor => "-1"}).
|
109
|
-
to_return(:body => fixture("
|
109
|
+
to_return(:body => fixture("memberships.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
110
110
|
end
|
111
111
|
it "requests the correct resource" do
|
112
112
|
@client.memberships
|
@@ -160,7 +160,7 @@ describe Twitter::API do
|
|
160
160
|
before do
|
161
161
|
stub_get("/1.1/lists/subscriptions.json").
|
162
162
|
with(:query => {:screen_name => 'pengwynn', :cursor => "-1"}).
|
163
|
-
to_return(:body => fixture("
|
163
|
+
to_return(:body => fixture("subscriptions.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
164
164
|
end
|
165
165
|
it "requests the correct resource" do
|
166
166
|
@client.subscriptions("pengwynn")
|
@@ -182,7 +182,7 @@ describe Twitter::API do
|
|
182
182
|
to_return(:body => fixture("sferik.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
183
183
|
stub_get("/1.1/lists/subscriptions.json").
|
184
184
|
with(:query => {:cursor => "-1"}).
|
185
|
-
to_return(:body => fixture("
|
185
|
+
to_return(:body => fixture("subscriptions.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
186
186
|
end
|
187
187
|
it "requests the correct resource" do
|
188
188
|
@client.subscriptions
|
@@ -789,21 +789,18 @@ describe Twitter::API do
|
|
789
789
|
describe "#lists" do
|
790
790
|
before do
|
791
791
|
stub_get("/1.1/lists/list.json").
|
792
|
-
with(:query => {:cursor => "-1"}).
|
793
792
|
to_return(:body => fixture("lists.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
794
793
|
end
|
795
794
|
it "requests the correct resource" do
|
796
795
|
@client.lists
|
797
796
|
a_get("/1.1/lists/list.json").
|
798
|
-
with(:query => {:cursor => "-1"}).
|
799
797
|
should have_been_made
|
800
798
|
end
|
801
799
|
it "returns the requested list" do
|
802
800
|
lists = @client.lists
|
803
|
-
lists.should
|
804
|
-
lists.
|
805
|
-
lists.
|
806
|
-
lists.lists.first.name.should eq "Rubyists"
|
801
|
+
lists.should be_an Array
|
802
|
+
lists.first.should be_a Twitter::List
|
803
|
+
lists.first.name.should eq "Rubyists"
|
807
804
|
end
|
808
805
|
end
|
809
806
|
|
data/spec/twitter/tweet_spec.rb
CHANGED
@@ -176,6 +176,17 @@ describe Twitter::Tweet do
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
+
describe "#reply?" do
|
180
|
+
it "returns true when there is an in-reply-to status" do
|
181
|
+
tweet = Twitter::Tweet.new(:id => 28669546014, :in_reply_to_status_id => 114749583439036416)
|
182
|
+
tweet.reply?.should be_true
|
183
|
+
end
|
184
|
+
it "returns false when in_reply_to_status_id is not set" do
|
185
|
+
tweet = Twitter::Tweet.new(:id => 28669546014)
|
186
|
+
tweet.reply?.should be_false
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
179
190
|
describe "#retweet?" do
|
180
191
|
it "returns true when there is a retweeted status" do
|
181
192
|
tweet = Twitter::Tweet.new(:id => 28669546014, :retweeted_status => {:id => 28561922516, :text => 'BOOSH'})
|
data/spec/twitter/user_spec.rb
CHANGED
@@ -31,9 +31,110 @@ describe Twitter::User do
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
describe "#profile_banner_url" do
|
35
|
+
it "returns a String when profile_banner_url is set" do
|
36
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
37
|
+
user.profile_banner_url.should be_a String
|
38
|
+
end
|
39
|
+
it "returns nil when created_at is not set" do
|
40
|
+
user = Twitter::User.new(:id => 7505382)
|
41
|
+
user.profile_banner_url.should be_nil
|
42
|
+
end
|
43
|
+
it "returns the web-sized image" do
|
44
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
45
|
+
user.profile_banner_url.should eq "http://si0.twimg.com/profile_banners/7505382/1348266581/web"
|
46
|
+
end
|
47
|
+
context "with :web_retina passed" do
|
48
|
+
it "returns the web retina-sized image" do
|
49
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
50
|
+
user.profile_banner_url(:web_retina).should eq "http://si0.twimg.com/profile_banners/7505382/1348266581/web_retina"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
context "with :mobile passed" do
|
54
|
+
it "returns the mobile-sized image" do
|
55
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
56
|
+
user.profile_banner_url(:mobile).should eq "http://si0.twimg.com/profile_banners/7505382/1348266581/mobile"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
context "with :mobile_retina passed" do
|
60
|
+
it "returns the mobile retina-sized image" do
|
61
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
62
|
+
user.profile_banner_url(:mobile_retina).should eq "http://si0.twimg.com/profile_banners/7505382/1348266581/mobile_retina"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
context "with :ipad passed" do
|
66
|
+
it "returns the mobile-sized image" do
|
67
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
68
|
+
user.profile_banner_url(:ipad).should eq "http://si0.twimg.com/profile_banners/7505382/1348266581/ipad"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
context "with :ipad_retina passed" do
|
72
|
+
it "returns the mobile retina-sized image" do
|
73
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
74
|
+
user.profile_banner_url(:ipad_retina).should eq "http://si0.twimg.com/profile_banners/7505382/1348266581/ipad_retina"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#profile_banner_url_https" do
|
80
|
+
it "returns a String when profile_banner_url is set" do
|
81
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
82
|
+
user.profile_banner_url_https.should be_a String
|
83
|
+
end
|
84
|
+
it "returns nil when created_at is not set" do
|
85
|
+
user = Twitter::User.new(:id => 7505382)
|
86
|
+
user.profile_banner_url_https.should be_nil
|
87
|
+
end
|
88
|
+
it "returns the web-sized image" do
|
89
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
90
|
+
user.profile_banner_url_https.should eq "https://si0.twimg.com/profile_banners/7505382/1348266581/web"
|
91
|
+
end
|
92
|
+
context "with :web_retina passed" do
|
93
|
+
it "returns the web retina-sized image" do
|
94
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
95
|
+
user.profile_banner_url_https(:web_retina).should eq "https://si0.twimg.com/profile_banners/7505382/1348266581/web_retina"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
context "with :mobile passed" do
|
99
|
+
it "returns the mobile-sized image" do
|
100
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
101
|
+
user.profile_banner_url_https(:mobile).should eq "https://si0.twimg.com/profile_banners/7505382/1348266581/mobile"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
context "with :mobile_retina passed" do
|
105
|
+
it "returns the mobile retina-sized image" do
|
106
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
107
|
+
user.profile_banner_url_https(:mobile_retina).should eq "https://si0.twimg.com/profile_banners/7505382/1348266581/mobile_retina"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
context "with :ipad passed" do
|
111
|
+
it "returns the mobile-sized image" do
|
112
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
113
|
+
user.profile_banner_url_https(:ipad).should eq "https://si0.twimg.com/profile_banners/7505382/1348266581/ipad"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
context "with :ipad_retina passed" do
|
117
|
+
it "returns the mobile retina-sized image" do
|
118
|
+
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
119
|
+
user.profile_banner_url_https(:ipad_retina).should eq "https://si0.twimg.com/profile_banners/7505382/1348266581/ipad_retina"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe "#profile_banner_url?" do
|
125
|
+
it "returns true when profile_banner_url is set" do
|
126
|
+
profile_banner_url = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581").profile_banner_url?
|
127
|
+
profile_banner_url.should be_true
|
128
|
+
end
|
129
|
+
it "returns false when status is not set" do
|
130
|
+
profile_banner_url = Twitter::User.new(:id => 7505382).profile_banner_url?
|
131
|
+
profile_banner_url.should be_false
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
34
135
|
describe "#profile_image_url" do
|
35
|
-
it "returns a String when
|
36
|
-
user = Twitter::User.new(:id => 7505382, :
|
136
|
+
it "returns a String when profile_image_url_https is set" do
|
137
|
+
user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
|
37
138
|
user.profile_image_url.should be_a String
|
38
139
|
end
|
39
140
|
it "returns nil when created_at is not set" do
|
@@ -41,24 +142,24 @@ describe Twitter::User do
|
|
41
142
|
user.profile_image_url.should be_nil
|
42
143
|
end
|
43
144
|
it "returns the normal-sized image" do
|
44
|
-
user = Twitter::User.new(:id => 7505382, :
|
145
|
+
user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
|
45
146
|
user.profile_image_url.should eq "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png"
|
46
147
|
end
|
47
148
|
context "with :original passed" do
|
48
149
|
it "returns the original image" do
|
49
|
-
user = Twitter::User.new(:id => 7505382, :
|
150
|
+
user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
|
50
151
|
user.profile_image_url(:original).should eq "http://a0.twimg.com/profile_images/1759857427/image1326743606.png"
|
51
152
|
end
|
52
153
|
end
|
53
154
|
context "with :bigger passed" do
|
54
155
|
it "returns the bigger-sized image" do
|
55
|
-
user = Twitter::User.new(:id => 7505382, :
|
156
|
+
user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
|
56
157
|
user.profile_image_url(:bigger).should eq "http://a0.twimg.com/profile_images/1759857427/image1326743606_bigger.png"
|
57
158
|
end
|
58
159
|
end
|
59
160
|
context "with :mini passed" do
|
60
161
|
it "returns the mini-sized image" do
|
61
|
-
user = Twitter::User.new(:id => 7505382, :
|
162
|
+
user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
|
62
163
|
user.profile_image_url(:mini).should eq "http://a0.twimg.com/profile_images/1759857427/image1326743606_mini.png"
|
63
164
|
end
|
64
165
|
end
|
@@ -97,6 +198,17 @@ describe Twitter::User do
|
|
97
198
|
end
|
98
199
|
end
|
99
200
|
|
201
|
+
describe "#profile_image_url?" do
|
202
|
+
it "returns true when profile_banner_url is set" do
|
203
|
+
profile_image_url = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://si0.twimg.com/profile_banners/7505382/1348266581").profile_image_url?
|
204
|
+
profile_image_url.should be_true
|
205
|
+
end
|
206
|
+
it "returns false when status is not set" do
|
207
|
+
profile_image_url= Twitter::User.new(:id => 7505382).profile_image_url?
|
208
|
+
profile_image_url.should be_false
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
100
212
|
describe "#status" do
|
101
213
|
it "returns a Status when status is set" do
|
102
214
|
tweet = Twitter::User.new(:id => 7505382, :status => {:id => 25938088801}).status
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2012-
|
15
|
+
date: 2012-10-08 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: faraday
|
@@ -258,10 +258,11 @@ files:
|
|
258
258
|
- lib/twitter/error/internal_server_error.rb
|
259
259
|
- lib/twitter/error/not_acceptable.rb
|
260
260
|
- lib/twitter/error/not_found.rb
|
261
|
-
- lib/twitter/error/rate_limited.rb
|
262
261
|
- lib/twitter/error/server_error.rb
|
263
262
|
- lib/twitter/error/service_unavailable.rb
|
263
|
+
- lib/twitter/error/too_many_requests.rb
|
264
264
|
- lib/twitter/error/unauthorized.rb
|
265
|
+
- lib/twitter/error/unprocessable_entity.rb
|
265
266
|
- lib/twitter/error.rb
|
266
267
|
- lib/twitter/factory.rb
|
267
268
|
- lib/twitter/geo/point.rb
|
@@ -306,6 +307,7 @@ files:
|
|
306
307
|
- spec/fixtures/contributors.json
|
307
308
|
- spec/fixtures/direct_message.json
|
308
309
|
- spec/fixtures/direct_messages.json
|
310
|
+
- spec/fixtures/empty.json
|
309
311
|
- spec/fixtures/end_session.json
|
310
312
|
- spec/fixtures/enhance_your_calm.text
|
311
313
|
- spec/fixtures/favorites.json
|
@@ -325,6 +327,7 @@ files:
|
|
325
327
|
- spec/fixtures/me.jpeg
|
326
328
|
- spec/fixtures/media_timeline.json
|
327
329
|
- spec/fixtures/members.json
|
330
|
+
- spec/fixtures/memberships.json
|
328
331
|
- spec/fixtures/no_user_matches.json
|
329
332
|
- spec/fixtures/not_acceptable.json
|
330
333
|
- spec/fixtures/not_following.json
|
@@ -355,6 +358,7 @@ files:
|
|
355
358
|
- spec/fixtures/status.json
|
356
359
|
- spec/fixtures/status_with_media.json
|
357
360
|
- spec/fixtures/statuses.json
|
361
|
+
- spec/fixtures/subscriptions.json
|
358
362
|
- spec/fixtures/suggestions.json
|
359
363
|
- spec/fixtures/tos.json
|
360
364
|
- spec/fixtures/totals.json
|
@@ -462,6 +466,7 @@ test_files:
|
|
462
466
|
- spec/fixtures/contributors.json
|
463
467
|
- spec/fixtures/direct_message.json
|
464
468
|
- spec/fixtures/direct_messages.json
|
469
|
+
- spec/fixtures/empty.json
|
465
470
|
- spec/fixtures/end_session.json
|
466
471
|
- spec/fixtures/enhance_your_calm.text
|
467
472
|
- spec/fixtures/favorites.json
|
@@ -481,6 +486,7 @@ test_files:
|
|
481
486
|
- spec/fixtures/me.jpeg
|
482
487
|
- spec/fixtures/media_timeline.json
|
483
488
|
- spec/fixtures/members.json
|
489
|
+
- spec/fixtures/memberships.json
|
484
490
|
- spec/fixtures/no_user_matches.json
|
485
491
|
- spec/fixtures/not_acceptable.json
|
486
492
|
- spec/fixtures/not_following.json
|
@@ -511,6 +517,7 @@ test_files:
|
|
511
517
|
- spec/fixtures/status.json
|
512
518
|
- spec/fixtures/status_with_media.json
|
513
519
|
- spec/fixtures/statuses.json
|
520
|
+
- spec/fixtures/subscriptions.json
|
514
521
|
- spec/fixtures/suggestions.json
|
515
522
|
- spec/fixtures/tos.json
|
516
523
|
- spec/fixtures/totals.json
|