From 55de89a3e32ffed117b39d0e5d93a8dd334d283a Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Mon, 12 Jun 2023 07:10:17 -0600 Subject: [PATCH] Make Url and MultiHostUrl subclassable (#660) --- src/url.rs | 4 ++-- tests/serializers/test_url.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/url.rs b/src/url.rs index 027b9f60f3..0414ae0ba0 100644 --- a/src/url.rs +++ b/src/url.rs @@ -12,7 +12,7 @@ use crate::SchemaValidator; static SCHEMA_DEFINITION_URL: GILOnceCell = GILOnceCell::new(); -#[pyclass(name = "Url", module = "pydantic_core._pydantic_core")] +#[pyclass(name = "Url", module = "pydantic_core._pydantic_core", subclass)] #[derive(Clone)] #[cfg_attr(debug_assertions, derive(Debug))] pub struct PyUrl { @@ -147,7 +147,7 @@ impl PyUrl { } } -#[pyclass(name = "MultiHostUrl", module = "pydantic_core._pydantic_core")] +#[pyclass(name = "MultiHostUrl", module = "pydantic_core._pydantic_core", subclass)] #[derive(Clone)] #[cfg_attr(debug_assertions, derive(Debug))] pub struct PyMultiHostUrl { diff --git a/tests/serializers/test_url.py b/tests/serializers/test_url.py index b8a3de2e63..1983154749 100644 --- a/tests/serializers/test_url.py +++ b/tests/serializers/test_url.py @@ -86,3 +86,13 @@ def test_custom_serializer(): multi_host_url = MultiHostUrl('https://ex.com,ex.org/path') assert s.to_python(multi_host_url) == multi_host_url + + +@pytest.mark.parametrize('base_class', [Url, MultiHostUrl]) +def test_url_subclass(base_class): + class MyUrl(base_class): + def some_method(self): + return self.path + '-success' + + m = MyUrl('http://ex.com/path') + assert m.some_method() == '/path-success'