maleo-foundation 0.0.60__tar.gz → 0.0.62__tar.gz

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 (64) hide show
  1. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/PKG-INFO +1 -1
  2. maleo_foundation-0.0.62/maleo_foundation/db/database.py +41 -0
  3. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/schemas/general.py +3 -35
  4. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/service/query.py +1 -19
  5. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/utils/query.py +7 -7
  6. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation.egg-info/PKG-INFO +1 -1
  7. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/pyproject.toml +1 -1
  8. maleo_foundation-0.0.60/maleo_foundation/db/database.py +0 -40
  9. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/README.md +0 -0
  10. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/__init__.py +0 -0
  11. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/__init__.py +0 -0
  12. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/general/__init__.py +0 -0
  13. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/general/http.py +0 -0
  14. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/google/__init__.py +0 -0
  15. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/google/cloud/__init__.py +0 -0
  16. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/google/cloud/logging.py +0 -0
  17. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/google/cloud/secret.py +0 -0
  18. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/google/cloud/storage.py +0 -0
  19. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/utils/__init__.py +0 -0
  20. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/clients/utils/logger.py +0 -0
  21. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/constants.py +0 -0
  22. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/db/__init__.py +0 -0
  23. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/db/engine.py +0 -0
  24. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/db/session.py +0 -0
  25. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/enums.py +0 -0
  26. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/expanded_types/__init__.py +0 -0
  27. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/expanded_types/client.py +0 -0
  28. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/expanded_types/query.py +0 -0
  29. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/expanded_types/service.py +0 -0
  30. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/extended_types.py +0 -0
  31. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/middlewares/__init__.py +0 -0
  32. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/middlewares/base.py +0 -0
  33. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/middlewares/cors.py +0 -0
  34. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/__init__.py +0 -0
  35. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/responses.py +0 -0
  36. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/schemas/__init__.py +0 -0
  37. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/schemas/parameter.py +0 -0
  38. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/schemas/result.py +0 -0
  39. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/__init__.py +0 -0
  40. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/parameters/__init__.py +0 -0
  41. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/parameters/client.py +0 -0
  42. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/parameters/general.py +0 -0
  43. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/parameters/service.py +0 -0
  44. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/__init__.py +0 -0
  45. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/client/__init__.py +0 -0
  46. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/client/controllers/__init__.py +0 -0
  47. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/client/controllers/http.py +0 -0
  48. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/client/service.py +0 -0
  49. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/service/__init__.py +0 -0
  50. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/service/controllers/__init__.py +0 -0
  51. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/service/controllers/rest.py +0 -0
  52. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/models/transfers/results/service/general.py +0 -0
  53. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/types.py +0 -0
  54. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/utils/__init__.py +0 -0
  55. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/utils/controller.py +0 -0
  56. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/utils/exceptions.py +0 -0
  57. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/utils/formatter/__init__.py +0 -0
  58. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/utils/formatter/case.py +0 -0
  59. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation/utils/logger.py +0 -0
  60. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation.egg-info/SOURCES.txt +0 -0
  61. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation.egg-info/dependency_links.txt +0 -0
  62. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation.egg-info/requires.txt +0 -0
  63. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/maleo_foundation.egg-info/top_level.txt +0 -0
  64. {maleo_foundation-0.0.60 → maleo_foundation-0.0.62}/setup.cfg +0 -0
@@ -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
@@ -0,0 +1,41 @@
1
+ from sqlalchemy import Engine, MetaData, Column, Integer, UUID, TIMESTAMP, Enum, func
2
+ from sqlalchemy.ext.declarative import DeclarativeMeta
3
+ from sqlalchemy.orm import declarative_base, declared_attr
4
+ from uuid import uuid4
5
+ from maleo_foundation.enums import BaseEnums
6
+ from maleo_foundation.utils.formatter.case import CaseFormatter
7
+
8
+ class BaseMixin:
9
+ __abstract__ = True
10
+
11
+ @declared_attr
12
+ def __tablename__(cls) -> str:
13
+ return CaseFormatter.to_snake_case(cls.__name__)
14
+
15
+ #* ----- ----- Common columns definition ----- ----- *#
16
+
17
+ #* Identifiers
18
+ id = Column(Integer, primary_key=True)
19
+ uuid = Column(UUID, default=uuid4, unique=True, nullable=False)
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)
28
+
29
+ #* Statuses
30
+ status = Column(Enum(BaseEnums.StatusType, name="statustype"), default=BaseEnums.StatusType.ACTIVE, nullable=False)
31
+
32
+ class DatabaseManager:
33
+ Base:DeclarativeMeta = declarative_base() #* Correct way to define a declarative base
34
+
35
+ #* Explicitly define the type of metadata
36
+ metadata:MetaData = Base.metadata
37
+
38
+ @classmethod
39
+ def initialize(cls, engine:Engine):
40
+ """Creates the database tables if they do not exist."""
41
+ cls.metadata.create_all(engine)
@@ -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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "maleo_foundation"
7
- version = "0.0.60"
7
+ version = "0.0.62"
8
8
  description = "Foundation package for Maleo"
9
9
  authors = [
10
10
  { name = "Agra Bima Yuda", email = "agra@nexmedis.com" }
@@ -1,40 +0,0 @@
1
- from sqlalchemy import Engine, MetaData, Column, Integer, UUID, TIMESTAMP, Enum, func
2
- from sqlalchemy.orm import declarative_base, declared_attr
3
- from uuid import uuid4
4
- from maleo_foundation.enums import BaseEnums
5
- from maleo_foundation.utils.formatter.case import CaseFormatter
6
-
7
- class DatabaseManager:
8
- class BaseMixin:
9
- __abstract__ = True
10
-
11
- @declared_attr
12
- def __tablename__(cls) -> str:
13
- return CaseFormatter.to_snake_case(cls.__name__)
14
-
15
- #* ----- ----- Common columns definition ----- ----- *#
16
-
17
- #* Identifiers
18
- id = Column(Integer, primary_key=True)
19
- uuid = Column(UUID, default=uuid4, unique=True, nullable=False)
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)
28
-
29
- #* Statuses
30
- status = Column(Enum(BaseEnums.StatusType, name="statustype"), default=BaseEnums.StatusType.ACTIVE, nullable=False)
31
-
32
- Base = declarative_base() #* Correct way to define a declarative base
33
-
34
- #* Explicitly define the type of metadata
35
- metadata:MetaData = Base.metadata
36
-
37
- @classmethod
38
- def initialize(cls, engine:Engine):
39
- """Creates the database tables if they do not exist."""
40
- cls.metadata.create_all(engine)