Bug in RoundTrip parser triggered by specific comments and indentation
ruamel.yaml is a YAML 1.2 parser/emitter for Python
Brought to you by:
anthon
I've encountered the following behavior, which I believe to be a bug. Since version 0.17.5, this YAML snippet cannot be parsed by the RoundTrip parser:
a:
b: # c1
- c # c2
It produces the following error:
Traceback (most recent call last):
File "./loadyaml.py", line 54, in <module>
test_bug()
File "./loadyaml.py", line 47, in test_bug
yaml.load(text_bug)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/main.py", line 434, in load
return constructor.get_single_data()
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/constructor.py", line 120, in get_single_data
node = self.composer.get_single_node()
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/composer.py", line 76, in get_single_node
document = self.compose_document()
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/composer.py", line 99, in compose_document
node = self.compose_node(None, None)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/composer.py", line 143, in compose_node
node = self.compose_mapping_node(anchor)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/composer.py", line 223, in compose_mapping_node
item_value = self.compose_node(node, item_key)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/composer.py", line 143, in compose_node
node = self.compose_mapping_node(anchor)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/composer.py", line 223, in compose_mapping_node
item_value = self.compose_node(node, item_key)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/composer.py", line 141, in compose_node
node = self.compose_sequence_node(anchor)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/composer.py", line 184, in compose_sequence_node
while not self.parser.check_event(SequenceEndEvent):
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/parser.py", line 146, in check_event
self.current_event = self.state()
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/parser.py", line 568, in parse_indentless_sequence_entry
return self.parse_block_node()
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/parser.py", line 343, in parse_block_node
return self.parse_node(block=True)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/parser.py", line 429, in parse_node
token = self.scanner.get_token()
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/scanner.py", line 1869, in get_token
self.tokens[0].add_post_comment(c)
File "/home/dbdbc/env/py37/lib/python3.7/site-packages/ruamel/yaml/tokens.py", line 69, in add_post_comment
assert len(self._comment) == 2 # make sure it is version 0
AssertionError
If I remove any of the comments, or indent the last line further to the right, the error disappears. I've attached a small test script with all 4 cases.
Thanks in advance for any comments or a fix!
Just an additional info: Running with
python -Oand skipping the assertion generates the same output in all four cases, pointing to the assertion being the problem.Thanks for reporting and the easy reproducibility.
This should be fixed in 0.17.10 (now on PyPI)
Thanks for the quick fix and release!