0

I have some jsonschema for a dictionary Resource, containing a $defs PartialResource.

{
    "title": "resource",
    "type": "object",
    "allOf": [
        { "$ref": "#/$defs/PartialResource" }
    ],
    "$defs": {
        "PartialResource": {
            "title": "partial_resource",
            "properties": {
                "spec": {
                    "title": "spec",
                    "type": "string"
                },
                "resource_kwargs": {
                    "title": "resource_kwargs",
                    "type": "object"
                },
                "resource_path": {
                    "title": "resource_path",
                    "type": "string"
                },
                "root": {
                    "title": "root",
                    "type": "string"
                },
                "uid": {
                    "title": "uid",
                    "type": "string"
                }
            },
            "required": [
                "resource_kwargs",
                "resource_path",
                "root",
                "spec",
                "uid"
            ]
        }
    },
    "properties": {
        "path_semantics": {
            "title": "path_semantics",
            "type": "string",
            "enum": [
                "posix",
                "windows"
            ]
        },
        "run_start": {
            "title": "run_start",
            "type": "string"
        }
    },
    "additionalProperties": false
}

It's structured this way so that datamodel-codegen can generate two TypedDicts, which it correctly does:

class PartialResource(TypedDict):
    spec: str
    resource_kwargs: Dict[str, Any]
    resource_path: str
    root: str
    uid: str


class Resource(PartialResource):
    path_semantics: NotRequired[Literal["posix", "windows"]]
    run_start: NotRequired[str]

When I actually try to use the schema with the jsonschema Draft202012Validator it doesn't seem to use the PartialResource definition:

    {'path_semantics': 'posix',
     'uid': 'e0fc15fc-3dd3-4822-848c-76f84585202d',
     'spec': 'DUMMY',
     'root': '/placeholder/path',
     'resource_kwargs': {'a': 1, 'b': 2},
     'resource_path': 'stack.tiff',
     'run_start': '8172473c-fec5-4baf-b28a-73bc4ada3bc5'}

fails with

jsonschema.exceptions.ValidationError: Additional properties are not allowed ('resource_kwargs', 'resource_path', 'root', 'spec', 'uid' were unexpected)

1 Answer 1

0

If you're using Draft-2020-12, change this line.

additionalProperties: false to unevaluatedProperties: false

allOf and additionaProperties don't really work well together with the way you are trying to use it.

If you just use a $ref without the allOf, does your generator create two classes?

{
  "$ref": "#/$defs/PartialResource"
}
Sign up to request clarification or add additional context in comments.

1 Comment

unevaluatedProperties in the subschema worked a treat, thank you! Without the allOf the converter will create the output file containing both definitions, however it won't add the inheritance.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.