Skip to content

REQ: Support ruamel.yaml's RoundTripLoader/Dumper for retaining comments #184

Open
@philipsd6

Description

@philipsd6

Now that the default YAML library is ruamel.yaml, and its notable feature is round trip comment preservation, my expectation is that this should work:

In [1]: from box import Box      
In [2]: yaml_doc = """--- 
   ...: # This is my YAML doc 
   ...: zlast: 1   # This is a line comment on zlast 
   ...: afirst: 2  # This should be shown second, not first!"""    
In [3]: mybox = Box.from_yaml(yaml_doc)                            
In [4]: print(mybox.to_yaml())   
afirst: 2
zlast: 1

Unordered, and no comments! However ruamel.yaml has RoundTripLoader and RoundTripDumper available!

In [8]: import ruamel.yaml as yaml                                 
In [9]: data = yaml.load(yaml_doc, Loader=yaml.RoundTripLoader)         
In [10]: print(yaml.dump(data, Dumper=yaml.RoundTripDumper))            
# This is my YAML doc
zlast: 1   # This is a line comment on zlast
afirst: 2  # This should be shown second, not first!

But using them with Box only helps resolve the creation order issue -- the comments are gone:

In [11]: mybox = Box.from_yaml(yaml_doc, Loader=yaml.RoundTripLoader)    
In [11]: print(mybox.to_yaml(Dumper=yaml.RoundTripDumper))               
zlast: 1
afirst: 2

Naturally -- as the incoming data is unrolled into a Box in the constructor:

Box/box/box.py

Line 223 in 4a50512

for k, v in kwargs.items():

I'm not sure if there's reasonable way for Box to coexist with the ruamel.yaml.CommentedMap, but it would be VERY convenient to work with my YAML files in box dot notation, while leaving the human readable comments intact.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions