ssato / python-anyconfig

Python library provides common APIs to load and dump configuration files in various formats
MIT License
278 stars 31 forks source link

.. This file was converted from sources (*/.rst). DO NOT EDIT THIS MANUALLY.

================= python-anyconfig

.. image:: https://img.shields.io/pypi/v/anyconfig.svg :target: https://pypi.python.org/pypi/anyconfig/ :alt: [Latest Version]

.. image:: https://img.shields.io/pypi/pyversions/anyconfig.svg :target: https://pypi.python.org/pypi/anyconfig/ :alt: [Python versions]

.. image:: https://img.shields.io/pypi/l/anyconfig.svg :target: https://pypi.python.org/pypi/anyconfig/ :alt: MIT License

.. image:: https://github.com/ssato/python-anyconfig/workflows/Tests/badge.svg :target: https://github.com/ssato/python-anyconfig/actions?query=workflow%3ATests :alt: [Github Actions: Test status]

.. image:: https://dev.azure.com/satorusatoh0471/python-anyconfig/_apis/build/status/ssato.python-anyconfig?branchName=next :target: https://dev.azure.com/satorusatoh0471/python-anyconfig/_build/latest?definitionId=1 :alt: [Azure Pipelines Status]

.. image:: https://img.shields.io/coveralls/ssato/python-anyconfig.svg :target: https://coveralls.io/r/ssato/python-anyconfig :alt: [Coverage Status]

.. .. image:: https://landscape.io/github/ssato/python-anyconfig/master/landscape.svg?style=flat :target: https://landscape.io/github/ssato/python-anyconfig/master :alt: [Code Health]

.. image:: https://scrutinizer-ci.com/g/ssato/python-anyconfig/badges/quality-score.png?b=master :target: https://scrutinizer-ci.com/g/ssato/python-anyconfig :alt: [Code Quality by Scrutinizer]

.. .. image:: https://img.shields.io/lgtm/grade/python/g/ssato/python-anyconfig.svg :target: https://lgtm.com/projects/g/ssato/python-anyconfig/context:python :alt: [Code Quality by LGTM]

.. .. image:: https://www.openhub.net/p/python-anyconfig/widgets/project_thin_badge.gif :target: https://www.openhub.net/p/python-anyconfig :alt: [Open HUB]

.. image:: https://readthedocs.org/projects/python-anyconfig/badge/?version=latest :target: http://python-anyconfig.readthedocs.io/en/latest/?badge=latest :alt: [Doc Status]

.. .. image:: https://img.shields.io/github/contributors/ssato/python-anyconfig :target: https://github.com/ssato/python-anyconfig/graphs/contributors/ :alt: [GitHub contributors]

Introduction

