From 7a461586f3c9ca4bf20117861e03af31acc31041 Mon Sep 17 00:00:00 2001 From: devanshshukla99 Date: Fri, 5 May 2023 01:38:40 +0530 Subject: [PATCH 1/4] switched from logging to loguru --- pytest_response/app.py | 3 --- pytest_response/logger.py | 46 +-------------------------------------- 2 files changed, 1 insertion(+), 48 deletions(-) diff --git a/pytest_response/app.py b/pytest_response/app.py index f4cef8a..e158c0d 100644 --- a/pytest_response/app.py +++ b/pytest_response/app.py @@ -112,9 +112,6 @@ def __init__( log_level: str = "debug", database: str = "database.db", ) -> None: - log.setLevel(log_level.upper()) - log.info("<------------------------------------------------------------------->") - self._basepath = pathlib.Path(__file__).parent self._path_to_mocks = self._basepath.joinpath(path) diff --git a/pytest_response/logger.py b/pytest_response/logger.py index 33db4be..c57206a 100644 --- a/pytest_response/logger.py +++ b/pytest_response/logger.py @@ -1,45 +1 @@ -import logging - - -class Formatter(logging.Formatter): - """Logging Formatter to add colors and count warning / errors""" - - grey = "\033[38;1m" - cyan = "\033[36m" - green = "\033[32m" - yellow = "\033[33m" - red = "\033[31m" - bold_red = "\033[31;1m" - reset = "\033[0m" - format = "%(asctime)s - %(module)s.%(funcName)s() - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)" - - FORMATS = { - logging.DEBUG: "".join([cyan, format, reset]), - logging.INFO: "".join([green, format, reset]), - logging.WARNING: "".join([yellow, format, reset]), - logging.ERROR: "".join([red, format, reset]), - logging.CRITICAL: "".join([bold_red, format, reset]), - } - - def format(self, record): - log_fmt = self.FORMATS.get(record.levelno) - formatter = logging.Formatter(log_fmt) - return formatter.format(record) - - -def _init_log(level="info"): - log = logging.getLogger("pytest_response") - log.setLevel(getattr(logging, level.upper())) - fh = logging.FileHandler(".pytest_response.log") - fh.setLevel(logging.DEBUG) - ch = logging.StreamHandler() - ch.setLevel(logging.ERROR) - # formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") - fh.setFormatter(Formatter()) - ch.setFormatter(Formatter()) - log.addHandler(fh) - log.addHandler(ch) - return log - - -log = _init_log() +from loguru import logger as log From f36c34e1dfd5d237290cea130eb5d86099756776 Mon Sep 17 00:00:00 2001 From: devanshshukla99 Date: Fri, 5 May 2023 01:39:30 +0530 Subject: [PATCH 2/4] reducing footprint by not creating db file on init but when called --- pytest_response/database.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/pytest_response/database.py b/pytest_response/database.py index f4de556..73f605f 100644 --- a/pytest_response/database.py +++ b/pytest_response/database.py @@ -38,8 +38,7 @@ class ResponseDB: def __init__(self, path: str) -> None: self._path = path - self._database = sqlite3.connect(path) - self.setup() + self._database = None return def __repr__(self) -> str: @@ -49,6 +48,7 @@ def setup(self) -> bool: """ Function to setup the database table. """ + self._database = sqlite3.connect(self._path) self._database.cursor().executescript( """ CREATE TABLE IF NOT EXISTS records ( @@ -78,6 +78,8 @@ def index(self, index: Optional[str] = "url") -> List[str]: _occurances : `list` All occurances of the selected column `index`. """ + if not self._database: + self.setup() elements = self._database.execute("SELECT * FROM records;").fetchall() _occurances = [] for element in elements: @@ -125,6 +127,8 @@ def insert(self, url: str, response: bytes, headers: dict, status: Optional[int] kwargs : `dict` Any additional parameter to be dumped. """ + if not self._database: + self.setup() _kwargs = [ b64encode(self._sanatize_url(url).encode()).decode(), self.today, @@ -157,6 +161,8 @@ def get(self, url: str, **kwargs) -> Tuple[int, bytes, dict]: headers : `dict` Response header. """ + if not self._database: + self.setup() url = b64encode(self._sanatize_url(url).encode()).decode() element = self._database.execute(f"SELECT * FROM records WHERE url='{url}';").fetchall() if element: @@ -178,21 +184,27 @@ def all(self) -> dict: ------- Return list of all elements. """ + if not self._database: + self.setup() return self._database.execute("SELECT * FROM records").fetchall() def truncate(self) -> bool: """ Method to purge all records in the database. """ + if not self._database: + self.setup() self._database.execute("DELETE FROM records;") return self._database.commit() def close(self) -> None: - self._database.close() - return + if not self._database: + return True + return self._database.close() def __del__(self) -> None: - self._database.close() - return + if not self._database: + return True + return self._database.close() pass From 44c86cdf37aa148835f1de9830021f10d052f3fd Mon Sep 17 00:00:00 2001 From: devanshshukla99 Date: Fri, 5 May 2023 01:48:39 +0530 Subject: [PATCH 3/4] added loguru as a dep --- pytest_response/database.py | 2 ++ setup.cfg | 1 + 2 files changed, 3 insertions(+) diff --git a/pytest_response/database.py b/pytest_response/database.py index 73f605f..95864a6 100644 --- a/pytest_response/database.py +++ b/pytest_response/database.py @@ -5,6 +5,7 @@ from typing import List, Tuple, Optional from datetime import date from urllib.parse import urljoin, urlparse +from loguru import logger as log from pytest_response.exceptions import MalformedUrl @@ -48,6 +49,7 @@ def setup(self) -> bool: """ Function to setup the database table. """ + log.debug("setting up database") self._database = sqlite3.connect(self._path) self._database.cursor().executescript( """ diff --git a/setup.cfg b/setup.cfg index 6fb76f9..e2c0701 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,6 +31,7 @@ install_requires = pytest>=4.6 requests>=2.25.1 aiohttp + loguru [options.entry_points] pytest11 = From 1e72fb744bf98b7afaee5791f13523234bc02a4a Mon Sep 17 00:00:00 2001 From: devanshshukla99 Date: Fri, 2 Feb 2024 21:32:46 +0530 Subject: [PATCH 4/4] cleanup --- pytest_response/plugin.py | 8 ++++++++ setup.cfg | 1 + 2 files changed, 9 insertions(+) diff --git a/pytest_response/plugin.py b/pytest_response/plugin.py index e555bdc..ef55eec 100644 --- a/pytest_response/plugin.py +++ b/pytest_response/plugin.py @@ -30,6 +30,12 @@ def pytest_addoption(parser): default=True, help="Blocks remote connection requests for all interceptors.", ) + parser.addini( + "enable_remote_response", + type="bool", + default=False, + help="Activate remote-response plugin", + ) parser.addini( "remote_response_database", type="string", @@ -42,6 +48,8 @@ def pytest_configure(config): """ Pytest hook for setting up :class:`pytest_response.app.Response` """ + if not config.getini("enable_remote_response"): + return # either remote_capture or remote_response if config.option.remote_capture and config.option.remote_response: assert not config.option.remote_capture and config.option.remote_response diff --git a/setup.cfg b/setup.cfg index e2c0701..a7be9df 100644 --- a/setup.cfg +++ b/setup.cfg @@ -54,6 +54,7 @@ max-line-length = 110 norecursedirs = ".tox" "*.egg-info" minversion = 4.6 testpaths = tests +enable_remote_response = true [coverage:run] disable_warnings = no-data-collected