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

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 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 

51 

52 self._data: jproperties.Properties = prop 

53 

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 ) 

62 

63 __hash__ = None # type: ignore[assignment] 

64 

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

73 

74 

75__all__ = ("JPropertiesConfigData",)