Skip to main content

lunaconf is a Python library to support easy-to-understand configuration for evaluations

Project description

lunaconf

lunaconf is a Python library to support easy-to-understand configuration for evaluations

Installation

pip install lunaconf

Usage

It provides the following interfaces:

  • lunaconf.LunaConf: A base class that every configuration class should inherit from. It is a subclass of pydantic.BaseModel and thus Pydantic features can be used.

    import typing, lunaconf, pydantic
    
    class Config(lunaconf.LunaConf):
        require: int
        opt_int: int = 10
        opt_str: str = "default"
        opt_list: list[int] = pydantic.Field(default_factory=lambda: [1, 2, 3])
    
        @classmethod
        def __lunaconf_default__(cls) -> typing.Self:
            return cls(require=42)
    

    Here __lunaconf_default__ is a class method that should be overloaded if the class has required fields. It should return a default instance of the class to set default values for the fields.

  • lunaconf.lunaconf_cli: Construct a configuration from the CLI.

    # example.py
    import lunaconf
    
    config = lunaconf.lunaconf_cli(Config)
    

    Some CLI arguments and their corresponding generated configurations are as follows.

    $ python3 example.py
    # Config(require=42, opt_int=10, opt_str='default', opt_list=[1, 2, 3])
    
    $ python3 example.py -J config.json    # suppose config.json contains {"require": 100}
    # Config(require=100, opt_int=10, opt_str='default', opt_list=[1, 2, 3])
    
    $ python3 example.py opt_int=233
    # Config(require=42, opt_int=233, opt_str='default', opt_list=[1, 2, 3])
    
    $ python3 example.py opt_list.0=4
    # Config(require=42, opt_int=10, opt_str='default', opt_list=[4, 2, 3])
    

    The . in the CLI modifications can be used by nested fields and list indices:

    # config
    class Inner(lunaconf.LunaConf):
        a: int = 1
    class Outer(lunaconf.LunaConf):
        inner: typing.Optional[Inner] = None
        lst: list[int] = lunaconf.Field(default_factory=lambda: [1, 2, 3])
    
    $ python3 example.py
    # Outer(inner=None, lst=[1, 2, 3])
    $ python3 example.py inner.a=10 lst.1=20
    # Outer(inner=Inner(a=10), lst=[1, 20, 3])
    

    Available command-line options:

    • command positional arguments: specify the modifications to the configuration in the form of key1.key2=value1; key3.key4=value2 etc. The . can be used to access nested fields and list indices.
    • -j <json_str> / -J <json_file>: specify the JSON to overload the configuration.
    • -t <toml_str> / -T <toml_file>: specify the TOML to overload the configuration.
    • -d <str> / -D <file>: detect the format of the string/file and parse it accordingly. It will first try to parse it as JSON, if it fails, it will try to parse it as TOML. If both fail, an error will be raised.
    • -C <file>: the extra configuration file. This file contains command line arguments (one group per line) that will be parsed interleaved with the other command line arguments. Lines starting with # are treated as comments and ignored.
    • -a: whether or not output all fields with -p / -P flags, and also affect the application of post_action_with_all or post_action_without_all callables passed to lunaconf_cli.
    • -p: print the final configuration in JSON and exit.
    • -P: print the final configuration in TOML and exit.

Special Values

The following special values can be used in the command line arguments to represent certain Python values, and are output in some cases for unsupported values in JSON/TOML:

  • Input <null> leads to None; TOML will output <null> for None.
  • Input <del> to delete element in an array, or reset the field to its default.
  • Input <inf>, <-inf>, <nan> lead to float('inf'), float('-inf'), float('nan') respectively; JSON will output <inf>, <-inf>, <nan> for these values.
  • Input <env:VAR_NAME> leads to the value of the environment variable VAR_NAME. An error is raised if the environment variable is not set. <envint:VAR_NAME> is similar but converts the value to an integer, and raises an error if the conversion fails.

Strings inside the angle brackets are case-insensitive.

Examples

For more examples, please refer to the unit tests in the tests folder.

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

lunaconf-0.5.1.tar.gz (6.4 kB view details)

Uploaded Source

Built Distribution

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

lunaconf-0.5.1-py3-none-any.whl (7.8 kB view details)

Uploaded Python 3

File details

Details for the file lunaconf-0.5.1.tar.gz.

File metadata

  • Download URL: lunaconf-0.5.1.tar.gz
  • Upload date:
  • Size: 6.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for lunaconf-0.5.1.tar.gz
Algorithm Hash digest
SHA256 f55206d4461dfa54753e7fe496a60a51b3bbd7eee2e0423926a471a3d8e95362
MD5 688a88bfa8776c4120ba7ea0692ab64a
BLAKE2b-256 d4cb528448e5d150fe518358953ecb0ab682e37b561a40d027393df643ec299a

See more details on using hashes here.

File details

Details for the file lunaconf-0.5.1-py3-none-any.whl.

File metadata

  • Download URL: lunaconf-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 7.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for lunaconf-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 aec88a449eaa60aaa08b3e5b3bc7f4e29fd3cab105ea20e2da19578e9f295d20
MD5 fc102c06bd88004b2816c328db653f2e
BLAKE2b-256 69ea282a680324a2077d896b59e9544b1fc2c01c31abdf0384589e814561adcd

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