tomlev


Nametomlev JSON
Version 1.0.6 PyPI version JSON
download
home_pageNone
SummaryType-safe TOML configuration management with environment variable substitution and automatic validation for modern Python applications.
upload_time2025-10-09 09:25:37
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseMIT
keywords config-management configuration environment-variables python311 settings toml type-hints type-safety validation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            <h2>
    <p style="text-align: center;">
        TomlEv - Open-source Python framework to manage environment variables
    </p>
</h2>

---
[![Latest Version](https://badgen.net/pypi/v/tomlev)](https://pypi.python.org/pypi/tomlev/)
[![Tomlev CI/CD Pipeline](https://github.com/thesimj/tomlev/actions/workflows/main.yml/badge.svg)](https://github.com/thesimj/tomlev/actions/workflows/main.yml)
[![Coverage Status](https://badgen.net/coveralls/c/github/thesimj/tomlev)](https://coveralls.io/github/thesimj/tomlev?branch=main)
![Versions](https://badgen.net/pypi/python/tomlev)
[![Code Style: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![License](https://img.shields.io/pypi/l/tomlev.svg)](LICENSE)
[![Downloads](https://static.pepy.tech/personalized-badge/tomlev?period=total&units=international_system&left_color=black&right_color=green&left_text=Downloads)](https://pepy.tech/project/tomlev)

### Motivation

TomlEv is a lightweight Python framework designed to simplify environment variable management using TOML configuration
files with type-safe configuration models. It allows you to:

- **Type-safe configuration**: Define configuration schemas using Python classes with type hints
- **Automatic type conversion**: Convert environment variables to appropriate types (bool, int, float, str, lists,
  dicts, sets, tuples)
- **Nested configuration**: Support for complex nested configuration structures
- **Environment variable substitution**: Reference environment variables in TOML files with `${VAR|-default}` syntax
- **Validation**: Automatic validation of configuration structure and types
- **AI coding agent ready**: Full type checking support makes configurations perfectly compatible with AI coding agents
  and IDEs
- **IDE support**: Complete IDE autocompletion and static type analysis support

### Install

```shell
# pip
pip install tomlev
```

```shell
# uv
uv add tomlev
```

```shell
# poetry
poetry add tomlev
```

### Basic usage

#### 1. Create a TOML configuration file

Create a TOML configuration file (`env.toml` by default):

```toml
# env.toml
app_name = "My Application"
debug = "${DEBUG|-false}"
environment = "${ENV|-development}"

[database]
host = "${DB_HOST|-localhost}"
port = "${DB_PORT|-5432}"
user = "${DB_USER}"
password = "${DB_PASSWORD}"
name = "${DB_NAME|-app_db}"

[redis]
host = "${REDIS_HOST|-127.0.0.1}"
port = "${REDIS_PORT|-6379}"
```

Optionally include fragments inside a table using `__include` (paths are resolved relative to the TOML file):

```toml
# main.toml
[features]
__include = ["features.toml"]
```

```toml
# features.toml (merged under [features])
enabled = true
name = "awesome"
```

#### 2. Define Configuration Models

Create configuration model classes that inherit from `BaseConfigModel`:

```python
from tomlev import BaseConfigModel, TomlEv


class DatabaseConfig(BaseConfigModel):
    host: str
    port: int
    user: str
    password: str
    name: str


class RedisConfig(BaseConfigModel):
    host: str
    port: int


class FeaturesConfig(BaseConfigModel):
    # Matches the content merged under [features] via __include
    enabled: bool
    name: str


class AppConfig(BaseConfigModel):
    app_name: str
    debug: bool
    environment: str

    database: DatabaseConfig
    redis: RedisConfig
    features: FeaturesConfig
```

Tip: See the [File Includes](#file-includes) section for more details on `__include` usage and merge rules.

#### 3. Use TomlEv in your Python code

```python
from tomlev import TomlEv

# Load and validate configuration (using defaults: "env.toml" and ".env")
config: AppConfig = TomlEv(AppConfig).validate()

# Or explicitly specify files (same as defaults)
config: AppConfig = TomlEv(AppConfig, "env.toml", ".env").validate()

# You can also set defaults via environment variables
# export TOMLEV_TOML_FILE="config/production.toml"
# export TOMLEV_ENV_FILE="config/.env.production"
# Then just use:
config: AppConfig = TomlEv(AppConfig).validate()  # Uses env var defaults

# Access configuration with type safety
print(f"App: {config.app_name}")
print(f"Environment: {config.environment}")
print(f"Debug mode: {config.debug}")  # Automatically converted to bool

# Access nested configuration
db_host = config.database.host
db_port = config.database.port  # Automatically converted to int

# All properties are type-safe and validated
redis_host = config.redis.host
redis_port = config.redis.port  # Automatically converted to int
```

### Configuration Models

TomlEv uses `BaseConfigModel` to provide type-safe configuration handling. Here are the supported types:

#### Supported Types

- **Basic types**: `str`, `int`, `float`, `bool`
- **Collections**: `list[T]`, `dict[str, T]`, `set[T]`, `tuple[T, ...]` where T is any supported type
- **Complex collections**: `list[dict[str, Any]]` for lists of dictionaries
- **Nested models**: Other `BaseConfigModel` subclasses
- **Generic types**: `typing.Any` for flexible values

#### Advanced Example

```python
from typing import Any
from tomlev import BaseConfigModel, TomlEv


class QueryConfig(BaseConfigModel):
    get_version: str
    get_users: str


class DatabaseConfig(BaseConfigModel):
    host: str
    port: int
    user: str
    password: str
    name: str
    uri: str
    queries: dict[str, str]  # Dictionary of queries


class RedisConfig(BaseConfigModel):
    host: str
    port: int
    keys: list[str]  # List of strings
    nums: list[int]  # List of integers
    atts: list[dict[str, Any]]  # List of dictionaries
    tags: set[str]  # Set of unique strings
    coordinates: tuple[float, float, float]  # Tuple with fixed types
    weight: int
    mass: float


class AppConfig(BaseConfigModel):
    debug: bool
    environment: str
    temp: float

    database: DatabaseConfig
    redis: RedisConfig


# Usage with .env file support (uses defaults: "env.toml" and ".env")
config: AppConfig = TomlEv(
    AppConfig,
    "env.toml",  # Default TOML file
    ".env"  # Default .env file
).validate()

# Or simply use defaults
config: AppConfig = TomlEv(AppConfig).validate()
```

### CLI Usage

TomlEv also provides a small CLI to validate TOML configuration files with environment substitution, without writing Python code.

Validate using defaults (`env.toml` and `.env` in the current directory):

```shell
tomlev validate
```

Validate explicit files:

```shell
tomlev validate --toml path/to/app.toml --env-file path/to/.env
```

#### Setting Default File Paths via Environment Variables

You can set default file paths using environment variables, which is useful for CI/CD pipelines or containerized environments:

```shell
# Set default file paths
export TOMLEV_TOML_FILE="config/production.toml"
export TOMLEV_ENV_FILE="config/.env.production"

# Now these commands will use the environment variable defaults
tomlev validate
tomlev render
```

The precedence order is:
1. Explicit command-line arguments (highest priority)
2. Environment variables (`TOMLEV_TOML_FILE`, `TOMLEV_ENV_FILE`)
3. Hardcoded defaults (`env.toml`, `.env`)

Disable strict mode (missing variables do not fail):

```shell
tomlev validate --no-strict
```

Ignore the `.env` file or system environment variables:

```shell
tomlev validate --no-env-file         # do not read .env
tomlev validate --no-environ          # do not include process environment
```

Customize the default separator used in `${VAR|-default}` patterns (default is `|-`):

```shell
tomlev validate --separator "|-"
```

Exit codes: returns `0` on success, `1` on validation error (including missing files, substitution errors, or TOML parse errors). This makes it convenient to integrate into CI.

### File Includes

TomlEv supports a simple include mechanism to compose configs from smaller TOML fragments. Place a reserved key `__include` inside any table to include one or more TOML files into that table.

Basic syntax (paths are resolved relative to the referencing file):

```toml
# main.toml
[database]
__include = ["database.toml"]
```

Included file content is merged under the table where `__include` appears. For example:

```toml
# database.toml
host = "${DB_HOST|-localhost}"
port = "${DB_PORT|-5432}"

[nested]
flag = true
```

After expansion and substitution, the effective configuration is equivalent to:

```toml
[database]
host = "localhost"
port = 5432

[database.nested]
flag = true
```

Notes:
- `__include` can be a string or a list of strings: `__include = "file.toml"` or `__include = ["a.toml", "b.toml"]`.
- Includes are expanded using the same environment mapping and strict mode as the parent file.
- Merge rules: dictionaries are deep-merged; non-dicts (strings, numbers, booleans, lists) are replaced by later includes (last one wins).
- Strict mode: missing files and include cycles raise errors. In non-strict mode, they are skipped.
- The `__include` key is removed from the final configuration prior to model validation.

#### TOML File with Complex Types

```toml
debug = "${DEBUG|-false}"
environment = "${CI_ENVIRONMENT_SLUG|-develop}"
temp = "${TEMP_VAL|--20.5}"

[database]
host = "${DB_HOST|-localhost}"
port = "${DB_PORT|-5432}"
user = "${DB_USER}"
password = "${DB_PASSWORD}"
name = "${DB_NAME|-app_db}"
uri = "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST|-localhost}:${DB_PORT|-5432}/${DB_NAME|-app_db}"

[database.queries]
get_version = """SELECT version();"""
get_users = """SELECT * FROM "users";"""

[redis]
host = "${REDIS_HOST|-127.0.0.1}"
port = "${REDIS_PORT|-6379}"
keys = ["one", "two", "three"]
nums = [10, 12, 99]
atts = [{ name = "one", age = 10 }, { name = "two", age = 12 }]
tags = ["cache", "session", "cache", "metrics"]  # Will be deduplicated to set
coordinates = [52.5200, 13.4050, 100.0]  # Will be converted to tuple
weight = 0.98
mass = 0.78
```

### Strict mode

By default, TomlEv operates in strict mode, which means it will raise a `ValueError` if:

1. An environment variable referenced in the TOML file is not defined and has no default value
2. The same variable is defined multiple times in the .env file

This helps catch configuration errors early. You can disable strict mode in two ways:

```python
# Method 1: Set the environment variable TOMLEV_STRICT_DISABLE
import os

os.environ["TOMLEV_STRICT_DISABLE"] = "true"
config = TomlEv(AppConfig).validate()  # Uses defaults: "env.toml" and ".env"

# Method 2: Pass strict=False when creating the TomlEv instance
config = TomlEv(AppConfig, strict=False).validate()  # Uses defaults with strict=False
```

When strict mode is disabled, TomlEv will not raise errors for missing environment variables or duplicate definitions.

### Support

If you like **TomlEv**, please give it a star on GitHub: https://github.com/thesimj/tomlev

### License

MIT licensed. See the [LICENSE](LICENSE) file for more details.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "tomlev",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "config-management, configuration, environment-variables, python311, settings, toml, type-hints, type-safety, validation",
    "author": null,
    "author_email": "Nick Bubelich <m+github@bubelich.com>",
    "download_url": "https://files.pythonhosted.org/packages/fb/85/68c3ce96e380ace4a659b88d2bc68decc521fd834c2bf343ccc24cef8d1f/tomlev-1.0.6.tar.gz",
    "platform": null,
    "description": "<h2>\n    <p style=\"text-align: center;\">\n        TomlEv - Open-source Python framework to manage environment variables\n    </p>\n</h2>\n\n---\n[![Latest Version](https://badgen.net/pypi/v/tomlev)](https://pypi.python.org/pypi/tomlev/)\n[![Tomlev CI/CD Pipeline](https://github.com/thesimj/tomlev/actions/workflows/main.yml/badge.svg)](https://github.com/thesimj/tomlev/actions/workflows/main.yml)\n[![Coverage Status](https://badgen.net/coveralls/c/github/thesimj/tomlev)](https://coveralls.io/github/thesimj/tomlev?branch=main)\n![Versions](https://badgen.net/pypi/python/tomlev)\n[![Code Style: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![License](https://img.shields.io/pypi/l/tomlev.svg)](LICENSE)\n[![Downloads](https://static.pepy.tech/personalized-badge/tomlev?period=total&units=international_system&left_color=black&right_color=green&left_text=Downloads)](https://pepy.tech/project/tomlev)\n\n### Motivation\n\nTomlEv is a lightweight Python framework designed to simplify environment variable management using TOML configuration\nfiles with type-safe configuration models. It allows you to:\n\n- **Type-safe configuration**: Define configuration schemas using Python classes with type hints\n- **Automatic type conversion**: Convert environment variables to appropriate types (bool, int, float, str, lists,\n  dicts, sets, tuples)\n- **Nested configuration**: Support for complex nested configuration structures\n- **Environment variable substitution**: Reference environment variables in TOML files with `${VAR|-default}` syntax\n- **Validation**: Automatic validation of configuration structure and types\n- **AI coding agent ready**: Full type checking support makes configurations perfectly compatible with AI coding agents\n  and IDEs\n- **IDE support**: Complete IDE autocompletion and static type analysis support\n\n### Install\n\n```shell\n# pip\npip install tomlev\n```\n\n```shell\n# uv\nuv add tomlev\n```\n\n```shell\n# poetry\npoetry add tomlev\n```\n\n### Basic usage\n\n#### 1. Create a TOML configuration file\n\nCreate a TOML configuration file (`env.toml` by default):\n\n```toml\n# env.toml\napp_name = \"My Application\"\ndebug = \"${DEBUG|-false}\"\nenvironment = \"${ENV|-development}\"\n\n[database]\nhost = \"${DB_HOST|-localhost}\"\nport = \"${DB_PORT|-5432}\"\nuser = \"${DB_USER}\"\npassword = \"${DB_PASSWORD}\"\nname = \"${DB_NAME|-app_db}\"\n\n[redis]\nhost = \"${REDIS_HOST|-127.0.0.1}\"\nport = \"${REDIS_PORT|-6379}\"\n```\n\nOptionally include fragments inside a table using `__include` (paths are resolved relative to the TOML file):\n\n```toml\n# main.toml\n[features]\n__include = [\"features.toml\"]\n```\n\n```toml\n# features.toml (merged under [features])\nenabled = true\nname = \"awesome\"\n```\n\n#### 2. Define Configuration Models\n\nCreate configuration model classes that inherit from `BaseConfigModel`:\n\n```python\nfrom tomlev import BaseConfigModel, TomlEv\n\n\nclass DatabaseConfig(BaseConfigModel):\n    host: str\n    port: int\n    user: str\n    password: str\n    name: str\n\n\nclass RedisConfig(BaseConfigModel):\n    host: str\n    port: int\n\n\nclass FeaturesConfig(BaseConfigModel):\n    # Matches the content merged under [features] via __include\n    enabled: bool\n    name: str\n\n\nclass AppConfig(BaseConfigModel):\n    app_name: str\n    debug: bool\n    environment: str\n\n    database: DatabaseConfig\n    redis: RedisConfig\n    features: FeaturesConfig\n```\n\nTip: See the [File Includes](#file-includes) section for more details on `__include` usage and merge rules.\n\n#### 3. Use TomlEv in your Python code\n\n```python\nfrom tomlev import TomlEv\n\n# Load and validate configuration (using defaults: \"env.toml\" and \".env\")\nconfig: AppConfig = TomlEv(AppConfig).validate()\n\n# Or explicitly specify files (same as defaults)\nconfig: AppConfig = TomlEv(AppConfig, \"env.toml\", \".env\").validate()\n\n# You can also set defaults via environment variables\n# export TOMLEV_TOML_FILE=\"config/production.toml\"\n# export TOMLEV_ENV_FILE=\"config/.env.production\"\n# Then just use:\nconfig: AppConfig = TomlEv(AppConfig).validate()  # Uses env var defaults\n\n# Access configuration with type safety\nprint(f\"App: {config.app_name}\")\nprint(f\"Environment: {config.environment}\")\nprint(f\"Debug mode: {config.debug}\")  # Automatically converted to bool\n\n# Access nested configuration\ndb_host = config.database.host\ndb_port = config.database.port  # Automatically converted to int\n\n# All properties are type-safe and validated\nredis_host = config.redis.host\nredis_port = config.redis.port  # Automatically converted to int\n```\n\n### Configuration Models\n\nTomlEv uses `BaseConfigModel` to provide type-safe configuration handling. Here are the supported types:\n\n#### Supported Types\n\n- **Basic types**: `str`, `int`, `float`, `bool`\n- **Collections**: `list[T]`, `dict[str, T]`, `set[T]`, `tuple[T, ...]` where T is any supported type\n- **Complex collections**: `list[dict[str, Any]]` for lists of dictionaries\n- **Nested models**: Other `BaseConfigModel` subclasses\n- **Generic types**: `typing.Any` for flexible values\n\n#### Advanced Example\n\n```python\nfrom typing import Any\nfrom tomlev import BaseConfigModel, TomlEv\n\n\nclass QueryConfig(BaseConfigModel):\n    get_version: str\n    get_users: str\n\n\nclass DatabaseConfig(BaseConfigModel):\n    host: str\n    port: int\n    user: str\n    password: str\n    name: str\n    uri: str\n    queries: dict[str, str]  # Dictionary of queries\n\n\nclass RedisConfig(BaseConfigModel):\n    host: str\n    port: int\n    keys: list[str]  # List of strings\n    nums: list[int]  # List of integers\n    atts: list[dict[str, Any]]  # List of dictionaries\n    tags: set[str]  # Set of unique strings\n    coordinates: tuple[float, float, float]  # Tuple with fixed types\n    weight: int\n    mass: float\n\n\nclass AppConfig(BaseConfigModel):\n    debug: bool\n    environment: str\n    temp: float\n\n    database: DatabaseConfig\n    redis: RedisConfig\n\n\n# Usage with .env file support (uses defaults: \"env.toml\" and \".env\")\nconfig: AppConfig = TomlEv(\n    AppConfig,\n    \"env.toml\",  # Default TOML file\n    \".env\"  # Default .env file\n).validate()\n\n# Or simply use defaults\nconfig: AppConfig = TomlEv(AppConfig).validate()\n```\n\n### CLI Usage\n\nTomlEv also provides a small CLI to validate TOML configuration files with environment substitution, without writing Python code.\n\nValidate using defaults (`env.toml` and `.env` in the current directory):\n\n```shell\ntomlev validate\n```\n\nValidate explicit files:\n\n```shell\ntomlev validate --toml path/to/app.toml --env-file path/to/.env\n```\n\n#### Setting Default File Paths via Environment Variables\n\nYou can set default file paths using environment variables, which is useful for CI/CD pipelines or containerized environments:\n\n```shell\n# Set default file paths\nexport TOMLEV_TOML_FILE=\"config/production.toml\"\nexport TOMLEV_ENV_FILE=\"config/.env.production\"\n\n# Now these commands will use the environment variable defaults\ntomlev validate\ntomlev render\n```\n\nThe precedence order is:\n1. Explicit command-line arguments (highest priority)\n2. Environment variables (`TOMLEV_TOML_FILE`, `TOMLEV_ENV_FILE`)\n3. Hardcoded defaults (`env.toml`, `.env`)\n\nDisable strict mode (missing variables do not fail):\n\n```shell\ntomlev validate --no-strict\n```\n\nIgnore the `.env` file or system environment variables:\n\n```shell\ntomlev validate --no-env-file         # do not read .env\ntomlev validate --no-environ          # do not include process environment\n```\n\nCustomize the default separator used in `${VAR|-default}` patterns (default is `|-`):\n\n```shell\ntomlev validate --separator \"|-\"\n```\n\nExit codes: returns `0` on success, `1` on validation error (including missing files, substitution errors, or TOML parse errors). This makes it convenient to integrate into CI.\n\n### File Includes\n\nTomlEv supports a simple include mechanism to compose configs from smaller TOML fragments. Place a reserved key `__include` inside any table to include one or more TOML files into that table.\n\nBasic syntax (paths are resolved relative to the referencing file):\n\n```toml\n# main.toml\n[database]\n__include = [\"database.toml\"]\n```\n\nIncluded file content is merged under the table where `__include` appears. For example:\n\n```toml\n# database.toml\nhost = \"${DB_HOST|-localhost}\"\nport = \"${DB_PORT|-5432}\"\n\n[nested]\nflag = true\n```\n\nAfter expansion and substitution, the effective configuration is equivalent to:\n\n```toml\n[database]\nhost = \"localhost\"\nport = 5432\n\n[database.nested]\nflag = true\n```\n\nNotes:\n- `__include` can be a string or a list of strings: `__include = \"file.toml\"` or `__include = [\"a.toml\", \"b.toml\"]`.\n- Includes are expanded using the same environment mapping and strict mode as the parent file.\n- Merge rules: dictionaries are deep-merged; non-dicts (strings, numbers, booleans, lists) are replaced by later includes (last one wins).\n- Strict mode: missing files and include cycles raise errors. In non-strict mode, they are skipped.\n- The `__include` key is removed from the final configuration prior to model validation.\n\n#### TOML File with Complex Types\n\n```toml\ndebug = \"${DEBUG|-false}\"\nenvironment = \"${CI_ENVIRONMENT_SLUG|-develop}\"\ntemp = \"${TEMP_VAL|--20.5}\"\n\n[database]\nhost = \"${DB_HOST|-localhost}\"\nport = \"${DB_PORT|-5432}\"\nuser = \"${DB_USER}\"\npassword = \"${DB_PASSWORD}\"\nname = \"${DB_NAME|-app_db}\"\nuri = \"postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST|-localhost}:${DB_PORT|-5432}/${DB_NAME|-app_db}\"\n\n[database.queries]\nget_version = \"\"\"SELECT version();\"\"\"\nget_users = \"\"\"SELECT * FROM \"users\";\"\"\"\n\n[redis]\nhost = \"${REDIS_HOST|-127.0.0.1}\"\nport = \"${REDIS_PORT|-6379}\"\nkeys = [\"one\", \"two\", \"three\"]\nnums = [10, 12, 99]\natts = [{ name = \"one\", age = 10 }, { name = \"two\", age = 12 }]\ntags = [\"cache\", \"session\", \"cache\", \"metrics\"]  # Will be deduplicated to set\ncoordinates = [52.5200, 13.4050, 100.0]  # Will be converted to tuple\nweight = 0.98\nmass = 0.78\n```\n\n### Strict mode\n\nBy default, TomlEv operates in strict mode, which means it will raise a `ValueError` if:\n\n1. An environment variable referenced in the TOML file is not defined and has no default value\n2. The same variable is defined multiple times in the .env file\n\nThis helps catch configuration errors early. You can disable strict mode in two ways:\n\n```python\n# Method 1: Set the environment variable TOMLEV_STRICT_DISABLE\nimport os\n\nos.environ[\"TOMLEV_STRICT_DISABLE\"] = \"true\"\nconfig = TomlEv(AppConfig).validate()  # Uses defaults: \"env.toml\" and \".env\"\n\n# Method 2: Pass strict=False when creating the TomlEv instance\nconfig = TomlEv(AppConfig, strict=False).validate()  # Uses defaults with strict=False\n```\n\nWhen strict mode is disabled, TomlEv will not raise errors for missing environment variables or duplicate definitions.\n\n### Support\n\nIf you like **TomlEv**, please give it a star on GitHub: https://github.com/thesimj/tomlev\n\n### License\n\nMIT licensed. See the [LICENSE](LICENSE) file for more details.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Type-safe TOML configuration management with environment variable substitution and automatic validation for modern Python applications.",
    "version": "1.0.6",
    "project_urls": {
        "Bug Tracker": "https://github.com/thesimj/tomlev/issues",
        "Changelog": "https://github.com/thesimj/tomlev/blob/main/CHANGELOG.md",
        "Discussions": "https://github.com/thesimj/tomlev/discussions",
        "Documentation": "https://github.com/thesimj/tomlev/blob/main/README.md",
        "Funding": "https://github.com/sponsors/thesimj",
        "Homepage": "https://github.com/thesimj/tomlev",
        "Repository": "https://github.com/thesimj/tomlev",
        "Security": "https://github.com/thesimj/tomlev/security"
    },
    "split_keywords": [
        "config-management",
        " configuration",
        " environment-variables",
        " python311",
        " settings",
        " toml",
        " type-hints",
        " type-safety",
        " validation"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c94a2c02d29a22c4614da74444f7702cd5da72353628c1b700e915229e6dc6ee",
                "md5": "2e0ccf7944ef8e24ae8bb290ebd66890",
                "sha256": "d9294cb96c122ebb7c3267bdbdd813113a73812c72da9d046043791eaa2edec1"
            },
            "downloads": -1,
            "filename": "tomlev-1.0.6-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "2e0ccf7944ef8e24ae8bb290ebd66890",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 29952,
            "upload_time": "2025-10-09T09:25:36",
            "upload_time_iso_8601": "2025-10-09T09:25:36.733108Z",
            "url": "https://files.pythonhosted.org/packages/c9/4a/2c02d29a22c4614da74444f7702cd5da72353628c1b700e915229e6dc6ee/tomlev-1.0.6-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fb8568c3ce96e380ace4a659b88d2bc68decc521fd834c2bf343ccc24cef8d1f",
                "md5": "06dfdc7b7ceb14f350d710fb1fa66e91",
                "sha256": "02fc5a78d9c249461422bb70b2c3285d396804d5eb8d348c9d0991803b621e9c"
            },
            "downloads": -1,
            "filename": "tomlev-1.0.6.tar.gz",
            "has_sig": false,
            "md5_digest": "06dfdc7b7ceb14f350d710fb1fa66e91",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 143914,
            "upload_time": "2025-10-09T09:25:37",
            "upload_time_iso_8601": "2025-10-09T09:25:37.751439Z",
            "url": "https://files.pythonhosted.org/packages/fb/85/68c3ce96e380ace4a659b88d2bc68decc521fd834c2bf343ccc24cef8d1f/tomlev-1.0.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-09 09:25:37",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "thesimj",
    "github_project": "tomlev",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "lcname": "tomlev"
}
        
Elapsed time: 2.92638s