maleo-foundation 0.0.60__py3-none-any.whl → 0.0.62__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.
@@ -1,35 +1,36 @@
1
1
  from sqlalchemy import Engine, MetaData, Column, Integer, UUID, TIMESTAMP, Enum, func
2
+ from sqlalchemy.ext.declarative import DeclarativeMeta
2
3
  from sqlalchemy.orm import declarative_base, declared_attr
3
4
  from uuid import uuid4
4
5
  from maleo_foundation.enums import BaseEnums
5
6
  from maleo_foundation.utils.formatter.case import CaseFormatter
6
7
 
7
- class DatabaseManager:
8
- class BaseMixin:
9
- __abstract__ = True
8
+ class BaseMixin:
9
+ __abstract__ = True
10
10
 
11
- @declared_attr
12
- def __tablename__(cls) -> str:
13
- return CaseFormatter.to_snake_case(cls.__name__)
11
+ @declared_attr
12
+ def __tablename__(cls) -> str:
13
+ return CaseFormatter.to_snake_case(cls.__name__)
14
14
 
15
- #* ----- ----- Common columns definition ----- ----- *#
15
+ #* ----- ----- Common columns definition ----- ----- *#
16
16
 
17
- #* Identifiers
18
- id = Column(Integer, primary_key=True)
19
- uuid = Column(UUID, default=uuid4, unique=True, nullable=False)
17
+ #* Identifiers
18
+ id = Column(Integer, primary_key=True)
19
+ uuid = Column(UUID, default=uuid4, unique=True, nullable=False)
20
20
 
21
- #* Timestamps
22
- created_at = Column(TIMESTAMP(timezone=True), server_default=func.now(), nullable=False)
23
- updated_at = Column(TIMESTAMP(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False)
24
- deleted_at = Column(TIMESTAMP(timezone=True))
25
- restored_at = Column(TIMESTAMP(timezone=True))
26
- deactivated_at = Column(TIMESTAMP(timezone=True))
27
- activated_at = Column(TIMESTAMP(timezone=True), server_default=func.now(), nullable=False)
21
+ #* Timestamps
22
+ created_at = Column(TIMESTAMP(timezone=True), server_default=func.now(), nullable=False)
23
+ updated_at = Column(TIMESTAMP(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False)
24
+ deleted_at = Column(TIMESTAMP(timezone=True))
25
+ restored_at = Column(TIMESTAMP(timezone=True))
26
+ deactivated_at = Column(TIMESTAMP(timezone=True))
27
+ activated_at = Column(TIMESTAMP(timezone=True), server_default=func.now(), nullable=False)
28
28
 
29
- #* Statuses
30
- status = Column(Enum(BaseEnums.StatusType, name="statustype"), default=BaseEnums.StatusType.ACTIVE, nullable=False)
29
+ #* Statuses
30
+ status = Column(Enum(BaseEnums.StatusType, name="statustype"), default=BaseEnums.StatusType.ACTIVE, nullable=False)
31
31
 
32
- Base = declarative_base() #* Correct way to define a declarative base
32
+ class DatabaseManager:
33
+ Base:DeclarativeMeta = declarative_base() #* Correct way to define a declarative base
33
34
 
34
35
  #* Explicitly define the type of metadata
35
36
  metadata:MetaData = Base.metadata
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
- from datetime import date, datetime, timedelta, timezone
3
- from pydantic import BaseModel, Field, model_validator, field_serializer, FieldSerializationInfo
4
- from typing import Any
2
+ from datetime import datetime, timedelta, timezone
3
+ from pydantic import BaseModel, Field, model_validator
5
4
  from uuid import UUID
6
5
  from maleo_foundation.constants import REFRESH_TOKEN_DURATION_DAYS, ACCESS_TOKEN_DURATION_MINUTES
7
6
  from maleo_foundation.enums import BaseEnums
@@ -59,11 +58,6 @@ class BaseGeneralSchemas:
59
58
  id:int = Field(..., ge=1, description="Data's ID, must be >= 1.")
60
59
  uuid:UUID = Field(..., description="Data's UUID.")
61
60
 
62
- # @field_serializer('uuid')
63
- # def serialize_uuid(self, value:UUID, info:FieldSerializationInfo) -> str:
64
- # """Serializes UUID to a hex string."""
65
- # return str(value)
66
-
67
61
  class Timestamps(BaseModel):
68
62
  created_at:datetime = Field(..., description="Data's created_at timestamp")
69
63
  updated_at:datetime = Field(..., description="Data's updated_at timestamp")
@@ -72,13 +66,6 @@ class BaseGeneralSchemas:
72
66
  deactivated_at:BaseTypes.OptionalDatetime = Field(..., description="Data's deactivated_at timestamp")
73
67
  activated_at:datetime = Field(..., description="Data's activated_at timestamp")
74
68
 
75
- # @field_serializer('created_at', 'updated_at', 'deleted_at', 'restored_at', 'deactivated_at', 'activated_at')
76
- # def serialize_timestamps(self, value:BaseTypes.OptionalDatetime, info:FieldSerializationInfo) -> str:
77
- # """Serializes datetime/date fields to ISO format."""
78
- # if value is not None:
79
- # return value.isoformat()
80
- # return value
81
-
82
69
  class Status(BaseModel):
83
70
  status:BaseEnums.StatusType = Field(..., description="Data's status")
84
71
 
@@ -129,23 +116,4 @@ class BaseGeneralSchemas:
129
116
  values["exp_dt"] = exp_dt
130
117
  #* Convert `exp_dt` to timestamp (int)
131
118
  values["exp"] = int(exp_dt.timestamp())
132
- return values
133
-
134
- # @field_serializer('*')
135
- # def serialize_fields(self, value, info: FieldSerializationInfo) -> Any:
136
- # """Recursively serialize UUIDs, datetimes, and dates in complex structures."""
137
-
138
- # def serialize(v: Any) -> Any:
139
- # if isinstance(v, UUID):
140
- # return str(v)
141
- # if isinstance(v, (datetime, date)):
142
- # return v.isoformat()
143
- # if isinstance(v, list):
144
- # return [serialize(item) for item in v]
145
- # if isinstance(v, tuple):
146
- # return tuple(serialize(item) for item in v)
147
- # if isinstance(v, dict):
148
- # return {serialize(k): serialize(val) for k, val in v.items()}
149
- # return v
150
-
151
- # return serialize(value)
119
+ return values
@@ -1,8 +1,5 @@
1
1
  from __future__ import annotations
2
- from datetime import datetime, date
3
- from pydantic import FieldSerializationInfo, field_validator, field_serializer, model_validator
4
- from uuid import UUID
5
- from typing import Any
2
+ from pydantic import model_validator
6
3
  from maleo_foundation.models.schemas.general import BaseGeneralSchemas
7
4
  from maleo_foundation.models.schemas.result import BaseResultSchemas
8
5
 
@@ -12,21 +9,6 @@ class BaseServiceQueryResultsTransfers:
12
9
  BaseGeneralSchemas.Timestamps,
13
10
  BaseGeneralSchemas.Identifiers
14
11
  ):
15
- @field_validator('*', mode="before")
16
- def set_none(cls, values):
17
- if isinstance(values, str) and (values == "" or len(values) == 0):
18
- return None
19
- return values
20
-
21
- @field_serializer('*')
22
- def serialize_fields(self, value, info:FieldSerializationInfo) -> Any:
23
- """Serializes all unique-typed fields."""
24
- if isinstance(value, UUID):
25
- return str(value)
26
- if isinstance(value, datetime) or isinstance(value, date):
27
- return value.isoformat()
28
- return value
29
-
30
12
  class Config:
31
13
  from_attributes=True
32
14
 
@@ -1,16 +1,16 @@
1
1
  from sqlalchemy import Column, Table
2
+ from sqlalchemy.ext.declarative import DeclarativeMeta
2
3
  from sqlalchemy.orm import Query
3
4
  from sqlalchemy.orm.attributes import InstrumentedAttribute
4
5
  from sqlalchemy.sql.expression import or_, asc, cast, desc
5
6
  from sqlalchemy.types import DATE, String, TEXT, TIMESTAMP
6
7
  from typing import Type
7
- from maleo_foundation.db import DatabaseManager
8
8
  from maleo_foundation.types import BaseTypes
9
9
  from maleo_foundation.extended_types import ExtendedTypes
10
10
 
11
11
  class BaseQueryUtils:
12
12
  @staticmethod
13
- def filter_column(query:Query, table:Type[DatabaseManager.Base], column:str, value:BaseTypes.OptionalAny) -> Query:
13
+ def filter_column(query:Query, table:Type[DeclarativeMeta], column:str, value:BaseTypes.OptionalAny) -> Query:
14
14
  if not value:
15
15
  return query
16
16
  column_attr = getattr(table, column, None)
@@ -24,7 +24,7 @@ class BaseQueryUtils:
24
24
  return query
25
25
 
26
26
  @staticmethod
27
- def filter_ids(query:Query, table:Type[DatabaseManager.Base], column:str, ids:BaseTypes.OptionalListOfIntegers) -> Query:
27
+ def filter_ids(query:Query, table:Type[DeclarativeMeta], column:str, ids:BaseTypes.OptionalListOfIntegers) -> Query:
28
28
  if ids is not None:
29
29
  column_attr = getattr(table, column, None)
30
30
  if column_attr:
@@ -33,7 +33,7 @@ class BaseQueryUtils:
33
33
  return query
34
34
 
35
35
  @staticmethod
36
- def filter_timestamps(query:Query, table:Type[DatabaseManager.Base], date_filters:ExtendedTypes.ListOfDateFilters) -> Query:
36
+ def filter_timestamps(query:Query, table:Type[DeclarativeMeta], date_filters:ExtendedTypes.ListOfDateFilters) -> Query:
37
37
  if date_filters and len(date_filters) > 0:
38
38
  for date_filter in date_filters:
39
39
  try:
@@ -52,14 +52,14 @@ class BaseQueryUtils:
52
52
  return query
53
53
 
54
54
  @staticmethod
55
- def filter_statuses(query:Query, table:Type[DatabaseManager.Base], statuses:BaseTypes.OptionalListOfStatuses) -> Query:
55
+ def filter_statuses(query:Query, table:Type[DeclarativeMeta], statuses:BaseTypes.OptionalListOfStatuses) -> Query:
56
56
  if statuses is not None:
57
57
  status_filters = [table.status == status for status in statuses]
58
58
  query = query.filter(or_(*status_filters))
59
59
  return query
60
60
 
61
61
  @staticmethod
62
- def filter_search(query:Query, table:Type[DatabaseManager.Base], search:BaseTypes.OptionalString) -> Query:
62
+ def filter_search(query:Query, table:Type[DeclarativeMeta], search:BaseTypes.OptionalString) -> Query:
63
63
  if search:
64
64
  search_term = f"%{search}%" #* Use wildcard for partial matching
65
65
  search_filters = []
@@ -78,7 +78,7 @@ class BaseQueryUtils:
78
78
  return query
79
79
 
80
80
  @staticmethod
81
- def sort(query:Query, table:Type[DatabaseManager.Base], sort_columns:ExtendedTypes.ListOfSortColumns) -> Query:
81
+ def sort(query:Query, table:Type[DeclarativeMeta], sort_columns:ExtendedTypes.ListOfSortColumns) -> Query:
82
82
  for sort_column in sort_columns:
83
83
  try:
84
84
  sort_col = getattr(table, sort_column.name)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maleo_foundation
3
- Version: 0.0.60
3
+ Version: 0.0.62
4
4
  Summary: Foundation package for Maleo
5
5
  Author-email: Agra Bima Yuda <agra@nexmedis.com>
6
6
  License: MIT
@@ -14,7 +14,7 @@ maleo_foundation/clients/google/cloud/storage.py,sha256=y_HAsbcGSnu5sxZPxaQWFWvO
14
14
  maleo_foundation/clients/utils/__init__.py,sha256=hChEGABHH4tOFxPRcpxmlhkM9PgF18M7wXapH88hpu4,131
15
15
  maleo_foundation/clients/utils/logger.py,sha256=QhxljzrvNY_gXAHCqaOUJJAgwvvcE9v3IQK6AWYxzM4,1144
16
16
  maleo_foundation/db/__init__.py,sha256=fFqGxpsiowiws70AqOfcOWFhwaahfOj9_05JSJ0iRaE,107
17
- maleo_foundation/db/database.py,sha256=I0dJ4DPWOxlgoARJa6dYtff37NswOj3oPICvP41hmgc,1653
17
+ maleo_foundation/db/database.py,sha256=wrgNUCyScSbkBngaYjckZaePRlw84Z_srlXPsVn4yto,1652
18
18
  maleo_foundation/db/engine.py,sha256=kw2SMMiWy5KARquh4TLk7v6HwlHW97lUIUvqdFbhNxk,1600
19
19
  maleo_foundation/db/session.py,sha256=tI13DJ6rLo8FOpSIFZrmD4dbuxY_c0RTjwEGb76ZOo0,2681
20
20
  maleo_foundation/expanded_types/__init__.py,sha256=RohoIQCiMvo2g6Jacq2dlqNXg3WLmRc-TD8nvMsyDKs,275
@@ -27,7 +27,7 @@ maleo_foundation/middlewares/cors.py,sha256=9uvBvY2N6Vxa9RP_YtESxcWo6Doi6uS0lzAG
27
27
  maleo_foundation/models/__init__.py,sha256=AaKehO7c1HyKhoTGRmNHDddSeBXkW-_YNrpOGBu8Ms8,246
28
28
  maleo_foundation/models/responses.py,sha256=ePz7yNEYVCNxxrQlj_dnWXspv1HAnBAHCQfyaaqTHdo,4541
29
29
  maleo_foundation/models/schemas/__init__.py,sha256=Xj8Ahsqyra-fmEaVcGPok5GOOsPQlKcknHYMvbjvENA,277
30
- maleo_foundation/models/schemas/general.py,sha256=QJ9U_tbIF53FC72CNA4fp_8R_sg0ec9i7wWc7DfVycE,7020
30
+ maleo_foundation/models/schemas/general.py,sha256=ROPzAd7b8lgZlc9tahh4XqrXjE5rZxPIQCeCvV53v_8,5497
31
31
  maleo_foundation/models/schemas/parameter.py,sha256=K47z2NzmTEhUiOfRiRLyRPXoQurbWsKBL7ObXAxIWRY,2100
32
32
  maleo_foundation/models/schemas/result.py,sha256=V3dljS2AdtWW4Pf8YsnQuiCylN1bZtEY1AtYC7okWuI,1747
33
33
  maleo_foundation/models/transfers/__init__.py,sha256=B8oCZHE3NTsrJ_rviSXaDsuc-gc25jpjuhJO40lpQiE,222
@@ -42,17 +42,17 @@ maleo_foundation/models/transfers/results/client/controllers/__init__.py,sha256=
42
42
  maleo_foundation/models/transfers/results/client/controllers/http.py,sha256=vhjfjchvlTq347mLY2mcE84n_xYMpLkALi_ecQNOAGY,1499
43
43
  maleo_foundation/models/transfers/results/service/__init__.py,sha256=dTjHe1iGIpdulrzawQoOj003sxxObumF63YpUptKrDA,390
44
44
  maleo_foundation/models/transfers/results/service/general.py,sha256=G4x-MhQI7Km9UAcx2uJmrsqA6RBvxpH6VFAd_ynFFd4,1486
45
- maleo_foundation/models/transfers/results/service/query.py,sha256=Wj9GCWk7FrKP0EoK55vJcr9YJ42Lo24mLXbRk9j0IJw,2566
45
+ maleo_foundation/models/transfers/results/service/query.py,sha256=G5A4FRkHyRRlpuGWrPV5-vqgyyBjMqu8f-Ka9BjD0lA,1828
46
46
  maleo_foundation/models/transfers/results/service/controllers/__init__.py,sha256=HZJWMy2dskzOCzLmp_UaL9rjbQ-sDMI7sd2bXb-4QOU,175
47
47
  maleo_foundation/models/transfers/results/service/controllers/rest.py,sha256=wCuFyOTQkuBs2cqjPsWnPy0XIsCfMqGByhrSy57qp7Y,1107
48
48
  maleo_foundation/utils/__init__.py,sha256=FavmL5XYGCm955EAKiWWcXYeU15p5rSzfcglpV2yI6c,387
49
49
  maleo_foundation/utils/controller.py,sha256=hapDGng4q5XTfaG18M3bbFsFGqEOlkNKRzGf8BMKrhs,2996
50
50
  maleo_foundation/utils/exceptions.py,sha256=nk3rD57fDR-D7BQkU1JEKV-Mu7FGMpLSEsqxdDZdKjU,4532
51
51
  maleo_foundation/utils/logger.py,sha256=978P57JOhGR-WIu7xdPXBIwd3JrfLLA8WerVzxhE_Fs,3408
52
- maleo_foundation/utils/query.py,sha256=qKNcjf5J7_Q7NjA79BO6_TpZVdYcF8YIO68F9M501ew,4398
52
+ maleo_foundation/utils/query.py,sha256=ODQ3adOYQNj5E2cRW9ytbjBz56nEDcnfq8mQ6YZbCCM,4375
53
53
  maleo_foundation/utils/formatter/__init__.py,sha256=iKf5YCbEdg1qKnFHyKqqcQbqAqEeRUf8mhI3v3dQoj8,78
54
54
  maleo_foundation/utils/formatter/case.py,sha256=TmvvlfzGdC_omMTB5vAa40TZBxQ3hnr-SYeo0M52Rlg,1352
55
- maleo_foundation-0.0.60.dist-info/METADATA,sha256=yS10g0mYJcgRzGN7eXIX-Pmdahjh9pAe4zAWjHZi79Y,3160
56
- maleo_foundation-0.0.60.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
57
- maleo_foundation-0.0.60.dist-info/top_level.txt,sha256=_iBos3F_bhEOdjOnzeiEYSrCucasc810xXtLBXI8cQc,17
58
- maleo_foundation-0.0.60.dist-info/RECORD,,
55
+ maleo_foundation-0.0.62.dist-info/METADATA,sha256=w396sabhoQLXTy_eD5QHWshrvlq-Gj7yuA-ufxCGh5o,3160
56
+ maleo_foundation-0.0.62.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
57
+ maleo_foundation-0.0.62.dist-info/top_level.txt,sha256=_iBos3F_bhEOdjOnzeiEYSrCucasc810xXtLBXI8cQc,17
58
+ maleo_foundation-0.0.62.dist-info/RECORD,,