Skip to content
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

Merged
merged 9 commits into from
Apr 18, 2013
Merged

Adding Bearer Token support #387

merged 9 commits into from
Apr 18, 2013

Conversation

paracycle
Copy link
Collaborator

  • 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

PS: I am very new to this project, so please disregard if I have done anything wrong... ;)

Ufuk Kayserilioglu added 2 commits April 16, 2013 23:04
- 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
@paracycle
Copy link
Collaborator Author

Added the oauth2/token method implementation as well, but I am not very pleased with it. Could someone give me feedback please?

@stve
Copy link
Collaborator

stve commented Apr 17, 2013

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?
Copy link
Collaborator

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

Copy link
Collaborator Author

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.

@paracycle
Copy link
Collaborator Author

OK. I have refactored the code and added tests and docs for the token method.

I still have the following questions:

  1. Is the name token alright? I am somehow uncomfortable with it, since it looks too generic (especially when you see it as client.token. Should we rename it to generate_token or something similar?
  2. Adding a separate request method still feels dirty. It also reduced coverage to 99.96% since we will need to test the exception pathways in the new request method. As I suggested above in the diff comment, should we unify the two methods and do a conditional check to decide on which block to use? I worry about performance but we are already doing a check in auth_header for every call even though most of the calls would probably not use it.

@sferik
Copy link
Owner

sferik commented Apr 18, 2013

Is the name token alright? I am somehow uncomfortable with it, since it looks too generic (especially when you see it as client.token. Should we rename it to generate_token or something similar?

I think token is okay, since there's only one type of token you can request from Twitter.

Adding a separate request method still feels dirty. It also reduced coverage to 99.96% since we will need to test the exception pathways in the new request method. As I suggested above in the diff comment, should we unify the two methods and do a conditional check to decide on which block to use? I worry about performance but we are already doing a check in auth_header for every call even though most of the calls would probably not use it.

Ideally, you could get this into a single conditional statement without needing a duplicate request method. If this means moving the auth_header logic inside the request method, so be it.

Other than that, this pull request looks very good to me.

@paracycle
Copy link
Collaborator Author

@sferik Thank you for your comments. Should I try to unify the request methods, then, also including the auth_header logic inside?

In your original email to the Google Group, you mention being able to initialize the library with just client_token and client_secret. This would imply that the library should call the token method internally at some point. Do you think this the right way to do it, and, if yes, where do you think this should happen? My guess is yes and, when constructing the Auth header for the request.

@sferik
Copy link
Owner

sferik commented Apr 18, 2013

Should I try to unify the request methods, then, also including the auth_header logic inside?

Yes, please.

In your original email to the Google Group, you mention being able to initialize the library with just client_token and client_secret. This would imply that the library should call the token method internally at some point. Do you think this the right way to do it, and, if yes, where do you think this should happen? My guess is yes and, when constructing the Auth header for the request.

When checking for credentials, the code should check if client_token and client_secret are set (and @bearer_token is nil). If this is the case, the client should call the token method and set the @bearer_token instance variable in the client to use for all future requests. Make sense?

# bearer_token = client.token
def token
object_from_response(Twitter::Token, :bearer_request, "/oauth2/token", :grant_type => "client_credentials")
end
Copy link
Owner

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?

Ufuk Kayserilioglu added 2 commits April 18, 2013 17:33
- 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.
@paracycle
Copy link
Collaborator Author

@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 credentials? method that doesn't seem to be used by the rest of the code, except for tests. Besides, if we do the check it has to be while the client is trying to make a request. If we call the token method at this point and it raises an error, the user of the library may be confused since the error they receive will not be related to the method they were trying to access.

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)
Copy link
Collaborator

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

Copy link
Collaborator Author

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
Copy link
Owner

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.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

definitely, good catch.

sferik added a commit that referenced this pull request Apr 18, 2013
@sferik sferik merged commit 6df3d85 into sferik:master Apr 18, 2013
@stve
Copy link
Collaborator

stve commented Apr 18, 2013

👍 nice work @paracycle

@paracycle
Copy link
Collaborator Author

@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.

@sferik
Copy link
Owner

sferik commented Apr 18, 2013

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.

@paracycle
Copy link
Collaborator Author

@sferik Wow, I'd be thrilled. Thanks for the vote of confidence.

@stve stve mentioned this pull request May 11, 2013
jsonn pushed a commit to jsonn/pkgsrc that referenced this pull request Jan 18, 2014
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)
jsonn pushed a commit to jsonn/pkgsrc that referenced this pull request Jan 20, 2014
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)
jsonn pushed a commit to jsonn/pkgsrc that referenced this pull request Mar 12, 2014
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)
jsonn pushed a commit to jsonn/pkgsrc that referenced this pull request Oct 11, 2014
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants