maleo-foundation 0.1.35__py3-none-any.whl → 0.1.37__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- maleo_foundation/managers/db.py +4 -5
- maleo_foundation/managers/service.py +3 -4
- maleo_foundation/middlewares/authentication.py +2 -2
- maleo_foundation/middlewares/base.py +2 -19
- maleo_foundation/utils/__init__.py +4 -2
- maleo_foundation/utils/exceptions.py +1 -13
- maleo_foundation/utils/extractor.py +16 -14
- maleo_foundation/utils/keyloader.py +52 -50
- {maleo_foundation-0.1.35.dist-info → maleo_foundation-0.1.37.dist-info}/METADATA +1 -1
- {maleo_foundation-0.1.35.dist-info → maleo_foundation-0.1.37.dist-info}/RECORD +13 -32
- maleo_foundation/clients/__init__.py +0 -7
- maleo_foundation/clients/general/__init__.py +0 -4
- maleo_foundation/clients/general/http.py +0 -50
- maleo_foundation/clients/google/__init__.py +0 -4
- maleo_foundation/clients/google/base.py +0 -32
- maleo_foundation/clients/google/cloud/__init__.py +0 -8
- maleo_foundation/clients/google/cloud/base.py +0 -32
- maleo_foundation/clients/google/cloud/logging.py +0 -63
- maleo_foundation/clients/google/cloud/secret.py +0 -149
- maleo_foundation/clients/google/cloud/storage.py +0 -110
- maleo_foundation/clients/google/secret.py +0 -61
- maleo_foundation/clients/google/storage.py +0 -57
- maleo_foundation/clients/utils/__init__.py +0 -5
- maleo_foundation/clients/utils/logger.py +0 -54
- maleo_foundation/db/__init__.py +0 -4
- maleo_foundation/db/engine.py +0 -76
- maleo_foundation/db/manager.py +0 -122
- maleo_foundation/db/session.py +0 -111
- maleo_foundation/utils/logger.py +0 -92
- /maleo_foundation/{db → models}/table.py +0 -0
- {maleo_foundation-0.1.35.dist-info → maleo_foundation-0.1.37.dist-info}/WHEEL +0 -0
- {maleo_foundation-0.1.35.dist-info → maleo_foundation-0.1.37.dist-info}/top_level.txt +0 -0
maleo_foundation/db/session.py
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
from contextlib import contextmanager
|
2
|
-
from sqlalchemy import Engine
|
3
|
-
from sqlalchemy.orm import sessionmaker, Session
|
4
|
-
from sqlalchemy.exc import SQLAlchemyError
|
5
|
-
from typing import Generator, Optional
|
6
|
-
from maleo_foundation.utils.logger import BaseLogger
|
7
|
-
|
8
|
-
class SessionManager:
|
9
|
-
_logger:Optional[BaseLogger] = None
|
10
|
-
_sessionmaker:Optional[sessionmaker[Session]] = None
|
11
|
-
|
12
|
-
@classmethod
|
13
|
-
def initialize(cls, logger:BaseLogger, engine:Engine) -> None:
|
14
|
-
"""Initialize the sessionmaker if not already initialized."""
|
15
|
-
if cls._sessionmaker is None:
|
16
|
-
cls._logger = logger
|
17
|
-
cls._sessionmaker = sessionmaker(bind=engine, expire_on_commit=False)
|
18
|
-
cls._logger.info("SessionManager initialized successfully.")
|
19
|
-
|
20
|
-
@classmethod
|
21
|
-
def _session_handler(cls) -> Generator[Session, None, None]:
|
22
|
-
"""Reusable function for managing database sessions."""
|
23
|
-
if cls._logger is None:
|
24
|
-
raise RuntimeError("Logger has not been initialized. Call initialize() first.")
|
25
|
-
if cls._sessionmaker is None:
|
26
|
-
raise RuntimeError("SessionLocal has not been initialized. Call initialize() first.")
|
27
|
-
|
28
|
-
session = cls._sessionmaker()
|
29
|
-
cls._logger.debug("New database session created.")
|
30
|
-
try:
|
31
|
-
yield session #* Provide session
|
32
|
-
session.commit() #* Auto-commit on success
|
33
|
-
except SQLAlchemyError as e:
|
34
|
-
session.rollback() #* Rollback on error
|
35
|
-
cls._logger.error(f"[SQLAlchemyError] Database transaction failed: {e}", exc_info=True)
|
36
|
-
raise
|
37
|
-
except Exception as e:
|
38
|
-
session.rollback() #* Rollback on error
|
39
|
-
cls._logger.error(f"[Exception] Database transaction failed: {e}", exc_info=True)
|
40
|
-
raise
|
41
|
-
finally:
|
42
|
-
session.close() #* Ensure session closes
|
43
|
-
cls._logger.debug("Database session closed.")
|
44
|
-
|
45
|
-
@classmethod
|
46
|
-
def inject(cls) -> Generator[Session, None, None]:
|
47
|
-
"""Returns a generator that yields a SQLAlchemy session for dependency injection."""
|
48
|
-
return cls._session_handler()
|
49
|
-
|
50
|
-
@classmethod
|
51
|
-
@contextmanager
|
52
|
-
def get(cls) -> Generator[Session, None, None]:
|
53
|
-
"""Context manager for manual session handling. Supports `with SessionManager.get() as session:`"""
|
54
|
-
yield from cls._session_handler()
|
55
|
-
|
56
|
-
@classmethod
|
57
|
-
def dispose(cls) -> None:
|
58
|
-
"""Dispose of the sessionmaker and release any resources."""
|
59
|
-
if cls._sessionmaker is not None:
|
60
|
-
cls._sessionmaker.close_all()
|
61
|
-
cls._sessionmaker = None
|
62
|
-
|
63
|
-
cls._logger.info("SessionManager disposed successfully.")
|
64
|
-
cls._logger = None
|
65
|
-
|
66
|
-
class SessionManagerV2:
|
67
|
-
def __init__(self, logger:BaseLogger, sessionmaker:sessionmaker[Session]):
|
68
|
-
self._logger = logger
|
69
|
-
self._sessionmaker = sessionmaker
|
70
|
-
|
71
|
-
def _session_handler(self) -> Generator[Session, None, None]:
|
72
|
-
"""Reusable function for managing database sessions."""
|
73
|
-
if self._logger is None:
|
74
|
-
raise RuntimeError("Logger has not been initialized. Call initialize() first.")
|
75
|
-
if self._sessionmaker is None:
|
76
|
-
raise RuntimeError("SessionLocal has not been initialized. Call initialize() first.")
|
77
|
-
|
78
|
-
session = self._sessionmaker()
|
79
|
-
self._logger.debug("New database session created.")
|
80
|
-
try:
|
81
|
-
yield session #* Provide session
|
82
|
-
session.commit() #* Auto-commit on success
|
83
|
-
except SQLAlchemyError as e:
|
84
|
-
session.rollback() #* Rollback on error
|
85
|
-
self._logger.error(f"[SQLAlchemyError] Database transaction failed: {e}", exc_info=True)
|
86
|
-
raise
|
87
|
-
except Exception as e:
|
88
|
-
session.rollback() #* Rollback on error
|
89
|
-
self._logger.error(f"[Exception] Database transaction failed: {e}", exc_info=True)
|
90
|
-
raise
|
91
|
-
finally:
|
92
|
-
session.close() #* Ensure session closes
|
93
|
-
self._logger.debug("Database session closed.")
|
94
|
-
|
95
|
-
def inject(self) -> Generator[Session, None, None]:
|
96
|
-
"""Returns a generator that yields a SQLAlchemy session for dependency injection."""
|
97
|
-
return self._session_handler()
|
98
|
-
|
99
|
-
@contextmanager
|
100
|
-
def get(self) -> Generator[Session, None, None]:
|
101
|
-
"""Context manager for manual session handling. Supports `with SessionManager.get() as session:`"""
|
102
|
-
yield from self._session_handler()
|
103
|
-
|
104
|
-
def dispose(self) -> None:
|
105
|
-
"""Dispose of the sessionmaker and release any resources."""
|
106
|
-
if self._sessionmaker is not None:
|
107
|
-
self._sessionmaker.close_all()
|
108
|
-
self._sessionmaker = None
|
109
|
-
|
110
|
-
self._logger.info("SessionManager disposed successfully.")
|
111
|
-
self._logger = None
|
maleo_foundation/utils/logger.py
DELETED
@@ -1,92 +0,0 @@
|
|
1
|
-
import logging
|
2
|
-
import os
|
3
|
-
from datetime import datetime
|
4
|
-
from typing import Callable, Optional
|
5
|
-
from maleo_foundation.clients.google.cloud.logging import GoogleCloudLoggingV2
|
6
|
-
from maleo_foundation.enums import BaseEnums
|
7
|
-
from maleo_foundation.types import BaseTypes
|
8
|
-
|
9
|
-
class BaseLogger(logging.Logger):
|
10
|
-
def __init__(
|
11
|
-
self,
|
12
|
-
base_dir:str,
|
13
|
-
type:BaseEnums.LoggerType,
|
14
|
-
service_name:BaseTypes.OptionalString = None,
|
15
|
-
client_name:BaseTypes.OptionalString = None,
|
16
|
-
level:BaseEnums.LoggerLevel = BaseEnums.LoggerLevel.INFO,
|
17
|
-
cloud_logging_manager:Optional[GoogleCloudLoggingV2] = None
|
18
|
-
):
|
19
|
-
"""
|
20
|
-
Custom extended logger with file, console, and Google Cloud Logging.
|
21
|
-
|
22
|
-
- Logs are stored in `base_dir/logs/{type}`
|
23
|
-
- Uses Google Cloud Logging if configured
|
24
|
-
|
25
|
-
Args:
|
26
|
-
base_dir (str): Base directory for logs (e.g., "/path/to/maleo_security")
|
27
|
-
type (str): Log type (e.g., "application", "middleware")
|
28
|
-
service_name (str): The service name (e.g., "maleo_security")
|
29
|
-
"""
|
30
|
-
#* Ensure service_name exists
|
31
|
-
service_name = service_name or os.getenv("SERVICE_NAME")
|
32
|
-
if service_name is None:
|
33
|
-
raise ValueError("SERVICE_NAME environment variable must be set if 'service_name' is set to None")
|
34
|
-
|
35
|
-
#* Ensure client_name is valid if logger type is a client
|
36
|
-
if type == BaseEnums.LoggerType.CLIENT and client_name is None:
|
37
|
-
raise ValueError("'client_name' parameter must be provided if 'logger_type' is 'client'")
|
38
|
-
|
39
|
-
self.type = type #* Define logger type
|
40
|
-
|
41
|
-
#* Define logger name
|
42
|
-
if self.type == BaseEnums.LoggerType.CLIENT:
|
43
|
-
self.name = f"{service_name} - {self.type} - {client_name}"
|
44
|
-
else:
|
45
|
-
self.name = f"{service_name} - {self.type}"
|
46
|
-
super().__init__(self.name, level)
|
47
|
-
|
48
|
-
#* Clear existing handlers to prevent duplicates
|
49
|
-
for handler in list(self.handlers):
|
50
|
-
self.removeHandler(handler)
|
51
|
-
handler.close()
|
52
|
-
|
53
|
-
#* Formatter for logs
|
54
|
-
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
55
|
-
|
56
|
-
#* Console handler
|
57
|
-
console_handler = logging.StreamHandler()
|
58
|
-
console_handler.setFormatter(formatter)
|
59
|
-
self.addHandler(console_handler)
|
60
|
-
|
61
|
-
#* Google Cloud Logging handler (If enabled)
|
62
|
-
if cloud_logging_manager is not None:
|
63
|
-
cloud_logging_handler = cloud_logging_manager.create_handler(name=self.name)
|
64
|
-
self.addHandler(cloud_logging_handler)
|
65
|
-
else:
|
66
|
-
self.info("Cloud logging is not configured.")
|
67
|
-
|
68
|
-
#* Define log directory
|
69
|
-
if type == BaseEnums.LoggerType.CLIENT:
|
70
|
-
log_dir = f"logs/{type}/{client_name}"
|
71
|
-
else:
|
72
|
-
log_dir = f"logs/{type}"
|
73
|
-
full_log_dir = os.path.join(base_dir, log_dir)
|
74
|
-
os.makedirs(full_log_dir, exist_ok=True)
|
75
|
-
|
76
|
-
#* Generate timestamped filename
|
77
|
-
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
78
|
-
log_filename = os.path.join(full_log_dir, f"{timestamp}.log")
|
79
|
-
|
80
|
-
#* File handler
|
81
|
-
file_handler = logging.FileHandler(log_filename, mode="a")
|
82
|
-
file_handler.setFormatter(formatter)
|
83
|
-
self.addHandler(file_handler)
|
84
|
-
|
85
|
-
def dispose(self):
|
86
|
-
"""Dispose of the logger by removing all handlers."""
|
87
|
-
for handler in list(self.handlers):
|
88
|
-
self.removeHandler(handler)
|
89
|
-
handler.close()
|
90
|
-
self.handlers.clear()
|
91
|
-
|
92
|
-
LoggerFactory = Callable[[], BaseLogger]
|
File without changes
|
File without changes
|
File without changes
|