diff --git a/.gitignore b/.gitignore index cf46964..6a73c32 100644 --- a/.gitignore +++ b/.gitignore @@ -122,6 +122,9 @@ venv.bak/ # Rope project settings .ropeproject +# ruff +.ruff_cache/ + # mkdocs documentation /site diff --git a/asdf_pydantic/model.py b/asdf_pydantic/model.py index 638ed77..0bdc49a 100644 --- a/asdf_pydantic/model.py +++ b/asdf_pydantic/model.py @@ -62,8 +62,9 @@ def schema_asdf( --- $schema: {metaschema} id: {cls._tag} + tag: tag:{cls._tag.split('://', maxsplit=2)[-1]} """ ) - body = yaml.dump(cls.schema()) + body = yaml.safe_dump(cls.model_json_schema()) return header + body diff --git a/tests/examples/__init__.py b/tests/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/examples/test_rectangle.py b/tests/examples/test_rectangle.py new file mode 100644 index 0000000..b52ea49 --- /dev/null +++ b/tests/examples/test_rectangle.py @@ -0,0 +1,54 @@ +import asdf +from asdf.extension import Extension +from asdf.schema import check_schema, load_schema + +from asdf_pydantic import AsdfPydanticConverter +from asdf_pydantic.examples.shapes import AsdfRectangle + + +def setup_module(): + AsdfPydanticConverter.add_models(AsdfRectangle) + + class TestExtension(Extension): + extension_uri = "asdf://asdf-pydantic/examples/extensions/test-1.0.0" # type: ignore + + tags = [*AsdfPydanticConverter().tags] # type: ignore + converters = [AsdfPydanticConverter()] # type: ignore + + # HACK: The schema URI should be referenced from `AsdfRectangle._schema`. + # Then there should be a way to automatically add the schema to ASDF + # resources perhaps during AsdfPydanticConverter.add_models(). Further + # abstracting can be done later, perhaps defining a + # AsdfPydanticExtension. + asdf.get_config().add_resource_mapping( + { + "asdf://asdf-pydantic/shapes/schemas/rectangle-1.0.0": ( + AsdfRectangle.schema_asdf().encode("utf-8") + ) + } + ) + asdf.get_config().add_extension(TestExtension()) + + +def test_schema(): + schema = load_schema("asdf://asdf-pydantic/shapes/schemas/rectangle-1.0.0") + + check_schema(schema) + + assert schema["$schema"] == "http://stsci.edu/schemas/asdf/asdf-schema-1.0.0" + assert schema["title"] == "AsdfRectangle" + assert schema["id"] == "asdf://asdf-pydantic/examples/tags/rectangle-1.0.0" + assert schema["tag"] == "tag:asdf-pydantic/examples/tags/rectangle-1.0.0" + assert schema["type"] == "object" + assert schema["properties"] == { + "width": { + "type": "number", + "title": "Width", + }, + "height": { + "type": "number", + "title": "Height", + }, + } + + assert schema["required"] == ["width", "height"] diff --git a/tests/schema_validation_test.py b/tests/schema_validation_test.py index 041dfe2..f62ac0d 100644 --- a/tests/schema_validation_test.py +++ b/tests/schema_validation_test.py @@ -5,8 +5,8 @@ import pytest import yaml from asdf.extension import Extension -from asdf_pydantic import AsdfPydanticConverter +from asdf_pydantic import AsdfPydanticConverter from asdf_pydantic.examples.shapes import AsdfRectangle from asdf_pydantic.examples.tree import AsdfNode