Skip to main content

ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order

Project description

ruamel.yaml

Starting with 0.10.7 the package has been reorganised and the command line utility is in its own package ruamel.yaml.cmd (so installing ruamel.yaml doesn’t pull in possibly irrelevant modules only used in the command line utility)

ruamel.yaml is a YAML package for Python. It is a derivative of Kirill Simonov’s PyYAML 3.11 which supports YAML1.1

Major differences with PyYAML 3.11:

  • integrated Python 2 and 3 sources, running on Python 2.6, 2.7 (CPython, PyPy), 3.3 and 3.4.

  • round trip mode that includes comments (block mode, key ordering kept)

  • support for simple lists as mapping keys by transforming these to tuples

  • !!omap generates ordereddict (C) on Python 2, collections.OrderedDict on Python 3, and !!omap is generated for these types.

  • some YAML 1.2 enhancements (0o octal prefix, \/ escape)

  • pep8 compliance

  • tox and py.test based testing

  • Tests whether the C yaml library is installed as well as the header files. That library doesn’t generate CommentTokens, so it cannot be used to do round trip editing on comments. It can be used to speed up normal processing (so you don’t need to install ruamel.yaml and PyYaml). See the section Optional requirements.

  • Basic support for multiline strings with preserved newlines and chomping ( ‘|’, ‘|+’, ‘|-’ ). As this subclasses the string type the information is lost on reassignment. (This might be changed in the future so that the preservation/folding/chomping is part of the parent container, like comments).

  • RoundTrip preservation of flow style sequences ( ‘a: b, c, d’) (based on request and test by Anthony Sottile)

  • anchors names that are hand-crafted (not of the form``idNNN``) are preserved

  • merges in dictionaries are preserved

  • adding/replacing comments on block-style sequences and mappings with smart column positioning

  • collection objects (when read in via RoundTripParser) have an lc property that contains line and column info lc.line and lc.col. Individual positions for mappings and sequences can also be retrieved (lc.key('a'), lc.value('a') resp. lc.item(3))

  • preservation of whitelines after block scalars. Contributed by Sam Thursfield.

Round trip including comments

The major motivation for this fork is the round-trip capability for comments. The integration of the sources was just an initial step to make this easier.

adding/replacing comments

Starting with version 0.8, you can add/replace comments on block style collections (mappings/sequences resuting in Python dict/list). The basic for for this is:

from __future__ import print_function

import ruamel.yaml

inp = """\
abc:
  - a     # comment 1
xyz:
  a: 1    # comment 2
  b: 2
  c: 3
  d: 4
  e: 5
  f: 6 # comment 3
"""

data = ruamel.yaml.load(inp, ruamel.yaml.RoundTripLoader)
data['abc'].append('b')
data['abc'].yaml_add_eol_comment('comment 4', 1)  # takes column of comment 1
data['xyz'].yaml_add_eol_comment('comment 5', 'c')  # takes column of comment 2
data['xyz'].yaml_add_eol_comment('comment 6', 'e')  # takes column of comment 3
data['xyz'].yaml_add_eol_comment('comment 7', 'd', column=20)

print(ruamel.yaml.dump(data, Dumper=ruamel.yaml.RoundTripDumper), end='')

Resulting in:

abc:
- a       # comment 1
- b       # comment 4
xyz:
  a: 1    # comment 2
  b: 2
  c: 3    # comment 5
  d: 4              # comment 7
  e: 5 # comment 6
  f: 6 # comment 3

If the comment doesn’t start with ‘#’, this will be added. The key is the element index for list, the actual key for dictionaries. As can be seen from the example, the column to choose for a comment is derived from the previous, next or preceding comment column (picking the first one found).

Config file formats

There are only a few configuration file formats that are easily readable and editable: JSON, INI/ConfigParser, YAML (XML is to cluttered to be called easily readable).

Unfortunately JSON doesn’t support comments, and although there are some solutions with pre-processed filtering of comments, there are no libraries that support round trip updating of such commented files.

INI files support comments, and the excellent ConfigObj library by Foord and Larosa even supports round trip editing with comment preservation, nesting of sections and limited lists (within a value). Retrieval of particular value format is explicit (and extensible).

YAML has basic mapping and sequence structures as well as support for ordered mappings and sets. It supports scalars various types including dates and datetimes (missing in JSON). YAML has comments, but these are normally thrown away.

Block structured YAML is a clean and very human readable format. By extending the Python YAML parser to support round trip preservation of comments, it makes YAML a very good choice for configuration files that are human readable and editable while at the same time interpretable and modifiable by a program.

