pep8 finished
This commit is contained in:
parent
6206c0b73f
commit
a0fec2f004
9 changed files with 155 additions and 76 deletions
143
twython/api.py
143
twython/api.py
|
|
@ -194,12 +194,14 @@ class Twython(EndpointsMixin, object):
|
|||
|
||||
raise ExceptionType(error_message,
|
||||
error_code=response.status_code,
|
||||
retry_after=response.headers.get('retry-after'))
|
||||
retry_after=response.headers.get('retry-\
|
||||
after'))
|
||||
|
||||
try:
|
||||
content = response.json()
|
||||
except ValueError:
|
||||
raise TwythonError('Response was not valid JSON. Unable to decode.')
|
||||
raise TwythonError('Response was not valid JSON. \
|
||||
Unable to decode.')
|
||||
|
||||
return content
|
||||
|
||||
|
|
@ -209,7 +211,8 @@ class Twython(EndpointsMixin, object):
|
|||
error_message = 'An error occurred processing your request.'
|
||||
try:
|
||||
content = response.json()
|
||||
# {"errors":[{"code":34,"message":"Sorry, that page does not exist"}]}
|
||||
# {"errors":[{"code":34,"message":"Sorry,
|
||||
# that page does not exist"}]}
|
||||
error_message = content['errors'][0]['message']
|
||||
except ValueError:
|
||||
# bad json data from Twitter for an error
|
||||
|
|
@ -223,13 +226,18 @@ class Twython(EndpointsMixin, object):
|
|||
def request(self, endpoint, method='GET', params=None, version='1.1'):
|
||||
"""Return dict of response received from Twitter's API
|
||||
|
||||
:param endpoint: (required) Full url or Twitter API endpoint (e.g. search/tweets)
|
||||
:param endpoint: (required) Full url or Twitter API endpoint
|
||||
(e.g. search/tweets)
|
||||
:type endpoint: string
|
||||
:param method: (optional) Method of accessing data, either GET or POST. (default GET)
|
||||
:param method: (optional) Method of accessing data, either
|
||||
GET or POST. (default GET)
|
||||
:type method: string
|
||||
:param params: (optional) Dict of parameters (if any) accepted the by Twitter API endpoint you are trying to access (default None)
|
||||
:param params: (optional) Dict of parameters (if any) accepted
|
||||
the by Twitter API endpoint you are trying to
|
||||
access (default None)
|
||||
:type params: dict or None
|
||||
:param version: (optional) Twitter API version to access (default 1.1)
|
||||
:param version: (optional) Twitter API version to access
|
||||
(default 1.1)
|
||||
:type version: string
|
||||
|
||||
:rtype: dict
|
||||
|
|
@ -242,7 +250,8 @@ class Twython(EndpointsMixin, object):
|
|||
else:
|
||||
url = '%s/%s.json' % (self.api_url % version, endpoint)
|
||||
|
||||
content = self._request(url, method=method, params=params, api_call=url)
|
||||
content = self._request(url, method=method, params=params,
|
||||
api_call=url)
|
||||
|
||||
return content
|
||||
|
||||
|
|
@ -258,7 +267,8 @@ class Twython(EndpointsMixin, object):
|
|||
"""Returns a specific header from the last API call
|
||||
This will return None if the header is not present
|
||||
|
||||
:param header: (required) The name of the header you want to get the value of
|
||||
:param header: (required) The name of the header you want to get
|
||||
the value of
|
||||
|
||||
Most useful for the following header information:
|
||||
x-rate-limit-limit,
|
||||
|
|
@ -268,21 +278,31 @@ class Twython(EndpointsMixin, object):
|
|||
|
||||
"""
|
||||
if self._last_call is None:
|
||||
raise TwythonError('This function must be called after an API call. It delivers header information.')
|
||||
raise TwythonError('This function must be called after an API call. \
|
||||
It delivers header information.')
|
||||
|
||||
return self._last_call['headers'].get(header, default_return_value)
|
||||
|
||||
def get_authentication_tokens(self, callback_url=None, force_login=False, screen_name=''):
|
||||
"""Returns a dict including an authorization URL, ``auth_url``, to direct a user to
|
||||
def get_authentication_tokens(self, callback_url=None, force_login=False,
|
||||
screen_name=''):
|
||||
"""Returns a dict including an authorization URL, ``auth_url``, to
|
||||
direct a user to
|
||||
|
||||
:param callback_url: (optional) Url the user is returned to after they authorize your app (web clients only)
|
||||
:param force_login: (optional) Forces the user to enter their credentials to ensure the correct users account is authorized.
|
||||
:param screen_name: (optional) If forced_login is set OR user is not currently logged in, Prefills the username input box of the OAuth login screen with the given value
|
||||
:param callback_url: (optional) Url the user is returned to after
|
||||
they authorize your app (web clients only)
|
||||
:param force_login: (optional) Forces the user to enter their
|
||||
credentials to ensure the correct users
|
||||
account is authorized.
|
||||
:param screen_name: (optional) If forced_login is set OR user is
|
||||
not currently logged in, Prefills the username
|
||||
input box of the OAuth login screen with the
|
||||
given value
|
||||
|
||||
:rtype: dict
|
||||
"""
|
||||
if self.oauth_version != 1:
|
||||
raise TwythonError('This method can only be called when your OAuth version is 1.0.')
|
||||
raise TwythonError('This method can only be called when your \
|
||||
OAuth version is 1.0.')
|
||||
|
||||
request_args = {}
|
||||
if callback_url:
|
||||
|
|
@ -290,15 +310,18 @@ class Twython(EndpointsMixin, object):
|
|||
response = self.client.get(self.request_token_url, params=request_args)
|
||||
|
||||
if response.status_code == 401:
|
||||
raise TwythonAuthError(response.content, error_code=response.status_code)
|
||||
raise TwythonAuthError(response.content,
|
||||
error_code=response.status_code)
|
||||
elif response.status_code != 200:
|
||||
raise TwythonError(response.content, error_code=response.status_code)
|
||||
raise TwythonError(response.content,
|
||||
error_code=response.status_code)
|
||||
|
||||
request_tokens = dict(parse_qsl(response.content.decode('utf-8')))
|
||||
if not request_tokens:
|
||||
raise TwythonError('Unable to decode request tokens.')
|
||||
|
||||
oauth_callback_confirmed = request_tokens.get('oauth_callback_confirmed') == 'true'
|
||||
oauth_callback_confirmed = request_tokens.get('oauth_callback_confirmed') \
|
||||
== 'true'
|
||||
|
||||
auth_url_params = {
|
||||
'oauth_token': request_tokens['oauth_token'],
|
||||
|
|
@ -314,21 +337,28 @@ class Twython(EndpointsMixin, object):
|
|||
if callback_url and not oauth_callback_confirmed:
|
||||
auth_url_params['oauth_callback'] = self.callback_url
|
||||
|
||||
request_tokens['auth_url'] = self.authenticate_url + '?' + urlencode(auth_url_params)
|
||||
request_tokens['auth_url'] = self.authenticate_url + \
|
||||
'?' + urlencode(auth_url_params)
|
||||
|
||||
return request_tokens
|
||||
|
||||
def get_authorized_tokens(self, oauth_verifier):
|
||||
"""Returns a dict of authorized tokens after they go through the :class:`get_authentication_tokens` phase.
|
||||
"""Returns a dict of authorized tokens after they go through the
|
||||
:class:`get_authentication_tokens` phase.
|
||||
|
||||
:param oauth_verifier: (required) The oauth_verifier (or a.k.a PIN for non web apps) retrieved from the callback url querystring
|
||||
:param oauth_verifier: (required) The oauth_verifier (or a.k.a PIN
|
||||
for non web apps) retrieved from the callback url querystring
|
||||
:rtype: dict
|
||||
|
||||
"""
|
||||
if self.oauth_version != 1:
|
||||
raise TwythonError('This method can only be called when your OAuth version is 1.0.')
|
||||
raise TwythonError('This method can only be called when your \
|
||||
OAuth version is 1.0.')
|
||||
|
||||
response = self.client.get(self.access_token_url, params={'oauth_verifier': oauth_verifier}, headers={'Content-Type': 'application/json'})
|
||||
response = self.client.get(self.access_token_url,
|
||||
params={'oauth_verifier': oauth_verifier},
|
||||
headers={'Content-Type': 'application/\
|
||||
json'})
|
||||
|
||||
if response.status_code == 401:
|
||||
try:
|
||||
|
|
@ -341,7 +371,8 @@ class Twython(EndpointsMixin, object):
|
|||
except ValueError:
|
||||
content = {}
|
||||
|
||||
raise TwythonError(content.get('error', 'Invalid / expired Token'), error_code=response.status_code)
|
||||
raise TwythonError(content.get('error', 'Invalid / expired To \
|
||||
ken'), error_code=response.status_code)
|
||||
|
||||
authorized_tokens = dict(parse_qsl(response.content.decode('utf-8')))
|
||||
if not authorized_tokens:
|
||||
|
|
@ -350,12 +381,14 @@ class Twython(EndpointsMixin, object):
|
|||
return authorized_tokens # pragma: no cover
|
||||
|
||||
def obtain_access_token(self):
|
||||
"""Returns an OAuth 2 access token to make OAuth 2 authenticated read-only calls.
|
||||
"""Returns an OAuth 2 access token to make OAuth 2 authenticated
|
||||
read-only calls.
|
||||
|
||||
:rtype: string
|
||||
"""
|
||||
if self.oauth_version != 2:
|
||||
raise TwythonError('This method can only be called when your OAuth version is 2.0.')
|
||||
raise TwythonError('This method can only be called when your \
|
||||
OAuth version is 2.0.')
|
||||
|
||||
data = {'grant_type': 'client_credentials'}
|
||||
basic_auth = HTTPBasicAuth(self.app_key, self.app_secret)
|
||||
|
|
@ -377,8 +410,10 @@ class Twython(EndpointsMixin, object):
|
|||
def construct_api_url(api_url, **params):
|
||||
"""Construct a Twitter API url, encoded, with parameters
|
||||
|
||||
:param api_url: URL of the Twitter API endpoint you are attempting to construct
|
||||
:param \*\*params: Parameters that are accepted by Twitter for the endpoint you're requesting
|
||||
:param api_url: URL of the Twitter API endpoint you are attempting
|
||||
to construct
|
||||
:param \*\*params: Parameters that are accepted by Twitter for the
|
||||
endpoint you're requesting
|
||||
:rtype: string
|
||||
|
||||
Usage::
|
||||
|
|
@ -387,7 +422,8 @@ class Twython(EndpointsMixin, object):
|
|||
>>> twitter = Twython()
|
||||
|
||||
>>> api_url = 'https://api.twitter.com/1.1/search/tweets.json'
|
||||
>>> constructed_url = twitter.construct_api_url(api_url, q='python', result_type='popular')
|
||||
>>> constructed_url = twitter.construct_api_url(api_url, q='python',
|
||||
result_type='popular')
|
||||
>>> print constructed_url
|
||||
https://api.twitter.com/1.1/search/tweets.json?q=python&result_type=popular
|
||||
|
||||
|
|
@ -403,7 +439,8 @@ class Twython(EndpointsMixin, object):
|
|||
|
||||
def search_gen(self, search_query, **params): # pragma: no cover
|
||||
warnings.warn(
|
||||
'This method is deprecated. You should use Twython.cursor instead. [eg. Twython.cursor(Twython.search, q=\'your_query\')]',
|
||||
'This method is deprecated. You should use Twython.cursor instead. \
|
||||
[eg. Twython.cursor(Twython.search, q=\'your_query\')]',
|
||||
TwythonDeprecationWarning,
|
||||
stacklevel=2
|
||||
)
|
||||
|
|
@ -412,14 +449,17 @@ class Twython(EndpointsMixin, object):
|
|||
def cursor(self, function, return_pages=False, **params):
|
||||
"""Returns a generator for results that match a specified query.
|
||||
|
||||
:param function: Instance of a Twython function (Twython.get_home_timeline, Twython.search)
|
||||
:param \*\*params: Extra parameters to send with your request (usually parameters accepted by the Twitter API endpoint)
|
||||
:param function: Instance of a Twython function
|
||||
(Twython.get_home_timeline, Twython.search)
|
||||
:param \*\*params: Extra parameters to send with your request
|
||||
(usually parameters accepted by the Twitter API endpoint)
|
||||
:rtype: generator
|
||||
|
||||
Usage::
|
||||
|
||||
>>> from twython import Twython
|
||||
>>> twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
|
||||
>>> twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN,
|
||||
OAUTH_TOKEN_SECRET)
|
||||
|
||||
>>> results = twitter.cursor(twitter.search, q='python')
|
||||
>>> for result in results:
|
||||
|
|
@ -427,7 +467,8 @@ class Twython(EndpointsMixin, object):
|
|||
|
||||
"""
|
||||
if not hasattr(function, 'iter_mode'):
|
||||
raise TwythonError('Unable to create generator for Twython method "%s"' % function.__name__)
|
||||
raise TwythonError('Unable to create generator for Twython \
|
||||
method "%s"' % function.__name__)
|
||||
|
||||
while True:
|
||||
content = function(**params)
|
||||
|
|
@ -446,22 +487,26 @@ class Twython(EndpointsMixin, object):
|
|||
for result in results:
|
||||
yield result
|
||||
|
||||
if function.iter_mode == 'cursor' and content['next_cursor_str'] == '0':
|
||||
if function.iter_mode == 'cursor' and \
|
||||
content['next_cursor_str'] == '0':
|
||||
raise StopIteration
|
||||
|
||||
try:
|
||||
if function.iter_mode == 'id':
|
||||
if not 'max_id' in params:
|
||||
# Add 1 to the id because since_id and max_id are inclusive
|
||||
if 'max_id' not in params:
|
||||
# Add 1 to the id because since_id and
|
||||
# max_id are inclusive
|
||||
if hasattr(function, 'iter_metadata'):
|
||||
since_id = content[function.iter_metadata].get('since_id_str')
|
||||
since_id = content[function.iter_metadata]\
|
||||
.get('since_id_str')
|
||||
else:
|
||||
since_id = content[0]['id_str']
|
||||
params['since_id'] = (int(since_id) - 1)
|
||||
elif function.iter_mode == 'cursor':
|
||||
params['cursor'] = content['next_cursor_str']
|
||||
except (TypeError, ValueError): # pragma: no cover
|
||||
raise TwythonError('Unable to generate next page of search results, `page` is not a number.')
|
||||
raise TwythonError('Unable to generate next page of search \
|
||||
results, `page` is not a number.')
|
||||
|
||||
@staticmethod
|
||||
def unicode2utf8(text):
|
||||
|
|
@ -483,11 +528,14 @@ class Twython(EndpointsMixin, object):
|
|||
"""Return HTML for a tweet (urls, mentions, hashtags replaced with links)
|
||||
|
||||
:param tweet: Tweet object from received from Twitter API
|
||||
:param use_display_url: Use display URL to represent link (ex. google.com, github.com). Default: True
|
||||
:param use_expanded_url: Use expanded URL to represent link (e.g. http://google.com). Default False
|
||||
:param use_display_url: Use display URL to represent link
|
||||
(ex. google.com, github.com). Default: True
|
||||
:param use_expanded_url: Use expanded URL to represent link
|
||||
(e.g. http://google.com). Default False
|
||||
|
||||
If use_expanded_url is True, it overrides use_display_url.
|
||||
If use_display_url and use_expanded_url is False, short url will be used (t.co/xxxxx)
|
||||
If use_display_url and use_expanded_url is False, short url will
|
||||
be used (t.co/xxxxx)
|
||||
|
||||
"""
|
||||
if 'retweeted_status' in tweet:
|
||||
|
|
@ -502,7 +550,8 @@ class Twython(EndpointsMixin, object):
|
|||
start, end = entity['indices'][0], entity['indices'][1]
|
||||
|
||||
mention_html = '<a href="https://twitter.com/%(screen_name)s" class="twython-mention">@%(screen_name)s</a>'
|
||||
text = text.replace(tweet['text'][start:end], mention_html % {'screen_name': entity['screen_name']})
|
||||
text = text.replace(tweet['text'][start:end],
|
||||
mention_html % {'screen_name': entity['screen_name']})
|
||||
|
||||
# Hashtags
|
||||
for entity in entities['hashtags']:
|
||||
|
|
@ -514,7 +563,8 @@ class Twython(EndpointsMixin, object):
|
|||
# Urls
|
||||
for entity in entities['urls']:
|
||||
start, end = entity['indices'][0], entity['indices'][1]
|
||||
if use_display_url and entity.get('display_url') and not use_expanded_url:
|
||||
if use_display_url and entity.get('display_url') \
|
||||
and not use_expanded_url:
|
||||
shown_url = entity['display_url']
|
||||
elif use_expanded_url and entity.get('expanded_url'):
|
||||
shown_url = entity['expanded_url']
|
||||
|
|
@ -522,6 +572,7 @@ class Twython(EndpointsMixin, object):
|
|||
shown_url = entity['url']
|
||||
|
||||
url_html = '<a href="%s" class="twython-url">%s</a>'
|
||||
text = text.replace(tweet['text'][start:end], url_html % (entity['url'], shown_url))
|
||||
text = text.replace(tweet['text'][start:end],
|
||||
url_html % (entity['url'], shown_url))
|
||||
|
||||
return text
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue