pretty-yaml (or pyaml)
======================
PyYAML_-based python module to produce a bit more pretty and human-readable YAML-serialized data.
This module is for serialization only, see `ruamel.yaml`_ module for literate
YAML parsing (keeping track of comments, spacing, line/column numbers of values, etc).
(side-note: to dump stuff parsed by ruamel.yaml with this module, use only ``YAML(typ='safe')`` there)
It's a small module, and for projects that only need part of its functionality,
I'd recommend copy-pasting that in, instead of adding janky dependency.
.. _PyYAML: http://pyyaml.org/
.. _ruamel.yaml: https://bitbucket.org/ruamel/yaml/
.. contents::
:backlinks: none
Repository URLs:
- https://github.com/mk-fg/pretty-yaml
- https://codeberg.org/mk-fg/pretty-yaml
- https://fraggod.net/code/git/pretty-yaml
Warning
-------
Prime goal of this module is to produce human-readable output that can be
easily diff'ed, manipulated and re-used, but maybe with occasional issues.
So please do not rely on the thing to produce output that can always be
deserialized exactly to what was exported, at least - use PyYAML directly
for that (but maybe with options from the next section).
Output also isn't guaranteed to be stable between module versions,
as new representation tweaks get added occasionally, but these can usually
be disabled via module parameters, to get output stability over improvements.
What this module does and why
-----------------------------
YAML is generally nice and easy format to read *if* it was written by humans.
PyYAML can a do fairly decent job of making stuff readable, and the best
combination of parameters for such output that I've seen so far is probably this one::
>>> m = [123, 45.67, {1: None, 2: False}, 'some text']
>>> data = dict(a='asldnsa\nasldpáknsa\n', b='whatever text', ma=m, mb=m)
>>> yaml.safe_dump( data, sys.stdout,
width=100, allow_unicode=True, default_flow_style=False )
a: 'asldnsa
asldpáknsa
'
b: whatever text
ma: &id001
- 123
- 45.67
- 1: null
2: false
- some text
mb: *id001
pyaml (this module) tries to improve on that a bit, with the following tweaks:
* Most human-friendly representation options in PyYAML (that I know of)
are used as defaults - unicode, flow-style, width=100 (old default is 80).
* Dump "null" values as empty values, if possible, which have the same meaning
but reduce visual clutter and are easier to edit.
* Dicts, sets, OrderedDicts, defaultdicts, namedtuples, enums, dataclasses, etc
are represented as their safe YAML-compatible base (like int, list or mapping),
with mappings key-sorted by default for more diff-friendly output.
* Use shorter and simpler yes/no for booleans.
* List items get indented, as they should be.
* Attempt is made to pick more readable string representation styles, depending
on the value, e.g.::
>>> yaml.safe_dump(cert, sys.stdout)
cert: '-----BEGIN CERTIFICATE-----
MIIH3jCCBcagAwIBAgIJAJi7AjQ4Z87OMA0GCSqGSIb3DQEBCwUAMIHBMRcwFQYD
VQQKFA52YWxlcm9uLm5vX2lzcDEeMBwGA1UECxMVQ2VydGlmaWNhdGUgQXV0aG9y
...
>>> pyaml.p(cert):
cert: |
-----BEGIN CERTIFICATE-----
MIIH3jCCBcagAwIBAgIJAJi7AjQ4Z87OMA0GCSqGSIb3DQEBCwUAMIHBMRcwFQYD
VQQKFA52YWxlcm9uLm5vX2lzcDEeMBwGA1UECxMVQ2VydGlmaWNhdGUgQXV0aG9y
...
* "force_embed" option (default=yes) to avoid having &id stuff scattered all
over the output. Might be more useful to disable it in some specific cases though.
* "&idXYZ" anchors, when needed, get labels from the keys they get attached to,
not just meaningless enumerators, e.g. "&users_-_admin" instead.
* "string_val_style" option to only apply to strings that are values, not keys,
i.e::
>>> pyaml.p(data, string_val_style='"')
key: "value\nasldpáknsa\n"
>>> yaml.safe_dump(data, sys.stdout, allow_unicode=True, default_style='"')
"key": "value\nasldpáknsa\n"
* Add vertical spacing (empty lines) between keys on different depths,
to separate long YAML sections in the output visually, make it more seekable.
* Discard end-of-document "..." indicators for simple values.
Result for the (rather meaningless) example above::
>>> pyaml.p(data, force_embed=False, vspacing=dict(split_lines=10))
a: |
asldnsa
asldpáknsa
b: whatever text
ma: &ma
- 123
- 45.67
- 1:
2: no
- some text
mb: *ma
(force_embed=False enabled deduplication with ``&ma`` anchor,
vspacing is adjusted to split even this tiny output)
----------
Extended example::
>>> pyaml.dump(data, vspacing=dict(split_lines=10))
destination:
encoding:
xz:
enabled: yes
min_size: 5120
options:
path_filter:
- \.(gz|bz2|t[gb]z2?|xz|lzma|7z|zip|rar)$
- \.(rpm|deb|iso)$
- \.(jpe?g|gif|png|mov|avi|ogg|mkv|webm|mp[34g]|flv|flac|ape|pdf|djvu)$
- \.(sqlite3?|fossil|fsl)$
- \.git/objects/[0-9a-f]+/[0-9a-f]+$
result:
append_to_file:
append_to_lafs_dir:
print_to_stdout: yes
url: http://localhost:3456/uri
filter:
- /(CVS|RCS|SCCS|_darcs|\{arch\})/$
- /\.(git|hg|bzr|svn|cvs)(/|ignore|attributes|tags)?$
- /=(RELEASE-ID|meta-update|update)$
http:
ca_certs_files: /etc/ssl/certs/ca-certificates.crt
debug_requests: no
request_pool_options:
cachedConnectionTimeout: 600
maxPersistentPerHost: 10
retryAutomatically: yes
logging:
formatters:
basic:
datefmt: '%Y-%m-%d %H:%M:%S'
format: '%(asctime)s :: %(name)s :: %(levelname)s: %(message)s'
handlers:
console:
class: logging.StreamHandler
formatter: basic
level: custom
stream: ext://sys.stderr
loggers:
twisted:
handlers:
- console
level: 0
root:
handlers:
- console
level: custom
Note that unless there are many moderately wide and deep trees of data,
which are expected to be read and edited by people, it might be preferrable
to directly use PyYAML regardless, as it won't introduce another
(rather pointless in that case) dependency and a point of failure.
Features and Tricks
-------------------
* Pretty-print any yaml or json (yaml subset) file from the shell::
% python -m pyaml /path/to/some/file.yaml
% pyaml < myfile.yml
% curl -s https://www.githubstatus.com/api/v2/summary.json | pyaml
``pipx install pyaml`` can be a good way to only install "pyaml" command-line script.
* Process and replace json/yaml file in-place::
% python -m pyaml -r mydata.yml
* Easier "debug printf" for more complex data (all funcs below are aliases to same thing)::
pyaml.p(stuff)
pyaml.pprint(my_data)
pyaml.pprint('----- HOW DOES THAT BREAKS!?!?', input_data, some_var, more_stuff)
pyaml.print(data, file=sys.stderr) # needs "from __future__ import print_function"
* Force all string values to a certain style (see info on these in `PyYAML docs`_)::
pyaml.dump(many_weird_strings, string_val_style='|')
pyaml.dump(multiline_words, string_val_style='>')
pyaml.dump(no_want_quotes, string_val_style='plain')
Using ``pyaml.add_representer()`` (note \*p\*yaml) as suggested in
`this SO thread`_ (or `github-issue-7`_) should also work.
See also this `amazing reply to StackOverflow#3790454`_ for everything about
the many different string styles in YAML.
* Control indent and width of the results::
pyaml.dump(wide_and_deep, indent=4, width=120)
These are actually keywords for PyYAML Emitter (passed to it from Dumper),
see more info on these in `PyYAML docs`_.
* Dump multiple yaml documents into a file: ``pyaml.dump_all([data1, data2, data3], dst_file)``
explicit_start=True is implied, unless overidden by explicit_start=False.
* Control thresholds for vertical spacing of values (0 = always space stuff out),
and clump all oneliner ones at the top::
>>> pyaml.p( data,
sort_dicts=pyaml.PYAMLSort.oneline_group,
vspacing=dict(split_lines=0, split_count=0) )
chart:
axisCenteredZero: no
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
drawStyle: line
...
hideFrom:
legend: no
tooltip: no
viz: no
scaleDistribution:
type: linear
stacking:
group: A
mode: none
Or same thing with cli tool ``-v/--vspacing`` option: ``pyaml -v 0/0g mydata.yaml``
* Dump any non-YAML-type values when debugging or to replace later::
>>> test2 = type('test2', (object,), dict(a='b'))()
>>> test3 = type('test3', (object,), dict(__repr__=lambda s: '# test3 repr'+' '*80))()
>>> pyaml.p(dict(test1='test1', test2=test2, test3=test3), repr_unknown=True)
test1: test1
test2: <__main__.test2 object at 0x7f00ccd1ade0> # python value
test3: '# test3 repr ...[50/92]' # python __main__.test3
Such unknown-type values get truncated if their repr() is too long, which can
be controlled by passing int max-length to repr_unknown instead of bool.
.. _PyYAML docs: http://pyyaml.org/wiki/PyYAMLDocumentation#Scalars
.. _this SO thread: http://stackoverflow.com/a/7445560
.. _github-issue-7: https://github.com/mk-fg/pretty-yaml/issues/7
.. _amazing reply to StackOverflow#3790454:
https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-in-yaml-over-multiple-lines/21699210#21699210
Installation
------------
It's a regular Python 3.8+ module/package, published on PyPI (as pyaml_).
Module uses PyYAML_ for processing of the actual YAML files
and should pull it in as a dependency.
Dependency on unidecode_ module is optional and only be used with
force_embed=False keyword (defaults to True), and same-id objects
or recursion within serialized data - i.e. only when generating
&some_key_id anchors is actually needed.
If module is unavailable at runtime, anchor ids might be less like their
keys and maybe not as nice.
Using pip_ is how you generally install it, usually coupled with venv_ usage
(which will also provide "pip" tool itself)::
% pip install pyaml
Current-git version can be installed like this::
% pip install git+https://github.com/mk-fg/pretty-yaml
pip will default to installing into currently-active venv, then user's home
directory (under ``~/.local/lib/python...``), and maybe system-wide when running
as root (only useful in specialized environments like docker containers).
There are many other python packaging tools - pipenv_, poetry_, pdm_, etc -
use whatever is most suitable for specific project/environment.
pipx_ can be used to install command-line script without a module.
More general info on python packaging can be found at `packaging.python.org`_.
When changing code, unit tests can be run with ``python -m unittest``
from the local repository checkout.
.. _pyaml: https://pypi.org/project/pyaml/
.. _unidecode: https://pypi.python.org/pypi/Unidecode
.. _pip: https://pip.pypa.io/en/stable/
.. _venv: https://docs.python.org/3/library/venv.html
.. _poetry: https://python-poetry.org/
.. _pipenv: https://pipenv.pypa.io/
.. _pdm: https://pdm.fming.dev/
.. _pipx: https://pypa.github.io/pipx/
.. _packaging.python.org: https://packaging.python.org/installing/
Raw data
{
"_id": null,
"home_page": "https://github.com/mk-fg/pretty-yaml",
"name": "pyaml",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "yaml, serialization, pretty-print, formatter, human, readability",
"author": "Mike Kazantsev",
"author_email": "Mike Kazantsev <mk.fraggod@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/13/7e/b60f491b4ad461a5bd0cb930cd43940061b38968464085d8ec8242b58c86/pyaml-24.12.1.tar.gz",
"platform": null,
"description": "pretty-yaml (or pyaml)\n======================\n\nPyYAML_-based python module to produce a bit more pretty and human-readable YAML-serialized data.\n\nThis module is for serialization only, see `ruamel.yaml`_ module for literate\nYAML parsing (keeping track of comments, spacing, line/column numbers of values, etc).\n\n(side-note: to dump stuff parsed by ruamel.yaml with this module, use only ``YAML(typ='safe')`` there)\n\nIt's a small module, and for projects that only need part of its functionality,\nI'd recommend copy-pasting that in, instead of adding janky dependency.\n\n.. _PyYAML: http://pyyaml.org/\n.. _ruamel.yaml: https://bitbucket.org/ruamel/yaml/\n\n.. contents::\n :backlinks: none\n\nRepository URLs:\n\n- https://github.com/mk-fg/pretty-yaml\n- https://codeberg.org/mk-fg/pretty-yaml\n- https://fraggod.net/code/git/pretty-yaml\n\n\nWarning\n-------\n\nPrime goal of this module is to produce human-readable output that can be\neasily diff'ed, manipulated and re-used, but maybe with occasional issues.\n\nSo please do not rely on the thing to produce output that can always be\ndeserialized exactly to what was exported, at least - use PyYAML directly\nfor that (but maybe with options from the next section).\n\nOutput also isn't guaranteed to be stable between module versions,\nas new representation tweaks get added occasionally, but these can usually\nbe disabled via module parameters, to get output stability over improvements.\n\n\nWhat this module does and why\n-----------------------------\n\nYAML is generally nice and easy format to read *if* it was written by humans.\n\nPyYAML can a do fairly decent job of making stuff readable, and the best\ncombination of parameters for such output that I've seen so far is probably this one::\n\n >>> m = [123, 45.67, {1: None, 2: False}, 'some text']\n >>> data = dict(a='asldnsa\\nasldp\u00e1knsa\\n', b='whatever text', ma=m, mb=m)\n >>> yaml.safe_dump( data, sys.stdout,\n width=100, allow_unicode=True, default_flow_style=False )\n a: 'asldnsa\n\n asldp\u00e1knsa\n\n '\n b: whatever text\n ma: &id001\n - 123\n - 45.67\n - 1: null\n 2: false\n - some text\n mb: *id001\n\npyaml (this module) tries to improve on that a bit, with the following tweaks:\n\n* Most human-friendly representation options in PyYAML (that I know of)\n are used as defaults - unicode, flow-style, width=100 (old default is 80).\n\n* Dump \"null\" values as empty values, if possible, which have the same meaning\n but reduce visual clutter and are easier to edit.\n\n* Dicts, sets, OrderedDicts, defaultdicts, namedtuples, enums, dataclasses, etc\n are represented as their safe YAML-compatible base (like int, list or mapping),\n with mappings key-sorted by default for more diff-friendly output.\n\n* Use shorter and simpler yes/no for booleans.\n\n* List items get indented, as they should be.\n\n* Attempt is made to pick more readable string representation styles, depending\n on the value, e.g.::\n\n >>> yaml.safe_dump(cert, sys.stdout)\n cert: '-----BEGIN CERTIFICATE-----\n\n MIIH3jCCBcagAwIBAgIJAJi7AjQ4Z87OMA0GCSqGSIb3DQEBCwUAMIHBMRcwFQYD\n\n VQQKFA52YWxlcm9uLm5vX2lzcDEeMBwGA1UECxMVQ2VydGlmaWNhdGUgQXV0aG9y\n ...\n\n >>> pyaml.p(cert):\n cert: |\n -----BEGIN CERTIFICATE-----\n MIIH3jCCBcagAwIBAgIJAJi7AjQ4Z87OMA0GCSqGSIb3DQEBCwUAMIHBMRcwFQYD\n VQQKFA52YWxlcm9uLm5vX2lzcDEeMBwGA1UECxMVQ2VydGlmaWNhdGUgQXV0aG9y\n ...\n\n* \"force_embed\" option (default=yes) to avoid having &id stuff scattered all\n over the output. Might be more useful to disable it in some specific cases though.\n\n* \"&idXYZ\" anchors, when needed, get labels from the keys they get attached to,\n not just meaningless enumerators, e.g. \"&users_-_admin\" instead.\n\n* \"string_val_style\" option to only apply to strings that are values, not keys,\n i.e::\n\n >>> pyaml.p(data, string_val_style='\"')\n key: \"value\\nasldp\u00e1knsa\\n\"\n >>> yaml.safe_dump(data, sys.stdout, allow_unicode=True, default_style='\"')\n \"key\": \"value\\nasldp\u00e1knsa\\n\"\n\n* Add vertical spacing (empty lines) between keys on different depths,\n to separate long YAML sections in the output visually, make it more seekable.\n\n* Discard end-of-document \"...\" indicators for simple values.\n\nResult for the (rather meaningless) example above::\n\n >>> pyaml.p(data, force_embed=False, vspacing=dict(split_lines=10))\n\n a: |\n asldnsa\n asldp\u00e1knsa\n\n b: whatever text\n\n ma: &ma\n - 123\n - 45.67\n - 1:\n 2: no\n - some text\n\n mb: *ma\n\n(force_embed=False enabled deduplication with ``&ma`` anchor,\nvspacing is adjusted to split even this tiny output)\n\n----------\n\nExtended example::\n\n >>> pyaml.dump(data, vspacing=dict(split_lines=10))\n\n destination:\n\n encoding:\n xz:\n enabled: yes\n min_size: 5120\n options:\n path_filter:\n - \\.(gz|bz2|t[gb]z2?|xz|lzma|7z|zip|rar)$\n - \\.(rpm|deb|iso)$\n - \\.(jpe?g|gif|png|mov|avi|ogg|mkv|webm|mp[34g]|flv|flac|ape|pdf|djvu)$\n - \\.(sqlite3?|fossil|fsl)$\n - \\.git/objects/[0-9a-f]+/[0-9a-f]+$\n\n result:\n append_to_file:\n append_to_lafs_dir:\n print_to_stdout: yes\n\n url: http://localhost:3456/uri\n\n filter:\n - /(CVS|RCS|SCCS|_darcs|\\{arch\\})/$\n - /\\.(git|hg|bzr|svn|cvs)(/|ignore|attributes|tags)?$\n - /=(RELEASE-ID|meta-update|update)$\n\n http:\n ca_certs_files: /etc/ssl/certs/ca-certificates.crt\n debug_requests: no\n request_pool_options:\n cachedConnectionTimeout: 600\n maxPersistentPerHost: 10\n retryAutomatically: yes\n\n logging:\n\n formatters:\n basic:\n datefmt: '%Y-%m-%d %H:%M:%S'\n format: '%(asctime)s :: %(name)s :: %(levelname)s: %(message)s'\n\n handlers:\n console:\n class: logging.StreamHandler\n formatter: basic\n level: custom\n stream: ext://sys.stderr\n\n loggers:\n twisted:\n handlers:\n - console\n level: 0\n\n root:\n handlers:\n - console\n level: custom\n\nNote that unless there are many moderately wide and deep trees of data,\nwhich are expected to be read and edited by people, it might be preferrable\nto directly use PyYAML regardless, as it won't introduce another\n(rather pointless in that case) dependency and a point of failure.\n\n\nFeatures and Tricks\n-------------------\n\n* Pretty-print any yaml or json (yaml subset) file from the shell::\n\n % python -m pyaml /path/to/some/file.yaml\n % pyaml < myfile.yml\n % curl -s https://www.githubstatus.com/api/v2/summary.json | pyaml\n\n ``pipx install pyaml`` can be a good way to only install \"pyaml\" command-line script.\n\n* Process and replace json/yaml file in-place::\n\n % python -m pyaml -r mydata.yml\n\n* Easier \"debug printf\" for more complex data (all funcs below are aliases to same thing)::\n\n pyaml.p(stuff)\n pyaml.pprint(my_data)\n pyaml.pprint('----- HOW DOES THAT BREAKS!?!?', input_data, some_var, more_stuff)\n pyaml.print(data, file=sys.stderr) # needs \"from __future__ import print_function\"\n\n* Force all string values to a certain style (see info on these in `PyYAML docs`_)::\n\n pyaml.dump(many_weird_strings, string_val_style='|')\n pyaml.dump(multiline_words, string_val_style='>')\n pyaml.dump(no_want_quotes, string_val_style='plain')\n\n Using ``pyaml.add_representer()`` (note \\*p\\*yaml) as suggested in\n `this SO thread`_ (or `github-issue-7`_) should also work.\n\n See also this `amazing reply to StackOverflow#3790454`_ for everything about\n the many different string styles in YAML.\n\n* Control indent and width of the results::\n\n pyaml.dump(wide_and_deep, indent=4, width=120)\n\n These are actually keywords for PyYAML Emitter (passed to it from Dumper),\n see more info on these in `PyYAML docs`_.\n\n* Dump multiple yaml documents into a file: ``pyaml.dump_all([data1, data2, data3], dst_file)``\n\n explicit_start=True is implied, unless overidden by explicit_start=False.\n\n* Control thresholds for vertical spacing of values (0 = always space stuff out),\n and clump all oneliner ones at the top::\n\n >>> pyaml.p( data,\n sort_dicts=pyaml.PYAMLSort.oneline_group,\n vspacing=dict(split_lines=0, split_count=0) )\n\n chart:\n axisCenteredZero: no\n axisColorMode: text\n axisLabel: ''\n axisPlacement: auto\n barAlignment: 0\n drawStyle: line\n ...\n\n hideFrom:\n legend: no\n tooltip: no\n viz: no\n\n scaleDistribution:\n type: linear\n\n stacking:\n group: A\n mode: none\n\n Or same thing with cli tool ``-v/--vspacing`` option: ``pyaml -v 0/0g mydata.yaml``\n\n* Dump any non-YAML-type values when debugging or to replace later::\n\n >>> test2 = type('test2', (object,), dict(a='b'))()\n >>> test3 = type('test3', (object,), dict(__repr__=lambda s: '# test3 repr'+' '*80))()\n >>> pyaml.p(dict(test1='test1', test2=test2, test3=test3), repr_unknown=True)\n\n test1: test1\n test2: <__main__.test2 object at 0x7f00ccd1ade0> # python value\n test3: '# test3 repr ...[50/92]' # python __main__.test3\n\n Such unknown-type values get truncated if their repr() is too long, which can\n be controlled by passing int max-length to repr_unknown instead of bool.\n\n.. _PyYAML docs: http://pyyaml.org/wiki/PyYAMLDocumentation#Scalars\n.. _this SO thread: http://stackoverflow.com/a/7445560\n.. _github-issue-7: https://github.com/mk-fg/pretty-yaml/issues/7\n.. _amazing reply to StackOverflow#3790454:\n https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-in-yaml-over-multiple-lines/21699210#21699210\n\n\nInstallation\n------------\n\nIt's a regular Python 3.8+ module/package, published on PyPI (as pyaml_).\n\nModule uses PyYAML_ for processing of the actual YAML files\nand should pull it in as a dependency.\n\nDependency on unidecode_ module is optional and only be used with\nforce_embed=False keyword (defaults to True), and same-id objects\nor recursion within serialized data - i.e. only when generating\n&some_key_id anchors is actually needed.\nIf module is unavailable at runtime, anchor ids might be less like their\nkeys and maybe not as nice.\n\nUsing pip_ is how you generally install it, usually coupled with venv_ usage\n(which will also provide \"pip\" tool itself)::\n\n % pip install pyaml\n\nCurrent-git version can be installed like this::\n\n % pip install git+https://github.com/mk-fg/pretty-yaml\n\npip will default to installing into currently-active venv, then user's home\ndirectory (under ``~/.local/lib/python...``), and maybe system-wide when running\nas root (only useful in specialized environments like docker containers).\n\nThere are many other python packaging tools - pipenv_, poetry_, pdm_, etc -\nuse whatever is most suitable for specific project/environment.\npipx_ can be used to install command-line script without a module.\n\nMore general info on python packaging can be found at `packaging.python.org`_.\n\nWhen changing code, unit tests can be run with ``python -m unittest``\nfrom the local repository checkout.\n\n.. _pyaml: https://pypi.org/project/pyaml/\n.. _unidecode: https://pypi.python.org/pypi/Unidecode\n.. _pip: https://pip.pypa.io/en/stable/\n.. _venv: https://docs.python.org/3/library/venv.html\n.. _poetry: https://python-poetry.org/\n.. _pipenv: https://pipenv.pypa.io/\n.. _pdm: https://pdm.fming.dev/\n.. _pipx: https://pypa.github.io/pipx/\n.. _packaging.python.org: https://packaging.python.org/installing/\n",
"bugtrack_url": null,
"license": "WTFPL",
"summary": "PyYAML-based module to produce a bit more pretty and readable YAML-serialized data",
"version": "24.12.1",
"project_urls": {
"Homepage": "https://github.com/mk-fg/pretty-yaml"
},
"split_keywords": [
"yaml",
" serialization",
" pretty-print",
" formatter",
" human",
" readability"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "ec7bd65a82c8e634b90613a8b969ab8a525194c2eec0de9118e75f77ffb822a2",
"md5": "f9f827b147f774987b441209c9372a4d",
"sha256": "97ed4d31ecc1d7bb93f3d2a66e53548c53d6f572d75d166957abc64a06033b76"
},
"downloads": -1,
"filename": "pyaml-24.12.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f9f827b147f774987b441209c9372a4d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 25983,
"upload_time": "2024-12-11T20:38:09",
"upload_time_iso_8601": "2024-12-11T20:38:09.213062Z",
"url": "https://files.pythonhosted.org/packages/ec/7b/d65a82c8e634b90613a8b969ab8a525194c2eec0de9118e75f77ffb822a2/pyaml-24.12.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "137eb60f491b4ad461a5bd0cb930cd43940061b38968464085d8ec8242b58c86",
"md5": "b8cdb0662838a98cd1e6e562677ed6cf",
"sha256": "3938c2b47924ed74524f844961a011852f7968fb8cc7b3933276087c5d1e45b3"
},
"downloads": -1,
"filename": "pyaml-24.12.1.tar.gz",
"has_sig": false,
"md5_digest": "b8cdb0662838a98cd1e6e562677ed6cf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 29288,
"upload_time": "2024-12-11T20:38:10",
"upload_time_iso_8601": "2024-12-11T20:38:10.603011Z",
"url": "https://files.pythonhosted.org/packages/13/7e/b60f491b4ad461a5bd0cb930cd43940061b38968464085d8ec8242b58c86/pyaml-24.12.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-11 20:38:10",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "mk-fg",
"github_project": "pretty-yaml",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "pyaml"
}