xplan-tools 1.12.0__tar.gz → 1.12.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/PKG-INFO +1 -1
  2. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/pyproject.toml +1 -1
  3. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/base.py +20 -2
  4. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/LICENSE.md +0 -0
  5. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/README.md +0 -0
  6. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/interface/__init__.py +0 -0
  7. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/interface/base.py +0 -0
  8. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/interface/db.py +0 -0
  9. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/interface/gml.py +0 -0
  10. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/interface/jsonfg.py +0 -0
  11. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/interface/shape.py +0 -0
  12. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/main.py +0 -0
  13. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/__init__.py +0 -0
  14. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/adapters/__init__.py +0 -0
  15. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/adapters/coretable.py +0 -0
  16. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/adapters/gml.py +0 -0
  17. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/adapters/jsonfg.py +0 -0
  18. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/__init__.py +0 -0
  19. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/definitions.py +0 -0
  20. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/inspire_base.py +0 -0
  21. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/inspire_base2.py +0 -0
  22. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/inspire_plu40.py +0 -0
  23. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/xplan41.py +0 -0
  24. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/xplan54.py +0 -0
  25. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/xplan60.py +0 -0
  26. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/xplan61.py +0 -0
  27. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/appschema/xtrasse20.py +0 -0
  28. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/migrations/env.py +0 -0
  29. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/migrations/script.py.mako +0 -0
  30. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/migrations/versions/3c3445a58565_base_schema.py +0 -0
  31. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/migrations/versions/f8b74c08ec07_add_refs_indexes_ensure_polygon_ccw.py +0 -0
  32. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/model/orm.py +0 -0
  33. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/resources/styles.py +0 -0
  34. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/__init__.py +0 -0
  35. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/mappingtables/XPlanToINSPIRE-SupplementaryRegulation_2_6_2025-10-08.xlsx +0 -0
  36. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/mappingtables/XPlanToINSPIRE-ZoningElement_2_6_2025-10-08.xlsx +0 -0
  37. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/mappingtables/XPlanToINSPIREFeatures_2_6_2025-10-08.xlsx +0 -0
  38. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/migrate_41_54.py +0 -0
  39. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/migrate_54_60.py +0 -0
  40. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/migrate_60_61.py +0 -0
  41. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/migrate_6x_plu.py +0 -0
  42. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/transform/transformer.py +0 -0
  43. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/util/__init__.py +0 -0
  44. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/util/style.py +0 -0
  45. {xplan_tools-1.12.0 → xplan_tools-1.12.1}/xplan_tools/util/validate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xplan-tools
3
- Version: 1.12.0
3
+ Version: 1.12.1
4
4
  Summary: Manage XPlanung data
5
5
  License: EUPL-1.2-or-later
6
6
  License-File: LICENSE.md
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "xplan-tools"
3
- version = "1.12.0"
3
+ version = "1.12.1"
4
4
  description = "Manage XPlanung data"
5
5
  authors = [
6
6
  { name = "Tobias Kraft", email = "tobias.kraft@gv.hamburg.de" },
@@ -7,7 +7,17 @@ import datetime
7
7
  import logging
8
8
  import re
9
9
  from types import NoneType
10
- from typing import Any, Iterator, Literal, Optional, Tuple, Type, get_args, get_origin
10
+ from typing import (
11
+ Any,
12
+ Iterator,
13
+ Literal,
14
+ Optional,
15
+ Self,
16
+ Tuple,
17
+ Type,
18
+ get_args,
19
+ get_origin,
20
+ )
11
21
  from uuid import UUID
12
22
 
13
23
  from lxml.etree import _Element
@@ -433,7 +443,7 @@ class BaseFeature(BaseModel, GMLAdapter, CoretableAdapter, JsonFGAdapter):
433
443
 
434
444
  @model_validator(mode="before")
435
445
  @classmethod
436
- def deserialization_hook(cls, data: Any, info: ValidationInfo) -> Any:
446
+ def _deserialization_hook(cls, data: Any, info: ValidationInfo) -> Any:
437
447
  """Provides deserialization for different formats/representations before validation."""
438
448
  if isinstance(data, _Element):
439
449
  data = cls._from_etree(data, info)
@@ -443,6 +453,14 @@ class BaseFeature(BaseModel, GMLAdapter, CoretableAdapter, JsonFGAdapter):
443
453
  data = cls._from_jsonfg(data, info)
444
454
  return data
445
455
 
456
+ @model_validator(mode="after")
457
+ def _ensure_any_attribute(self) -> Self:
458
+ if all(
459
+ getattr(self, field) is None for field in type(self).model_fields.keys()
460
+ ):
461
+ raise ValueError("at least one field must have a value")
462
+ return self
463
+
446
464
  @field_serializer("hatGenerAttribut", when_used="unless-none", check_fields=False)
447
465
  def _serialize_gener_att(
448
466
  self, v: list["BaseFeature"], info: SerializationInfo
File without changes
File without changes