cyaml.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. from __future__ import annotations
  2. if False: # MYPY
  3. from typing import Any, Optional
  4. from ruamel.yaml.compat import StreamTextType, StreamType, VersionType # NOQA
  5. __yaml_lib: Optional[str] = None
  6. try:
  7. from _ruamel_yaml import CParser, CEmitter # type: ignore
  8. __yaml_lib = 'clib'
  9. except ModuleNotFoundError:
  10. from _ruamel_yaml_clibz import CParser, CEmitter # type: ignore
  11. __yaml_lib = 'clibz'
  12. from ruamel.yaml.constructor import Constructor, BaseConstructor, SafeConstructor # NOQA
  13. from ruamel.yaml.representer import Representer, SafeRepresenter, BaseRepresenter # NOQA
  14. from ruamel.yaml.resolver import Resolver, BaseResolver # NOQA
  15. __all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', 'CBaseDumper', 'CSafeDumper', 'CDumper',
  16. '__yaml_lib']
  17. # this includes some hacks to solve the usage of resolver by lower level
  18. # parts of the parser
  19. class CBaseLoader(CParser, BaseConstructor, BaseResolver): # type: ignore
  20. def __init__(
  21. self,
  22. stream: StreamTextType,
  23. version: Optional[VersionType] = None,
  24. preserve_quotes: Optional[bool] = None,
  25. ) -> None:
  26. CParser.__init__(self, stream)
  27. self._parser = self._composer = self
  28. BaseConstructor.__init__(self, loader=self)
  29. BaseResolver.__init__(self, loadumper=self)
  30. # self.descend_resolver = self._resolver.descend_resolver
  31. # self.ascend_resolver = self._resolver.ascend_resolver
  32. # self.resolve = self._resolver.resolve
  33. class CSafeLoader(CParser, SafeConstructor, Resolver): # type: ignore
  34. def __init__(
  35. self,
  36. stream: StreamTextType,
  37. version: Optional[VersionType] = None,
  38. preserve_quotes: Optional[bool] = None,
  39. ) -> None:
  40. CParser.__init__(self, stream)
  41. self._parser = self._composer = self
  42. SafeConstructor.__init__(self, loader=self)
  43. Resolver.__init__(self, loadumper=self)
  44. # self.descend_resolver = self._resolver.descend_resolver
  45. # self.ascend_resolver = self._resolver.ascend_resolver
  46. # self.resolve = self._resolver.resolve
  47. class CLoader(CParser, Constructor, Resolver): # type: ignore
  48. def __init__(
  49. self,
  50. stream: StreamTextType,
  51. version: Optional[VersionType] = None,
  52. preserve_quotes: Optional[bool] = None,
  53. ) -> None:
  54. CParser.__init__(self, stream)
  55. self._parser = self._composer = self
  56. Constructor.__init__(self, loader=self)
  57. Resolver.__init__(self, loadumper=self)
  58. # self.descend_resolver = self._resolver.descend_resolver
  59. # self.ascend_resolver = self._resolver.ascend_resolver
  60. # self.resolve = self._resolver.resolve
  61. class CBaseDumper(CEmitter, BaseRepresenter, BaseResolver): # type: ignore
  62. def __init__(
  63. self: StreamType,
  64. stream: Any,
  65. default_style: Any = None,
  66. default_flow_style: Any = None,
  67. canonical: Optional[bool] = None,
  68. indent: Optional[int] = None,
  69. width: Optional[int] = None,
  70. allow_unicode: Optional[bool] = None,
  71. line_break: Any = None,
  72. encoding: Any = None,
  73. explicit_start: Optional[bool] = None,
  74. explicit_end: Optional[bool] = None,
  75. version: Any = None,
  76. tags: Any = None,
  77. block_seq_indent: Any = None,
  78. top_level_colon_align: Any = None,
  79. prefix_colon: Any = None,
  80. ) -> None:
  81. # NOQA
  82. CEmitter.__init__(
  83. self,
  84. stream,
  85. canonical=canonical,
  86. indent=indent,
  87. width=width,
  88. encoding=encoding,
  89. allow_unicode=allow_unicode,
  90. line_break=line_break,
  91. explicit_start=explicit_start,
  92. explicit_end=explicit_end,
  93. version=version,
  94. tags=tags,
  95. )
  96. self._emitter = self._serializer = self._representer = self
  97. BaseRepresenter.__init__(
  98. self,
  99. default_style=default_style,
  100. default_flow_style=default_flow_style,
  101. dumper=self,
  102. )
  103. BaseResolver.__init__(self, loadumper=self)
  104. class CSafeDumper(CEmitter, SafeRepresenter, Resolver): # type: ignore
  105. def __init__(
  106. self: StreamType,
  107. stream: Any,
  108. default_style: Any = None,
  109. default_flow_style: Any = None,
  110. canonical: Optional[bool] = None,
  111. indent: Optional[int] = None,
  112. width: Optional[int] = None,
  113. allow_unicode: Optional[bool] = None,
  114. line_break: Any = None,
  115. encoding: Any = None,
  116. explicit_start: Optional[bool] = None,
  117. explicit_end: Optional[bool] = None,
  118. version: Any = None,
  119. tags: Any = None,
  120. block_seq_indent: Any = None,
  121. top_level_colon_align: Any = None,
  122. prefix_colon: Any = None,
  123. ) -> None:
  124. # NOQA
  125. self._emitter = self._serializer = self._representer = self
  126. CEmitter.__init__(
  127. self,
  128. stream,
  129. canonical=canonical,
  130. indent=indent,
  131. width=width,
  132. encoding=encoding,
  133. allow_unicode=allow_unicode,
  134. line_break=line_break,
  135. explicit_start=explicit_start,
  136. explicit_end=explicit_end,
  137. version=version,
  138. tags=tags,
  139. )
  140. self._emitter = self._serializer = self._representer = self
  141. SafeRepresenter.__init__(
  142. self, default_style=default_style, default_flow_style=default_flow_style,
  143. )
  144. Resolver.__init__(self)
  145. class CDumper(CEmitter, Representer, Resolver): # type: ignore
  146. def __init__(
  147. self: StreamType,
  148. stream: Any,
  149. default_style: Any = None,
  150. default_flow_style: Any = None,
  151. canonical: Optional[bool] = None,
  152. indent: Optional[int] = None,
  153. width: Optional[int] = None,
  154. allow_unicode: Optional[bool] = None,
  155. line_break: Any = None,
  156. encoding: Any = None,
  157. explicit_start: Optional[bool] = None,
  158. explicit_end: Optional[bool] = None,
  159. version: Any = None,
  160. tags: Any = None,
  161. block_seq_indent: Any = None,
  162. top_level_colon_align: Any = None,
  163. prefix_colon: Any = None,
  164. ) -> None:
  165. # NOQA
  166. CEmitter.__init__(
  167. self,
  168. stream,
  169. canonical=canonical,
  170. indent=indent,
  171. width=width,
  172. encoding=encoding,
  173. allow_unicode=allow_unicode,
  174. line_break=line_break,
  175. explicit_start=explicit_start,
  176. explicit_end=explicit_end,
  177. version=version,
  178. tags=tags,
  179. )
  180. self._emitter = self._serializer = self._representer = self
  181. Representer.__init__(
  182. self, default_style=default_style, default_flow_style=default_flow_style,
  183. )
  184. Resolver.__init__(self)