Source code for quackamollie.core.cli.helpers.db_url_config

# -*- coding: utf-8 -*-
__all__ = ["get_db_url_from_config", "anonymize_database_url"]
__author__ = "QuacktorAI"
__copyright__ = "Copyright 2024, Forge of Absurd Ducks"
__credits__ = ["QuacktorAI"]

import re

from typing import Optional


[docs] def get_db_url_from_config(db_protocol: str, db_host: str, db_name: str, db_username: Optional[str], db_password: Optional[str], db_port: Optional[int]) -> str: """ Construct database URL from URL fields :param db_protocol: Database protocol, must be a protocol supported by SQLAlchemy :type db_protocol: str :param db_host: Hostname of the database :type db_host: str :param db_name: Name of the database :type db_name: str :param db_username: Username for database connection :type db_username: Optional[str] :param db_password: Password for database connection :type db_password: Optional[str] :param db_port: Port of the database :type db_port: Optional[str] :return: The URL of the database in the format `{db_protocol}://{db_username}:{db_password}@{}:{db_port}/{db_name}` :rtype: str """ db_url: str = f"{db_protocol}://" if db_username is not None: if db_password is None: db_url += f"{db_username}@" else: db_url += f"{db_username}:{db_password}@" db_url += db_host if db_port is not None: db_url += f":{db_port}" db_url += f"/{db_name}" return db_url
[docs] def anonymize_database_url(db_url: str) -> str: """ Hide the username and password of a given database URL :param db_url: The database URL to anonymize, typically `postgres://user:password@host/database` :type db_url: str :return: The anonymized URL, typically `postgres://host/database` or `postgres://us****@host/database` or `postgres://us****:****@host/database`. The number of asterisks is a constant to not divulge data. :rtype: str """ db_url_regex_userpass = re.search(r"^.*://(?P<userpass>.*)@.*$", db_url) if db_url_regex_userpass is not None and 'userpass' in db_url_regex_userpass.groupdict(): userpass = db_url_regex_userpass.groupdict()['userpass'] return db_url.replace(userpass, f"{userpass[:2]}****{':****' if ':' in userpass else ''}") else: return db_url