I/O facility for Idefix/Pluto configuration files
Project description
inifix
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), though the following file format specification is intended as a
superset of the one used in Pluto and Idefix. Namely, while Pluto and Idefix
require that each and every (key, value) pair be part of a section, inifix
supports section-free definitions.
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 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
dictionary 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)
File formatter
A small command line tool is shipped with the package to format compatible inifiles.
This will print a formatted verison of the input file to stdout
$ inifix-format pluto.ini
In can be redirected as
$ inifix-format pluto.ini > pluto-formatted.ini
Use the -i/--inplace flag to write back to the source file.
Note that comments are preserved in all cases.
This program can also be used as a hook for pre-commit. Simply add the following to your
project's .pre-commit-config.yaml
- repo: https://github.com/neutrinoceros/inifix.git
rev: v0.5.1
hooks:
- id: inifix-format
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
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file inifix-0.7.0.tar.gz.
File metadata
- Download URL: inifix-0.7.0.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e30bee3eb8d5c47c4765ebafba88dc4a2ab0facb6d4642522c9dd2f49b20f466
|
|
| MD5 |
edd0a3b55c8dc799c052bec919857722
|
|
| BLAKE2b-256 |
85105f425b37e7e3aa1c452ef761551884204905c73a4690c5b14fbc98ac9edd
|
File details
Details for the file inifix-0.7.0-py3-none-any.whl.
File metadata
- Download URL: inifix-0.7.0-py3-none-any.whl
- Upload date:
- Size: 21.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4fcf287b058f495983492013d9a21442719a14039a04b20f3997ee6bf0a42219
|
|
| MD5 |
277676a6bdaefe27d647203ccae4f96f
|
|
| BLAKE2b-256 |
328c8a42f032a7fe3995061fd77915db0c23f2b837bc8eef7c500922bbbefb8d
|