Skip to content

Commit

Permalink
use registry for styles and data
Browse files Browse the repository at this point in the history
  • Loading branch information
cleder committed Mar 15, 2024
1 parent 947281f commit 7a7c498
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 95 deletions.
38 changes: 12 additions & 26 deletions fastkml/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@
from fastkml.enums import DataType
from fastkml.enums import Verbosity
from fastkml.exceptions import KMLSchemaError
from fastkml.helpers import attribute_text_kwarg
from fastkml.helpers import subelement_text_kwarg
from fastkml.helpers import text_attribute
from fastkml.helpers import text_subelement
from fastkml.helpers import xml_subelement_list
from fastkml.helpers import xml_subelement_list_kwarg
Expand Down Expand Up @@ -214,33 +216,17 @@ def __init__(
def __bool__(self) -> bool:
return bool(self.name) and self.value is not None

def etree_element(
self,
precision: Optional[int] = None,
verbosity: Verbosity = Verbosity.normal,
) -> Element:
element = super().etree_element(precision=precision, verbosity=verbosity)
element.set("name", self.name or "")
return element

@classmethod
def _get_kwargs(
cls,
*,
ns: str,
name_spaces: Optional[Dict[str, str]] = None,
element: Element,
strict: bool,
) -> Dict[str, Any]:
kwargs = super()._get_kwargs(
ns=ns,
name_spaces=name_spaces,
element=element,
strict=strict,
)
kwargs["name"] = element.get("name")
return kwargs

registry.register(
Data,
RegistryItem(
attr_name="name",
node_name="name",
classes=(str,),
get_kwarg=attribute_text_kwarg,
set_element=text_attribute,
),
)

registry.register(
Data,
Expand Down
56 changes: 56 additions & 0 deletions fastkml/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,20 @@ def float_subelement(
subelement.text = str(getattr(obj, attr_name))


def float_attribute(
obj: _XMLObject,
*,
element: Element,
attr_name: str,
node_name: str,
precision: Optional[int],
verbosity: Optional[Verbosity],
) -> None:
"""Set the value of an attribute."""
if getattr(obj, attr_name, None) is not None:
element.set(node_name, str(getattr(obj, attr_name)))


def enum_subelement(
obj: _XMLObject,
*,
Expand All @@ -289,6 +303,20 @@ def enum_subelement(
subelement.text = getattr(obj, attr_name).value


def enum_attribute(
obj: _XMLObject,
*,
element: Element,
attr_name: str,
node_name: str,
precision: Optional[int],
verbosity: Optional[Verbosity],
) -> None:
"""Set the value of an attribute."""
if getattr(obj, attr_name, None):
element.set(node_name, getattr(obj, attr_name).value)


def xml_subelement(
obj: _XMLObject,
*,
Expand Down Expand Up @@ -470,6 +498,19 @@ def subelement_float_kwarg(
return {}


def attribute_float_kwarg(
*,
element: Element,
ns: str,
name_spaces: Dict[str, str],
node_name: str,
kwarg: str,
classes: Tuple[known_types, ...],
strict: bool,
) -> Dict[str, float]:
return {kwarg: float(element.get(node_name))} if element.get(node_name) else {}


def subelement_enum_kwarg(
*,
element: Element,
Expand Down Expand Up @@ -499,6 +540,21 @@ def subelement_enum_kwarg(
return {}


def attribute_enum_kwarg(
*,
element: Element,
ns: str,
name_spaces: Dict[str, str],
node_name: str,
kwarg: str,
classes: Tuple[known_types, ...],
strict: bool,
) -> Dict[str, Enum]:
assert len(classes) == 1
assert issubclass(classes[0], Enum)
return {kwarg: classes[0](element.get(node_name))} if element.get(node_name) else {}


def xml_subelement_kwarg(
*,
element: Element,
Expand Down
127 changes: 58 additions & 69 deletions fastkml/styles.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
"""

import logging
from typing import Any
from typing import Dict
from typing import Iterable
from typing import List
Expand All @@ -35,10 +34,15 @@
from fastkml.enums import DisplayMode
from fastkml.enums import PairKey
from fastkml.enums import Units
from fastkml.enums import Verbosity
from fastkml.helpers import attribute_enum_kwarg
from fastkml.helpers import attribute_float_kwarg
from fastkml.helpers import bool_subelement
from fastkml.helpers import enum_attribute
from fastkml.helpers import enum_subelement
from fastkml.helpers import float_attribute
from fastkml.helpers import float_subelement
from fastkml.helpers import node_text
from fastkml.helpers import node_text_kwarg
from fastkml.helpers import subelement_bool_kwarg
from fastkml.helpers import subelement_enum_kwarg
from fastkml.helpers import subelement_float_kwarg
Expand All @@ -51,7 +55,6 @@
from fastkml.links import Icon
from fastkml.registry import RegistryItem
from fastkml.registry import registry
from fastkml.types import Element

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -95,37 +98,22 @@ def __repr__(self) -> str:
def __bool__(self) -> bool:
return bool(self.url)

def etree_element(
self,
precision: Optional[int] = None,
verbosity: Verbosity = Verbosity.normal,
) -> Element:
element = super().etree_element(precision=precision, verbosity=verbosity)
element.text = self.url or ""
return element

@classmethod
def get_tag_name(cls) -> str:
"""Return the tag name."""
return "styleUrl"

@classmethod
def _get_kwargs(
cls,
*,
ns: str,
name_spaces: Optional[Dict[str, str]] = None,
element: Element,
strict: bool,
) -> Dict[str, Any]:
kwargs = super()._get_kwargs(
ns=ns,
name_spaces=name_spaces,
element=element,
strict=strict,
)
kwargs["url"] = element.text
return kwargs

registry.register(
StyleUrl,
RegistryItem(
attr_name="url",
node_name="styleUrl",
classes=(str,),
get_kwarg=node_text_kwarg,
set_element=node_text,
),
)


class _StyleSelector(_BaseObject):
Expand Down Expand Up @@ -266,51 +254,52 @@ def __repr__(self) -> str:
def __bool__(self) -> bool:
return all((self.x is not None, self.y is not None))

def etree_element(
self,
precision: Optional[int] = None,
verbosity: Verbosity = Verbosity.normal,
) -> Element:
element = super().etree_element(precision=precision, verbosity=verbosity)
hot_spot = config.etree.SubElement( # type: ignore[attr-defined]
element,
f"{self.ns}hotSpot",
)
hot_spot.attrib["x"] = str(self.x)
hot_spot.attrib["y"] = str(self.y)
if self.xunits:
hot_spot.attrib["xunits"] = self.xunits.value
if self.yunits:
hot_spot.attrib["yunits"] = self.yunits.value
return element

@classmethod
def get_tag_name(cls) -> str:
"""Return the tag name."""
return "hotSpot"

@classmethod
def _get_kwargs(
cls,
*,
ns: str,
name_spaces: Optional[Dict[str, str]] = None,
element: Element,
strict: bool,
) -> Dict[str, Any]:
kwargs = super()._get_kwargs(
ns=ns,
name_spaces=name_spaces,
element=element,
strict=strict,
)
kwargs["x"] = float(element.get("x"))
kwargs["y"] = float(element.get("y"))
if element.get("xunits"):
kwargs["xunits"] = Units(element.get("xunits"))
if element.get("yunits"):
kwargs["yunits"] = Units(element.get("yunits"))
return kwargs

registry.register(
HotSpot,
RegistryItem(
attr_name="x",
node_name="x",
classes=(float,),
get_kwarg=attribute_float_kwarg,
set_element=float_attribute,
),
)
registry.register(
HotSpot,
RegistryItem(
attr_name="y",
node_name="y",
classes=(float,),
get_kwarg=attribute_float_kwarg,
set_element=float_attribute,
),
)
registry.register(
HotSpot,
RegistryItem(
attr_name="xunits",
node_name="xunits",
classes=(Units,),
get_kwarg=attribute_enum_kwarg,
set_element=enum_attribute,
),
)
registry.register(
HotSpot,
RegistryItem(
attr_name="yunits",
node_name="yunits",
classes=(Units,),
get_kwarg=attribute_enum_kwarg,
set_element=enum_attribute,
),
)


class IconStyle(_ColorStyle):
Expand Down

0 comments on commit 7a7c498

Please sign in to comment.