Fixed UnboundLocalError / AttributeError #571, #581 (#583)

* Fix plamere/spotipy#571, plamere/spotipy#581

* Add integration test for reaching max retries

* Update tests/integration/test_non_user_endpoints.py

Co-authored-by: Stéphane Bruckert <contact@stephanebruckert.com>

* Update CHANGELOG.md, integration test mock data

Co-authored-by: Stéphane Bruckert <contact@stephanebruckert.com>
This commit is contained in:
Callum 2020-10-07 19:00:45 +11:00 committed by GitHub
parent 76b640ae1e
commit 4bb42598e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 5 deletions

View File

@ -7,7 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
// Add your changes here and then delete this line
### Fixed
- SpotifyException now thrown when a request fails & has no response ( fixes #571, #581 )
## [2.16.0] - 2020-09-16

View File

@ -243,7 +243,8 @@ class Spotify(object):
response.raise_for_status()
results = response.json()
except requests.exceptions.HTTPError:
except requests.exceptions.HTTPError as http_error:
response = http_error.response
try:
msg = response.json()["error"]["message"]
except (ValueError, KeyError):
@ -263,13 +264,18 @@ class Spotify(object):
reason=reason,
headers=response.headers,
)
except requests.exceptions.RetryError:
except requests.exceptions.RetryError as retry_error:
request = retry_error.request
logger.error('Max Retries reached')
try:
reason = retry_error.args[0].reason
except (IndexError, AttributeError):
reason = None
raise SpotifyException(
599,
-1,
"%s:\n %s" % (response.url, "Max Retries"),
headers=response.headers,
"%s:\n %s" % (request.path_url, "Max Retries"),
reason=reason
)
except ValueError:
results = None

View File

@ -240,6 +240,20 @@ class AuthTestSpotipy(unittest.TestCase):
self.assertRaises((requests.exceptions.Timeout, requests.exceptions.ConnectionError),
lambda: sp.search(q='my*', type='track'))
def test_max_retries_reached(self):
spotify_no_retry = Spotify(
client_credentials_manager=SpotifyClientCredentials(),
retries=0)
i = 0
while i < 100:
try:
spotify_no_retry.search(q='foo')
except spotipy.exceptions.SpotifyException as e:
self.assertIsInstance(e, spotipy.exceptions.SpotifyException)
return
i += 1
self.fail()
def test_album_search(self):
results = self.spotify.search(q='weezer pinkerton', type='album')
self.assertTrue('albums' in results)