codekingpro/portable-devtools
114k
1 2from __future__ import annotations3 4"""5DocInfo6 7Although it was possible to read tag directives before this, all handle/prefix8pairs for all documents in all streams were stored in one dictionary per9YAML instance, making it impossible to distinguish where such a pair came10from without sublassing the scanner.11 12ToDo:13DocInfo can be used by a yaml dumper to dump a class14- if connected to the root of a data structure15- if provided to the dumper?16"""17 18if False: # MYPY19 from typing import Optional, Tuple, Any20 21# from dataclasses import dataclass, field, MISSING # NOQA22 23 24# @dataclass(order=True, frozen=True)25class Version:26 # major: int27 # minor: int28 def __init__(self, major: int, minor: int) -> None:29 self._major = major30 self._minor = minor31 32 @property33 def major(self) -> int:34 return self._major35 36 @property37 def minor(self) -> int:38 return self._minor39 40 def __eq__(self, v: Any) -> bool:41 if not isinstance(v, Version):42 return False43 return self._major == v._major and self._minor == v._minor44 45 def __lt__(self, v: Version) -> bool:46 if self._major < v._major:47 return True48 if self._major > v._major:49 return False50 return self._minor < v._minor51 52 def __le__(self, v: Version) -> bool:53 if self._major < v._major:54 return True55 if self._major > v._major:56 return False57 return self._minor <= v._minor58 59 def __gt__(self, v: Version) -> bool:60 if self._major > v._major:61 return True62 if self._major < v._major:63 return False64 return self._minor > v._minor65 66 def __ge__(self, v: Version) -> bool:67 if self._major > v._major:68 return True69 if self._major < v._major:70 return False71 return self._minor >= v._minor72 73 74def version(75 major: int | str | Tuple[int, int] | None,76 minor: Optional[int] = None,77) -> Optional[Version]:78 if major is None:79 assert minor is None80 return None81 if isinstance(major, str):82 assert minor is None83 parts = major.split('.')84 assert len(parts) == 285 return Version(int(parts[0]), int(parts[1]))86 elif isinstance(major, tuple):87 assert minor is None88 assert len(major) == 289 major, minor = major90 assert minor is not None91 return Version(major, minor)92 93 94# @dataclass(frozen=True)95class Tag:96 # handle: str97 # prefix: str98 def __init__(self, handle: str, prefix: str) -> None:99 self._handle = handle100 self._prefix = prefix101 102 @property103 def handle(self) -> str:104 return self._handle105 106 @property107 def prefix(self) -> str:108 return self._prefix109 110 111# @dataclass112class DocInfo:113 """114 Store document information, can be used for analysis of a loaded YAML document115 requested_version: if explicitly set before load116 doc_version: from %YAML directive117 tags: from %TAG directives in scanned order118 """119 # requested_version: Optional[Version] = None120 # doc_version: Optional[Version] = None121 # tags: list[Tag] = field(default_factory=list)122 def __init__(123 self,124 requested_version: Optional[Version] = None,125 doc_version: Optional[Version] = None,126 tags: Optional[list[Tag]] = None,127 ):128 self.requested_version = requested_version129 self.doc_version = doc_version130 self.tags = [] if tags is None else tags131 