from abc import ABC, abstractmethod
from contextlib import contextmanager
from sys import stderr
-from typing import IO, Iterator
+from typing import Callable, Iterator
import requests
import requests_cache
+from version import paperdoorknob_version
+
+
+_headers = {'User-Agent': f'paperdoorknob/{paperdoorknob_version} ' +
+ '(https://git.scottworley.com/paperdoorknob/)'}
+
class Fetcher(ABC):
@abstractmethod
self._timeout = timeout
def fetch(self, url: str) -> bytes:
- with self._session.get(url, timeout=self._timeout) as r:
+ with self._session.get(url, timeout=self._timeout, headers=_headers) as r:
r.raise_for_status()
return r.content
self._cache_hit_count = 0
def fetch(self, url: str) -> bytes:
- with self._session.get(url, timeout=self._timeout) as r:
+ with self._session.get(url, timeout=self._timeout, headers=_headers) as r:
r.raise_for_status()
self._request_count += 1
self._cache_hit_count += int(r.from_cache)
@contextmanager
def CachingFetcher(
- cache_path: str,
- timeout: int,
- report_stream: IO[str] = stderr) -> Iterator[_CachingFetcher]:
+ cache_path: str,
+ timeout: int,
+ log: Callable[[str], None] = lambda x: print(x, file=stderr),
+) -> Iterator[_CachingFetcher]:
with requests_cache.CachedSession(cache_path, cache_control=True) as session:
fetcher = _CachingFetcher(session, timeout)
yield fetcher
if fetcher.request_count > 0:
percent = 100.0 * fetcher.cache_hit_count / fetcher.request_count
- print(
- f"Fetch cache hits: {fetcher.cache_hit_count} ({percent:.1f}%)",
- file=report_stream)
+ log(f"Fetch cache hits: {fetcher.cache_hit_count} ({percent:.1f}%)")
class FakeFetcher(Fetcher):