Merge branch 'master' of github:ryanmcgrath/twython

This commit is contained in:
Ben McGinnes 2014-11-02 09:23:04 +11:00
commit 6b5a975537
10 changed files with 70 additions and 23 deletions

View file

@ -27,7 +27,7 @@ Patches and Suggestions
- `Jonathan Elsas <https://github.com/jelsas>`_, Fix for original Streaming API stub causing import errors. - `Jonathan Elsas <https://github.com/jelsas>`_, Fix for original Streaming API stub causing import errors.
- `LuqueDaniel <https://github.com/LuqueDaniel>`_, Extended example code where necessary. - `LuqueDaniel <https://github.com/LuqueDaniel>`_, Extended example code where necessary.
- `Mesar Hameed <https://github.com/mhameed>`_, Commit to swap ``__getattr__`` trick for a more debuggable solution. - `Mesar Hameed <https://github.com/mhameed>`_, Commit to swap ``__getattr__`` trick for a more debuggable solution.
- `Remy DeCausemaker <https://github.com/decause>`_, PEP-8 contributions. - `Remy DeCausemaker <https://github.com/decause>`_, PEP 8 contributions.
- `mckellister <https://github.com/mckellister>`_ Twitter Spring 2012 Clean Up fixes to ``Exception`` raised by Twython (Rate Limits, etc). - `mckellister <https://github.com/mckellister>`_ Twitter Spring 2012 Clean Up fixes to ``Exception`` raised by Twython (Rate Limits, etc).
- `Tatz Tsuchiya <http://d.hatena.ne.jp/tatz_tsuchiya/20120115/1326623451>`_, Fix for ``lambda`` scoping in key injection phase. - `Tatz Tsuchiya <http://d.hatena.ne.jp/tatz_tsuchiya/20120115/1326623451>`_, Fix for ``lambda`` scoping in key injection phase.
- `Mohammed ALDOUB <https://github.com/Voulnet>`_, Fixes for ``http/https`` access endpoints. - `Mohammed ALDOUB <https://github.com/Voulnet>`_, Fixes for ``http/https`` access endpoints.
@ -35,7 +35,7 @@ Patches and Suggestions
- `Terry Jones <https://github.com/terrycojones>`_, Error cleanup and Exception processing in 2.3.0. - `Terry Jones <https://github.com/terrycojones>`_, Error cleanup and Exception processing in 2.3.0.
- `Leandro Ferreira <https://github.com/leandroferreira>`_, Fix for double-encoding of search queries in 2.3.0. - `Leandro Ferreira <https://github.com/leandroferreira>`_, Fix for double-encoding of search queries in 2.3.0.
- `Chris Brown <https://github.com/chbrown>`_, Updated to use v1.1 endpoints over v1 - `Chris Brown <https://github.com/chbrown>`_, Updated to use v1.1 endpoints over v1
- `Virendra Rajput <https://github.com/bkvirendra>`_, Fixed unicode (json) encoding in twython.py 2.7.2. - `Virendra Rajput <https://github.com/bkvirendra>`_, Fixed unicode (json) encoding in twython.py 2.7.2.
- `Paul Solbach <https://github.com/hansenrum>`_, fixed requirement for oauth_verifier - `Paul Solbach <https://github.com/hansenrum>`_, fixed requirement for oauth_verifier
- `Greg Nofi <https://github.com/nofeet>`_, fixed using built-in Exception attributes for storing & retrieving error message - `Greg Nofi <https://github.com/nofeet>`_, fixed using built-in Exception attributes for storing & retrieving error message
- `Jonathan Vanasco <https://github.com/jvanasco>`_, Debugging support, error_code tracking, Twitter error API tracking, other fixes - `Jonathan Vanasco <https://github.com/jvanasco>`_, Debugging support, error_code tracking, Twitter error API tracking, other fixes
@ -43,3 +43,14 @@ Patches and Suggestions
- `Ruben Varela Rosa <https://github.com/rubenvarela>`_, Fixed search example - `Ruben Varela Rosa <https://github.com/rubenvarela>`_, Fixed search example
- `Oleg Anashkin <https://github.com/extesy>`_, streaming ``handlers`` functionality - `Oleg Anashkin <https://github.com/extesy>`_, streaming ``handlers`` functionality
- `Luis Alberto Santana <https://github.com/jackboot7`_, Added auth_endpoint parameter for cases when the right permissions weren't being shown on authenticate step - `Luis Alberto Santana <https://github.com/jackboot7`_, Added auth_endpoint parameter for cases when the right permissions weren't being shown on authenticate step
- `Cory Benfield <https://github.com/Lukasa>`_, Fixed issue where Twython was unnecessarily disabling compression
- `Cory Dolphin <https://github.com/wcdolphin>`_, Added retry_after attribute to TwythonRateLimitError
- `Natan L <https://github.com/kuyan>`_, Fixed typo in documentation
- `Cash Costello <https://github.com/cash>`_, Moved tests to use `responsoes`, fixed typos in documentation
- `Joe Cabrera <https://github.com/greedo>`_, PEP 8 contributions
- `bsbkeven <https://github.com/bsbkeven>`_, Added `lookup_status` function to `endpoints.py`
- `drevicko <https://github.com/drevicko>`_, Added option to yield full page vs individual results in `cursor`
- `Filipe A Ximenes <https://github.com/filipeximenes>`_, Added `upload_media` function to `endpoints.py`
- `Mertcan Mermerkaya <https://github.com/mmermerkaya>`_, Fixed code example in documentation
- `Donne Martin <https://github.com/donnemartin>`_, Fixed typos in `README.rst`
- `Diego Allen <https://github.com/dalleng>`_, Add missing comma in documentation code snippet

