Skip to content

Instantly share code, notes, and snippets.

@remram44
Created April 7, 2020 21:58
Show Gist options
  • Save remram44/bf0f9354f9193bb0c28bef22ed73aa73 to your computer and use it in GitHub Desktop.
Save remram44/bf0f9354f9193bb0c28bef22ed73aa73 to your computer and use it in GitHub Desktop.
PyYAML patch to discard values
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