summaryrefslogtreecommitdiffstats
path: root/events.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 00:30:09 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 00:30:09 +0000
commit4dd6e896edac1096089a9cd54296266436ffec03 (patch)
treea3da8663c704704177ad944ae5a680c302f29f55 /events.py
parentInitial commit. (diff)
downloadruamel.yaml-4dd6e896edac1096089a9cd54296266436ffec03.tar.xz
ruamel.yaml-4dd6e896edac1096089a9cd54296266436ffec03.zip
Adding upstream version 0.18.5.upstream/0.18.5
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'events.py')
-rw-r--r--events.py264
1 files changed, 264 insertions, 0 deletions
diff --git a/events.py b/events.py
new file mode 100644
index 0000000..a570a0d
--- /dev/null
+++ b/events.py
@@ -0,0 +1,264 @@
+# coding: utf-8
+
+# Abstract classes.
+
+from typing import Any, Dict, Optional, List # NOQA
+from ruamel.yaml.tag import Tag
+
+SHOW_LINES = False
+
+
+def CommentCheck() -> None:
+ pass
+
+
+class Event:
+ __slots__ = 'start_mark', 'end_mark', 'comment'
+ crepr = 'Unspecified Event'
+
+ def __init__(
+ self, start_mark: Any = None, end_mark: Any = None, comment: Any = CommentCheck,
+ ) -> None:
+ self.start_mark = start_mark
+ self.end_mark = end_mark
+ # assert comment is not CommentCheck
+ if comment is CommentCheck:
+ comment = None
+ self.comment = comment
+
+ def __repr__(self) -> Any:
+ if True:
+ arguments = []
+ if hasattr(self, 'value'):
+ # if you use repr(getattr(self, 'value')) then flake8 complains about
+ # abuse of getattr with a constant. When you change to self.value
+ # then mypy throws an error
+ arguments.append(repr(self.value))
+ for key in ['anchor', 'tag', 'implicit', 'flow_style', 'style']:
+ v = getattr(self, key, None)
+ if v is not None:
+ arguments.append(f'{key!s}={v!r}')
+ if self.comment not in [None, CommentCheck]:
+ arguments.append(f'comment={self.comment!r}')
+ if SHOW_LINES:
+ arguments.append(
+ f'({self.start_mark.line}:{self.start_mark.column}/'
+ f'{self.end_mark.line}:{self.end_mark.column})',
+ )
+ arguments = ', '.join(arguments) # type: ignore
+ else:
+ attributes = [
+ key
+ for key in ['anchor', 'tag', 'implicit', 'value', 'flow_style', 'style']
+ if hasattr(self, key)
+ ]
+ arguments = ', '.join([f'{key!s}={getattr(self, key)!r}' for key in attributes])
+ if self.comment not in [None, CommentCheck]:
+ arguments += f', comment={self.comment!r}'
+ return f'{self.__class__.__name__!s}({arguments!s})'
+
+ def compact_repr(self) -> str:
+ return f'{self.crepr}'
+
+
+class NodeEvent(Event):
+ __slots__ = ('anchor',)
+
+ def __init__(
+ self, anchor: Any, start_mark: Any = None, end_mark: Any = None, comment: Any = None,
+ ) -> None:
+ Event.__init__(self, start_mark, end_mark, comment)
+ self.anchor = anchor
+
+
+class CollectionStartEvent(NodeEvent):
+ __slots__ = 'ctag', 'implicit', 'flow_style', 'nr_items'
+
+ def __init__(
+ self,
+ anchor: Any,
+ tag: Any,
+ implicit: Any,
+ start_mark: Any = None,
+ end_mark: Any = None,
+ flow_style: Any = None,
+ comment: Any = None,
+ nr_items: Optional[int] = None,
+ ) -> None:
+ NodeEvent.__init__(self, anchor, start_mark, end_mark, comment)
+ self.ctag = tag
+ self.implicit = implicit
+ self.flow_style = flow_style
+ self.nr_items = nr_items
+
+ @property
+ def tag(self) -> Optional[str]:
+ return None if self.ctag is None else str(self.ctag)
+
+
+class CollectionEndEvent(Event):
+ __slots__ = ()
+
+
+# Implementations.
+
+
+class StreamStartEvent(Event):
+ __slots__ = ('encoding',)
+ crepr = '+STR'
+
+ def __init__(
+ self,
+ start_mark: Any = None,
+ end_mark: Any = None,
+ encoding: Any = None,
+ comment: Any = None,
+ ) -> None:
+ Event.__init__(self, start_mark, end_mark, comment)
+ self.encoding = encoding
+
+
+class StreamEndEvent(Event):
+ __slots__ = ()
+ crepr = '-STR'
+
+
+class DocumentStartEvent(Event):
+ __slots__ = 'explicit', 'version', 'tags'
+ crepr = '+DOC'
+
+ def __init__(
+ self,
+ start_mark: Any = None,
+ end_mark: Any = None,
+ explicit: Any = None,
+ version: Any = None,
+ tags: Any = None,
+ comment: Any = None,
+ ) -> None:
+ Event.__init__(self, start_mark, end_mark, comment)
+ self.explicit = explicit
+ self.version = version
+ self.tags = tags
+
+ def compact_repr(self) -> str:
+ start = ' ---' if self.explicit else ''
+ return f'{self.crepr}{start}'
+
+
+class DocumentEndEvent(Event):
+ __slots__ = ('explicit',)
+ crepr = '-DOC'
+
+ def __init__(
+ self,
+ start_mark: Any = None,
+ end_mark: Any = None,
+ explicit: Any = None,
+ comment: Any = None,
+ ) -> None:
+ Event.__init__(self, start_mark, end_mark, comment)
+ self.explicit = explicit
+
+ def compact_repr(self) -> str:
+ end = ' ...' if self.explicit else ''
+ return f'{self.crepr}{end}'
+
+
+class AliasEvent(NodeEvent):
+ __slots__ = 'style'
+ crepr = '=ALI'
+
+ def __init__(
+ self,
+ anchor: Any,
+ start_mark: Any = None,
+ end_mark: Any = None,
+ style: Any = None,
+ comment: Any = None,
+ ) -> None:
+ NodeEvent.__init__(self, anchor, start_mark, end_mark, comment)
+ self.style = style
+
+ def compact_repr(self) -> str:
+ return f'{self.crepr} *{self.anchor}'
+
+
+class ScalarEvent(NodeEvent):
+ __slots__ = 'ctag', 'implicit', 'value', 'style'
+ crepr = '=VAL'
+
+ def __init__(
+ self,
+ anchor: Any,
+ tag: Any,
+ implicit: Any,
+ value: Any,
+ start_mark: Any = None,
+ end_mark: Any = None,
+ style: Any = None,
+ comment: Any = None,
+ ) -> None:
+ NodeEvent.__init__(self, anchor, start_mark, end_mark, comment)
+ self.ctag = tag
+ self.implicit = implicit
+ self.value = value
+ self.style = style
+
+ @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 compact_repr(self) -> str:
+ style = ':' if self.style is None else self.style
+ anchor = f'&{self.anchor} ' if self.anchor else ''
+ tag = f'<{self.tag!s}> ' if self.tag else ''
+ value = self.value
+ for ch, rep in [
+ ('\\', '\\\\'),
+ ('\t', '\\t'),
+ ('\n', '\\n'),
+ ('\a', ''), # remove from folded
+ ('\r', '\\r'),
+ ('\b', '\\b'),
+ ]:
+ value = value.replace(ch, rep)
+ return f'{self.crepr} {anchor}{tag}{style}{value}'
+
+
+class SequenceStartEvent(CollectionStartEvent):
+ __slots__ = ()
+ crepr = '+SEQ'
+
+ def compact_repr(self) -> str:
+ flow = ' []' if self.flow_style else ''
+ anchor = f' &{self.anchor}' if self.anchor else ''
+ tag = f' <{self.tag!s}>' if self.tag else ''
+ return f'{self.crepr}{flow}{anchor}{tag}'
+
+
+class SequenceEndEvent(CollectionEndEvent):
+ __slots__ = ()
+ crepr = '-SEQ'
+
+
+class MappingStartEvent(CollectionStartEvent):
+ __slots__ = ()
+ crepr = '+MAP'
+
+ def compact_repr(self) -> str:
+ flow = ' {}' if self.flow_style else ''
+ anchor = f' &{self.anchor}' if self.anchor else ''
+ tag = f' <{self.tag!s}>' if self.tag else ''
+ return f'{self.crepr}{flow}{anchor}{tag}'
+
+
+class MappingEndEvent(CollectionEndEvent):
+ __slots__ = ()
+ crepr = '-MAP'