Automatic type annotations from JSON schemas
Project description
JSON Schema-powered type annotations
This package provides a way to automatically produce type annotations based
on jsonschema
-schemas.
Not all concepts covered by jsonschema
are expressible within Python typing annotations. However, most things
will work like you'd expect. Most types are translated trivially
(integer
, number
, string
, array
, boolean
and null
).
The interesting type is object
, which is translated into a TypedDict
.
Warning: This is based on the mypy plugin system, which is stated to have no backwards compatibility guarantee. New versions of mypy might not be supported immediately.
Example
A JSON schema:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://foo.qwerty/some/schema#",
"title": "Foo Schema",
"type": "object",
"properties": {
"title": {
"type": "string"
},
"awesome": {
"type": "number"
}
},
"required": ["title"]
}
A TypedDict:
from typing import TYPE_CHECKING
from jsonschema_typed import JSONSchema
data: JSONSchema["path/to/schema.json"] = {"title": "baz"}
if TYPE_CHECKING:
reveal_type(data) # Revealed type is 'TypedDict('FooSchema', {'title': builtins.str,
# 'awesome'?: Union[builtins.int, builtins.float]})'
data["description"] = "there is no description" # TypedDict "FooSchema" has no key 'description'
data["awesome"] = 42
data["awesome"] = None # Argument 2 has incompatible type "None"; expected "Union[int, float]"
You can also get types of parts of a schema, as well as types of elements in arrays. Take a look at the test cases for more examples of usage.
Installation
pip install jsonschema-typed
You also need to enable the plugin(s) in your mypy.ini
configuration file:
# mypy.ini
[mypy]
plugins = jsonschema_typed.plugin, jsonschema_typed.optional_typed_dict
# Due to a quirk of how these type hints are generated, mypy's caching breaks.
# Disabling caching might be required.
cache_dir = /dev/null
Requirements
The above installations resolves the dependencies, which consist of mypy
and jsonschema
(naturally).
Testing has been done with versions:
- mypy==0.761
- jsonschema==3.2.0
Probably some older versions will also work. Report an issue if you need other versions.
Limitations
additionalProperties
doesn't really have an equivalent in TypedDict.- The
default
keyword is not supported; but see: https://github.com/python/mypy/issues/6131. - Self-references (e.g.
"#"
) can't really work properly until nested forward-references are supported; see: https://github.com/python/mypy/issues/731.
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 Distributions
Built Distribution
Hashes for jsonschema_typed-0.8.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 52509fa251b390b56576be5a837382d6b8c60fab1ded4f235f0202b4af45006e |
|
MD5 | fe5919f5d38a4474320c5f2858c67a5b |
|
BLAKE2b-256 | fd396380d9561d071114ed02ea738ed90f0c85e6a96e9cad883922e3fef68bb8 |