Coverage for src / c41811 / config / basic / jproperties.py: 100%
35 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-09 01:06 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-09 01:06 +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 prop = data
40 is_none = data is None
41 not_property = not isinstance(data, jproperties.Properties)
42 if is_none or not_property:
43 prop = jproperties.Properties()
44 if is_none:
45 data = {}
46 if not_property:
47 for key, value in data.items(): # type: ignore[union-attr]
48 prop[key] = value # type: ignore[index]
49 # noinspection PyProtectedMember
50 prop._key_order.append(key) # type: ignore[union-attr] # noqa: SLF001
52 self._data: jproperties.Properties = prop
54 @override
55 def __eq__(self, other: Any) -> bool:
56 if not isinstance(other, type(self)):
57 return NotImplemented
58 return all(
59 getattr(self._data, attr) == getattr(other._data, attr) # noqa: SLF001
60 for attr in ("properties", "_metadata", "_key_order")
61 )
63 __hash__ = None # type: ignore[assignment]
65 @override
66 def __repr__(self) -> str:
67 repr_ls = []
68 for name, attr in zip(
69 ("properties", "metadata", "key_order"), ("properties", "_metadata", "_key_order"), strict=False
70 ):
71 repr_ls.append(f"{name}={getattr(self._data, attr)!r}")
72 return f"{self.__class__.__name__}({', '.join(repr_ls)})"
75__all__ = ("JPropertiesConfigData",)