You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

131 lines
3.4 KiB

  1. from __future__ import annotations
  2. """
  3. DocInfo
  4. Although it was possible to read tag directives before this, all handle/prefix
  5. pairs for all documents in all streams were stored in one dictionary per
  6. YAML instance, making it impossible to distinguish where such a pair came
  7. from without sublassing the scanner.
  8. ToDo:
  9. DocInfo can be used by a yaml dumper to dump a class
  10. - if connected to the root of a data structure
  11. - if provided to the dumper?
  12. """
  13. if False: # MYPY
  14. from typing import Optional, Tuple, Any
  15. # from dataclasses import dataclass, field, MISSING # NOQA
  16. # @dataclass(order=True, frozen=True)
  17. class Version:
  18. # major: int
  19. # minor: int
  20. def __init__(self, major: int, minor: int) -> None:
  21. self._major = major
  22. self._minor = minor
  23. @property
  24. def major(self) -> int:
  25. return self._major
  26. @property
  27. def minor(self) -> int:
  28. return self._minor
  29. def __eq__(self, v: Any) -> bool:
  30. if not isinstance(v, Version):
  31. return False
  32. return self._major == v._major and self._minor == v._minor
  33. def __lt__(self, v: Version) -> bool:
  34. if self._major < v._major:
  35. return True
  36. if self._major > v._major:
  37. return False
  38. return self._minor < v._minor
  39. def __le__(self, v: Version) -> bool:
  40. if self._major < v._major:
  41. return True
  42. if self._major > v._major:
  43. return False
  44. return self._minor <= v._minor
  45. def __gt__(self, v: Version) -> bool:
  46. if self._major > v._major:
  47. return True
  48. if self._major < v._major:
  49. return False
  50. return self._minor > v._minor
  51. def __ge__(self, v: Version) -> bool:
  52. if self._major > v._major:
  53. return True
  54. if self._major < v._major:
  55. return False
  56. return self._minor >= v._minor
  57. def version(
  58. major: int | str | Tuple[int, int] | None,
  59. minor: Optional[int] = None,
  60. ) -> Optional[Version]:
  61. if major is None:
  62. assert minor is None
  63. return None
  64. if isinstance(major, str):
  65. assert minor is None
  66. parts = major.split('.')
  67. assert len(parts) == 2
  68. return Version(int(parts[0]), int(parts[1]))
  69. elif isinstance(major, tuple):
  70. assert minor is None
  71. assert len(major) == 2
  72. major, minor = major
  73. assert minor is not None
  74. return Version(major, minor)
  75. # @dataclass(frozen=True)
  76. class Tag:
  77. # handle: str
  78. # prefix: str
  79. def __init__(self, handle: str, prefix: str) -> None:
  80. self._handle = handle
  81. self._prefix = prefix
  82. @property
  83. def handle(self) -> str:
  84. return self._handle
  85. @property
  86. def prefix(self) -> str:
  87. return self._prefix
  88. # @dataclass
  89. class DocInfo:
  90. """
  91. Store document information, can be used for analysis of a loaded YAML document
  92. requested_version: if explicitly set before load
  93. doc_version: from %YAML directive
  94. tags: from %TAG directives in scanned order
  95. """
  96. # requested_version: Optional[Version] = None
  97. # doc_version: Optional[Version] = None
  98. # tags: list[Tag] = field(default_factory=list)
  99. def __init__(
  100. self,
  101. requested_version: Optional[Version] = None,
  102. doc_version: Optional[Version] = None,
  103. tags: Optional[list[Tag]] = None,
  104. ):
  105. self.requested_version = requested_version
  106. self.doc_version = doc_version
  107. self.tags = [] if tags is None else tags