twitter 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- #### A Ruby interface to the Twitter API.
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 remove of the [`GET
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::RateLimited => 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 two new error classes:
139
+ It's worth mentioning new error classes:
140
140
 
141
141
  * `Twitter::Error::GatewayTimeout`
142
- * `Twitter::Error::RateLimited`
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::RateLimited` for all rate limit errors. The
148
- `Twitter::Error::EnhanceYourCalm` class has been aliased to
149
- `Twitter::Error::RateLimited`.
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
- Applications that make requests on behalf of one Twitter user at a time can
168
- pass global configuration options as a block to the `Twitter.configure` method.
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
- ### Threadsafe Configuration
212
+ ### Thread Safety
195
213
 
196
214
  Applications that make requests on behalf of multiple Twitter users should
197
- avoid using global configuration. Instead, instantiate a `Twitter::Client` for
198
- each user, passing in the user's token/secret pair as a `Hash`.
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 `Twitter::Client`:
226
+ Then, for each user's access token/secret pair, instantiate a
227
+ `Twitter::Client`:
211
228
 
212
229
  ```ruby
213
- @erik = Twitter::Client.new(
214
- :oauth_token => "Erik's OAuth token",
215
- :oauth_token_secret => "Erik's OAuth secret"
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
- @john = Twitter::Client.new(
219
- :oauth_token => "John's OAuth token",
220
- :oauth_token_secret => "John's OAuth secret"
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 like so:
241
+ You can now make threadsafe requests as the authenticated user:
225
242
 
226
243
  ```ruby
227
- @erik.update("Tweeting as Erik!")
228
- @john.update("Tweeting as John!")
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 => "a consumer key",
237
- :consumer_secret => "a consumer secret",
238
- :oauth_token => "a user's OAuth token",
239
- :oauth_token_secret => "a user's OAuth secret"
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
- ###### Return a user's location
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.user("sferik").location
289
+ Twitter.update("I'm tweeting with @gem!")
269
290
  ```
270
- ###### Return a user's most recent Tweet
291
+ **Follow a user (by screen name or user ID)**
292
+
271
293
  ```ruby
272
- Twitter.user_timeline("sferik").first.text
294
+ Twitter.follow("gem")
295
+ Twitter.follow(213747670)
273
296
  ```
274
- ###### Return the text of a Tweet
297
+ **Fetch a user (by screen name or user ID)**
298
+
275
299
  ```ruby
276
- Twitter.status(27558893223).text
300
+ Twitter.user("gem")
301
+ Twitter.user(213747670)
277
302
  ```
278
- ###### Find the 3 most recent marriage proposals to @justinbieber
303
+ **Fetch the timeline of Tweets by a user**
304
+
279
305
  ```ruby
280
- Twitter.search("to:justinbieber marry me", :count => 3, :result_type => "recent").results.map do |status|
281
- "#{status.from_user}: #{status.text}"
282
- end
306
+ Twitter.user_timeline("gem")
307
+ Twitter.user_timeline(213747670)
283
308
  ```
284
- ###### Find a Japanese-language Tweet tagged #ruby (excluding retweets)
309
+ **Fetch the timeline of Tweets from the authenticated user's home page**
310
+
285
311
  ```ruby
286
- Twitter.search("#ruby -rt", :lang => "ja", :count => 1).results.first.text
312
+ Twitter.home_timeline
287
313
  ```
288
- ###### Update your status
314
+ **Fetch the timeline of Tweets mentioning the authenticated user**
315
+
289
316
  ```ruby
290
- Twitter.update("I'm tweeting with @gem!")
317
+ Twitter.mentions_timeline
291
318
  ```
292
- ###### Read the most recent Tweet in your timeline
319
+ **Fetch a particular Tweet by ID**
320
+
293
321
  ```ruby
294
- Twitter.home_timeline.first.text
322
+ Twitter.status(27558893223)
323
+ ```
324
+ **Find the 3 most recent marriage proposals to @justinbieber**
295
325
 
296
- For more usage examples, please see the full [documentation][].
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
- ## Additional Notes
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.
@@ -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, Hash] The background image for the profile. 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 scaled down.
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 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 {Twitter::User#profile_image_url}.
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, Hash] The avatar image for the profile. 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
+ # @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
- # List the lists of the specified user
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::Cursor]
1170
- # @param options [Hash] A customizable set of options.
1171
- # @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.
1172
- # @example List the authenticated user's lists
1173
- # Twitter.lists
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
- lists_from_response(:get, "/1.1/lists/list.json", args)
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 RateLimited < Twitter::Error::ClientError
6
+ class TooManyRequests < Twitter::Error::ClientError
7
7
  HTTP_STATUS_CODE = 429
8
8
  end
9
- EnhanceYourCalm = RateLimited
9
+ EnhanceYourCalm = TooManyRequests
10
+ RateLimited = TooManyRequests
10
11
  end
11
12
  end
@@ -0,0 +1,10 @@
1
+ require 'twitter/error/client_error'
2
+
3
+ module Twitter
4
+ class Error
5
+ # Raised when Twitter returns the HTTP status code 404
6
+ class UnprocessableEntity < Twitter::Error::ClientError
7
+ HTTP_STATUS_CODE = 422
8
+ end
9
+ end
10
+ 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
@@ -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
@@ -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
- # The profile image URL comes in looking like like this:
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
 
@@ -1,7 +1,7 @@
1
1
  module Twitter
2
2
  class Version
3
3
  MAJOR = 4 unless defined? Twitter::MAJOR
4
- MINOR = 0 unless defined? Twitter::MINOR
4
+ MINOR = 1 unless defined? Twitter::MINOR
5
5
  PATCH = 0 unless defined? Twitter::PATCH
6
6
  PRE = nil unless defined? Twitter::PRE
7
7
 
File without changes
@@ -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"}
@@ -1 +1 @@
1
- {"show_all_inline_media":true,"lang":"en","geo_enabled":true,"profile_background_image_url":"http:\/\/a2.twimg.com\/profile_background_images\/162641967\/we_concept_bg2.png","created_at":"Mon Jul 16 12:59:01 +0000 2007","description":"A mind forever voyaging through strange seas of thought, alone.","screen_name":"sferik","url":"https:\/\/github.com\/sferik","status":{"retweeted_status":{"coordinates":null,"retweeted":false,"retweet_count":8,"created_at":"Sun Jan 16 20:57:21 +0000 2011","in_reply_to_user_id":null,"place":null,"source":"\u003Ca href=\"http:\/\/www.echofon.com\/\" rel=\"nofollow\"\u003EEchofon\u003C\/a\u003E","in_reply_to_status_id":null,"truncated":false,"favorited":false,"in_reply_to_status_id_str":null,"id_str":"26744838716133376","geo":null,"contributors":null,"in_reply_to_screen_name":null,"id":26744838716133376,"in_reply_to_user_id_str":null,"text":"[ANN] sqlite3-ruby =&gt; sqlite3"},"coordinates":null,"retweeted":false,"retweet_count":8,"created_at":"Sun Jan 16 21:38:25 +0000 2011","in_reply_to_user_id":null,"place":null,"source":"\u003Ca href=\"http:\/\/itunes.apple.com\/us\/app\/twitter\/id409789998?mt=12\" rel=\"nofollow\"\u003ETwitter for Mac\u003C\/a\u003E","in_reply_to_status_id":null,"truncated":false,"favorited":false,"in_reply_to_status_id_str":null,"id_str":"26755176471724032","geo":null,"contributors":null,"in_reply_to_screen_name":null,"id":26755176471724032,"in_reply_to_user_id_str":null,"text":"RT @tenderlove: [ANN] sqlite3-ruby =&gt; sqlite3"},"profile_text_color":"333333","followers_count":1048,"listed_count":41,"following":false,"favourites_count":1040,"profile_sidebar_fill_color":"DDEEF6","location":"San Francisco","profile_background_tile":false,"time_zone":"Pacific Time (US & Canada)","contributors_enabled":false,"statuses_count":3479,"profile_link_color":"0084B4","is_translator":false,"profile_sidebar_border_color":"C0DEED","protected":false,"id_str":"7505382","name":"Erik Michaels-Ober","verified":false,"notifications":false,"profile_use_background_image":true,"friends_count":197,"profile_image_url":"http:\/\/a1.twimg.com\/profile_images\/1186912733\/Github_Square_normal.jpg","id":7505382,"follow_request_sent":false,"utc_offset":-28800,"profile_background_color":"000000"}
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("lists.json"), :headers => {:content_type => "application/json; charset=utf-8"})
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 "Rubyists"
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("lists.json"), :headers => {:content_type => "application/json; charset=utf-8"})
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("lists.json"), :headers => {:content_type => "application/json; charset=utf-8"})
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("lists.json"), :headers => {:content_type => "application/json; charset=utf-8"})
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 be_a Twitter::Cursor
804
- lists.lists.should be_an Array
805
- lists.lists.first.should be_a Twitter::List
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
 
@@ -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'})
@@ -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 profile_image_url is set" do
36
- user = Twitter::User.new(:id => 7505382, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
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, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
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, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
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, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
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, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
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.0.0
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-09-26 00:00:00.000000000 Z
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