Skip to content

Commit

Permalink
Refactor XML subelement functions in fastkml/helpers.py and fastkml/c…
Browse files Browse the repository at this point in the history
…ontainers.py #286
  • Loading branch information
cleder committed Dec 21, 2023
1 parent 768a44c commit 17f6041
Show file tree
Hide file tree
Showing 3 changed files with 487 additions and 326 deletions.
57 changes: 33 additions & 24 deletions fastkml/containers.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
from fastkml.geometry import MultiGeometry
from fastkml.geometry import Point
from fastkml.geometry import Polygon
from fastkml.helpers import xml_subelement_list
from fastkml.helpers import xml_subelement_list_kwarg
from fastkml.styles import Style
from fastkml.styles import StyleMap
from fastkml.styles import StyleUrl
Expand Down Expand Up @@ -54,7 +56,7 @@ class _Container(_Feature):
Folder.
"""

_features: Optional[List[_Feature]]
features: List[_Feature]

def __init__(
self,
Expand All @@ -78,7 +80,7 @@ def __init__(
region: Optional[Region] = None,
extended_data: Optional[ExtendedData] = None,
# Container specific
features: Optional[List[_Feature]] = None,
features: Optional[Iterable[_Feature]] = None,
) -> None:
super().__init__(
ns=ns,
Expand All @@ -101,7 +103,7 @@ def __init__(
region=region,
extended_data=extended_data,
)
self.features = features or []
self.features = list(features) if features else []

def etree_element(
self,
Expand Down Expand Up @@ -137,20 +139,23 @@ def _get_kwargs(
strict=strict,
)
kwargs["features"] = []
name_spaces = kwargs["name_spaces"]
assert name_spaces is not None
for klass in (
Folder,
Placemark,
Document,
):
for feature in element.findall(f"{ns}{klass.__name__}"):
kwargs["features"].append(
klass.class_from_element( # type: ignore[attr-defined]
ns=ns,
name_spaces=name_spaces,
element=feature,
strict=strict,
),
)
kwargs["features"].extend(
xml_subelement_list_kwarg(
element=element,
ns=ns,
name_spaces=name_spaces,
kwarg="features",
obj_class=klass,
strict=strict,
).get("features", []),
)
return kwargs


Expand Down Expand Up @@ -224,11 +229,13 @@ def etree_element(
verbosity: Verbosity = Verbosity.normal,
) -> Element:
element = super().etree_element(precision=precision, verbosity=verbosity)
if self.schemata is not None:
for schema in self.schemata:
element.append(
schema.etree_element(precision=precision, verbosity=verbosity),
)
xml_subelement_list(
obj=self,
element=element,
attr_name="schemata",
precision=precision,
verbosity=verbosity,
)
return element

def get_style_by_url(self, style_url: str) -> Optional[Union[Style, StyleMap]]:
Expand All @@ -250,14 +257,16 @@ def _get_kwargs(
element=element,
strict=strict,
)
schemata = element.findall(f"{ns}Schema")
kwargs["schemata"] = [
Schema.class_from_element(
name_spaces = kwargs["name_spaces"]
assert name_spaces is not None
kwargs.update(
xml_subelement_list_kwarg(
element=element,
ns=ns,
name_spaces=name_spaces,
element=schema,
kwarg="schemata",
obj_class=Schema,
strict=strict,
)
for schema in schemata
]
),
)
return kwargs
18 changes: 11 additions & 7 deletions fastkml/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@
from typing import Type

from fastkml import config
from fastkml.base import _BaseObject
from fastkml.base import _XMLObject
from fastkml.enums import Verbosity
from fastkml.types import Element


def simple_text_subelement(
obj: _BaseObject,
obj: _XMLObject,
*,
element: Element,
attr_name: str,
Expand All @@ -29,7 +28,7 @@ def simple_text_subelement(


def bool_subelement(
obj: _BaseObject,
obj: _XMLObject,
*,
element: Element,
attr_name: str,
Expand All @@ -45,7 +44,7 @@ def bool_subelement(


def float_subelement(
obj: _BaseObject,
obj: _XMLObject,
*,
element: Element,
attr_name: str,
Expand All @@ -62,7 +61,7 @@ def float_subelement(


def enum_subelement(
obj: _BaseObject,
obj: _XMLObject,
*,
element: Element,
attr_name: str,
Expand All @@ -78,7 +77,7 @@ def enum_subelement(


def xml_subelement(
obj: _BaseObject,
obj: _XMLObject,
*,
element: Element,
attr_name: str,
Expand Down Expand Up @@ -155,7 +154,12 @@ def subelement_float_kwarg(
if node is None:
return {}
if node.text and node.text.strip():
return {kwarg: float(node.text.strip())}
try:
return {kwarg: float(node.text.strip())}
except ValueError:
if strict:
raise
return {}
return {}


Expand Down

0 comments on commit 17f6041

Please sign in to comment.