Skip to main content

I/O facility for Idefix/Pluto configuration files

Project description

inifix

PyPI PyPI codecov pre-commit.ci status Code style: black Imports: isort

inifix in a small Python library with I/O methods to read and write Pluto/Idefix inifiles as Python dictionaries.

Its primary goal is to support Idefix's model (which is intended as identical to Pluto's), but it has enough flexibility to support other (section-free) configuration files.

File format specifications

  • parameter names are strings
  • parameter names and values are separated by white spaces
  • values can be an integers, floats, booleans, or strings
  • a parameter can be associated to a single value or a set of space-separated value
  • optionally, the file can be separated into sections, whose names match this regexp "$[\.+]"
  • comments start with # and are ignored

Using the following Python's typing notations

from typing import Union, Mapping
Scalar = Union[str, float, bool, int]
InifixConf = Mapping[str, Union[Scalar, Mapping[str, Scalar]]

A configuration file is considered valid if it can be parsed as an InifixConf object.

Examples

The following content is considered valid

# My awesome experiment
[Grid]
x   1 2 "u" 10    # a comment
y   4 5 "l" 100
[Time Integrator]
CFL  1e-3
tstop 1E3

and maps to

{
    "Grid": {
        "x": [1, 2, "u", 10],
        "y": [4, 5, "l", 100]
    },
    "Time Integrator": {
        "CFL": 0.001,
        "tstop": 1000
    }
}

The following is also considered valid

mode   fargo

# Time integrator
CFL    1e-3
tstop  1e3

and maps to

{
    "mode": "fargo",
    "CFL": 0.001,
    "tstop": 1000
}

Note that strings using e-notation (e.g. 1e-3 or 1E3 here) are decoded as numbers. They are cast to int if no precision loss ensues, and float otherwise. Reversly, when writing files, numbers are re-encoded using e-notation if it leads to a more compact representation. For instance, 100000 is encoded as 1e5, but 10 is left unchanged because 1e1 also uses one more character. In case where both reprensations are equally compact (e.g. 100 VS 1e2), e-notation is prefered in encoding.

While decoding, e can be lower or upper case, but they are also encoded as lower case.

Installation

$ pip install inifix

Usage

The API is similar to that of toml and stdlib json, though intentionally simplified, and consists in two main user-facing functions: inifix.load and inifix.dump.

import inifix

# read
conf = inifix.load("pluto.ini")

# patch
conf["Time"]["CFL"] = 0.1

# write back
inifix.dump(conf, "pluto-mod.ini")

inifix.load supports loading a from an open file

with open("pluto.ini") as fh:
    conf = inifix.load(fh)

or from a str/os.PathLike object representing a file.

Schema Validation

inifix.validate_inifile_schema can be used to validate an aribitrary dictionnary as writable to an inifile, following Pluto/Idefix's format. This will raise an exception (ValueError) if the dictionnary data is invalid.

inifix.validate_inifile_schema(data)

Contribution guidelines

We use the pre-commit framework to automatically lint for code style and common pitfals.

Before you commit to your local copy of the repo, please run this from the top level

$ python3 -m pip install -u -e .[dev]
$ pre-commit install

Testing

We use the pytest framework to test inifix. The test suite can be run from the top level with a simple pytest invocation.

$ pytest

Project details


Download files

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

Source Distribution

inifix-0.3.1.tar.gz (20.0 kB view details)

Uploaded Source

Built Distribution

inifix-0.3.1-py3-none-any.whl (20.0 kB view details)

Uploaded Python 3

File details

Details for the file inifix-0.3.1.tar.gz.

File metadata

  • Download URL: inifix-0.3.1.tar.gz
  • Upload date:
  • Size: 20.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.1

File hashes

Hashes for inifix-0.3.1.tar.gz
Algorithm Hash digest
SHA256 c29407385cee4c2082a07e0ba397db375942285bb610ed76b25d222ca52f7c86
MD5 f951d125a98cd49325705329f516c3b3
BLAKE2b-256 793b35942b3643bcaff4099db33c32acbe59936b8358877ff1f8ebc7665e5cae

See more details on using hashes here.

File details

Details for the file inifix-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: inifix-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 20.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.1

File hashes

Hashes for inifix-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ce98c990d2aaa2fcb136448a55e465278131d4a806755e33206cff593c213fb8
MD5 e0bb50072a73f02b80f80eb3db36db12
BLAKE2b-256 892957b8366fb202be85019244d727794acf7912f8f7f9da8e4222ef0c5ec14d

See more details on using hashes here.

Supported by

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