Created
April 7, 2020 21:58
-
-
Save remram44/bf0f9354f9193bb0c28bef22ed73aa73 to your computer and use it in GitHub Desktop.
PyYAML patch to discard values
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/ext/_yaml.pyx b/ext/_yaml.pyx | |
index ff4efe8..876a6c6 100644 | |
--- a/ext/_yaml.pyx | |
+++ b/ext/_yaml.pyx | |
@@ -258,8 +258,11 @@ cdef class CParser: | |
cdef int stream_cache_len | |
cdef int stream_cache_pos | |
cdef int unicode_source | |
+ cdef object filter | |
+ cdef object path | |
+ cdef int discarding | |
- def __init__(self, stream): | |
+ def __init__(self, stream, filter): | |
cdef is_readable | |
if yaml_parser_initialize(&self.parser) == 0: | |
raise MemoryError | |
@@ -306,6 +309,9 @@ cdef class CParser: | |
self.current_token = None | |
self.current_event = None | |
self.anchors = {} | |
+ self.filter = filter | |
+ self.path = [] | |
+ self.discarding = 0 | |
def __dealloc__(self): | |
yaml_parser_delete(&self.parser) | |
@@ -848,7 +854,10 @@ cdef class CParser: | |
index = 0 | |
self._parse_next_event() | |
while self.parsed_event.type != YAML_SEQUENCE_END_EVENT: | |
- value.append(self._compose_node(node, index)) | |
+ if self.discarding: | |
+ self._compose_node(node, index) | |
+ else: | |
+ value.append(self._compose_node(node, index)) | |
index = index+1 | |
self._parse_next_event() | |
node.end_mark = Mark(self.stream_name, | |
@@ -887,8 +896,18 @@ cdef class CParser: | |
self._parse_next_event() | |
while self.parsed_event.type != YAML_MAPPING_END_EVENT: | |
item_key = self._compose_node(node, None) | |
- item_value = self._compose_node(node, item_key) | |
- value.append((item_key, item_value)) | |
+ if self.discarding: | |
+ self._compose_node(node, item_key) | |
+ else: | |
+ self.path.append(item_key.value) | |
+ if self.filter(self.path): | |
+ item_value = self._compose_node(node, item_key) | |
+ value.append((item_key, item_value)) | |
+ else: | |
+ self.discarding = 1 | |
+ self._compose_node(node, item_key) | |
+ self.discarding = 0 | |
+ self.path.pop(-1) | |
self._parse_next_event() | |
node.end_mark = Mark(self.stream_name, | |
self.parsed_event.end_mark.index, | |
diff --git a/lib3/yaml/cyaml.py b/lib3/yaml/cyaml.py | |
index 1e606c7..97328d4 100644 | |
--- a/lib3/yaml/cyaml.py | |
+++ b/lib3/yaml/cyaml.py | |
@@ -22,8 +22,8 @@ class CBaseLoader(CParser, BaseConstructor, BaseResolver): | |
class CSafeLoader(CParser, SafeConstructor, Resolver): | |
- def __init__(self, stream): | |
- CParser.__init__(self, stream) | |
+ def __init__(self, stream, filter=lambda _: True): | |
+ CParser.__init__(self, stream, filter) | |
SafeConstructor.__init__(self) | |
Resolver.__init__(self) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment