From b2c23d6ddcb581a1dfd44f3a695aab15b35c9b63 Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Tue, 8 Aug 2023 04:47:02 +0300 Subject: Fix issues caught by linter * Add a .pylintrc to silence annoying messages * Fix imports * Add missing `parse_db_url` function * Add a new `gn_auth.auth.db.redis` module --- gn_auth/auth/db/__init__.py | 1 + gn_auth/auth/db/mariadb.py | 14 ++++++++++++-- gn_auth/auth/db/redis.py | 22 ++++++++++++++++++++++ gn_auth/auth/db/sqlite3.py | 2 ++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gn_auth/auth/db/redis.py (limited to 'gn_auth/auth/db') diff --git a/gn_auth/auth/db/__init__.py b/gn_auth/auth/db/__init__.py index eab58ef..7bdb38a 100644 --- a/gn_auth/auth/db/__init__.py +++ b/gn_auth/auth/db/__init__.py @@ -1 +1,2 @@ +"""Unified database connections module.""" from .protocols import DbCursor, DbConnection diff --git a/gn_auth/auth/db/mariadb.py b/gn_auth/auth/db/mariadb.py index a934fd9..69c1d8e 100644 --- a/gn_auth/auth/db/mariadb.py +++ b/gn_auth/auth/db/mariadb.py @@ -1,12 +1,22 @@ """Connections to MariaDB""" +import logging import traceback import contextlib -from typing import Iterator +from urllib.parse import urlparse +from typing import Tuple, Iterator import MySQLdb as mdb from .protocols import DbConnection +def parse_db_url(sql_uri: str) -> Tuple: + """Parse SQL_URI env variable note:there is a default value for SQL_URI so a + tuple result is always expected""" + parsed_db = urlparse(sql_uri) + return ( + parsed_db.hostname, parsed_db.username, parsed_db.password, + parsed_db.path[1:], parsed_db.port) + @contextlib.contextmanager def database_connection(sql_uri) -> Iterator[DbConnection]: """Connect to MySQL database.""" @@ -18,7 +28,7 @@ def database_connection(sql_uri) -> Iterator[DbConnection]: port=port or 3306) try: yield connection - except Exception as _exc: # TODO: Make the Exception class less general + except mdb.Error as _mdb_err: logging.debug(traceback.format_exc()) connection.rollback() finally: diff --git a/gn_auth/auth/db/redis.py b/gn_auth/auth/db/redis.py new file mode 100644 index 0000000..fdf1d6f --- /dev/null +++ b/gn_auth/auth/db/redis.py @@ -0,0 +1,22 @@ +"""Connections for Redis.""" +import logging +import traceback +import contextlib +from typing import Iterator + +from redis import Redis, RedisError, ConnectionError as RedisConnectionError + +@contextlib.contextmanager +def connection(redis_uri) -> Iterator[Redis]: + """Connection to redis""" + rconn = Redis.from_url(redis_uri, decode_responses=True) + try: + if not rconn.ping(): + raise RedisConnectionError("Could not connect to Redis.") + yield rconn + except RedisError as _rerr: + logging.debug(traceback.format_exc()) + raise + finally: + rconn.disconnect() + rconn.close() diff --git a/gn_auth/auth/db/sqlite3.py b/gn_auth/auth/db/sqlite3.py index 3d94832..be9eb2f 100644 --- a/gn_auth/auth/db/sqlite3.py +++ b/gn_auth/auth/db/sqlite3.py @@ -6,6 +6,8 @@ from typing import Any, Callable, Iterator import traceback +from flask import current_app + from .protocols import DbCursor, DbConnection @contextlib.contextmanager -- cgit v1.2.3