maleo-foundation 0.0.86__py3-none-any.whl → 0.0.88__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 (29) hide show
  1. maleo_foundation/clients/google/base.py +32 -0
  2. maleo_foundation/clients/google/cloud/base.py +32 -0
  3. maleo_foundation/clients/google/cloud/logging.py +20 -1
  4. maleo_foundation/clients/google/cloud/secret.py +58 -1
  5. maleo_foundation/clients/google/cloud/storage.py +35 -2
  6. maleo_foundation/clients/google/secret.py +61 -0
  7. maleo_foundation/clients/google/storage.py +57 -0
  8. maleo_foundation/db/engine.py +37 -1
  9. maleo_foundation/db/manager.py +111 -3
  10. maleo_foundation/db/session.py +48 -1
  11. maleo_foundation/enums.py +9 -0
  12. maleo_foundation/managers/__init__.py +0 -0
  13. maleo_foundation/managers/client/__init__.py +0 -0
  14. maleo_foundation/managers/client/base.py +33 -0
  15. maleo_foundation/managers/client/google/__init__.py +0 -0
  16. maleo_foundation/managers/client/google/base.py +26 -0
  17. maleo_foundation/managers/client/google/secret.py +65 -0
  18. maleo_foundation/managers/client/google/storage.py +60 -0
  19. maleo_foundation/managers/client/http.py +40 -0
  20. maleo_foundation/managers/db.py +123 -0
  21. maleo_foundation/managers/service.py +251 -0
  22. maleo_foundation/models/transfers/general/token.py +1 -1
  23. maleo_foundation/services/token.py +14 -14
  24. maleo_foundation/utils/logger.py +17 -14
  25. maleo_foundation/utils/logging.py +182 -0
  26. {maleo_foundation-0.0.86.dist-info → maleo_foundation-0.0.88.dist-info}/METADATA +1 -1
  27. {maleo_foundation-0.0.86.dist-info → maleo_foundation-0.0.88.dist-info}/RECORD +29 -14
  28. {maleo_foundation-0.0.86.dist-info → maleo_foundation-0.0.88.dist-info}/WHEEL +1 -1
  29. {maleo_foundation-0.0.86.dist-info → maleo_foundation-0.0.88.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,182 @@
1
+ import logging
2
+ import os
3
+ from datetime import datetime
4
+ from google.auth import default
5
+ from google.cloud.logging import Client
6
+ from google.cloud.logging.handlers import CloudLoggingHandler
7
+ from google.oauth2 import service_account
8
+ from typing import Optional
9
+ from maleo_foundation.enums import BaseEnums
10
+ from maleo_foundation.types import BaseTypes
11
+
12
+ class GoogleCloudLogging:
13
+ def __init__(self, google_credentials_path:BaseTypes.OptionalString = None) -> None:
14
+ google_credentials_path = google_credentials_path or os.getenv("GOOGLE_CREDENTIALS_PATH")
15
+ try:
16
+ if google_credentials_path is not None:
17
+ self._credentials = service_account.Credentials.from_service_account_file(filename=google_credentials_path)
18
+ else:
19
+ self._credentials, _ = default()
20
+ except Exception as e:
21
+ raise ValueError(f"Failed to initialize credentials: {str(e)}")
22
+ self._client = Client(credentials=self._credentials)
23
+ self._client.setup_logging()
24
+
25
+ @property
26
+ def credentials(self) -> service_account.Credentials:
27
+ return self._credentials
28
+
29
+ @property
30
+ def client(self) -> Client:
31
+ return self._client
32
+
33
+ def dispose(self) -> None:
34
+ if self._credentials is not None:
35
+ self._credentials = None
36
+ if self._client is not None:
37
+ self._client = None
38
+
39
+ def create_handler(self, name:str) -> CloudLoggingHandler:
40
+ return CloudLoggingHandler(client=self._client, name=name)
41
+
42
+ class BaseLogger(logging.Logger):
43
+ def __init__(
44
+ self,
45
+ logs_dir:str,
46
+ type:BaseEnums.LoggerType,
47
+ service_key:BaseTypes.OptionalString = None,
48
+ client_key:BaseTypes.OptionalString = None,
49
+ level:BaseEnums.LoggerLevel = BaseEnums.LoggerLevel.INFO,
50
+ google_cloud_logging:Optional[GoogleCloudLogging] = None
51
+ ):
52
+ """
53
+ Custom extended logger with file, console, and Google Cloud Logging.
54
+
55
+ - Logs are stored in `logs_dir/logs/{type}`
56
+ - Uses Google Cloud Logging if configured
57
+
58
+ Args:
59
+ logs_dir (str): Base directory for logs (e.g., "/path/to/service")
60
+ type (str): Log type (e.g., "application", "middleware")
61
+ service_key (str): The service name (e.g., "service")
62
+ """
63
+ self._type = type #* Declare logger type
64
+
65
+ #* Ensure service_key exists
66
+ self._service_key = service_key or os.getenv("SERVICE_NAME")
67
+ if self._service_key is None:
68
+ raise ValueError("SERVICE_NAME environment variable must be set if 'service_key' is set to None")
69
+
70
+ self._client_key = client_key #* Declare client key
71
+
72
+ #* Ensure client_key is valid if logger type is a client
73
+ if self._type == BaseEnums.LoggerType.CLIENT and self._client_key is None:
74
+ raise ValueError("'client_key' parameter must be provided if 'logger_type' is 'client'")
75
+
76
+ #* Define logger name
77
+ if self._type == BaseEnums.LoggerType.CLIENT:
78
+ self._name = f"{self._service_key} - {self._type} - {self._client_key}"
79
+ else:
80
+ self._name = f"{self._service_key} - {self._type}"
81
+
82
+ super().__init__(self._name, level) #* Init the superclass's logger
83
+
84
+ #* Clear existing handlers to prevent duplicates
85
+ for handler in list(self.handlers):
86
+ self.removeHandler(handler)
87
+ handler.close()
88
+
89
+ #* Formatter for logs
90
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
91
+
92
+ #* Console handler
93
+ console_handler = logging.StreamHandler()
94
+ console_handler.setFormatter(formatter)
95
+ self.addHandler(console_handler)
96
+
97
+ #* Google Cloud Logging handler (If enabled)
98
+ if google_cloud_logging is not None:
99
+ cloud_logging_handler = google_cloud_logging.create_handler(name=self._name)
100
+ self.addHandler(cloud_logging_handler)
101
+ else:
102
+ self.info("Cloud logging is not configured.")
103
+
104
+ #* Define log directory
105
+ if self._type == BaseEnums.LoggerType.CLIENT:
106
+ log_dir = f"logs/{self._type}/{self._client_key}"
107
+ else:
108
+ log_dir = f"logs/{self._type}"
109
+ self._log_dir = os.path.join(logs_dir, log_dir)
110
+ os.makedirs(self._log_dir, exist_ok=True)
111
+
112
+ #* Generate timestamped filename
113
+ timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
114
+ log_filename = os.path.join(self._log_dir, f"{timestamp}.log")
115
+
116
+ #* File handler
117
+ file_handler = logging.FileHandler(log_filename, mode="a")
118
+ file_handler.setFormatter(formatter)
119
+ self.addHandler(file_handler)
120
+
121
+ @property
122
+ def type(self) -> str:
123
+ return self._type
124
+
125
+ @property
126
+ def service(self) -> str:
127
+ return self._service_key
128
+
129
+ @property
130
+ def client(self) -> str:
131
+ raise NotImplementedError()
132
+
133
+ @property
134
+ def name(self) -> str:
135
+ return self._name
136
+
137
+ @property
138
+ def location(self) -> str:
139
+ return self._log_dir
140
+
141
+ def dispose(self):
142
+ """Dispose of the logger by removing all handlers."""
143
+ for handler in list(self.handlers):
144
+ self.removeHandler(handler)
145
+ handler.close()
146
+ self.handlers.clear()
147
+
148
+ class ServiceLogger(BaseLogger):
149
+ def __init__(
150
+ self,
151
+ logs_dir:str,
152
+ type:BaseEnums.ServiceLoggerType,
153
+ service_key:BaseTypes.OptionalString = None,
154
+ level:BaseEnums.LoggerLevel = BaseEnums.LoggerLevel.INFO,
155
+ google_cloud_logging:Optional[GoogleCloudLogging] = None
156
+ ):
157
+ super().__init__(
158
+ logs_dir=logs_dir,
159
+ type=type,
160
+ service_key=service_key,
161
+ client_key=None,
162
+ level=level,
163
+ google_cloud_logging=google_cloud_logging
164
+ )
165
+
166
+ class ClientLogger(BaseLogger):
167
+ def __init__(
168
+ self,
169
+ logs_dir:str,
170
+ client_key:str,
171
+ service_key:BaseTypes.OptionalString = None,
172
+ level:BaseEnums.LoggerLevel = BaseEnums.LoggerLevel.INFO,
173
+ google_cloud_logging:Optional[GoogleCloudLogging] = None
174
+ ):
175
+ super().__init__(
176
+ logs_dir=logs_dir,
177
+ type=BaseEnums.LoggerType.CLIENT,
178
+ service_key=service_key,
179
+ client_key=client_key,
180
+ level=level,
181
+ google_cloud_logging=google_cloud_logging
182
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maleo_foundation
3
- Version: 0.0.86
3
+ Version: 0.0.88
4
4
  Summary: Foundation package for Maleo
5
5
  Author-email: Agra Bima Yuda <agra@nexmedis.com>
6
6
  License: MIT
@@ -1,22 +1,26 @@
1
1
  maleo_foundation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  maleo_foundation/constants.py,sha256=aBmEfWlBqZxi0k-n6h2NM1YRLOjMnheEiLyQcjP-zCQ,1164
3
- maleo_foundation/enums.py,sha256=8R-0ysAUvC7OlsEZXqQ_sqDy8MLM85c2MmEgSx3IQbw,2523
3
+ maleo_foundation/enums.py,sha256=mhLidFNxo89ZlmfJptB7dNqX7Q_7H9jVS8tvUyp_jQg,2748
4
4
  maleo_foundation/extended_types.py,sha256=pIKt-_9tby4rmune3fmWcCW_mohaNRh_1lywBmdc-L4,301
5
5
  maleo_foundation/types.py,sha256=aKXnIgEhYGSfFqNMGLc4qIKGkINBRpkOo9R9cb2CbwI,2414
6
6
  maleo_foundation/clients/__init__.py,sha256=W8vydJYeDEi6gdmOZSBFSSDsfZJtb8C05CHErZgsZ30,188
7
7
  maleo_foundation/clients/general/__init__.py,sha256=l9eQrBeLW4aXtGU5aK3i6fD-msVR4526W7D9V8WCXIg,91
8
8
  maleo_foundation/clients/general/http.py,sha256=pObW6EaMeLDNsRZ9QJPzfhZDzcZ33kCsb-9Yfoh2MA4,1670
9
9
  maleo_foundation/clients/google/__init__.py,sha256=1uv6nF9QbATsSAcMimQOT7Y-eBljjDunBojNX6oAtS8,90
10
+ maleo_foundation/clients/google/base.py,sha256=tdiqNNtvy-Ev_L7R4Dg9y7V14QdlbfCOQ2Mulo238aE,1141
11
+ maleo_foundation/clients/google/secret.py,sha256=4k3pDs4HAibeCEgv8nUBADfhk2aftG9L1sfR3UxAyfE,2516
12
+ maleo_foundation/clients/google/storage.py,sha256=smsmrjKAyxtfdqz3EzuUVx_rQeaTaYZ5VKNWCvwQ4U8,1971
10
13
  maleo_foundation/clients/google/cloud/__init__.py,sha256=WGMPxEKKdkz3XGY5dZn9E-nYhD1kv1MgRHbmVnky4zk,245
11
- maleo_foundation/clients/google/cloud/logging.py,sha256=b-q6Mhlt2Vl5HBh-YXeEEfGu1TMFK_XIJa55haMvkpA,1552
12
- maleo_foundation/clients/google/cloud/secret.py,sha256=cFewA-EYsAaEfxc2G2XGzwHreW1FgyCK6MpwOARE24M,3452
13
- maleo_foundation/clients/google/cloud/storage.py,sha256=y_HAsbcGSnu5sxZPxaQWFWvOlF3vEcqkej2834OgAS0,2617
14
+ maleo_foundation/clients/google/cloud/base.py,sha256=V_5Zdu90FQLgAfUZvlB1KojFzXNKZNIR516gjDXgaPU,1146
15
+ maleo_foundation/clients/google/cloud/logging.py,sha256=s9T9bex0GeCPwIHrBRvilT23iyNKqJ5z50KcT76Jt5Y,2202
16
+ maleo_foundation/clients/google/cloud/secret.py,sha256=1dua0V2FHesjltLdc1N4PF8xTXPzmcSA3sgwBzYNUtM,5853
17
+ maleo_foundation/clients/google/cloud/storage.py,sha256=t8hAZiQj_RFhJJXE8a20WP7spNKTEFw1RK1AqurL3T8,3848
14
18
  maleo_foundation/clients/utils/__init__.py,sha256=hChEGABHH4tOFxPRcpxmlhkM9PgF18M7wXapH88hpu4,131
15
19
  maleo_foundation/clients/utils/logger.py,sha256=FMnHKV4i6xR6e8XN7kCNwTf1jhSLdJUIO7teSm5g0D4,1829
16
20
  maleo_foundation/db/__init__.py,sha256=fmvhCz4_siHfyKJujcUakKDKmuLxMhxn2w5tmfQwfcM,135
17
- maleo_foundation/db/engine.py,sha256=kw2SMMiWy5KARquh4TLk7v6HwlHW97lUIUvqdFbhNxk,1600
18
- maleo_foundation/db/manager.py,sha256=czs-6czNvKHZ7zWRX1nPpKJcdsadyX8R2DnZlA_6mlk,500
19
- maleo_foundation/db/session.py,sha256=tI13DJ6rLo8FOpSIFZrmD4dbuxY_c0RTjwEGb76ZOo0,2681
21
+ maleo_foundation/db/engine.py,sha256=hhYjCt5IEb864H2RNlUVS7GfMzuThHKRV260Bgkhn_o,3003
22
+ maleo_foundation/db/manager.py,sha256=nSstMJ9JBoEKTSLlz6MNf4Wuet8DLp2Pipfveg4kM1c,4663
23
+ maleo_foundation/db/session.py,sha256=6flx_HVh4Fe3EohK2xDcyXmVAPOci1KFvhVK4wFcKtA,4736
20
24
  maleo_foundation/db/table.py,sha256=Dk5GXeO0gbBBPN2PJtZhlUx2x3vMbT4dxTBc3YLBbuc,1199
21
25
  maleo_foundation/expanded_types/__init__.py,sha256=lm_r7rxlLA0sgSTGQBMR9ZbZbVDpD7Te-UYb3oRVi1g,364
22
26
  maleo_foundation/expanded_types/client.py,sha256=To0kRXp3QTmuSu5rWKaCiTsMK9qkYiyYKYbHfw-y1fY,2396
@@ -24,6 +28,16 @@ maleo_foundation/expanded_types/general.py,sha256=bjIBREYTS73tvS-Key7P7db82a2HHl
24
28
  maleo_foundation/expanded_types/query.py,sha256=0yUG-JIVsanzB7KAkrRz_OsrhP6J0bRqD9Q3l3atQnk,2384
25
29
  maleo_foundation/expanded_types/service.py,sha256=q8jpKdbCbLWwH1UPQavKpVE14rC5rveduk2cFWzuhGw,2416
26
30
  maleo_foundation/expanded_types/token.py,sha256=4fRTJw6W5MYq71NksNrWNi7qYHQ4_lQwfu9WxwrMipc,355
31
+ maleo_foundation/managers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ maleo_foundation/managers/db.py,sha256=FWfkOChi1nBqNzzHfY1yisYWrsyg4eYVZ5qDP99yLOI,4628
33
+ maleo_foundation/managers/service.py,sha256=N0IZrHAa7aFPdrLiz3NXPLlmyCCcetjbYXS-qQe-ayw,10669
34
+ maleo_foundation/managers/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ maleo_foundation/managers/client/base.py,sha256=lFn3B4SKjZfpeb9aYFY1iyut9juNM6l91yHXoqntPhM,949
36
+ maleo_foundation/managers/client/http.py,sha256=gAPEpIyA4XzEpToxZGPj6HAuK9VwdoSG54lR8OoVK1c,1374
37
+ maleo_foundation/managers/client/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ maleo_foundation/managers/client/google/base.py,sha256=1lrGoyGnYW5Xq05bVXbKqnsqqmFPnsqZCBPK5-DINDA,1037
39
+ maleo_foundation/managers/client/google/secret.py,sha256=T3EOSgolTaGXeLI-uYRoOWM-JU3zUhAPk8k4NZE4AmQ,2877
40
+ maleo_foundation/managers/client/google/storage.py,sha256=NunBBAVNg2DaPzDhlVC6a3PLa2jYdNvZEr8FNeriJOo,2155
27
41
  maleo_foundation/middlewares/__init__.py,sha256=bqE2EIFC3rWcR2AwFPR0fk2kSFfeTRzgA24GbnuT5RA,3697
28
42
  maleo_foundation/middlewares/base.py,sha256=KcpODNs0DQXX8Cwc6T9dC6aiZIqxTLtuJjVAGWXPSKk,11633
29
43
  maleo_foundation/middlewares/cors.py,sha256=9uvBvY2N6Vxa9RP_YtESxcWo6Doi6uS0lzAG9iLY7Uc,2288
@@ -36,7 +50,7 @@ maleo_foundation/models/schemas/result.py,sha256=V3dljS2AdtWW4Pf8YsnQuiCylN1bZtE
36
50
  maleo_foundation/models/schemas/token.py,sha256=u71kPXJyCxqn_INK05MSNFhQr9MaLfQM-icYc536xik,551
37
51
  maleo_foundation/models/transfers/__init__.py,sha256=oJLJ3Geeme6vBw7R2Dhvdvg4ziVvzEYAGJaP-tm_90w,299
38
52
  maleo_foundation/models/transfers/general/__init__.py,sha256=0yW67vJvKgJmZ9htteOVatG7mb-YEpHF62dpwH2g_Bk,146
39
- maleo_foundation/models/transfers/general/token.py,sha256=FrXIVgVBwOPTsri271WAkq54Sqa8WSzY75BzsNq2P6k,2411
53
+ maleo_foundation/models/transfers/general/token.py,sha256=ZbWIPU0WUFr9ReHOqjRuD1CFie2v206tJNFRcDGQvU4,2411
40
54
  maleo_foundation/models/transfers/parameters/__init__.py,sha256=oKW4RPIEISISRjsJzD8lsCGY1HhZRTzshPpWHcJu86k,353
41
55
  maleo_foundation/models/transfers/parameters/client.py,sha256=tn_Hwa-k-Utp5rODe7GylqZB8djIKKupgkUFscYCyLc,4059
42
56
  maleo_foundation/models/transfers/parameters/general.py,sha256=WoekZJCIoAllhXdRIJkNRdNq0QEIn0bteiHJLtzkCxU,579
@@ -54,16 +68,17 @@ maleo_foundation/models/transfers/results/service/query.py,sha256=G5A4FRkHyRRlpu
54
68
  maleo_foundation/models/transfers/results/service/controllers/__init__.py,sha256=HZJWMy2dskzOCzLmp_UaL9rjbQ-sDMI7sd2bXb-4QOU,175
55
69
  maleo_foundation/models/transfers/results/service/controllers/rest.py,sha256=wCuFyOTQkuBs2cqjPsWnPy0XIsCfMqGByhrSy57qp7Y,1107
56
70
  maleo_foundation/services/__init__.py,sha256=Ho5zJSA89xdGFKIwOdzjmd8sm23cIuwrqYAxCEBBTIU,120
57
- maleo_foundation/services/token.py,sha256=mULGv3wEeeFdNtk0k5pY3g7htFQM9EZBI1QIJdjfLy8,2348
71
+ maleo_foundation/services/token.py,sha256=sDwgiE_v-s6lQHQv9xtB0zMOGcCKMvdk_Gcm22LV97o,2376
58
72
  maleo_foundation/utils/__init__.py,sha256=FavmL5XYGCm955EAKiWWcXYeU15p5rSzfcglpV2yI6c,387
59
73
  maleo_foundation/utils/controller.py,sha256=ECzPzpw36zBAjKcWcDbUAhIJGbc6UpeypdUUX6ipXBg,6396
60
74
  maleo_foundation/utils/exceptions.py,sha256=nk3rD57fDR-D7BQkU1JEKV-Mu7FGMpLSEsqxdDZdKjU,4532
61
75
  maleo_foundation/utils/keyloader.py,sha256=g7LYypj7UolmSgHRGXMFgVaWr55UayMdtKXR5NmB7VM,2341
62
- maleo_foundation/utils/logger.py,sha256=978P57JOhGR-WIu7xdPXBIwd3JrfLLA8WerVzxhE_Fs,3408
76
+ maleo_foundation/utils/logger.py,sha256=uTvzzKnGjbxRVLHbiMDw2zKKWNaCwV35sxgjDStEwNQ,3569
77
+ maleo_foundation/utils/logging.py,sha256=7TIxwaKBQbY6YcjXZIBKs0qySbTRSK7VxWgjMvNkVEQ,6410
63
78
  maleo_foundation/utils/query.py,sha256=ODQ3adOYQNj5E2cRW9ytbjBz56nEDcnfq8mQ6YZbCCM,4375
64
79
  maleo_foundation/utils/formatter/__init__.py,sha256=iKf5YCbEdg1qKnFHyKqqcQbqAqEeRUf8mhI3v3dQoj8,78
65
80
  maleo_foundation/utils/formatter/case.py,sha256=TmvvlfzGdC_omMTB5vAa40TZBxQ3hnr-SYeo0M52Rlg,1352
66
- maleo_foundation-0.0.86.dist-info/METADATA,sha256=_f6U5Q82bD9p78MtcCdXQ-NjdGo8uVL6czk_ZQM0688,3190
67
- maleo_foundation-0.0.86.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
68
- maleo_foundation-0.0.86.dist-info/top_level.txt,sha256=_iBos3F_bhEOdjOnzeiEYSrCucasc810xXtLBXI8cQc,17
69
- maleo_foundation-0.0.86.dist-info/RECORD,,
81
+ maleo_foundation-0.0.88.dist-info/METADATA,sha256=x08I-4MffCYEkKnW5SU9nRlVPyyu6_APsfQgZzljxVo,3190
82
+ maleo_foundation-0.0.88.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
83
+ maleo_foundation-0.0.88.dist-info/top_level.txt,sha256=_iBos3F_bhEOdjOnzeiEYSrCucasc810xXtLBXI8cQc,17
84
+ maleo_foundation-0.0.88.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5