Extending

There are normally six files involved when extending the roundtrip capabilities: the reader, parser, composer and constructor to go from YAML to Python and the resolver, representer, serializer and emitter to go the other way.

Extending involves keeping extra data around for the next process step, eventuallly resulting in a different Python object (subclass or alternative), that should behave like the original, but on the way from Python to YAML generates the original (or at least something much closer).

Smartening

When you use round-tripping, then the complex data you get are already subclasses of the built-in types. So you can patch in extra methods or override existing ones. Some methods are already included and you can do:

yaml_str = """\
a:
- b:
  c: 42
- d:
    f: 196
  e:
    g: 3.14
"""


data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)

assert data.mlget(['a', 1, 'd', 'f'], list_ok=True) == 196

Examples

Basic round trip of parsing YAML to Python objects, modifying and generating YAML:

from __future__ import print_function

import ruamel.yaml

inp = """\
# example
name:
  # details
  family: Smith   # very common
  given: Alice    # one of the siblings
"""

code = ruamel.yaml.load(inp, ruamel.yaml.RoundTripLoader)
code['name']['given'] = 'Bob'

print(ruamel.yaml.dump(code, Dumper=ruamel.yaml.RoundTripDumper), end='')

Resulting in

# example
name:
  # details
  family: Smith   # very common
  given: Bob      # one of the siblings

YAML handcrafted anchors and references as well as key merging is preserved. The merged keys can transparently be accessed using [] and .get():

import ruamel.yaml

inp = """\
- &CENTER {x: 1, y: 2}
- &LEFT {x: 0, y: 2}
- &BIG {r: 10}
- &SMALL {r: 1}
# All the following maps are equal:
# Explicit keys
- x: 1
  y: 2
  r: 10
  label: center/big
# Merge one map
- <<: *CENTER
  r: 10
  label: center/big
# Merge multiple maps
- <<: [*CENTER, *BIG]
  label: center/big
# Override
- <<: [*BIG, *LEFT, *SMALL]
  x: 1
  label: center/big
"""

data = ruamel.yaml.load(inp, ruamel.yaml.RoundTripLoader)
assert data[7]['y'] == 2

Optional requirements

If you have the C yaml library and headers installed, as well as the header files for your Python executables then you can use the non-roundtrip but faster C loader and emitter.

On Debian systems you should use:

sudo apt-get install libyaml-dev python-dev python3-dev

you can leave out python3-dev if you don’t use python3

For CentOS (7) based systems you should do:

sudo yum install libyaml-devel python-devel

Testing

