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

Add the retry session/wrapper #33

Merged
merged 4 commits into from
Jan 21, 2025
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion liblistenbrainz/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@

import json
import requests
from requests.adapters import HTTPAdapter
import time
from urllib3.util import Retry

from datetime import datetime
from enum import Enum
Expand All @@ -25,6 +27,9 @@
from liblistenbrainz.utils import _validate_submit_listens_payload, _convert_api_payload_to_listen
from urllib.parse import urljoin

retry_strategy = Retry(total=5, status_forcelist=[429, 500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry_strategy)

STATS_SUPPORTED_TIME_RANGES = (
'week',
'month',
Expand Down Expand Up @@ -95,9 +100,13 @@ def _get(self, endpoint, params=None, headers=None):
if self._auth_token:
headers['Authorization'] = f'Token {self._auth_token}'

session = requests.Session()
session.mount("http://", adapter) # http is not used, but in case someone needs to use to for dev work, its included here
session.mount("https://", adapter)

try:
self._wait_until_rate_limit()
response = requests.get(
response = session.get(
urljoin(API_BASE_URL, endpoint),
params=params,
headers=headers,
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ dependencies = [

[project.optional-dependencies]
tests = [
'pytest == 5.4.1',
'pytest-cov == 2.8.1'
'pytest == 8.3.4',
'pytest-cov >= 5.0.0'
]
build = [
'build',
Expand Down
6 changes: 3 additions & 3 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class ListenBrainzClientTestCase(unittest.TestCase):
def setUp(self):
self.client = liblistenbrainz.ListenBrainz()

@mock.patch('liblistenbrainz.client.requests.get')
@mock.patch('liblistenbrainz.client.requests.Session.get')
def test_get_injects_auth_token_if_available(self, mock_requests_get):
mock_requests_get.return_value = mock.MagicMock()
self.client._get('/1/user/iliekcomputers/listens')
Expand Down Expand Up @@ -283,7 +283,7 @@ def test_post_api_exceptions(self, mock_requests_post):
with self.assertRaises(errors.ListenBrainzAPIException):
self.client.submit_single_listen(listen)

@mock.patch('liblistenbrainz.client.requests.get')
@mock.patch('liblistenbrainz.client.requests.Session.get')
def test_get_api_exceptions(self, mock_requests_get):
response = mock.MagicMock()
response.json.return_value = {'code': 401, 'error': 'Unauthorized'}
Expand All @@ -295,7 +295,7 @@ def test_get_api_exceptions(self, mock_requests_get):
self.client.get_listens('iliekcomputers')


@mock.patch('liblistenbrainz.client.requests.get')
@mock.patch('liblistenbrainz.client.requests.Session.get')
def test_get_user_recommendation_recordings(self, mock_requests_get):
mock_requests_get.return_value = mock.MagicMock()
with self.assertRaises(ValueError):
Expand Down
Loading