Coverage for src/c41811/config/basic/jproperties.py: 100%
35 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-04 11:16 +0000
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-04 11:16 +0000
1# cython: language_level = 3 # noqa: ERA001
4# noinspection GrazieInspection
5"""
6:py:class:`~jproperties.Properties` 类型配置数据实现
8.. versionadded:: 0.3.0
9"""
11from collections.abc import Mapping
12from typing import Any
13from typing import override
15from .mapping import MappingConfigData
16from ..errors import DependencyNotFoundError
18try:
19 # noinspection PyPackageRequirements, PyUnresolvedReferences
20 import jproperties # type: ignore[import-not-found]
21except ImportError:
22 dependency = "jproperties"
23 raise DependencyNotFoundError(dependency) from None
26class JPropertiesConfigData(MappingConfigData[jproperties.Properties]):
27 """:py:class:`~jproperties.Properties` 类型配置数据"""
29 def __init__(self, data: jproperties.Properties | Mapping[str, str | tuple[str, dict[str, str]]] | None = None):
30 """
31 :param data: 配置的原始数据
32 :type data: jproperties.Properties | Mapping[str, str | tuple[str, dict[str, str]]] | None
34 .. caution::
35 未默认做深拷贝,可能导致非预期行为
36 """ # noqa: RUF002, D205
37 super().__init__()
39 if data is None:
40 data = jproperties.Properties()
41 prop = data
42 if not isinstance(data, jproperties.Properties):
43 prop = jproperties.Properties()
44 if not isinstance(data, Mapping):
45 msg = f"must be mapping, not {type(data).__name__}"
46 raise TypeError(msg)
47 for key, value in data.items(): # type: ignore[union-attr]
48 prop[key] = value # type: ignore[index]
49 # jproperties没提供接口只能破坏封装性了
50 # noinspection PyProtectedMember
51 prop._key_order.append(key) # type: ignore[union-attr] # noqa: SLF001
53 self._data: jproperties.Properties = prop
55 @override
56 def __eq__(self, other: Any) -> bool:
57 if not isinstance(other, type(self)):
58 return NotImplemented
59 return all(
60 getattr(self._data, attr) == getattr(other._data, attr) # noqa: SLF001
61 for attr in ("properties", "_metadata", "_key_order")
62 )
64 __hash__ = None # type: ignore[assignment]
66 @override
67 def __repr__(self) -> str:
68 repr_ls = []
69 for name, attr in zip(
70 ("properties", "metadata", "key_order"), ("properties", "_metadata", "_key_order"), strict=False
71 ):
72 repr_ls.append(f"{name}={getattr(self._data, attr)!r}")
73 return f"{self.__class__.__name__}({', '.join(repr_ls)})"
76__all__ = ("JPropertiesConfigData",)