Testing is done using tox, which uses virtualenv and pytest.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ruamel.yaml-0.10.19.tar.gz (228.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ruamel.yaml-0.10.19-cp35-none-win_amd64.whl (71.1 kB view details)

Uploaded CPython 3.5Windows x86-64

ruamel.yaml-0.10.19-cp35-none-win32.whl (71.1 kB view details)

Uploaded CPython 3.5Windows x86

ruamel.yaml-0.10.19-cp34-none-win_amd64.whl (71.1 kB view details)

Uploaded CPython 3.4Windows x86-64

ruamel.yaml-0.10.19-cp34-none-win32.whl (71.1 kB view details)

Uploaded CPython 3.4Windows x86

ruamel.yaml-0.10.19-cp33-none-win_amd64.whl (71.1 kB view details)

Uploaded CPython 3.3Windows x86-64

ruamel.yaml-0.10.19-cp33-none-win32.whl (71.1 kB view details)

Uploaded CPython 3.3Windows x86

ruamel.yaml-0.10.19-cp27-none-win_amd64.whl (71.2 kB view details)

Uploaded CPython 2.7Windows x86-64

ruamel.yaml-0.10.19-cp27-none-win32.whl (130.8 kB view details)

Uploaded CPython 2.7Windows x86

ruamel.yaml-0.10.19-cp26-none-win_amd64.whl (71.2 kB view details)

Uploaded CPython 2.6Windows x86-64

ruamel.yaml-0.10.19-cp26-none-win32.whl (71.2 kB view details)

Uploaded CPython 2.6Windows x86

File details

Details for the file ruamel.yaml-0.10.19.tar.gz.

File metadata

  • Download URL: ruamel.yaml-0.10.19.tar.gz
  • Upload date:
  • Size: 228.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for ruamel.yaml-0.10.19.tar.gz
Algorithm Hash digest
SHA256 39a153bd1d143934be4e9cfaff4ef90c04dcaea5c97a68d2500d001f5617b9a5
MD5 e8e3a965c4b00e788eaeff5997078d39
BLAKE2b-256 85585b97edfff117d2ecba1a9ce95a139ee1186a334cc147d87ad70925af0bb1

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp35-none-win_amd64.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp35-none-win_amd64.whl
Algorithm Hash digest
SHA256 a7e919c0370549b0b1eaa5bc7d48f67d02fa6da8f13a44f2ea4fd6e66d5c8a70
MD5 3d6f862cec49c6f3b93148044a01df43
BLAKE2b-256 298436da6ff05ab33b3aecf13b351f03606783ade9abb125c5afb78a4acf368b

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp35-none-win32.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp35-none-win32.whl
Algorithm Hash digest
SHA256 918d958a59409571946a1b43969de423d3b3d091a9b190aa1205d1b8bf66086b
MD5 b66389ca18febf1f3a00b2afd54da389
BLAKE2b-256 11b710ecaec23b2965d5bd5284783a4237ed5403dbb2e1eb89eb976c110fccc1

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp34-none-win_amd64.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp34-none-win_amd64.whl
Algorithm Hash digest
SHA256 a40eea333c793b0e1ade187be73357ac813906eb4b1cfcc7770d3331a9596d02
MD5 d6b6356e8cb8b36536b48fd564072da1
BLAKE2b-256 b133272b778fad31412db91a42bb43c541bbb55a0dd976b46baee90f2664f0b7

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp34-none-win32.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp34-none-win32.whl
Algorithm Hash digest
SHA256 ec079d5971886748185530ddb2570abfd5a041d944146a393bd210d9fc68e38c
MD5 7ca3dffae6618d2aab3386f13ddd1653
BLAKE2b-256 8d014bd957dc041ceb4c23b77f194bf371cc23350fa814392cee85e58bbd390f

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp33-none-win_amd64.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp33-none-win_amd64.whl
Algorithm Hash digest
SHA256 539b87bfb75b7e5ea07c460d4652bc14a87dab6ab5e47510c324508fdfafecca
MD5 b1c4bab8dbf98d395e7fdb094d221997
BLAKE2b-256 58e88af0dc759e4856268fa340409e825a24c455a4f50d07a9d5bfba479b096a

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp33-none-win32.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp33-none-win32.whl
Algorithm Hash digest
SHA256 8f450ff38ea49127236b211b653f6048ac3c52b8c6215c631cc6241f30768d12
MD5 9c53424773a4bba48c74bdd183bc0707
BLAKE2b-256 e6cc10bd8551a1b723a1a9f75d26412798beb3bd309413b69e0464c25ca29fab

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp27-none-win_amd64.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp27-none-win_amd64.whl
Algorithm Hash digest
SHA256 241d714f4263a56bd63e68b863dfe9d3295a82ee0d48a5306b75d2edac466173
MD5 4e7c2433d039f85bc8e7dbb9e9ad4de9
BLAKE2b-256 45ad7df8f13f7b0820032f8b742c8e61292c8a50c0f74b803c90069b47b7dbd6

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp27-none-win32.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp27-none-win32.whl
Algorithm Hash digest
SHA256 6797583a2461ae7cc6bee07d6afb14fcec7d407c50a25d0948e2e1101ebd91b2
MD5 252a43841d265aa6d8d3f55238b636fd
BLAKE2b-256 d1c349d42af8a34a8e2b47afe75fd90f5aafc8ab33758a14faaa4a91dd555037

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp26-none-win_amd64.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp26-none-win_amd64.whl
Algorithm Hash digest
SHA256 e91d87c7b58b5ea4364f27055194f4ff18440958479b6b092cd4ca79d9ebfbf3
MD5 156853eed40af8c381f60578af97b0cd
BLAKE2b-256 692c1a32d8ec79ffa062f834cebfaa5bfc4d17eeff46d2abb7ba6a4dc9b928ab

See more details on using hashes here.

File details

Details for the file ruamel.yaml-0.10.19-cp26-none-win32.whl.

File metadata

File hashes

Hashes for ruamel.yaml-0.10.19-cp26-none-win32.whl
Algorithm Hash digest
SHA256 9a3374ddc556758bbbbd7bde64a5aa3b491e920fcd4ed185dcd56693e6270992
MD5 2078474c3421fe4eee91987f025ab538
BLAKE2b-256 37b42e8d94200400c1671e89df7787dd4764e2a369bcd9df2df4e2ff422dc255

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page