Ruff and __version
Some checks failed
Run Python tests (through Pytest) / Test (push) Failing after 28s
Verify Python project can be installed, loaded and have version checked / Test (push) Failing after 28s

This commit is contained in:
Jon Michael Aanes 2025-07-13 23:57:01 +02:00
parent b238952198
commit 35554771d4
4 changed files with 20 additions and 13 deletions

View File

@ -1,5 +1,5 @@
"""# Common HTTP/REST clients interface """# Common HTTP/REST clients interface"""
"""
import urllib.parse import urllib.parse
import abc import abc
@ -11,6 +11,10 @@ import bs4
import lxml.html import lxml.html
import requests import requests
from __version import __version__
__all__ = ['__version__']
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -40,8 +44,10 @@ class AbstractClient(abc.ABC):
def fetch(self, url: str, **kwargs) -> requests.Response: def fetch(self, url: str, **kwargs) -> requests.Response:
r = self._fetch(url, **kwargs) r = self._fetch(url, **kwargs)
if r.status_code in {301,302,303}: if r.status_code in {301, 302, 303}:
msg = f'Redirection: {r.request.method} {url} -> GET {r.headers["Location"]}' msg = (
f'Redirection: {r.request.method} {url} -> GET {r.headers["Location"]}'
)
raise Exception(msg) raise Exception(msg)
r.raise_for_status() r.raise_for_status()
return r return r
@ -51,7 +57,9 @@ class AbstractClient(abc.ABC):
kwargs.setdefault('allow_redirects', True) kwargs.setdefault('allow_redirects', True)
url_parsed = urllib.parse.urlparse(url) url_parsed = urllib.parse.urlparse(url)
origin_url = url_parsed._replace(path='',params='',query='',fragment='').geturl() origin_url = url_parsed._replace(
path='', params='', query='', fragment=''
).geturl()
kwargs.setdefault('headers', {}).setdefault('Origin', origin_url) kwargs.setdefault('headers', {}).setdefault('Origin', origin_url)
kwargs.setdefault('headers', {}).setdefault('Alt-Used', url_parsed.hostname) kwargs.setdefault('headers', {}).setdefault('Alt-Used', url_parsed.hostname)
@ -68,21 +76,21 @@ class AbstractClient(abc.ABC):
url: str, url: str,
**kwargs, **kwargs,
) -> None | bs4.BeautifulSoup: ) -> None | bs4.BeautifulSoup:
kwargs.setdefault('headers', {}).setdefault('Accept', 'text/html') kwargs.setdefault('headers', {}).setdefault('Accept', 'text/html')
text = self.fetch_text(url, **kwargs) text = self.fetch_text(url, **kwargs)
if text is None: if text is None:
return None return None
return lxml.html.document_fromstring(text) return lxml.html.document_fromstring(text)
def fetch_soup(self, url: str, **kwargs) -> None | bs4.BeautifulSoup: def fetch_soup(self, url: str, **kwargs) -> None | bs4.BeautifulSoup:
kwargs.setdefault('headers', {}).setdefault('Accept', 'text/html') kwargs.setdefault('headers', {}).setdefault('Accept', 'text/html')
text = self.fetch_text(url, **kwargs) text = self.fetch_text(url, **kwargs)
if text is None: if text is None:
return None return None
return bs4.BeautifulSoup(text, 'html.parser') return bs4.BeautifulSoup(text, 'html.parser')
def fetch_json(self, url: str, **kwargs) -> None | dict[str, Any]: def fetch_json(self, url: str, **kwargs) -> None | dict[str, Any]:
kwargs.setdefault('headers', {}).setdefault('Accept', 'application/json') kwargs.setdefault('headers', {}).setdefault('Accept', 'application/json')
response = self.fetch(url=url, **kwargs) response = self.fetch(url=url, **kwargs)
loaded_json = response.json() loaded_json = response.json()

View File

@ -15,6 +15,7 @@ DEFAULT_MAX_RESULTS = 1
URL = str URL = str
@dataclasses.dataclass(frozen=True, order=True, slots=True) @dataclasses.dataclass(frozen=True, order=True, slots=True)
class SellerInfo: class SellerInfo:
name: str name: str

View File

@ -7,6 +7,7 @@ import dataclasses
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@dataclasses.dataclass(frozen=True) @dataclasses.dataclass(frozen=True)
class WishlistItem: class WishlistItem:
"""A single wishlished product.""" """A single wishlished product."""
@ -14,12 +15,11 @@ class WishlistItem:
product_name: str # Name of the game/product product_name: str # Name of the game/product
reference_url: str # URL to a reference page for the item. reference_url: str # URL to a reference page for the item.
image_url: str | None = None # URL to the product image image_url: str | None = None # URL to the product image
console_name: str | None = None # Gaming platform/console name console_name: str | None = None # Gaming platform/console name
reference_price: fin_defs.AssetAmount | None = None # Reference price, if any reference_price: fin_defs.AssetAmount | None = None # Reference price, if any
class WishlistClient(abc.ABC): class WishlistClient(abc.ABC):
@abc.abstractmethod @abc.abstractmethod
def get_wishlist(self) -> Sequence[WishlistItem]: def get_wishlist(self) -> Sequence[WishlistItem]:
pass pass

View File

@ -1,5 +1,3 @@
def test_init(): def test_init():
import clients_protocol import clients_protocol
import clients_protocol.autoload import clients_protocol.autoload