-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adding Bearer Token support #387
Conversation
- Added :bearer_token to the list of configuration parameters - The default value of the bearer_token is read from the environment variable - Requests send the "Bearer AAA..." type authentication header if a bearer token exists - Added tests to verify that bearer token implementation works as intended
- I had to replicate the functionality of the request method to accomodate for the abnormal way we have to make the request - Configurable can supply the base64 encoded bearer token credential
Added the oauth2/token method implementation as well, but I am not very pleased with it. Could someone give me feedback please? |
This looks really good to me actually, nicely done. |
@@ -49,6 +51,13 @@ def reset! | |||
alias setup reset! | |||
|
|||
private | |||
def application_only_auth? | |||
not @bearer_token.nil? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
stylistic preference for me, but i loathe double negatives like this, perhaps change to:
!!@bearer_token
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, that sounds perfectly fine, will change.
OK. I have refactored the code and added tests and docs for the I still have the following questions:
|
I think
Ideally, you could get this into a single conditional statement without needing a duplicate request method. If this means moving the Other than that, this pull request looks very good to me. |
@sferik Thank you for your comments. Should I try to unify the request methods, then, also including the In your original email to the Google Group, you mention being able to initialize the library with just |
Yes, please.
When checking for credentials, the code should check if |
# bearer_token = client.token | ||
def token | ||
object_from_response(Twitter::Token, :bearer_request, "/oauth2/token", :grant_type => "client_credentials") | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe alias
this method to bearer_token
?
- The request method is using a helper method request_setup that returns a Proc which sets up the correct headers for the current request. - Each type of different authentication header is being returned by a separate private method and they all have tests.
@sferik I just pushed the request method unification, please tell me if there are any functional and/or stylistic errors. As to automatically acquiring BT given CT and CS: I couldn't find a place where credentials are checked. There is a If you think this pull request is ready just for adding bearer_token support, maybe you can merge this and then we can discuss and I can implement a proper solution for automagically getting BT from CT and CS. |
end | ||
else | ||
Proc.new do |request| | ||
uri = URI(@endpoint + path) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this doesn't appear to be used
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
duh, you are right. that was a left over from a refactor. will remove it.
uri = URI(@endpoint + path) | ||
SimpleOAuth::Header.new(method, uri, params, credentials) | ||
end | ||
|
||
end | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor point but this end
should be indented.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
definitely, good catch.
👍 nice work @paracycle |
@sferik @spagalloco Thanks for all the help and for putting up with all my questions. It was a pleasure collaborating with you. I would love to contribute more in the future, please drop me a note if you think there is anything I can help with. |
After this pull request, it would be my pleasure to add you as a collaborator on this project. Feel free to push any other changes you see fit. |
@sferik Wow, I'd be thrilled. Thanks for the vote of confidence. |
Changelog (from CHANGELOG.md) 5.5.1 ----- * [Fix bug where `Twitter::Error::AlreadyFavorited` would never be raised](sferik/twitter-ruby#512) ([@Polestarw](https://twitter.com/polestarw)) * [Fix bug where `Twitter::Error::AlreadyPosted` would never be raised](sferik/twitter-ruby@e6b37b9) * [Restore `Twitter::Entities#entities?` as a public method](sferik/twitter-ruby@234a9e3) 5.5.0 ----- * [Add entities to `Twitter::DirectMessage`](sferik/twitter-ruby@d911deb) * [Add conversion methods to `Twitter::NullObject`](sferik/twitter-ruby@4900fee) 5.4.1 ----- * [Default to maximum number of tweets per request](sferik/twitter-ruby@1e41b5d) 5.4.0 ----- * [Fix enumerable search interface](sferik/twitter-ruby@e14cc33) 5.3.1 ----- * [Add `Twitter::Utils` module](sferik/twitter-ruby@a1f47fb) ([@charliesome](https://twitter.com/charliesome)) * [Remove `Enumerable` monkey patch](sferik/twitter-ruby@818b28d) ([@charliesome](https://twitter.com/charliesome)) * [Don't spawning a new thread if there's only one element](sferik/twitter-ruby@c01ea83) * [Introduce meaningful constant names](sferik/twitter-ruby@215c808) ([@futuresanta](https://twitter.com/futuresanta)) * [Automatically flatten `Twitter::Arguments`](sferik/twitter-ruby@a556028) 5.3.0 ----- * [Add `UNABLE_TO_VERIFY_CREDENTIALS` error code](sferik/twitter-ruby@6a47e71) * [Don't suppress `Twitter::Error::Forbidden` in #follow and #follow!](sferik/twitter-ruby@b949c04) * [Update memoizable dependency to ~> 0.3.1](sferik/twitter-ruby#501) 5.2.0 ----- * [Replace `URI` with `adressable`](sferik/twitter-ruby@7ea2f53) * [Make `Twitter::Streaming::FriendList` an array](sferik/twitter-ruby@1a38e5e) * [Add `Twitter::Streaming::DeletedTweet`](sferik/twitter-ruby@084025b) * [Add `Twitter::Streaming::StallWarning`](sferik/twitter-ruby@b07ac50) * [Add error code for "User is over daily status update limit"](sferik/twitter-ruby@76c088d) * [`Twitter::Streaming::Client#site` can take a `String` or `Twitter::User`](sferik/twitter-ruby@e3ad4f2) * [Update `http_parser.rb` dependency to `~> 0.6.0`](sferik/twitter-ruby@6d2f81b) 5.1.1 ----- * [Custom equalizer for `Twitter::Place`](sferik/twitter-ruby@79c76a9) 5.1.0 ----- * [Use `Addressable::URI` everywhere](sferik/twitter-ruby@97d7c68) ([@matthewrudy](https://twitter.com/matthewrudy)) * [Allow use of `Twitter::Place` instead of `place_id`](sferik/twitter-ruby@c2b31dd) * [Allow use of `Twitter::Tweet` instead of `in_reply_to_status_id`](sferik/twitter-ruby@6b7d6c2) 5.0.1 ----- * [Fix `buftok` delimiter handling](sferik/twitter-ruby#484) * [Started handling streaming deletes](sferik/twitter-ruby@8860b97) 5.0.0 ----- * [Remove `Twitter::API::Undocumented#status_activity` and `#statuses_activity`](sferik/twitter-ruby@7f97081) * [Remove `Twitter::Tweet#favoriters`, `#repliers`, `#repliers_count`, and `#retweeters`](sferik/twitter-ruby@77cc963) * [Remove identity map](sferik/twitter-ruby@ec7c2df) * [Remove `Twitter::Cursor#all`](sferik/twitter-ruby@72be414) * [Remove `Twitter::Cursor#collection`](sferik/twitter-ruby@9ae4621) * [Remove `Twitter#from_user`](sferik/twitter-ruby@d2ae9f1) * [Remove `ClientError`, `ServerError`, and `ParserError`](sferik/twitter-ruby@7284394) * [Remove global configuration](sferik/twitter-ruby@239c5a8) * [Remove ability to configure client with environment variables](sferik/twitter-ruby@17e9585) * [Remove Brittish English aliases](sferik/twitter-ruby@572813b) * [Replace `multi_json` with `json`](sferik/twitter-ruby@e5fc292) * [Rename `oauth_token` to `access_token`](sferik/twitter-ruby@d360f80) * [Move `Twitter::Arguments` out of `REST::API` namespace](sferik/twitter-ruby@8faa153) * [Move `Twitter::Client` into `REST` namespace](sferik/twitter-ruby@5b8c3fd) * [Add `Twitter::Streaming::Client`](sferik/twitter-ruby@23afe90) * [Add `Twitter::Error::AlreadyPosted`](sferik/twitter-ruby@e11d2a2) * [Add `Twitter::REST::Client#reverse_token`](sferik/twitter-ruby@39139c4) * [Add `#url` methods to `Twitter::List`, `Twitter::Tweet`, and `Twitter::User`](sferik/twitter-ruby@a89ec0f) * [Add `Twitter::Place#contained_within` and `#contained_within?`](sferik/twitter-ruby@23cc247) * [Add `Twitter::GeoResults`](sferik/twitter-ruby@be1a0a1) * [Add `NullObject`](sferik/twitter-ruby@17880f4) * [Add predicate methods for any possible `NullObject`](sferik/twitter-ruby@eac5522) * [Always return `URI` instead of `String`](sferik/twitter-ruby@341f68d) * [Allow `URI` as argument](sferik/twitter-ruby@c207567) * [Allow `String` in addition to `URI` objects](sferik/twitter-ruby@89a46fb) * [Collection caching](sferik/twitter-ruby@d484d7d) * [Implement `Twitter::Cursor#each` without making an extra HTTP request](sferik/twitter-ruby@8eeff57) * [Make `Twitter::SearchResults` enumerable](sferik/twitter-ruby@d5ce853) * [Make `Twitter::Base` objects immutable](sferik/twitter-ruby@69b1ef7) * [Missing key now raises `KeyError`, not `ArgumentError`](sferik/twitter-ruby@f56698c) * [Use `equalizer` instead of manually overwriting #==](sferik/twitter-ruby@a7ddf71) * [Give methods more natural names](sferik/twitter-ruby@e593194) * [Fix `Twitter::SearchResults#rpp` return value](sferik/twitter-ruby@28d7320) 4.8.1 ----- * [Ignore case of profile image extension](sferik/twitter-ruby@7376061) * [Allow use of Twitter::Token in place of bearer token string](sferik/twitter-ruby@13596bc) * [Add Twitter::API::Undocumented#tweet_count](sferik/twitter-ruby@795458a) * [Add missing dependencies](sferik/twitter-ruby@e07e034) ([@tmatilai](https://twitter.com/tmatilai)) 4.8.0 ----- * [Add `Twitter::SearchResults#refresh_url`](sferik/twitter-ruby@6bf08c0) ([@mustafaturan](https://twitter.com/mustafaturan)) * [Fix issue with wrong signature being generated when multipart data is posted](sferik/twitter-ruby@65ab90a) ([@mustafaturan](https://twitter.com/mustafaturan)) * [Restore compatibility with Ruby 1.8.7](sferik/twitter-ruby@fb63970) * [Remove undocumented methods, retired in the APIpocalypse](sferik/twitter-ruby@cf6a91f) 4.7.0 ----- * [Add support for application-only authentication](sferik/twitter-ruby#387) ([@paracycle](https://twitter.com/paracycle)) * [Add support for `Twitter::Entity::Symbol` entities](sferik/twitter-ruby@a14a0cd) ([@anno](https://twitter.com/anno)) * [Add `Twitter::API::OAuth#invalidate_token`](sferik/twitter-ruby#372) ([@terenceponce](https://twitter.com/terenceponce)) * [Add `Twitter::API::Lists#lists_owned` method](sferik/twitter-ruby@9e97b51) * [Add `Twitter::API::Tweets#retweeters_ids` method](sferik/twitter-ruby@8cf5b2d) * [Add `Twitter::SearchResults#next_results`](sferik/twitter-ruby#365) ([@KentonWhite](https://twitter.com/KentonWhite)) * [Make consumer_key readable](sferik/twitter-ruby@a318869) * [Loosen required_rubygems_version for compatibility with Ubuntu 10.04](sferik/twitter-ruby@41bd565) * [Remove default SSL configuration options and override](sferik/twitter-ruby@113b14b)
Changelog (from CHANGELOG.md) 5.5.1 ----- * [Fix bug where `Twitter::Error::AlreadyFavorited` would never be raised](sferik/twitter-ruby#512) ([@Polestarw](https://twitter.com/polestarw)) * [Fix bug where `Twitter::Error::AlreadyPosted` would never be raised](sferik/twitter-ruby@e6b37b9) * [Restore `Twitter::Entities#entities?` as a public method](sferik/twitter-ruby@234a9e3) 5.5.0 ----- * [Add entities to `Twitter::DirectMessage`](sferik/twitter-ruby@d911deb) * [Add conversion methods to `Twitter::NullObject`](sferik/twitter-ruby@4900fee) 5.4.1 ----- * [Default to maximum number of tweets per request](sferik/twitter-ruby@1e41b5d) 5.4.0 ----- * [Fix enumerable search interface](sferik/twitter-ruby@e14cc33) 5.3.1 ----- * [Add `Twitter::Utils` module](sferik/twitter-ruby@a1f47fb) ([@charliesome](https://twitter.com/charliesome)) * [Remove `Enumerable` monkey patch](sferik/twitter-ruby@818b28d) ([@charliesome](https://twitter.com/charliesome)) * [Don't spawning a new thread if there's only one element](sferik/twitter-ruby@c01ea83) * [Introduce meaningful constant names](sferik/twitter-ruby@215c808) ([@futuresanta](https://twitter.com/futuresanta)) * [Automatically flatten `Twitter::Arguments`](sferik/twitter-ruby@a556028) 5.3.0 ----- * [Add `UNABLE_TO_VERIFY_CREDENTIALS` error code](sferik/twitter-ruby@6a47e71) * [Don't suppress `Twitter::Error::Forbidden` in #follow and #follow!](sferik/twitter-ruby@b949c04) * [Update memoizable dependency to ~> 0.3.1](sferik/twitter-ruby#501) 5.2.0 ----- * [Replace `URI` with `adressable`](sferik/twitter-ruby@7ea2f53) * [Make `Twitter::Streaming::FriendList` an array](sferik/twitter-ruby@1a38e5e) * [Add `Twitter::Streaming::DeletedTweet`](sferik/twitter-ruby@084025b) * [Add `Twitter::Streaming::StallWarning`](sferik/twitter-ruby@b07ac50) * [Add error code for "User is over daily status update limit"](sferik/twitter-ruby@76c088d) * [`Twitter::Streaming::Client#site` can take a `String` or `Twitter::User`](sferik/twitter-ruby@e3ad4f2) * [Update `http_parser.rb` dependency to `~> 0.6.0`](sferik/twitter-ruby@6d2f81b) 5.1.1 ----- * [Custom equalizer for `Twitter::Place`](sferik/twitter-ruby@79c76a9) 5.1.0 ----- * [Use `Addressable::URI` everywhere](sferik/twitter-ruby@97d7c68) ([@matthewrudy](https://twitter.com/matthewrudy)) * [Allow use of `Twitter::Place` instead of `place_id`](sferik/twitter-ruby@c2b31dd) * [Allow use of `Twitter::Tweet` instead of `in_reply_to_status_id`](sferik/twitter-ruby@6b7d6c2) 5.0.1 ----- * [Fix `buftok` delimiter handling](sferik/twitter-ruby#484) * [Started handling streaming deletes](sferik/twitter-ruby@8860b97) 5.0.0 ----- * [Remove `Twitter::API::Undocumented#status_activity` and `#statuses_activity`](sferik/twitter-ruby@7f97081) * [Remove `Twitter::Tweet#favoriters`, `#repliers`, `#repliers_count`, and `#retweeters`](sferik/twitter-ruby@77cc963) * [Remove identity map](sferik/twitter-ruby@ec7c2df) * [Remove `Twitter::Cursor#all`](sferik/twitter-ruby@72be414) * [Remove `Twitter::Cursor#collection`](sferik/twitter-ruby@9ae4621) * [Remove `Twitter#from_user`](sferik/twitter-ruby@d2ae9f1) * [Remove `ClientError`, `ServerError`, and `ParserError`](sferik/twitter-ruby@7284394) * [Remove global configuration](sferik/twitter-ruby@239c5a8) * [Remove ability to configure client with environment variables](sferik/twitter-ruby@17e9585) * [Remove Brittish English aliases](sferik/twitter-ruby@572813b) * [Replace `multi_json` with `json`](sferik/twitter-ruby@e5fc292) * [Rename `oauth_token` to `access_token`](sferik/twitter-ruby@d360f80) * [Move `Twitter::Arguments` out of `REST::API` namespace](sferik/twitter-ruby@8faa153) * [Move `Twitter::Client` into `REST` namespace](sferik/twitter-ruby@5b8c3fd) * [Add `Twitter::Streaming::Client`](sferik/twitter-ruby@23afe90) * [Add `Twitter::Error::AlreadyPosted`](sferik/twitter-ruby@e11d2a2) * [Add `Twitter::REST::Client#reverse_token`](sferik/twitter-ruby@39139c4) * [Add `#url` methods to `Twitter::List`, `Twitter::Tweet`, and `Twitter::User`](sferik/twitter-ruby@a89ec0f) * [Add `Twitter::Place#contained_within` and `#contained_within?`](sferik/twitter-ruby@23cc247) * [Add `Twitter::GeoResults`](sferik/twitter-ruby@be1a0a1) * [Add `NullObject`](sferik/twitter-ruby@17880f4) * [Add predicate methods for any possible `NullObject`](sferik/twitter-ruby@eac5522) * [Always return `URI` instead of `String`](sferik/twitter-ruby@341f68d) * [Allow `URI` as argument](sferik/twitter-ruby@c207567) * [Allow `String` in addition to `URI` objects](sferik/twitter-ruby@89a46fb) * [Collection caching](sferik/twitter-ruby@d484d7d) * [Implement `Twitter::Cursor#each` without making an extra HTTP request](sferik/twitter-ruby@8eeff57) * [Make `Twitter::SearchResults` enumerable](sferik/twitter-ruby@d5ce853) * [Make `Twitter::Base` objects immutable](sferik/twitter-ruby@69b1ef7) * [Missing key now raises `KeyError`, not `ArgumentError`](sferik/twitter-ruby@f56698c) * [Use `equalizer` instead of manually overwriting #==](sferik/twitter-ruby@a7ddf71) * [Give methods more natural names](sferik/twitter-ruby@e593194) * [Fix `Twitter::SearchResults#rpp` return value](sferik/twitter-ruby@28d7320) 4.8.1 ----- * [Ignore case of profile image extension](sferik/twitter-ruby@7376061) * [Allow use of Twitter::Token in place of bearer token string](sferik/twitter-ruby@13596bc) * [Add Twitter::API::Undocumented#tweet_count](sferik/twitter-ruby@795458a) * [Add missing dependencies](sferik/twitter-ruby@e07e034) ([@tmatilai](https://twitter.com/tmatilai)) 4.8.0 ----- * [Add `Twitter::SearchResults#refresh_url`](sferik/twitter-ruby@6bf08c0) ([@mustafaturan](https://twitter.com/mustafaturan)) * [Fix issue with wrong signature being generated when multipart data is posted](sferik/twitter-ruby@65ab90a) ([@mustafaturan](https://twitter.com/mustafaturan)) * [Restore compatibility with Ruby 1.8.7](sferik/twitter-ruby@fb63970) * [Remove undocumented methods, retired in the APIpocalypse](sferik/twitter-ruby@cf6a91f) 4.7.0 ----- * [Add support for application-only authentication](sferik/twitter-ruby#387) ([@paracycle](https://twitter.com/paracycle)) * [Add support for `Twitter::Entity::Symbol` entities](sferik/twitter-ruby@a14a0cd) ([@anno](https://twitter.com/anno)) * [Add `Twitter::API::OAuth#invalidate_token`](sferik/twitter-ruby#372) ([@terenceponce](https://twitter.com/terenceponce)) * [Add `Twitter::API::Lists#lists_owned` method](sferik/twitter-ruby@9e97b51) * [Add `Twitter::API::Tweets#retweeters_ids` method](sferik/twitter-ruby@8cf5b2d) * [Add `Twitter::SearchResults#next_results`](sferik/twitter-ruby#365) ([@KentonWhite](https://twitter.com/KentonWhite)) * [Make consumer_key readable](sferik/twitter-ruby@a318869) * [Loosen required_rubygems_version for compatibility with Ubuntu 10.04](sferik/twitter-ruby@41bd565) * [Remove default SSL configuration options and override](sferik/twitter-ruby@113b14b)
Changelog (from CHANGELOG.md) 5.5.1 ----- * [Fix bug where `Twitter::Error::AlreadyFavorited` would never be raised](sferik/twitter-ruby#512) ([@Polestarw](https://twitter.com/polestarw)) * [Fix bug where `Twitter::Error::AlreadyPosted` would never be raised](sferik/twitter-ruby@e6b37b9) * [Restore `Twitter::Entities#entities?` as a public method](sferik/twitter-ruby@234a9e3) 5.5.0 ----- * [Add entities to `Twitter::DirectMessage`](sferik/twitter-ruby@d911deb) * [Add conversion methods to `Twitter::NullObject`](sferik/twitter-ruby@4900fee) 5.4.1 ----- * [Default to maximum number of tweets per request](sferik/twitter-ruby@1e41b5d) 5.4.0 ----- * [Fix enumerable search interface](sferik/twitter-ruby@e14cc33) 5.3.1 ----- * [Add `Twitter::Utils` module](sferik/twitter-ruby@a1f47fb) ([@charliesome](https://twitter.com/charliesome)) * [Remove `Enumerable` monkey patch](sferik/twitter-ruby@818b28d) ([@charliesome](https://twitter.com/charliesome)) * [Don't spawning a new thread if there's only one element](sferik/twitter-ruby@c01ea83) * [Introduce meaningful constant names](sferik/twitter-ruby@215c808) ([@futuresanta](https://twitter.com/futuresanta)) * [Automatically flatten `Twitter::Arguments`](sferik/twitter-ruby@a556028) 5.3.0 ----- * [Add `UNABLE_TO_VERIFY_CREDENTIALS` error code](sferik/twitter-ruby@6a47e71) * [Don't suppress `Twitter::Error::Forbidden` in #follow and #follow!](sferik/twitter-ruby@b949c04) * [Update memoizable dependency to ~> 0.3.1](sferik/twitter-ruby#501) 5.2.0 ----- * [Replace `URI` with `adressable`](sferik/twitter-ruby@7ea2f53) * [Make `Twitter::Streaming::FriendList` an array](sferik/twitter-ruby@1a38e5e) * [Add `Twitter::Streaming::DeletedTweet`](sferik/twitter-ruby@084025b) * [Add `Twitter::Streaming::StallWarning`](sferik/twitter-ruby@b07ac50) * [Add error code for "User is over daily status update limit"](sferik/twitter-ruby@76c088d) * [`Twitter::Streaming::Client#site` can take a `String` or `Twitter::User`](sferik/twitter-ruby@e3ad4f2) * [Update `http_parser.rb` dependency to `~> 0.6.0`](sferik/twitter-ruby@6d2f81b) 5.1.1 ----- * [Custom equalizer for `Twitter::Place`](sferik/twitter-ruby@79c76a9) 5.1.0 ----- * [Use `Addressable::URI` everywhere](sferik/twitter-ruby@97d7c68) ([@matthewrudy](https://twitter.com/matthewrudy)) * [Allow use of `Twitter::Place` instead of `place_id`](sferik/twitter-ruby@c2b31dd) * [Allow use of `Twitter::Tweet` instead of `in_reply_to_status_id`](sferik/twitter-ruby@6b7d6c2) 5.0.1 ----- * [Fix `buftok` delimiter handling](sferik/twitter-ruby#484) * [Started handling streaming deletes](sferik/twitter-ruby@8860b97) 5.0.0 ----- * [Remove `Twitter::API::Undocumented#status_activity` and `#statuses_activity`](sferik/twitter-ruby@7f97081) * [Remove `Twitter::Tweet#favoriters`, `#repliers`, `#repliers_count`, and `#retweeters`](sferik/twitter-ruby@77cc963) * [Remove identity map](sferik/twitter-ruby@ec7c2df) * [Remove `Twitter::Cursor#all`](sferik/twitter-ruby@72be414) * [Remove `Twitter::Cursor#collection`](sferik/twitter-ruby@9ae4621) * [Remove `Twitter#from_user`](sferik/twitter-ruby@d2ae9f1) * [Remove `ClientError`, `ServerError`, and `ParserError`](sferik/twitter-ruby@7284394) * [Remove global configuration](sferik/twitter-ruby@239c5a8) * [Remove ability to configure client with environment variables](sferik/twitter-ruby@17e9585) * [Remove Brittish English aliases](sferik/twitter-ruby@572813b) * [Replace `multi_json` with `json`](sferik/twitter-ruby@e5fc292) * [Rename `oauth_token` to `access_token`](sferik/twitter-ruby@d360f80) * [Move `Twitter::Arguments` out of `REST::API` namespace](sferik/twitter-ruby@8faa153) * [Move `Twitter::Client` into `REST` namespace](sferik/twitter-ruby@5b8c3fd) * [Add `Twitter::Streaming::Client`](sferik/twitter-ruby@23afe90) * [Add `Twitter::Error::AlreadyPosted`](sferik/twitter-ruby@e11d2a2) * [Add `Twitter::REST::Client#reverse_token`](sferik/twitter-ruby@39139c4) * [Add `#url` methods to `Twitter::List`, `Twitter::Tweet`, and `Twitter::User`](sferik/twitter-ruby@a89ec0f) * [Add `Twitter::Place#contained_within` and `#contained_within?`](sferik/twitter-ruby@23cc247) * [Add `Twitter::GeoResults`](sferik/twitter-ruby@be1a0a1) * [Add `NullObject`](sferik/twitter-ruby@17880f4) * [Add predicate methods for any possible `NullObject`](sferik/twitter-ruby@eac5522) * [Always return `URI` instead of `String`](sferik/twitter-ruby@341f68d) * [Allow `URI` as argument](sferik/twitter-ruby@c207567) * [Allow `String` in addition to `URI` objects](sferik/twitter-ruby@89a46fb) * [Collection caching](sferik/twitter-ruby@d484d7d) * [Implement `Twitter::Cursor#each` without making an extra HTTP request](sferik/twitter-ruby@8eeff57) * [Make `Twitter::SearchResults` enumerable](sferik/twitter-ruby@d5ce853) * [Make `Twitter::Base` objects immutable](sferik/twitter-ruby@69b1ef7) * [Missing key now raises `KeyError`, not `ArgumentError`](sferik/twitter-ruby@f56698c) * [Use `equalizer` instead of manually overwriting #==](sferik/twitter-ruby@a7ddf71) * [Give methods more natural names](sferik/twitter-ruby@e593194) * [Fix `Twitter::SearchResults#rpp` return value](sferik/twitter-ruby@28d7320) 4.8.1 ----- * [Ignore case of profile image extension](sferik/twitter-ruby@7376061) * [Allow use of Twitter::Token in place of bearer token string](sferik/twitter-ruby@13596bc) * [Add Twitter::API::Undocumented#tweet_count](sferik/twitter-ruby@795458a) * [Add missing dependencies](sferik/twitter-ruby@e07e034) ([@tmatilai](https://twitter.com/tmatilai)) 4.8.0 ----- * [Add `Twitter::SearchResults#refresh_url`](sferik/twitter-ruby@6bf08c0) ([@mustafaturan](https://twitter.com/mustafaturan)) * [Fix issue with wrong signature being generated when multipart data is posted](sferik/twitter-ruby@65ab90a) ([@mustafaturan](https://twitter.com/mustafaturan)) * [Restore compatibility with Ruby 1.8.7](sferik/twitter-ruby@fb63970) * [Remove undocumented methods, retired in the APIpocalypse](sferik/twitter-ruby@cf6a91f) 4.7.0 ----- * [Add support for application-only authentication](sferik/twitter-ruby#387) ([@paracycle](https://twitter.com/paracycle)) * [Add support for `Twitter::Entity::Symbol` entities](sferik/twitter-ruby@a14a0cd) ([@anno](https://twitter.com/anno)) * [Add `Twitter::API::OAuth#invalidate_token`](sferik/twitter-ruby#372) ([@terenceponce](https://twitter.com/terenceponce)) * [Add `Twitter::API::Lists#lists_owned` method](sferik/twitter-ruby@9e97b51) * [Add `Twitter::API::Tweets#retweeters_ids` method](sferik/twitter-ruby@8cf5b2d) * [Add `Twitter::SearchResults#next_results`](sferik/twitter-ruby#365) ([@KentonWhite](https://twitter.com/KentonWhite)) * [Make consumer_key readable](sferik/twitter-ruby@a318869) * [Loosen required_rubygems_version for compatibility with Ubuntu 10.04](sferik/twitter-ruby@41bd565) * [Remove default SSL configuration options and override](sferik/twitter-ruby@113b14b)
Changelog (from CHANGELOG.md) 5.5.1 ----- * [Fix bug where `Twitter::Error::AlreadyFavorited` would never be raised](sferik/twitter-ruby#512) ([@Polestarw](https://twitter.com/polestarw)) * [Fix bug where `Twitter::Error::AlreadyPosted` would never be raised](sferik/twitter-ruby@e6b37b9) * [Restore `Twitter::Entities#entities?` as a public method](sferik/twitter-ruby@234a9e3) 5.5.0 ----- * [Add entities to `Twitter::DirectMessage`](sferik/twitter-ruby@d911deb) * [Add conversion methods to `Twitter::NullObject`](sferik/twitter-ruby@4900fee) 5.4.1 ----- * [Default to maximum number of tweets per request](sferik/twitter-ruby@1e41b5d) 5.4.0 ----- * [Fix enumerable search interface](sferik/twitter-ruby@e14cc33) 5.3.1 ----- * [Add `Twitter::Utils` module](sferik/twitter-ruby@a1f47fb) ([@charliesome](https://twitter.com/charliesome)) * [Remove `Enumerable` monkey patch](sferik/twitter-ruby@818b28d) ([@charliesome](https://twitter.com/charliesome)) * [Don't spawning a new thread if there's only one element](sferik/twitter-ruby@c01ea83) * [Introduce meaningful constant names](sferik/twitter-ruby@215c808) ([@futuresanta](https://twitter.com/futuresanta)) * [Automatically flatten `Twitter::Arguments`](sferik/twitter-ruby@a556028) 5.3.0 ----- * [Add `UNABLE_TO_VERIFY_CREDENTIALS` error code](sferik/twitter-ruby@6a47e71) * [Don't suppress `Twitter::Error::Forbidden` in #follow and #follow!](sferik/twitter-ruby@b949c04) * [Update memoizable dependency to ~> 0.3.1](sferik/twitter-ruby#501) 5.2.0 ----- * [Replace `URI` with `adressable`](sferik/twitter-ruby@7ea2f53) * [Make `Twitter::Streaming::FriendList` an array](sferik/twitter-ruby@1a38e5e) * [Add `Twitter::Streaming::DeletedTweet`](sferik/twitter-ruby@084025b) * [Add `Twitter::Streaming::StallWarning`](sferik/twitter-ruby@b07ac50) * [Add error code for "User is over daily status update limit"](sferik/twitter-ruby@76c088d) * [`Twitter::Streaming::Client#site` can take a `String` or `Twitter::User`](sferik/twitter-ruby@e3ad4f2) * [Update `http_parser.rb` dependency to `~> 0.6.0`](sferik/twitter-ruby@6d2f81b) 5.1.1 ----- * [Custom equalizer for `Twitter::Place`](sferik/twitter-ruby@79c76a9) 5.1.0 ----- * [Use `Addressable::URI` everywhere](sferik/twitter-ruby@97d7c68) ([@matthewrudy](https://twitter.com/matthewrudy)) * [Allow use of `Twitter::Place` instead of `place_id`](sferik/twitter-ruby@c2b31dd) * [Allow use of `Twitter::Tweet` instead of `in_reply_to_status_id`](sferik/twitter-ruby@6b7d6c2) 5.0.1 ----- * [Fix `buftok` delimiter handling](sferik/twitter-ruby#484) * [Started handling streaming deletes](sferik/twitter-ruby@8860b97) 5.0.0 ----- * [Remove `Twitter::API::Undocumented#status_activity` and `#statuses_activity`](sferik/twitter-ruby@7f97081) * [Remove `Twitter::Tweet#favoriters`, `#repliers`, `#repliers_count`, and `#retweeters`](sferik/twitter-ruby@77cc963) * [Remove identity map](sferik/twitter-ruby@ec7c2df) * [Remove `Twitter::Cursor#all`](sferik/twitter-ruby@72be414) * [Remove `Twitter::Cursor#collection`](sferik/twitter-ruby@9ae4621) * [Remove `Twitter#from_user`](sferik/twitter-ruby@d2ae9f1) * [Remove `ClientError`, `ServerError`, and `ParserError`](sferik/twitter-ruby@7284394) * [Remove global configuration](sferik/twitter-ruby@239c5a8) * [Remove ability to configure client with environment variables](sferik/twitter-ruby@17e9585) * [Remove Brittish English aliases](sferik/twitter-ruby@572813b) * [Replace `multi_json` with `json`](sferik/twitter-ruby@e5fc292) * [Rename `oauth_token` to `access_token`](sferik/twitter-ruby@d360f80) * [Move `Twitter::Arguments` out of `REST::API` namespace](sferik/twitter-ruby@8faa153) * [Move `Twitter::Client` into `REST` namespace](sferik/twitter-ruby@5b8c3fd) * [Add `Twitter::Streaming::Client`](sferik/twitter-ruby@23afe90) * [Add `Twitter::Error::AlreadyPosted`](sferik/twitter-ruby@e11d2a2) * [Add `Twitter::REST::Client#reverse_token`](sferik/twitter-ruby@39139c4) * [Add `#url` methods to `Twitter::List`, `Twitter::Tweet`, and `Twitter::User`](sferik/twitter-ruby@a89ec0f) * [Add `Twitter::Place#contained_within` and `#contained_within?`](sferik/twitter-ruby@23cc247) * [Add `Twitter::GeoResults`](sferik/twitter-ruby@be1a0a1) * [Add `NullObject`](sferik/twitter-ruby@17880f4) * [Add predicate methods for any possible `NullObject`](sferik/twitter-ruby@eac5522) * [Always return `URI` instead of `String`](sferik/twitter-ruby@341f68d) * [Allow `URI` as argument](sferik/twitter-ruby@c207567) * [Allow `String` in addition to `URI` objects](sferik/twitter-ruby@89a46fb) * [Collection caching](sferik/twitter-ruby@d484d7d) * [Implement `Twitter::Cursor#each` without making an extra HTTP request](sferik/twitter-ruby@8eeff57) * [Make `Twitter::SearchResults` enumerable](sferik/twitter-ruby@d5ce853) * [Make `Twitter::Base` objects immutable](sferik/twitter-ruby@69b1ef7) * [Missing key now raises `KeyError`, not `ArgumentError`](sferik/twitter-ruby@f56698c) * [Use `equalizer` instead of manually overwriting #==](sferik/twitter-ruby@a7ddf71) * [Give methods more natural names](sferik/twitter-ruby@e593194) * [Fix `Twitter::SearchResults#rpp` return value](sferik/twitter-ruby@28d7320) 4.8.1 ----- * [Ignore case of profile image extension](sferik/twitter-ruby@7376061) * [Allow use of Twitter::Token in place of bearer token string](sferik/twitter-ruby@13596bc) * [Add Twitter::API::Undocumented#tweet_count](sferik/twitter-ruby@795458a) * [Add missing dependencies](sferik/twitter-ruby@e07e034) ([@tmatilai](https://twitter.com/tmatilai)) 4.8.0 ----- * [Add `Twitter::SearchResults#refresh_url`](sferik/twitter-ruby@6bf08c0) ([@mustafaturan](https://twitter.com/mustafaturan)) * [Fix issue with wrong signature being generated when multipart data is posted](sferik/twitter-ruby@65ab90a) ([@mustafaturan](https://twitter.com/mustafaturan)) * [Restore compatibility with Ruby 1.8.7](sferik/twitter-ruby@fb63970) * [Remove undocumented methods, retired in the APIpocalypse](sferik/twitter-ruby@cf6a91f) 4.7.0 ----- * [Add support for application-only authentication](sferik/twitter-ruby#387) ([@paracycle](https://twitter.com/paracycle)) * [Add support for `Twitter::Entity::Symbol` entities](sferik/twitter-ruby@a14a0cd) ([@anno](https://twitter.com/anno)) * [Add `Twitter::API::OAuth#invalidate_token`](sferik/twitter-ruby#372) ([@terenceponce](https://twitter.com/terenceponce)) * [Add `Twitter::API::Lists#lists_owned` method](sferik/twitter-ruby@9e97b51) * [Add `Twitter::API::Tweets#retweeters_ids` method](sferik/twitter-ruby@8cf5b2d) * [Add `Twitter::SearchResults#next_results`](sferik/twitter-ruby#365) ([@KentonWhite](https://twitter.com/KentonWhite)) * [Make consumer_key readable](sferik/twitter-ruby@a318869) * [Loosen required_rubygems_version for compatibility with Ubuntu 10.04](sferik/twitter-ruby@41bd565) * [Remove default SSL configuration options and override](sferik/twitter-ruby@113b14b)
variable
bearer token exists
intended
PS: I am very new to this project, so please disregard if I have done anything wrong... ;)