jsonschema-fill-default


Namejsonschema-fill-default JSON
Version 0.2.1.20250710 PyPI version JSON
download
home_pageNone
SummaryFill a JSON instance with the missing defaults from its JSON Schema Draft 2020-12-valid schema
upload_time2025-07-10 20:47:44
maintainerLars Maxfield
docs_urlNone
authorLars Maxfield
requires_python<4.0,>=3.9
licenseMIT
keywords jsonschema default nested
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # jsonschema-fill-default

Fill a JSON instance in Python with the missing defaults from its [JSON Schema](https://json-schema.org/) [Draft 2020-12](https://json-schema.org/draft/2020-12)-valid schema.

```python
from jsonschema_fill_default import fill_default

schema = {
    "properties": {
        "text": {"default": "Hello"},
        "font": {"default": 12},
    }
}

instance = {"text": "Goodbye"}

fill_default(instance, schema)  # Mutates instance!
```
```python
>>> instance
    {
        "text": "Goodbye",
        "font": 12
    }
```

> [!CAUTION]
> Filled instances are not automatically validated.
>
> See [Load, validate, deference, fill](#load-validate-dereference-fill) for how you can validate instances and schemas.


## Install

`jsonschema-fill-default` is available on [`PyPI`](https://pypi.org/project/jsonschema-fill-default/). You can install using [`pip`](https://pip.pypa.io/en/stable/):

```command
pip install jsonschema-fill-default
```

## Features

- Fills all missing defaults, including nested ones.

- Optionally [do *not* create missing parents](#do-not-create-missing-parents-with-nested-defaults) when filling.

- Uses the first applicable default if multiple defaults exist for a single property.

- Works with the following keywords and any combination thereof (see [examples](#examples) for details):
  - `"properties"`
  - `"allOf"`
  - `"anyOf"`
  - `"oneOf"`
  - `"dependentSchemas"`
  - `"if-then(-else)"`
  - `"prefixItems"`
  - `"items"`

> [!IMPORTANT]
> - The instance must already be valid to its schema.
> - The schema itself must be a valid [Draft 2020-12](https://json-schema.org/draft/2020-12) [JSON Schema](https://json-schema.org/).
> - The filled instance is **not automatically validated**.


## Examples


### Load, validate, dereference, fill

See unabridged script at [examples/load_validate_dereference_fill.py](https://github.com/larsmaxfield/jsonschema-fill-default/blob/main/examples/load_validate_dereference_fill.py).

```python
import json

from jsonschema import validate, protocols
from jsonref import replace_refs
from jsonschema_fill_default import fill_default


schema_filename = "bicycle.schema.json"
instance = {
    "style": "road",
    "color": "purple",
    "tire": {
        "width": 28
    }
}

with open(schema_filename, 'r') as file:
    schema = json.load(file)

protocols.Validator.check_schema(schema)  # Validate schema
validate(instance, schema)  # Validate instance against schema

schema = replace_refs(schema) # De-reference schema "$refs"

fill_default(instance, schema)  # Fill instance (mutates)

validate(instance, schema)  # Validate filled instance

print(f"\nFilled:\n{json.dumps(instance, indent=4)}")
```

### Nested defaults

```python
from jsonschema_fill_default import fill_default

schema = {
    "properties": {
        "someString": {"default": "The default string"},
        "someObject": {
            "properties": {
                "someNumber": {"default": 3.14},
                "someBoolean": {"default": True}}}}}

instance = {
    "someObject": {
        "someNumber": -1
    }
}

fill_default(instance, schema)
```
```python
original
    {
        "someObject": {
            "someNumber": -1
        }
    }

filled
    {
        "someString": "The default string",
        "someObject": {
            "someNumber": -1,
            "someBoolean": True
        }
    }
```


### Do not create missing parents with nested defaults

```python
from jsonschema_fill_default import fill_default, FillConfig

schema = {
    "properties": {
        "pool": {
            "properties": {
                "max_connections": {"type": "int", "default": 8},
                "min_connections": {"type": "int", "default": 0}
            }
        }
    }
}

config = FillConfig(create_missing_parents=False)

missing = {}
fill_default(missing, schema, config)
assert missing == {}, missing

empty = {"pool": {}}
fill_default(empty, schema, config)
assert empty == {"pool": {"max_connections": 8, "min_connections": 0}}, empty
```


### Conditional properties with defaults with `"dependentSchemas"`

```python
from jsonschema_fill_default import fill_default

schema = {
    "properties": {"some_number": {"default": 100}},
    "dependentSchemas": {
        "some_bool": {
            "properties": {
              "some_string": {"default": "some_bool given"}}}}}

without_bool = {}
with_bool = {"some_bool": False}

fill_default(without_bool, schema)`
fill_default(with_bool, schema)
```
```python
original  {}
filled    {"some_number": 100}

original
    {
        "some_bool": False
    }
filled
    {
        "some_number": 100,
        "some_bool": False,
        "some_string": "some_bool given"
    }
```


### Conditional defaults with `"if-then-else"`

```python
from jsonschema_fill_default import fill_default

schema = {
    "if": {
        "required": ["someInteger"]
    },
    "then": {
        "if": {
            "properties": {
                "someInteger": {"multipleOf": 2}
            }
        },
        "then": {"properties": {
            "conditionalString": {"default": "Even integer"}
        }},
        "else": {"properties": {
            "conditionalString": {"default": "Odd integer"}
        }}
    },
    "else": {"properties": {
        "conditionalString": {"default": "someInteger not given"}
    }}
}

none = {}
odd = {"someInteger": 3}
even = {"someInteger": 4}

fill_default(none, schema)
fill_default(odd, schema)
fill_default(even, schema)
```
```python
original  {}
filled    {"conditionalString": "someInteger not given"}

original  {"someInteger": 3}
filled    {"someInteger": 3, "conditionalString": "Odd integer"}

original  {"someInteger": 4}
filled    {"someInteger": 4, "conditionalString": "Even integer"}
```

### Different properties and defaults with `"oneOf"`

```python
from jsonschema_fill_default import fill_default

schema = {
    "unevaluatedProperties": False,
    "oneOf": [
        {
            "additionalProperties": False,
            "properties": {
                "food": {"enum": ["cake", "taco"]},
                "price": {"default": 9.95}
            },
            "required": ["food"]
        },
        {
            "additionalProperties": False,
            "properties": {
                "activity": {
                    "enum": ["walk", "talk", "eat"]
                },
                "duration": {
                    "default": 30
                }
            },
            "required": ["activity"]
        }
    ],
}

A = {"food": "cake"}
B = {"activity": "eat"}

fill_default(A, schema)
fill_default(B, schema)
```
```python
original  {"food": "cake"}
filled    {"food": "cake", "price": 9.95}


original  {"activity": "eat"}
filled    {"activity": "eat", "duration": 30}
```

### Fill array defaults with `"prefixItems"` and `"items"`

```python
from jsonschema_fill_default import fill_default

schema = {
    "type": "array",
    "prefixItems": [
        {"type": "number"},
        {"type": "string"},
        {"enum": ["Street", "Avenue", "Drive"], "default": "Drive"}
    ],
    "items": {
        "type": "object",
        "properties": {
            "name": {"type": "string"},
            "age": {"type": "integer", "default": 11}
        },
        "required": ["name"]
    }
}

a = [4, "Privet"]
fill_default(a, schema)
```
```python
# Missing prefixItems are only filled if there are only default-resolving prefixItem schemas remaining.

original  [4]
filled    [4]

original  [4, "Privet"]
filled    [4, "Privet", "Drive"]


# Existing prefixItems and items are filled

original  [4, "Privet", "Drive",
           {"name": "Harry"},
           {"name": "Dudley"}]
filled    [4, "Privet", "Drive",
           {"name": "Harry", "age": 11},
           {"name": "Dudley", "age": 11}]


original  [1428, "Elm", "Street"]
filled    [1428, "Elm", "Street"]
```

## Developers

### Development environment with `conda` and `poetry`

I use `conda` to create a virtual environment with Python, `pip`, and `poetry`.

I then add the dependencies using `poetry install`, which automatically adds them to that `conda` environment.

Here's how:

#### 1. Clone the repo

#### 2. Create and activate a virtual environment using `conda`

For example, create and activate a virtual environment `env` in the root of the project repo using `requirements.dev.txt` as reference:

```
cd /root/of/this/repo
conda env create --prefix ./env python=3.9
conda activate ./env
pip install poetry==1.8.5
```

I don't use an `environment.yml` to solve and install the `conda` environment because it's typically slower than just running the above "manual" install.

#### 3. Install `poetry` dependencies

```
poetry install
```

#### 4. Use

Once set up, you can use the development environment in the future by simply activating the `conda` environment.

If you used the example above, that would be:

```
cd /root/of/this/repo
conda activate ./env
```

### How to release

1. Checkout branch 
2. Update version X.Y.Z.YYYYMMDD in `pyproject.toml`
    - Bump X.Y.Z according to semantic versioning 2.0.0
    - Set YYYYMMDD according to current UTC date
4. Update `poetry.lock` with `poetry update`
5. Push changes
6. Merge with main
7. Create release with title and tag `vX.Y.Z.YYYYMMDD` (prepend `v` in both)
8. PyPI is automatically published


### Paradigms

#### Use the top-level `__init__.py` to declare a 'public' API for the module

_From [this post](https://www.reddit.com/r/Python/comments/1bbbwk/comment/c95cjs5/) by reostra:_

> For example, having
> 
> ```
> stuff/
>   __init__.py
>   bigstuff.py
>     Stuffinator()
>     Stuffinatrix()
>   privateStuff.py
> ```
> 
> where **init**.py contains
> 
> ```
> from .bigstuff import Stuffinator, Stuffinatrix
> ```
> 
> and thereby users can import those with
> 
> ```
> from stuff import Stuffinator, Stuffinatrix
> ```
> 
> which essentially says that stuff.Stuffinator and stuff.Stuffinatrix are the only parts of the module intended for public use.
> 
> While there's nothing stopping people from doing an 'import stuff.bigstuff.Stuffometer' or 'import stuff.privateStuff.HiddenStuff', they'll at least know they're peeking behind the curtain at that point.
> 
> Rather than being implicit, I find it's rather explicit.
> 


## Credits

jsonschema-fill-default is by Lars Maxfield

Recursive filling of `"properties"` based on [Tom-tbt](https://stackoverflow.com/users/10712860/tom-tbt)'s answer to [Set default values according to JSON schema automatically](https://stackoverflow.com/questions/72044825/set-default-values-according-to-json-schema-automatically) on Stack Overflow.


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "jsonschema-fill-default",
    "maintainer": "Lars Maxfield",
    "docs_url": null,
    "requires_python": "<4.0,>=3.9",
    "maintainer_email": null,
    "keywords": "jsonschema, default, nested",
    "author": "Lars Maxfield",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/32/e3/6d09e6a1ea10c916a280c67c7551c7abaf810b1fed0dbc1bd45903444b15/jsonschema_fill_default-0.2.1.20250710.tar.gz",
    "platform": null,
    "description": "# jsonschema-fill-default\n\nFill a JSON instance in Python with the missing defaults from its [JSON Schema](https://json-schema.org/) [Draft 2020-12](https://json-schema.org/draft/2020-12)-valid schema.\n\n```python\nfrom jsonschema_fill_default import fill_default\n\nschema = {\n    \"properties\": {\n        \"text\": {\"default\": \"Hello\"},\n        \"font\": {\"default\": 12},\n    }\n}\n\ninstance = {\"text\": \"Goodbye\"}\n\nfill_default(instance, schema)  # Mutates instance!\n```\n```python\n>>> instance\n    {\n        \"text\": \"Goodbye\",\n        \"font\": 12\n    }\n```\n\n> [!CAUTION]\n> Filled instances are not automatically validated.\n>\n> See [Load, validate, deference, fill](#load-validate-dereference-fill) for how you can validate instances and schemas.\n\n\n## Install\n\n`jsonschema-fill-default` is available on [`PyPI`](https://pypi.org/project/jsonschema-fill-default/). You can install using [`pip`](https://pip.pypa.io/en/stable/):\n\n```command\npip install jsonschema-fill-default\n```\n\n## Features\n\n- Fills all missing defaults, including nested ones.\n\n- Optionally [do *not* create missing parents](#do-not-create-missing-parents-with-nested-defaults) when filling.\n\n- Uses the first applicable default if multiple defaults exist for a single property.\n\n- Works with the following keywords and any combination thereof (see [examples](#examples) for details):\n  - `\"properties\"`\n  - `\"allOf\"`\n  - `\"anyOf\"`\n  - `\"oneOf\"`\n  - `\"dependentSchemas\"`\n  - `\"if-then(-else)\"`\n  - `\"prefixItems\"`\n  - `\"items\"`\n\n> [!IMPORTANT]\n> - The instance must already be valid to its schema.\n> - The schema itself must be a valid [Draft 2020-12](https://json-schema.org/draft/2020-12) [JSON Schema](https://json-schema.org/).\n> - The filled instance is **not automatically validated**.\n\n\n## Examples\n\n\n### Load, validate, dereference, fill\n\nSee unabridged script at [examples/load_validate_dereference_fill.py](https://github.com/larsmaxfield/jsonschema-fill-default/blob/main/examples/load_validate_dereference_fill.py).\n\n```python\nimport json\n\nfrom jsonschema import validate, protocols\nfrom jsonref import replace_refs\nfrom jsonschema_fill_default import fill_default\n\n\nschema_filename = \"bicycle.schema.json\"\ninstance = {\n    \"style\": \"road\",\n    \"color\": \"purple\",\n    \"tire\": {\n        \"width\": 28\n    }\n}\n\nwith open(schema_filename, 'r') as file:\n    schema = json.load(file)\n\nprotocols.Validator.check_schema(schema)  # Validate schema\nvalidate(instance, schema)  # Validate instance against schema\n\nschema = replace_refs(schema) # De-reference schema \"$refs\"\n\nfill_default(instance, schema)  # Fill instance (mutates)\n\nvalidate(instance, schema)  # Validate filled instance\n\nprint(f\"\\nFilled:\\n{json.dumps(instance, indent=4)}\")\n```\n\n### Nested defaults\n\n```python\nfrom jsonschema_fill_default import fill_default\n\nschema = {\n    \"properties\": {\n        \"someString\": {\"default\": \"The default string\"},\n        \"someObject\": {\n            \"properties\": {\n                \"someNumber\": {\"default\": 3.14},\n                \"someBoolean\": {\"default\": True}}}}}\n\ninstance = {\n    \"someObject\": {\n        \"someNumber\": -1\n    }\n}\n\nfill_default(instance, schema)\n```\n```python\noriginal\n    {\n        \"someObject\": {\n            \"someNumber\": -1\n        }\n    }\n\nfilled\n    {\n        \"someString\": \"The default string\",\n        \"someObject\": {\n            \"someNumber\": -1,\n            \"someBoolean\": True\n        }\n    }\n```\n\n\n### Do not create missing parents with nested defaults\n\n```python\nfrom jsonschema_fill_default import fill_default, FillConfig\n\nschema = {\n    \"properties\": {\n        \"pool\": {\n            \"properties\": {\n                \"max_connections\": {\"type\": \"int\", \"default\": 8},\n                \"min_connections\": {\"type\": \"int\", \"default\": 0}\n            }\n        }\n    }\n}\n\nconfig = FillConfig(create_missing_parents=False)\n\nmissing = {}\nfill_default(missing, schema, config)\nassert missing == {}, missing\n\nempty = {\"pool\": {}}\nfill_default(empty, schema, config)\nassert empty == {\"pool\": {\"max_connections\": 8, \"min_connections\": 0}}, empty\n```\n\n\n### Conditional properties with defaults with `\"dependentSchemas\"`\n\n```python\nfrom jsonschema_fill_default import fill_default\n\nschema = {\n    \"properties\": {\"some_number\": {\"default\": 100}},\n    \"dependentSchemas\": {\n        \"some_bool\": {\n            \"properties\": {\n              \"some_string\": {\"default\": \"some_bool given\"}}}}}\n\nwithout_bool = {}\nwith_bool = {\"some_bool\": False}\n\nfill_default(without_bool, schema)`\nfill_default(with_bool, schema)\n```\n```python\noriginal  {}\nfilled    {\"some_number\": 100}\n\noriginal\n    {\n        \"some_bool\": False\n    }\nfilled\n    {\n        \"some_number\": 100,\n        \"some_bool\": False,\n        \"some_string\": \"some_bool given\"\n    }\n```\n\n\n### Conditional defaults with `\"if-then-else\"`\n\n```python\nfrom jsonschema_fill_default import fill_default\n\nschema = {\n    \"if\": {\n        \"required\": [\"someInteger\"]\n    },\n    \"then\": {\n        \"if\": {\n            \"properties\": {\n                \"someInteger\": {\"multipleOf\": 2}\n            }\n        },\n        \"then\": {\"properties\": {\n            \"conditionalString\": {\"default\": \"Even integer\"}\n        }},\n        \"else\": {\"properties\": {\n            \"conditionalString\": {\"default\": \"Odd integer\"}\n        }}\n    },\n    \"else\": {\"properties\": {\n        \"conditionalString\": {\"default\": \"someInteger not given\"}\n    }}\n}\n\nnone = {}\nodd = {\"someInteger\": 3}\neven = {\"someInteger\": 4}\n\nfill_default(none, schema)\nfill_default(odd, schema)\nfill_default(even, schema)\n```\n```python\noriginal  {}\nfilled    {\"conditionalString\": \"someInteger not given\"}\n\noriginal  {\"someInteger\": 3}\nfilled    {\"someInteger\": 3, \"conditionalString\": \"Odd integer\"}\n\noriginal  {\"someInteger\": 4}\nfilled    {\"someInteger\": 4, \"conditionalString\": \"Even integer\"}\n```\n\n### Different properties and defaults with `\"oneOf\"`\n\n```python\nfrom jsonschema_fill_default import fill_default\n\nschema = {\n    \"unevaluatedProperties\": False,\n    \"oneOf\": [\n        {\n            \"additionalProperties\": False,\n            \"properties\": {\n                \"food\": {\"enum\": [\"cake\", \"taco\"]},\n                \"price\": {\"default\": 9.95}\n            },\n            \"required\": [\"food\"]\n        },\n        {\n            \"additionalProperties\": False,\n            \"properties\": {\n                \"activity\": {\n                    \"enum\": [\"walk\", \"talk\", \"eat\"]\n                },\n                \"duration\": {\n                    \"default\": 30\n                }\n            },\n            \"required\": [\"activity\"]\n        }\n    ],\n}\n\nA = {\"food\": \"cake\"}\nB = {\"activity\": \"eat\"}\n\nfill_default(A, schema)\nfill_default(B, schema)\n```\n```python\noriginal  {\"food\": \"cake\"}\nfilled    {\"food\": \"cake\", \"price\": 9.95}\n\n\noriginal  {\"activity\": \"eat\"}\nfilled    {\"activity\": \"eat\", \"duration\": 30}\n```\n\n### Fill array defaults with `\"prefixItems\"` and `\"items\"`\n\n```python\nfrom jsonschema_fill_default import fill_default\n\nschema = {\n    \"type\": \"array\",\n    \"prefixItems\": [\n        {\"type\": \"number\"},\n        {\"type\": \"string\"},\n        {\"enum\": [\"Street\", \"Avenue\", \"Drive\"], \"default\": \"Drive\"}\n    ],\n    \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n            \"name\": {\"type\": \"string\"},\n            \"age\": {\"type\": \"integer\", \"default\": 11}\n        },\n        \"required\": [\"name\"]\n    }\n}\n\na = [4, \"Privet\"]\nfill_default(a, schema)\n```\n```python\n# Missing prefixItems are only filled if there are only default-resolving prefixItem schemas remaining.\n\noriginal  [4]\nfilled    [4]\n\noriginal  [4, \"Privet\"]\nfilled    [4, \"Privet\", \"Drive\"]\n\n\n# Existing prefixItems and items are filled\n\noriginal  [4, \"Privet\", \"Drive\",\n           {\"name\": \"Harry\"},\n           {\"name\": \"Dudley\"}]\nfilled    [4, \"Privet\", \"Drive\",\n           {\"name\": \"Harry\", \"age\": 11},\n           {\"name\": \"Dudley\", \"age\": 11}]\n\n\noriginal  [1428, \"Elm\", \"Street\"]\nfilled    [1428, \"Elm\", \"Street\"]\n```\n\n## Developers\n\n### Development environment with `conda` and `poetry`\n\nI use `conda` to create a virtual environment with Python, `pip`, and `poetry`.\n\nI then add the dependencies using `poetry install`, which automatically adds them to that `conda` environment.\n\nHere's how:\n\n#### 1. Clone the repo\n\n#### 2. Create and activate a virtual environment using `conda`\n\nFor example, create and activate a virtual environment `env` in the root of the project repo using `requirements.dev.txt` as reference:\n\n```\ncd /root/of/this/repo\nconda env create --prefix ./env python=3.9\nconda activate ./env\npip install poetry==1.8.5\n```\n\nI don't use an `environment.yml` to solve and install the `conda` environment because it's typically slower than just running the above \"manual\" install.\n\n#### 3. Install `poetry` dependencies\n\n```\npoetry install\n```\n\n#### 4. Use\n\nOnce set up, you can use the development environment in the future by simply activating the `conda` environment.\n\nIf you used the example above, that would be:\n\n```\ncd /root/of/this/repo\nconda activate ./env\n```\n\n### How to release\n\n1. Checkout branch \n2. Update version X.Y.Z.YYYYMMDD in `pyproject.toml`\n    - Bump X.Y.Z according to semantic versioning 2.0.0\n    - Set YYYYMMDD according to current UTC date\n4. Update `poetry.lock` with `poetry update`\n5. Push changes\n6. Merge with main\n7. Create release with title and tag `vX.Y.Z.YYYYMMDD` (prepend `v` in both)\n8. PyPI is automatically published\n\n\n### Paradigms\n\n#### Use the top-level `__init__.py` to declare a 'public' API for the module\n\n_From [this post](https://www.reddit.com/r/Python/comments/1bbbwk/comment/c95cjs5/) by reostra:_\n\n> For example, having\n> \n> ```\n> stuff/\n>   __init__.py\n>   bigstuff.py\n>     Stuffinator()\n>     Stuffinatrix()\n>   privateStuff.py\n> ```\n> \n> where **init**.py contains\n> \n> ```\n> from .bigstuff import Stuffinator, Stuffinatrix\n> ```\n> \n> and thereby users can import those with\n> \n> ```\n> from stuff import Stuffinator, Stuffinatrix\n> ```\n> \n> which essentially says that stuff.Stuffinator and stuff.Stuffinatrix are the only parts of the module intended for public use.\n> \n> While there's nothing stopping people from doing an 'import stuff.bigstuff.Stuffometer' or 'import stuff.privateStuff.HiddenStuff', they'll at least know they're peeking behind the curtain at that point.\n> \n> Rather than being implicit, I find it's rather explicit.\n> \n\n\n## Credits\n\njsonschema-fill-default is by Lars Maxfield\n\nRecursive filling of `\"properties\"` based on [Tom-tbt](https://stackoverflow.com/users/10712860/tom-tbt)'s answer to [Set default values according to JSON schema automatically](https://stackoverflow.com/questions/72044825/set-default-values-according-to-json-schema-automatically) on Stack Overflow.\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Fill a JSON instance with the missing defaults from its JSON Schema Draft 2020-12-valid schema",
    "version": "0.2.1.20250710",
    "project_urls": {
        "Repository": "https://github.com/larsmaxfield/jsonschema-fill-default"
    },
    "split_keywords": [
        "jsonschema",
        " default",
        " nested"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5efc4b91d439897b323d2dcdb1f5a0ea1cc5ae9b73c724fa530f252737efbb6c",
                "md5": "42cd3aa6793c196cb89ce0b82ae912db",
                "sha256": "85fe2051d9d387e28e554ad206d3cac4bab59da576b5e0e352438cd2a160a382"
            },
            "downloads": -1,
            "filename": "jsonschema_fill_default-0.2.1.20250710-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "42cd3aa6793c196cb89ce0b82ae912db",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.9",
            "size": 8193,
            "upload_time": "2025-07-10T20:47:42",
            "upload_time_iso_8601": "2025-07-10T20:47:42.768344Z",
            "url": "https://files.pythonhosted.org/packages/5e/fc/4b91d439897b323d2dcdb1f5a0ea1cc5ae9b73c724fa530f252737efbb6c/jsonschema_fill_default-0.2.1.20250710-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "32e36d09e6a1ea10c916a280c67c7551c7abaf810b1fed0dbc1bd45903444b15",
                "md5": "82242d0eea0d19ecaa5e223b84f6fde7",
                "sha256": "b4291e74fe84af6e574b06c463dd0ba9f01422b2dab079b0d193eab8033b4782"
            },
            "downloads": -1,
            "filename": "jsonschema_fill_default-0.2.1.20250710.tar.gz",
            "has_sig": false,
            "md5_digest": "82242d0eea0d19ecaa5e223b84f6fde7",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.9",
            "size": 7149,
            "upload_time": "2025-07-10T20:47:44",
            "upload_time_iso_8601": "2025-07-10T20:47:44.116424Z",
            "url": "https://files.pythonhosted.org/packages/32/e3/6d09e6a1ea10c916a280c67c7551c7abaf810b1fed0dbc1bd45903444b15/jsonschema_fill_default-0.2.1.20250710.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-10 20:47:44",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "larsmaxfield",
    "github_project": "jsonschema-fill-default",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "jsonschema-fill-default"
}
        
Elapsed time: 1.53048s