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.
Files changed (32) hide show
  1. maleo_foundation/managers/db.py +4 -5
  2. maleo_foundation/managers/service.py +3 -4
  3. maleo_foundation/middlewares/authentication.py +2 -2
  4. maleo_foundation/middlewares/base.py +2 -19
  5. maleo_foundation/utils/__init__.py +4 -2
  6. maleo_foundation/utils/exceptions.py +1 -13
  7. maleo_foundation/utils/extractor.py +16 -14
  8. maleo_foundation/utils/keyloader.py +52 -50
  9. {maleo_foundation-0.1.35.dist-info → maleo_foundation-0.1.37.dist-info}/METADATA +1 -1
  10. {maleo_foundation-0.1.35.dist-info → maleo_foundation-0.1.37.dist-info}/RECORD +13 -32
  11. maleo_foundation/clients/__init__.py +0 -7
  12. maleo_foundation/clients/general/__init__.py +0 -4
  13. maleo_foundation/clients/general/http.py +0 -50
  14. maleo_foundation/clients/google/__init__.py +0 -4
  15. maleo_foundation/clients/google/base.py +0 -32
  16. maleo_foundation/clients/google/cloud/__init__.py +0 -8
  17. maleo_foundation/clients/google/cloud/base.py +0 -32
  18. maleo_foundation/clients/google/cloud/logging.py +0 -63
  19. maleo_foundation/clients/google/cloud/secret.py +0 -149
  20. maleo_foundation/clients/google/cloud/storage.py +0 -110
  21. maleo_foundation/clients/google/secret.py +0 -61
  22. maleo_foundation/clients/google/storage.py +0 -57
  23. maleo_foundation/clients/utils/__init__.py +0 -5
  24. maleo_foundation/clients/utils/logger.py +0 -54
  25. maleo_foundation/db/__init__.py +0 -4
  26. maleo_foundation/db/engine.py +0 -76
  27. maleo_foundation/db/manager.py +0 -122
  28. maleo_foundation/db/session.py +0 -111
  29. maleo_foundation/utils/logger.py +0 -92
  30. /maleo_foundation/{db → models}/table.py +0 -0
  31. {maleo_foundation-0.1.35.dist-info → maleo_foundation-0.1.37.dist-info}/WHEEL +0 -0
  32. {maleo_foundation-0.1.35.dist-info → maleo_foundation-0.1.37.dist-info}/top_level.txt +0 -0
@@ -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
@@ -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