summaryrefslogtreecommitdiffstats
path: root/nodes.py
diff options
context:
space:
mode:
Diffstat (limited to 'nodes.py')
-rw-r--r--nodes.py145
1 files changed, 145 insertions, 0 deletions
diff --git a/nodes.py b/nodes.py
new file mode 100644
index 0000000..1721049
--- /dev/null
+++ b/nodes.py
@@ -0,0 +1,145 @@
+# coding: utf-8
+
+import sys
+
+from typing import Dict, Any, Text, Optional # NOQA
+from ruamel.yaml.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)
+ 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