View file

@ -3,6 +3,21 @@
History History
------- -------
3.2.0 (2014-10-30)
++++++++++++++++++
- PEP8'd some code
- Added `lookup_status` function to `endpoints.py`
- Added keyword argument to `cursor` to return full pages rather than individual results
- `cursor` now uses while loop rather than recursion
- Fixed issue where Twython was unnecessarily disabling compression
- Using `responses` to mock API calls in tests
- Fixed some typos in documentation
- Added `retry_after` attribute to `TwythonRateLimitError`
- Added `upload_media` method to `Twython` in favor of `update_with_media`
- Deprecating `update_with_media` per Twitter API 1.1 (https://dev.twitter.com/rest/reference/post/statuses/update_with_media)
- Unpin `requests` and `requests-oauthlib` in `requirements.txt`
3.1.2 (2013-12-05) 3.1.2 (2013-12-05)
++++++++++++++++++ ++++++++++++++++++

View file

@ -50,9 +50,9 @@ copyright = u'2013, Ryan McGrath'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '3.1.2' version = '3.2.0'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '3.1.2' release = '3.2.0'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

View file

@ -55,7 +55,7 @@ Posting a Status with an Editing Image
# unable to be read # unable to be read
image_io.seek(0) image_io.seek(0)
twitter.update_status_with_media(media=photo, status='Check out my edited image!') twitter.update_status_with_media(media=image_io, status='Check out my edited image!')
Search Generator Search Generator

View file

@ -3,4 +3,4 @@ requests>=2.1.0
requests_oauthlib>=0.4.0 requests_oauthlib>=0.4.0
python-coveralls==2.1.0 python-coveralls==2.1.0
nose-cov==1.6 nose-cov==1.6
responses==0.2.0 responses==0.3.0

View file

@ -9,7 +9,7 @@ except ImportError:
from distutils.core import setup from distutils.core import setup
__author__ = 'Ryan McGrath <ryan@venodesigns.net>' __author__ = 'Ryan McGrath <ryan@venodesigns.net>'
__version__ = '3.1.2' __version__ = '3.2.0'
packages = [ packages = [
'twython', 'twython',
@ -23,7 +23,7 @@ if sys.argv[-1] == 'publish':
setup( setup(
name='twython', name='twython',
version=__version__, version=__version__,
install_requires=['requests==2.1.0', 'requests_oauthlib==0.4.0'], install_requires=['requests>=2.1.0', 'requests_oauthlib>=0.4.0'],
author='Ryan McGrath', author='Ryan McGrath',
author_email='ryan@venodesigns.net', author_email='ryan@venodesigns.net',
license=open('LICENSE').read(), license=open('LICENSE').read(),

View file

@ -262,16 +262,16 @@ class TwythonAPITestCase(unittest.TestCase):
"""Test getting last specific header of the last API call works""" """Test getting last specific header of the last API call works"""
endpoint = 'statuses/home_timeline' endpoint = 'statuses/home_timeline'
url = self.get_url(endpoint) url = self.get_url(endpoint)
self.register_response(responses.GET, url, adding_headers={'x-rate-limit-remaining': 37}) self.register_response(responses.GET, url, adding_headers={'x-rate-limit-remaining': '37'})
self.api.get(endpoint) self.api.get(endpoint)
value = self.api.get_lastfunction_header('x-rate-limit-remaining') value = self.api.get_lastfunction_header('x-rate-limit-remaining')
self.assertEqual(37, value) self.assertEqual('37', value)
value2 = self.api.get_lastfunction_header('does-not-exist') value2 = self.api.get_lastfunction_header('does-not-exist')
self.assertIsNone(value2) self.assertIsNone(value2)
value3 = self.api.get_lastfunction_header('not-there-either', 96) value3 = self.api.get_lastfunction_header('not-there-either', '96')
self.assertEqual(96, value3) self.assertEqual('96', value3)
def test_get_lastfunction_header_should_raise_error_when_no_previous_call(self): def test_get_lastfunction_header_should_raise_error_when_no_previous_call(self):
"""Test attempting to get a header when no API call was made raises a TwythonError""" """Test attempting to get a header when no API call was made raises a TwythonError"""
@ -286,7 +286,7 @@ class TwythonAPITestCase(unittest.TestCase):
self.api.get(endpoint) self.api.get(endpoint)
self.assertEqual(b'gzip, deflate, compress', responses.calls[0].request.headers['Accept-Encoding']) self.assertEqual(b'gzip, deflate', responses.calls[0].request.headers['Accept-Encoding'])
# Static methods # Static methods
def test_construct_api_url(self): def test_construct_api_url(self):

View file

@ -19,7 +19,7 @@ Questions, comments? ryan@venodesigns.net
""" """
__author__ = 'Ryan McGrath <ryan@venodesigns.net>' __author__ = 'Ryan McGrath <ryan@venodesigns.net>'
__version__ = '3.1.2' __version__ = '3.2.0'
from .api import Twython from .api import Twython
from .streaming import TwythonStreamer from .streaming import TwythonStreamer

View file

@ -9,6 +9,8 @@ Twitter Authentication, and miscellaneous methods that are useful when
dealing with the Twitter API dealing with the Twitter API
""" """
import warnings
import requests import requests
from requests.auth import HTTPBasicAuth from requests.auth import HTTPBasicAuth
from requests_oauthlib import OAuth1, OAuth2 from requests_oauthlib import OAuth1, OAuth2
@ -20,8 +22,6 @@ from .endpoints import EndpointsMixin
from .exceptions import TwythonError, TwythonAuthError, TwythonRateLimitError from .exceptions import TwythonError, TwythonAuthError, TwythonRateLimitError
from .helpers import _transparent_params from .helpers import _transparent_params
import warnings
warnings.simplefilter('always', TwythonDeprecationWarning) # For Python 2.7 > warnings.simplefilter('always', TwythonDeprecationWarning) # For Python 2.7 >
@ -192,10 +192,10 @@ class Twython(EndpointsMixin, object):
# app keys/user tokens # app keys/user tokens
ExceptionType = TwythonAuthError ExceptionType = TwythonAuthError
raise ExceptionType(error_message, raise ExceptionType(
error_code=response.status_code, error_message,
retry_after=response.headers.get('retry-\ error_code=response.status_code,
after')) retry_after=response.headers.get('X-Rate-Limit-Reset'))
try: try:
content = response.json() content = response.json()
@ -243,9 +243,12 @@ class Twython(EndpointsMixin, object):
:rtype: dict :rtype: dict
""" """
if endpoint.startswith('http://'):
raise TwythonError('api.twitter.com is restricted to SSL/TLS traffic.')
# In case they want to pass a full Twitter URL # In case they want to pass a full Twitter URL
# i.e. https://api.twitter.com/1.1/search/tweets.json # i.e. https://api.twitter.com/1.1/search/tweets.json
if endpoint.startswith('http://') or endpoint.startswith('https://'): if endpoint.startswith('https://'):
url = endpoint url = endpoint
else: else:
url = '%s/%s.json' % (self.api_url % version, endpoint) url = '%s/%s.json' % (self.api_url % version, endpoint)
@ -497,8 +500,7 @@ class Twython(EndpointsMixin, object):
# Add 1 to the id because since_id and # Add 1 to the id because since_id and
# max_id are inclusive # max_id are inclusive
if hasattr(function, 'iter_metadata'): if hasattr(function, 'iter_metadata'):
since_id = content[function.iter_metadata]\ since_id = content[function.iter_metadata].get('since_id_str')
.get('since_id_str')
else: else:
since_id = content[0]['id_str'] since_id = content[0]['id_str']
params['since_id'] = (int(since_id) - 1) params['since_id'] = (int(since_id) - 1)

View file

@ -14,6 +14,10 @@ This map is organized the order functions are documented at:
https://dev.twitter.com/docs/api/1.1 https://dev.twitter.com/docs/api/1.1
""" """
import warnings
from .advisory import TwythonDeprecationWarning
class EndpointsMixin(object): class EndpointsMixin(object):
# Timelines # Timelines
@ -118,8 +122,23 @@ class EndpointsMixin(object):
https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media
""" """
warnings.warn(
'This method is deprecated. You should use Twython.upload_media instead.',
TwythonDeprecationWarning,
stacklevel=2
)
return self.post('statuses/update_with_media', params=params) return self.post('statuses/update_with_media', params=params)
def upload_media(self, **params):
"""Uploads media file to Twitter servers. The file will be available to be attached
to a status for 60 minutes. To attach to a update, pass a list of returned media ids
to the 'update_status' method using the 'media_ids' param.
Docs:
https://dev.twitter.com/rest/public/uploading-media-multiple-photos
"""
return self.post('https://upload.twitter.com/1.1/media/upload.json', params=params)
def get_oembed_tweet(self, **params): def get_oembed_tweet(self, **params):
"""Returns information allowing the creation of an embedded """Returns information allowing the creation of an embedded
representation of a Tweet on third party sites. representation of a Tweet on third party sites.