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

1# cython: language_level = 3 # noqa: ERA001 

2 

3 

4# noinspection GrazieInspection 

5""" 

6:py:class:`~jproperties.Properties` 类型配置数据实现 

7 

8.. versionadded:: 0.3.0 

9""" 

10 

11from collections.abc import Mapping 

12from typing import Any 

13from typing import override 

14 

15from .mapping import MappingConfigData 

16from ..errors import DependencyNotFoundError 

17 

18try: 

19 # noinspection PyPackageRequirements, PyUnresolvedReferences 

20 import jproperties # type: ignore[import-not-found] 

21except ImportError: 

22 dependency = "jproperties" 

23 raise DependencyNotFoundError(dependency) from None 

24 

25 

26class JPropertiesConfigData(MappingConfigData[jproperties.Properties]): 

27 """:py:class:`~jproperties.Properties` 类型配置数据""" 

28 

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 

33 

34 .. caution:: 

35 未默认做深拷贝,可能导致非预期行为 

36 """ # noqa: RUF002, D205 

37 super().__init__() 

38 

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 

52 

53 self._data: jproperties.Properties = prop 

54 

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 ) 

63 

64 __hash__ = None # type: ignore[assignment] 

65 

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)})" 

74 

75 

76__all__ = ("JPropertiesConfigData",)