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.
- maleo_foundation/clients/google/base.py +32 -0
- maleo_foundation/clients/google/cloud/base.py +32 -0
- maleo_foundation/clients/google/cloud/logging.py +20 -1
- maleo_foundation/clients/google/cloud/secret.py +58 -1
- maleo_foundation/clients/google/cloud/storage.py +35 -2
- maleo_foundation/clients/google/secret.py +61 -0
- maleo_foundation/clients/google/storage.py +57 -0
- maleo_foundation/db/engine.py +37 -1
- maleo_foundation/db/manager.py +111 -3
- maleo_foundation/db/session.py +48 -1
- maleo_foundation/enums.py +9 -0
- maleo_foundation/managers/__init__.py +0 -0
- maleo_foundation/managers/client/__init__.py +0 -0
- maleo_foundation/managers/client/base.py +33 -0
- maleo_foundation/managers/client/google/__init__.py +0 -0
- maleo_foundation/managers/client/google/base.py +26 -0
- maleo_foundation/managers/client/google/secret.py +65 -0
- maleo_foundation/managers/client/google/storage.py +60 -0
- maleo_foundation/managers/client/http.py +40 -0
- maleo_foundation/managers/db.py +123 -0
- maleo_foundation/managers/service.py +251 -0
- maleo_foundation/models/transfers/general/token.py +1 -1
- maleo_foundation/services/token.py +14 -14
- maleo_foundation/utils/logger.py +17 -14
- maleo_foundation/utils/logging.py +182 -0
- {maleo_foundation-0.0.86.dist-info → maleo_foundation-0.0.88.dist-info}/METADATA +1 -1
- {maleo_foundation-0.0.86.dist-info → maleo_foundation-0.0.88.dist-info}/RECORD +29 -14
- {maleo_foundation-0.0.86.dist-info → maleo_foundation-0.0.88.dist-info}/WHEEL +1 -1
- {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,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=
|
|
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/
|
|
12
|
-
maleo_foundation/clients/google/cloud/
|
|
13
|
-
maleo_foundation/clients/google/cloud/
|
|
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=
|
|
18
|
-
maleo_foundation/db/manager.py,sha256=
|
|
19
|
-
maleo_foundation/db/session.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
67
|
-
maleo_foundation-0.0.
|
|
68
|
-
maleo_foundation-0.0.
|
|
69
|
-
maleo_foundation-0.0.
|
|
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,,
|
|
File without changes
|