|
-
- from __future__ import annotations
-
- """
- DocInfo
-
- Although it was possible to read tag directives before this, all handle/prefix
- pairs for all documents in all streams were stored in one dictionary per
- YAML instance, making it impossible to distinguish where such a pair came
- from without sublassing the scanner.
-
- ToDo:
- DocInfo can be used by a yaml dumper to dump a class
- - if connected to the root of a data structure
- - if provided to the dumper?
- """
-
- if False: # MYPY
- from typing import Optional, Tuple, Any
-
- # from dataclasses import dataclass, field, MISSING # NOQA
-
-
- # @dataclass(order=True, frozen=True)
- class Version:
- # major: int
- # minor: int
- def __init__(self, major: int, minor: int) -> None:
- self._major = major
- self._minor = minor
-
- @property
- def major(self) -> int:
- return self._major
-
- @property
- def minor(self) -> int:
- return self._minor
-
- def __eq__(self, v: Any) -> bool:
- if not isinstance(v, Version):
- return False
- return self._major == v._major and self._minor == v._minor
-
- def __lt__(self, v: Version) -> bool:
- if self._major < v._major:
- return True
- if self._major > v._major:
- return False
- return self._minor < v._minor
-
- def __le__(self, v: Version) -> bool:
- if self._major < v._major:
- return True
- if self._major > v._major:
- return False
- return self._minor <= v._minor
-
- def __gt__(self, v: Version) -> bool:
- if self._major > v._major:
- return True
- if self._major < v._major:
- return False
- return self._minor > v._minor
-
- def __ge__(self, v: Version) -> bool:
- if self._major > v._major:
- return True
- if self._major < v._major:
- return False
- return self._minor >= v._minor
-
-
- def version(
- major: int | str | Tuple[int, int] | None,
- minor: Optional[int] = None,
- ) -> Optional[Version]:
- if major is None:
- assert minor is None
- return None
- if isinstance(major, str):
- assert minor is None
- parts = major.split('.')
- assert len(parts) == 2
- return Version(int(parts[0]), int(parts[1]))
- elif isinstance(major, tuple):
- assert minor is None
- assert len(major) == 2
- major, minor = major
- assert minor is not None
- return Version(major, minor)
-
-
- # @dataclass(frozen=True)
- class Tag:
- # handle: str
- # prefix: str
- def __init__(self, handle: str, prefix: str) -> None:
- self._handle = handle
- self._prefix = prefix
-
- @property
- def handle(self) -> str:
- return self._handle
-
- @property
- def prefix(self) -> str:
- return self._prefix
-
-
- # @dataclass
- class DocInfo:
- """
- Store document information, can be used for analysis of a loaded YAML document
- requested_version: if explicitly set before load
- doc_version: from %YAML directive
- tags: from %TAG directives in scanned order
- """
- # requested_version: Optional[Version] = None
- # doc_version: Optional[Version] = None
- # tags: list[Tag] = field(default_factory=list)
- def __init__(
- self,
- requested_version: Optional[Version] = None,
- doc_version: Optional[Version] = None,
- tags: Optional[list[Tag]] = None,
- ):
- self.requested_version = requested_version
- self.doc_version = doc_version
- self.tags = [] if tags is None else tags
|