python-anyconfig [#]_ is a python library provides common APIs to load and dump configuration files in various formats with some useful features such as contents merge, templates, query, schema validation and generation support.

.. [#] This name took an example from the 'anydbm' python standard library.

Features

python-anyconfig provides very simple and unified APIs to process configuration files in various formats and related functions:

It enables to load configuration file[s] in various formats in the same manner, and in some cases, even there is no need to take care of the actual format of configuration file[s] like the followings:

.. code-block:: python

import anyconfig

Config type (format) is automatically detected by filename (file

extension) in some cases.

conf1 = anyconfig.load("/path/to/foo/conf.d/a.yml")

Similar to the above but the input is pathlib.Path object.

import pathlib path_1 = pathlib.Path("/path/to/foo/conf.d/a.yml") conf1_1 = anyconfig.load(path_1)

Similar to the first one but load from file object opened:

with anyconfig.open("/path/to/foo/conf.d/a.yml") as fileobj: conf1_2 = anyconfig.load(fileobj)

Loaded config data is a mapping object, for example:

#

conf1["a"] => 1

conf1["b"]["b1"] => "xyz"

conf1["c"]["c1"]["c13"] => [1, 2, 3]

Or you can specify the format (config type) explicitly if its automatic

detection may not work.

conf2 = anyconfig.load("/path/to/foo/conf.d/b.conf", ac_parser="yaml")

Likewise.

with anyconfig.open("/path/to/foo/conf.d/b.conf") as fileobj: conf2_2 = anyconfig.load(fileobj, ac_parser="yaml")

Specify multiple config files by the list of paths. Configurations of each

files will be merged.

conf3 = anyconfig.load(["/etc/foo.d/a.json", "/etc/foo.d/b.json"])

Similar to the above but all or one of config file[s] might be missing.

conf4 = anyconfig.load(["/etc/foo.d/a.json", "/etc/foo.d/b.json"], ac_ignore_missing=True)

Specify config files by glob path pattern:

conf5 = anyconfig.load("/etc/foo.d/*.json")

Similar to the above, but parameters in the former config file will be simply

overwritten by the later ones instead of merge:

conf6 = anyconfig.load("/etc/foo.d/*.json", ac_merge=anyconfig.MS_REPLACE)

Also, it can process configuration files which are jinja2-based template <http://jinja.pocoo.org>_ files:

.. code-block:: console

In [1]: import anyconfig

In [2]: open("/tmp/a.yml", 'w').write("a: {{ a|default('aaa') }}\n")

In [3]: anyconfig.load("/tmp/a.yml", ac_template=True) Out[3]: {'a': 'aaa'}

In [4]: anyconfig.load("/tmp/a.yml", ac_template=True, ac_context=dict(a='bbb')) Out[4]: {'a': 'bbb'}

In [5]: open("/tmp/b.yml", 'w').write("{% include 'a.yml' %}\n") # 'include'

In [6]: anyconfig.load("/tmp/b.yml", ac_template=True, ac_context=dict(a='ccc')) Out[6]: {'a': 'ccc'}

And python-anyconfig enables to validate configuration files in various formats with using JSON schema like the followings:

.. code-block:: python

Validate a JSON config file (conf.json) with JSON schema (schema.yaml).

If validation succeeds, rc -> True, err -> ''.

conf1 = anyconfig.load("/path/to/conf.json") schema1 = anyconfig.load("/path/to/schema.yaml") (rc, err) = anyconfig.validate(conf1, schema1) # err is empty if success, rc == 0

Validate a config file (conf.yml) with JSON schema (schema.yml) while

loading the config file.

conf2 = anyconfig.load("/a/b/c/conf.yml", ac_schema="/c/d/e/schema.yml")

Validate config loaded from multiple config files with JSON schema

(schema.json) while loading them.

conf3 = anyconfig.load("conf.d/*.yml", ac_schema="/c/d/e/schema.json")

Generate jsonschema object from config files loaded and get string

representation.

conf4 = anyconfig.load("conf.d/*.yml") scm4 = anyconfig.gen_schema(conf4) scm4_s = anyconfig.dumps(scm4, "json")

And you can query loaded data with JMESPath [#]_ expressions:

.. code-block:: python

In [2]: dic = dict(a=dict(b=[dict(c="C", d=0)]))

In [3]: anyconfig.loads(anyconfig.dumps(dic, ac_parser="json"), ...: ac_parser="json", ac_query="a.b[0].c") Out[3]: u'C'

In [4]:

And in the last place, python-anyconfig provides a CLI tool called anyconfig_cli to process configuration files and:

.. [#] http://json-schema.org .. [#] http://jmespath.org

Supported configuration formats ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

python-anyconfig supports various file formats if requirements are satisfied and backends in charge are enabled and ready to use:

.. csv-table:: Always supported formats :header: "Format", "Type", "Requirement" :widths: 15, 10, 40

JSON, json, json (standard lib) or simplejson [#] Ini-like, ini, configparser (standard lib) Pickle, pickle, pickle (standard lib) XML, xml, ElementTree (standard lib) Java properties [#] , properties, None (native implementation with standard lib) B-sh, shellvars, None (native implementation with standard lib) Python, python, None (native implementation)

.. csv-table:: Supported formats if requirements are satisfied :header: "Format", "Type", "Requirement" :widths: 15, 10, 40

YAML, yaml, ruamel.yaml [#] or PyYAML [#] TOML, toml, toml [#]_

.. csv-table:: Supported formats by pluggable backend modules :header: "Format", "Type", "Required backend" :widths: 15, 10, 40

Amazon Ion, ion, anyconfig-ion-backend [#] BSON, bson, anyconfig-bson-backend [#] CBOR, cbor, anyconfig-cbor-backend [#] or anyconfig-cbor2-backend [#] ConifgObj, configobj, anyconfig-configobj-backend [#] MessagePack, msgpack, anyconfig-msgpack-backend [#]

The supported formats of python-anyconfig on your system are able to be listed by 'anyconfig_cli -L' like this:

.. code-block:: console

$ anyconfig_cli -L Supported config types: bson, configobj, ini, json, msgpack, toml, xml, yaml $

or with the API 'anyconfig.list_types()' will show them:

.. code-block:: console

In [8]: anyconfig.list_types() Out[8]: ['bson', 'configobj', 'ini', 'json', 'msgpack', 'toml', 'xml', 'yaml']

In [9]:

.. [#] https://pypi.python.org/pypi/simplejson .. [#] ex. https://docs.oracle.com/javase/7/docs/api/java/util/Properties.html .. [#] https://pypi.python.org/pypi/ruamel.yaml .. [#] https://pypi.python.org/pypi/PyYAML .. [#] https://pypi.python.org/pypi/toml .. [#] http://peak.telecommunity.com/DevCenter/setuptools#dynamic-discovery-of-services-and-plugins .. [#] https://pypi.python.org/pypi/anyconfig-ion-backend .. [#] https://pypi.python.org/pypi/anyconfig-bson-backend .. [#] https://pypi.python.org/pypi/anyconfig-cbor-backend .. [#] https://pypi.python.org/pypi/anyconfig-cbor2-backend .. [#] https://pypi.python.org/pypi/anyconfig-configobj-backend .. [#] https://pypi.python.org/pypi/anyconfig-msgpack-backend

Installation

Requirements ^^^^^^^^^^^^^^

Many runtime dependencies are resolved dynamically and python-anyconfig just disables specific features if required dependencies are not satisfied. Therefore, only python standard library is required to install and use python-anyconfig at minimum.

The following packages need to be installed along with python-anyconfig to enable the features.

.. csv-table:: :header: "Feature", "Requirements", "Notes" :widths: 20, 10, 25

YAML load/dump, ruamel.yaml or PyYAML, ruamel.yaml will be used instead of PyYAML if it's available to support the YAML 1.2 specification. TOML load/dump, toml [#] or tomllib [#] and tomli-w [#] or tomli [#] and tomli-w or tomlkit [#] , tomllib is in the standard lib since python 3.11.0 BSON load/dump, bson, bson from pymongo package may work and bson [#] does not Template config, Jinja2 [#] , none Validation with JSON schema, jsonschema [#] , Not required to generate JSON schema. Query with JMESPath expression, jmespath [#]_ , none

.. [#] https://pypi.python.org/pypi/toml/ .. [#] https://docs.python.org/3/library/tomllib.html .. [#] https://pypi.python.org/pypi/tomli-w/ .. [#] https://pypi.python.org/pypi/tomli/ .. [#] https://pypi.python.org/pypi/tomlkit/ .. [#] https://pypi.python.org/pypi/bson/ .. [#] https://pypi.python.org/pypi/Jinja2/ .. [#] https://pypi.python.org/pypi/jsonschema/ .. [#] https://pypi.python.org/pypi/jmespath/

How to install ^^^^^^^^^^^^^^^^

There is a couple of ways to install python-anyconfig:

.. [#] Thanks to Brett-san! https://src.fedoraproject.org/rpms/python-anyconfig/

Help and feedbak

If you have any issues / feature request / bug reports with python-anyconfig, please open issue tickets on github.com, https://github.com/ssato/python-anyconfig/issues.

The following areas are still insufficient, I think.

Any feedbacks, helps, suggestions are welcome! Please open github issues for these kind of problems also!

.. vim:sw=2:ts=2:et: