Compare commits

..

No commits in common. "main" and "v0.1.2" have entirely different histories.
main ... v0.1.2

7 changed files with 22 additions and 54 deletions

View File

@ -14,23 +14,7 @@
This project requires [Python](https://www.python.org/) 3.8 or newer. This project requires [Python](https://www.python.org/) 3.8 or newer.
All required libraries can be installed easily using: This project does not have any library requirements 😎
```bash
pip install -r requirements.txt
```
Full list of requirements:
- [beautifulsoup4](https://pypi.org/project/beautifulsoup4/)
- [cssselect](https://pypi.org/project/cssselect/)
- [fin-defs](https://gitfub.space/Jmaa/fin-defs)
- [lxml](https://pypi.org/project/lxml/)
- [requests](https://pypi.org/project/requests/)
- [frozendict](https://pypi.org/project/frozendict/)
- [requests-ratelimiter](https://pypi.org/project/requests-ratelimiter/)
- [requests-util](https://gitfub.space/Jmaa/requests_util)
- [requests_cache](https://pypi.org/project/requests_cache/)
## Contributing ## Contributing

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,10 +11,6 @@ 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__)
@ -44,10 +40,8 @@ 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 = ( msg = f'Redirection: {r.request.method} {url} -> GET {r.headers["Location"]}'
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
@ -57,9 +51,7 @@ 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( origin_url = url_parsed._replace(path='',params='',query='',fragment='').geturl()
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)

View File

@ -1 +1 @@
__version__ = '0.1.6' __version__ = '0.1.2'

View File

@ -15,7 +15,6 @@ 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
@ -40,7 +39,6 @@ class StoreOfferProperty(enum.Enum):
AUCTION = enum.auto() AUCTION = enum.auto()
SOLD_OUT = enum.auto() SOLD_OUT = enum.auto()
DISCOUNT = enum.auto() DISCOUNT = enum.auto()
PRE_ORDER = enum.auto()
@dataclasses.dataclass(frozen=True, order=True, slots=True) @dataclasses.dataclass(frozen=True, order=True, slots=True)

View File

@ -7,7 +7,6 @@ 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."""
@ -20,6 +19,7 @@ class WishlistItem:
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

@ -10,7 +10,8 @@ from setuptools import setup
PACKAGE_NAME = 'clients_protocol' PACKAGE_NAME = 'clients_protocol'
PACKAGE_DESCRIPTION = """ PACKAGE_DESCRIPTION = """
# Common HTTP/REST clients interface""".strip() # Common HTTP/REST clients interface
""".strip()
PACKAGE_DESCRIPTION_SHORT = """ PACKAGE_DESCRIPTION_SHORT = """
""".strip() """.strip()
@ -26,9 +27,11 @@ def parse_version_file(text: str) -> str:
def find_python_packages() -> list[str]: def find_python_packages() -> list[str]:
"""Find all python packages (directories containing __init__.py files).""" """
Find all python packages. (Directories containing __init__.py files.)
"""
root_path = Path(PACKAGE_NAME) root_path = Path(PACKAGE_NAME)
packages: set[str] = {PACKAGE_NAME} packages: set[str] = set([PACKAGE_NAME])
# Search recursively # Search recursively
for init_file in root_path.rglob('__init__.py'): for init_file in root_path.rglob('__init__.py'):
@ -36,22 +39,11 @@ def find_python_packages() -> list[str]:
return sorted(packages) return sorted(packages)
with open(PACKAGE_NAME + '/_version.py') as f: with open(PACKAGE_NAME + '/_version.py') as f:
version = parse_version_file(f.read()) version = parse_version_file(f.read())
REQUIREMENTS_MAIN = [ REQUIREMENTS_MAIN = []
'beautifulsoup4',
'cssselect',
'fin-defs @ git+https://gitfub.space/Jmaa/fin-defs.git',
'lxml',
'requests',
'frozendict',
'requests-ratelimiter',
'requests-util @ git+https://gitfub.space/Jmaa/requests_util.git',
'requests_cache',
]
REQUIREMENTS_TEST = [] REQUIREMENTS_TEST = []

View File

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