dycw-utilities 0.136.0__py3-none-any.whl → 0.136.1__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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.136.0
3
+ Version: 0.136.1
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -1,4 +1,4 @@
1
- utilities/__init__.py,sha256=0ew7YXcLdtzxH-7q4GWgY3emjEZ_c9LZ173C_Q0J4xI,60
1
+ utilities/__init__.py,sha256=ghJADNjYC0lnQw7wfkYTP1svwcTYMtjPxrfG-2Yp7II,60
2
2
  utilities/aiolimiter.py,sha256=mD0wEiqMgwpty4XTbawFpnkkmJS6R4JRsVXFUaoitSU,628
3
3
  utilities/altair.py,sha256=HeZBVUocjkrTNwwKrClppsIqgNFF-ykv05HfZSoHYno,9104
4
4
  utilities/arq.py,sha256=S-sfBfY-E1ErRKf4sSXt2YyCjKvu-pBlOECDfjBebRA,6399
@@ -68,7 +68,7 @@ utilities/sentinel.py,sha256=3jIwgpMekWgDAxPDA_hXMP2St43cPhciKN3LWiZ7kv0,1248
68
68
  utilities/shelve.py,sha256=HZsMwK4tcIfg3sh0gApx4-yjQnrY4o3V3ZRimvRhoW0,738
69
69
  utilities/slack_sdk.py,sha256=RrB34gOj4TzBFh1vzMy6wL_ajzIG-2c9kiS6c6LzMFM,4233
70
70
  utilities/socket.py,sha256=K77vfREvzoVTrpYKo6MZakol0EYu2q1sWJnnZqL0So0,118
71
- utilities/sqlalchemy.py,sha256=5Cx-ioYb099xDUDZuXrXp5tFU90HnCvu3jUu6wkGxrg,38001
71
+ utilities/sqlalchemy.py,sha256=NAJGgCqdLoqPZIne74M3Z_sOaNYVEXiIhl3-6p-4UZE,38219
72
72
  utilities/sqlalchemy_polars.py,sha256=jXO-yizGuX_mivaQg7pe17GldcTMpeEldkIL4SpMyuI,14294
73
73
  utilities/statsmodels.py,sha256=koyiBHvpMcSiBfh99wFUfSggLNx7cuAw3rwyfAhoKpQ,3410
74
74
  utilities/streamlit.py,sha256=U9PJBaKP1IdSykKhPZhIzSPTZsmLsnwbEPZWzNhJPKk,2955
@@ -89,7 +89,7 @@ utilities/warnings.py,sha256=un1LvHv70PU-LLv8RxPVmugTzDJkkGXRMZTE2-fTQHw,1771
89
89
  utilities/whenever.py,sha256=A-yoOqBqrcVD1yDINDsTFDw7dq9-zgUGn_f8CxVUQJs,23332
90
90
  utilities/zipfile.py,sha256=24lQc9ATcJxHXBPc_tBDiJk48pWyRrlxO2fIsFxU0A8,699
91
91
  utilities/zoneinfo.py,sha256=oEH-nL3t4h9uawyZqWDtNtDAl6M-CLpLYGI_nI6DulM,1971
92
- dycw_utilities-0.136.0.dist-info/METADATA,sha256=IM9-dR9bLGWxZvhPixn8lYPDBpR-51PXzrwvgQXPDyI,1637
93
- dycw_utilities-0.136.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
94
- dycw_utilities-0.136.0.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
95
- dycw_utilities-0.136.0.dist-info/RECORD,,
92
+ dycw_utilities-0.136.1.dist-info/METADATA,sha256=V3lMerqiPJLZQv-NaDpV_MHwsBt6fkaoZRslaaGRS7w,1637
93
+ dycw_utilities-0.136.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
94
+ dycw_utilities-0.136.1.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
95
+ dycw_utilities-0.136.1.dist-info/RECORD,,
utilities/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.136.0"
3
+ __version__ = "0.136.1"
utilities/sqlalchemy.py CHANGED
@@ -66,6 +66,7 @@ from utilities.functions import (
66
66
  is_string_mapping,
67
67
  is_tuple,
68
68
  is_tuple_or_str_mapping,
69
+ yield_object_attributes,
69
70
  )
70
71
  from utilities.iterables import (
71
72
  CheckLengthError,
@@ -1036,21 +1037,31 @@ class _MapMappingToTableSnakeMapNonUniqueError(_MapMappingToTableError):
1036
1037
 
1037
1038
  def _orm_inst_to_dict(obj: DeclarativeBase, /) -> StrMapping:
1038
1039
  """Map an ORM instance to a dictionary."""
1039
- cls = type(obj)
1040
+ attrs = {
1041
+ k for k, _ in yield_object_attributes(obj, static_type=InstrumentedAttribute)
1042
+ }
1043
+ return {
1044
+ name: _orm_inst_to_dict_one(obj, attrs, name) for name in get_column_names(obj)
1045
+ }
1040
1046
 
1041
- def is_attr(attr: str, key: str, /) -> str | None:
1042
- if isinstance(value := getattr(cls, attr), InstrumentedAttribute) and (
1043
- value.name == key
1044
- ):
1045
- return attr
1046
- return None
1047
1047
 
1048
- def yield_items() -> Iterator[tuple[str, Any]]:
1049
- for key in get_column_names(cls):
1050
- attr = one(attr for attr in dir(cls) if is_attr(attr, key) is not None)
1051
- yield key, getattr(obj, attr)
1048
+ def _orm_inst_to_dict_one(
1049
+ obj: DeclarativeBase, attrs: AbstractSet[str], name: str, /
1050
+ ) -> Any:
1051
+ attr = one(
1052
+ attr for attr in attrs if _orm_inst_to_dict_predicate(type(obj), attr, name)
1053
+ )
1054
+ return getattr(obj, attr)
1055
+
1052
1056
 
1053
- return dict(yield_items())
1057
+ def _orm_inst_to_dict_predicate(
1058
+ cls: type[DeclarativeBase], attr: str, name: str, /
1059
+ ) -> bool:
1060
+ cls_attr = getattr(cls, attr)
1061
+ try:
1062
+ return cls_attr.name == name
1063
+ except AttributeError:
1064
+ return False
1054
1065
 
1055
1066
 
1056
1067
  ##