From 8f1a46325c1442635cbf4c908009fae70839193a Mon Sep 17 00:00:00 2001 From: Adam Lastowka Date: Wed, 25 Feb 2026 15:13:33 -0500 Subject: [PATCH 1/5] Widen AdminLevel from uint8 to int32 --- .../src/overture/schema/divisions/types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py index 621cfc416..79c69873d 100644 --- a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py +++ b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py @@ -3,14 +3,14 @@ from pydantic import Field from overture.schema.system.field_constraint import UniqueItemsConstraint -from overture.schema.system.primitive import uint8 +from overture.schema.system.primitive import int32 from .models import HierarchyItem AdminLevel = NewType( "AdminLevel", Annotated[ - uint8, + int32, Field( description="Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", ), From 05a421d8a254a0593855402da9cfadc0c2bf6085 Mon Sep 17 00:00:00 2001 From: Adam Lastowka Date: Wed, 25 Feb 2026 15:13:52 -0500 Subject: [PATCH 2/5] Fix Pydantic rebinding self in model constraint validator --- .../system/model_constraint/model_constraint.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/overture-schema-system/src/overture/schema/system/model_constraint/model_constraint.py b/packages/overture-schema-system/src/overture/schema/system/model_constraint/model_constraint.py index 9b8e0c924..1d7d22a44 100644 --- a/packages/overture-schema-system/src/overture/schema/system/model_constraint/model_constraint.py +++ b/packages/overture-schema-system/src/overture/schema/system/model_constraint/model_constraint.py @@ -56,10 +56,6 @@ def __init__(self, name: str | None = None): ) self.__name = name - def __validate_instance(self, model_instance: BaseModel) -> BaseModel: - self.validate_instance(model_instance) - return model_instance - @property def name(self) -> str: """Returns the name of the constraint, e.g. "FooConstraint" or "@foo".""" @@ -126,6 +122,15 @@ def decorate(self, model_class: type[BaseModel]) -> type[BaseModel]: metadata = Metadata.retrieve_from(model_class, Metadata()).copy() # type: ignore[union-attr] model_constraints = (*ModelConstraint.get_model_constraints(model_class), self) metadata[_MODEL_CONSTRAINT_KEY] = model_constraints + # Capture the constraint in a closure rather than passing a bound method. + # Some Pydantic versions unwrap bound methods passed through __validators__ + # and rebind `self` to the model instance, breaking the dispatch. + constraint = self + + def _after_validator(model_instance: BaseModel) -> BaseModel: + constraint.validate_instance(model_instance) + return model_instance + new_model_class = create_model( model_class.__name__, __config__=config, @@ -135,7 +140,7 @@ def decorate(self, model_class: type[BaseModel]) -> type[BaseModel]: __validators__={ self.name: cast( Callable[..., Any], - model_validator(mode="after")(self.__validate_instance), + model_validator(mode="after")(_after_validator), ) }, __metadata__=metadata, From 09bfa86577583a819d1b3f413adcd24a369b3183 Mon Sep 17 00:00:00 2001 From: Adam Lastowka Date: Wed, 25 Feb 2026 15:55:14 -0500 Subject: [PATCH 3/5] update json --- .../tests/division_area_baseline_schema.json | 4 ++-- .../tests/division_baseline_schema.json | 4 ++-- .../tests/division_boundary_baseline_schema.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json index f3e8c2abd..83f6b066a 100644 --- a/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json @@ -457,8 +457,8 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 255, - "minimum": 0, + "maximum": 2147483647, + "minimum": -2147483648, "title": "Admin Level", "type": "integer" }, diff --git a/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json index a2ee027b5..fac18fecc 100644 --- a/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json @@ -524,8 +524,8 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 255, - "minimum": 0, + "maximum": 2147483647, + "minimum": -2147483648, "title": "Admin Level", "type": "integer" }, diff --git a/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json index 336d2d484..6decd83e7 100644 --- a/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json @@ -370,8 +370,8 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 255, - "minimum": 0, + "maximum": 2147483647, + "minimum": -2147483648, "title": "Admin Level", "type": "integer" }, From 90664071ca581084338e414c8ef770c971b6f2d2 Mon Sep 17 00:00:00 2001 From: Adam Lastowka Date: Fri, 27 Feb 2026 14:20:04 -0500 Subject: [PATCH 4/5] constrain admin_level --- .../src/overture/schema/divisions/types.py | 2 ++ .../tests/division_area_baseline_schema.json | 4 ++-- .../tests/division_baseline_schema.json | 4 ++-- .../tests/division_boundary_baseline_schema.json | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py index 79c69873d..699bfc9ac 100644 --- a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py +++ b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py @@ -13,6 +13,8 @@ int32, Field( description="Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", + ge=0, + le=16, ), ], ) diff --git a/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json index 83f6b066a..f3e8c2abd 100644 --- a/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json @@ -457,8 +457,8 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 2147483647, - "minimum": -2147483648, + "maximum": 255, + "minimum": 0, "title": "Admin Level", "type": "integer" }, diff --git a/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json index fac18fecc..a2ee027b5 100644 --- a/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json @@ -524,8 +524,8 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 2147483647, - "minimum": -2147483648, + "maximum": 255, + "minimum": 0, "title": "Admin Level", "type": "integer" }, diff --git a/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json index 6decd83e7..336d2d484 100644 --- a/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json @@ -370,8 +370,8 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 2147483647, - "minimum": -2147483648, + "maximum": 255, + "minimum": 0, "title": "Admin Level", "type": "integer" }, From 4566a1d195e6b06466f84322c048b5e900b8fbe7 Mon Sep 17 00:00:00 2001 From: Adam Lastowka Date: Fri, 27 Feb 2026 14:26:02 -0500 Subject: [PATCH 5/5] oops, forgot to regen --- .../tests/division_area_baseline_schema.json | 2 +- .../tests/division_baseline_schema.json | 2 +- .../tests/division_boundary_baseline_schema.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json index f3e8c2abd..e86de89d9 100644 --- a/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json @@ -457,7 +457,7 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 255, + "maximum": 16, "minimum": 0, "title": "Admin Level", "type": "integer" diff --git a/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json index a2ee027b5..3cf5a93dd 100644 --- a/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json @@ -524,7 +524,7 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 255, + "maximum": 16, "minimum": 0, "title": "Admin Level", "type": "integer" diff --git a/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json index 336d2d484..6d18b17ce 100644 --- a/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json @@ -370,7 +370,7 @@ "properties": { "admin_level": { "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", - "maximum": 255, + "maximum": 16, "minimum": 0, "title": "Admin Level", "type": "integer"