1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
from __future__ import annotations
import sys
if False: # MYPY
from typing import Dict, Any, Text, Optional # NOQA
from ruyaml.tag import Tag
class Node:
__slots__ = 'ctag', 'value', 'start_mark', 'end_mark', 'comment', 'anchor'
def __init__(
self,
tag: Any,
value: Any,
start_mark: Any,
end_mark: Any,
comment: Any = None,
anchor: Any = None,
) -> None:
# you can still get a string from the serializer
self.ctag = tag if isinstance(tag, Tag) else Tag(suffix=tag)
self.value = value
self.start_mark = start_mark
self.end_mark = end_mark
self.comment = comment
self.anchor = anchor
@property
def tag(self) -> Optional[str]:
return None if self.ctag is None else str(self.ctag)
@tag.setter
def tag(self, val: Any) -> None:
if isinstance(val, str):
val = Tag(suffix=val)
self.ctag = val
def __repr__(self) -> Any:
value = self.value
# if isinstance(value, list):
# if len(value) == 0:
# value = '<empty>'
# elif len(value) == 1:
# value = '<1 item>'
# else:
# value = f'<{len(value)} items>'
# else:
# if len(value) > 75:
# value = repr(value[:70]+' ... ')
# else:
# value = repr(value)
value = repr(value)
if self.anchor is not None:
return f'{self.__class__.__name__!s}(tag={self.tag!r}, anchor={self.anchor!r}, value={value!s})' # NOQA
return f'{self.__class__.__name__!s}(tag={self.tag!r}, value={value!s})'
def dump(self, indent: int = 0) -> None:
xx = self.__class__.__name__
xi = ' ' * indent
if isinstance(self.value, str):
sys.stdout.write(f'{xi}{xx}(tag={self.tag!r}, value={self.value!r})\n')
if self.comment:
sys.stdout.write(f' {xi}comment: {self.comment})\n')
return
sys.stdout.write(f'{xi}{xx}(tag={self.tag!r})\n')
if self.comment:
sys.stdout.write(f' {xi}comment: {self.comment})\n')
for v in self.value:
if isinstance(v, tuple):
for v1 in v:
v1.dump(indent + 1)
elif isinstance(v, Node):
v.dump(indent + 1)
else:
sys.stdout.write(f'Node value type? {type(v)}\n')
class ScalarNode(Node):
"""
styles:
? -> set() ? key, no value
- -> suppressable null value in set
" -> double quoted
' -> single quoted
| -> literal style
> -> folding style
"""
__slots__ = ('style',)
id = 'scalar'
def __init__(
self,
tag: Any,
value: Any,
start_mark: Any = None,
end_mark: Any = None,
style: Any = None,
comment: Any = None,
anchor: Any = None,
) -> None:
Node.__init__(
self, tag, value, start_mark, end_mark, comment=comment, anchor=anchor
)
self.style = style
class CollectionNode(Node):
__slots__ = ('flow_style',)
def __init__(
self,
tag: Any,
value: Any,
start_mark: Any = None,
end_mark: Any = None,
flow_style: Any = None,
comment: Any = None,
anchor: Any = None,
) -> None:
Node.__init__(self, tag, value, start_mark, end_mark, comment=comment)
self.flow_style = flow_style
self.anchor = anchor
class SequenceNode(CollectionNode):
__slots__ = ()
id = 'sequence'
class MappingNode(CollectionNode):
__slots__ = ('merge',)
id = 'mapping'
def __init__(
self,
tag: Any,
value: Any,
start_mark: Any = None,
end_mark: Any = None,
flow_style: Any = None,
comment: Any = None,
anchor: Any = None,
) -> None:
CollectionNode.__init__(
self,
tag,
value,
start_mark,
end_mark,
flow_style,
comment,
anchor,
)
self.merge = None
|