# 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"
}