From e8dd1d061114080f94949966f09a1ca611894e14 Mon Sep 17 00:00:00 2001 From: apurvabanka Date: Fri, 22 Nov 2024 13:55:24 -0500 Subject: [PATCH 01/11] Network LInk Control --- fastkml/__init__.py | 1 + fastkml/containers.py | 87 ++++++++++++++++++++++++++++++ fastkml/features.py | 121 +++++++++++++++++++++++++++++++++++++++++- fastkml/kml.py | 7 +-- fastkml/times.py | 5 ++ fastkml/update.py | 36 +++++++++++++ 6 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 fastkml/update.py diff --git a/fastkml/__init__.py b/fastkml/__init__.py index b607e08f..38a11805 100644 --- a/fastkml/__init__.py +++ b/fastkml/__init__.py @@ -61,6 +61,7 @@ __all__ = [ "KML", + "NetworkLinkControl" "Document", "Folder", "GroundOverlay", diff --git a/fastkml/containers.py b/fastkml/containers.py index 5041d219..40acd84f 100644 --- a/fastkml/containers.py +++ b/fastkml/containers.py @@ -47,9 +47,12 @@ from fastkml.styles import StyleMap from fastkml.styles import StyleUrl from fastkml.times import TimeSpan +from fastkml.times import KmlDateTime from fastkml.times import TimeStamp +from fastkml.update import Update from fastkml.utils import find_all from fastkml.views import Camera +from fastkml.views import _AbstractView from fastkml.views import LookAt from fastkml.views import Region @@ -323,6 +326,79 @@ def get_style_by_url(self, style_url: str) -> Optional[Union[Style, StyleMap]]: ) +class NetworkLinkControl(_Container): + + schemata: List[Schema] + + def __init__( + self, + ns: Optional[str] = None, + name_spaces: Optional[Dict[str, str]] = None, + id: Optional[str] = None, + target_id: Optional[str] = None, + min_refresh_period: Optional[float] = None, + max_session_length: Optional[float] = None, + cookie: Optional[str] = None, + message: Optional[str] = None, + link_name: Optional[str] = None, + link_description: Optional[str] = None, + link_snippet: Optional[str] = None, + expires: Optional[KmlDateTime] = None, + update:Optional[Update] = None, + view: Optional[Union[Camera, LookAt]] = None, + schemata: Optional[Iterable[Schema]] = None, + **kwargs: Any + ) -> None: + super().__init__( + ns=ns, + name_spaces=name_spaces, + id=id, + target_id=target_id, + min_refresh_period=min_refresh_period, + max_session_length=max_session_length, + cookie=cookie, + message=message, + link_name=link_name, + link_description=link_description, + link_snippet=link_snippet, + expires=expires, + update=update, + view=view, + **kwargs + ) + self.schemata = list(schemata) if schemata else [] + + def __repr__(self) -> str: + """ + Return a string representation of the NetworkLinkControl object. + + Returns + ------- + str: A string representation of the NetworkLinkControl object. + + """ + return ( + f"{self.__class__.__module__}.{self.__class__.__name__}(" + f"ns={self.ns!r}, " + f"name_spaces={self.name_spaces!r}, " + f"id={self.id!r}, " + f"target_id={self.target_id!r}, " + f"min_refresh_period={self.min_refresh_period!r}, " + f"max_session_length={self.max_session_length!r}, " + f"cookie={self.cookie!r}, " + f"message={self.message!r}, " + f"link_name={self.link_name!r}, " + f"link_description={self.link_description!r}, " + f"link_snippet={self.link_snippet!r}, " + f"expires={self.expires!r}, " + f"update={self.update!r}, " + f"view={self.view!r}, " + f"schemata={self.schemata!r}, " + f"**{self._get_splat()!r}," + ")" + ) + + registry.register( _Container, RegistryItem( @@ -334,6 +410,17 @@ def get_style_by_url(self, style_url: str) -> Optional[Union[Style, StyleMap]]: set_element=xml_subelement_list, ), ) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="schemata", + node_name="Schema", + classes=(Schema,), + get_kwarg=xml_subelement_list_kwarg, + set_element=xml_subelement_list, + ), +) registry.register( Document, RegistryItem( diff --git a/fastkml/features.py b/fastkml/features.py index f8d091a5..83beeefa 100644 --- a/fastkml/features.py +++ b/fastkml/features.py @@ -43,6 +43,8 @@ from fastkml.geometry import Polygon from fastkml.geometry import create_kml_geometry from fastkml.helpers import attribute_int_kwarg +from fastkml.helpers import datetime_subelement +from fastkml.helpers import datetime_subelement_kwarg from fastkml.helpers import bool_subelement from fastkml.helpers import clean_string from fastkml.helpers import int_attribute @@ -63,8 +65,9 @@ from fastkml.styles import Style from fastkml.styles import StyleMap from fastkml.styles import StyleUrl -from fastkml.times import TimeSpan +from fastkml.times import KmlDateTime, TimeSpan from fastkml.times import TimeStamp +from fastkml.update import Update from fastkml.views import Camera from fastkml.views import LookAt from fastkml.views import Region @@ -222,6 +225,15 @@ class _Feature(TimeMixin, _BaseObject): view: Union[Camera, LookAt, None] region: Optional[Region] extended_data: Optional[ExtendedData] + min_refresh_period: Optional[float] = None, + max_session_length: Optional[float] = None, + cookie: Optional[str] = None, + message: Optional[str] = None, + link_name: Optional[str] = None, + link_description: Optional[str] = None, + link_snippet: Optional[str] = None, + expires: Optional[KmlDateTime] = None, + update:Optional[Update] = None, def __init__( self, @@ -244,6 +256,15 @@ def __init__( styles: Optional[Iterable[Union[Style, StyleMap]]] = None, region: Optional[Region] = None, extended_data: Optional[ExtendedData] = None, + min_refresh_period: Optional[float] = None, + max_session_length: Optional[float] = None, + cookie: Optional[str] = None, + message: Optional[str] = None, + link_name: Optional[str] = None, + link_description: Optional[str] = None, + link_snippet: Optional[str] = None, + expires: Optional[KmlDateTime] = None, + update:Optional[Update] = None, **kwargs: Any, ) -> None: """ @@ -304,6 +325,15 @@ def __init__( self.region = region self.extended_data = extended_data self.times = times + self.min_refresh_period = min_refresh_period + self.max_session_length = max_session_length + self.cookie = cookie + self.message = message + self.link_name = link_name + self.link_description = link_description + self.link_snippet = link_snippet + self.expires = expires + self.update = update registry.register( @@ -407,6 +437,95 @@ def __init__( set_element=text_subelement, ), ) +registry.register( + _Feature, + RegistryItem( + ns_ids=("kml",), + attr_name="min_refresh_period", + node_name="minRefreshPeriod", + classes=(float,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _Feature, + RegistryItem( + ns_ids=("kml",), + attr_name="max_session_length", + node_name="maxSessionLength", + classes=(float,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _Feature, + RegistryItem( + ns_ids=("kml",), + attr_name="cookie", + node_name="cookie", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _Feature, + RegistryItem( + ns_ids=("kml",), + attr_name="message", + node_name="message", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _Feature, + RegistryItem( + ns_ids=("kml",), + attr_name="link_name", + node_name="linkName", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _Feature, + RegistryItem( + ns_ids=("kml",), + attr_name="link_description", + node_name="linkDescription", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _Feature, + RegistryItem( + ns_ids=("kml",), + attr_name="link_snippet", + node_name="linkSnippet", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _Feature, + item=RegistryItem( + ns_ids=("kml", ), + classes=(KmlDateTime,), + attr_name="expires", + node_name="expires", + get_kwarg=datetime_subelement_kwarg, + set_element=datetime_subelement, + ), +) + registry.register( _Feature, RegistryItem( diff --git a/fastkml/kml.py b/fastkml/kml.py index 0886c6ba..3edba7cb 100644 --- a/fastkml/kml.py +++ b/fastkml/kml.py @@ -45,6 +45,7 @@ from fastkml import validator from fastkml.base import _XMLObject from fastkml.containers import Document +from fastkml.containers import NetworkLinkControl from fastkml.containers import Folder from fastkml.enums import Verbosity from fastkml.features import NetworkLink @@ -59,7 +60,7 @@ logger = logging.getLogger(__name__) -kml_children = Union[Folder, Document, Placemark, GroundOverlay, PhotoOverlay] +kml_children = Union[Folder, Document, Placemark, GroundOverlay, PhotoOverlay, NetworkLinkControl] def lxml_parse_and_validate( @@ -286,8 +287,8 @@ def write( KML, RegistryItem( ns_ids=("kml",), - classes=(Document, Folder, Placemark, GroundOverlay, PhotoOverlay, NetworkLink), - node_name="Document,Folder,Placemark,GroundOverlay,PhotoOverlay,NetworkLink", + classes=(Document, Folder, Placemark, GroundOverlay, PhotoOverlay, NetworkLink, NetworkLinkControl), + node_name="Document,Folder,Placemark,GroundOverlay,PhotoOverlay,NetworkLink,NetworkLinkControl", attr_name="features", get_kwarg=xml_subelement_list_kwarg, set_element=xml_subelement_list, diff --git a/fastkml/times.py b/fastkml/times.py index a2f35b5f..1f3eeabd 100644 --- a/fastkml/times.py +++ b/fastkml/times.py @@ -189,6 +189,11 @@ def __str__(self) -> str: else self.dt.isoformat() ) return self.dt.isoformat() + + @classmethod + def get_tag_name(cls) -> str: + """Return the tag name.""" + return cls.__name__.lower() @classmethod def parse(cls, datestr: str) -> Optional["KmlDateTime"]: diff --git a/fastkml/update.py b/fastkml/update.py new file mode 100644 index 00000000..b73b873a --- /dev/null +++ b/fastkml/update.py @@ -0,0 +1,36 @@ +from typing import Any, Dict, List, Optional + +from fastkml.base import _XMLObject + +class Change(_XMLObject): + + def __int__( + self, + target_id: str, + elements: List[Dict[str, Any]] = None + ): + super.__init__( + target_id=target_id, + elements=elements + ) + + def parse_children(self): + pass + +class Create(_XMLObject): + def __init__(): + pass + +class Delete(_XMLObject): + def __init__(): + pass + +class Update: + + def __init__( + target_href: Optional[str] = None, + change: Optional[Change] = None, + create: Optional[Create] = None, + delete: Optional[Delete] = None + ): + pass From 35b6fa50162c120d3a32d371366cec2a7cafe43f Mon Sep 17 00:00:00 2001 From: apurvabanka Date: Sun, 24 Nov 2024 04:03:50 -0500 Subject: [PATCH 02/11] Creating separate class for network control --- fastkml/containers.py | 24 +---- fastkml/features.py | 122 +----------------------- fastkml/network_control.py | 184 +++++++++++++++++++++++++++++++++++++ fastkml/update.py | 115 +++++++++++++++++++++-- 4 files changed, 293 insertions(+), 152 deletions(-) create mode 100644 fastkml/network_control.py diff --git a/fastkml/containers.py b/fastkml/containers.py index 40acd84f..b45b4f45 100644 --- a/fastkml/containers.py +++ b/fastkml/containers.py @@ -39,6 +39,7 @@ from fastkml.geometry import Polygon from fastkml.helpers import xml_subelement_list from fastkml.helpers import xml_subelement_list_kwarg +from fastkml.network_control import _NetworkControl from fastkml.overlays import GroundOverlay from fastkml.overlays import PhotoOverlay from fastkml.registry import RegistryItem @@ -52,7 +53,6 @@ from fastkml.update import Update from fastkml.utils import find_all from fastkml.views import Camera -from fastkml.views import _AbstractView from fastkml.views import LookAt from fastkml.views import Region @@ -326,7 +326,7 @@ def get_style_by_url(self, style_url: str) -> Optional[Union[Style, StyleMap]]: ) -class NetworkLinkControl(_Container): +class NetworkLinkControl(_NetworkControl): schemata: List[Schema] @@ -334,8 +334,6 @@ def __init__( self, ns: Optional[str] = None, name_spaces: Optional[Dict[str, str]] = None, - id: Optional[str] = None, - target_id: Optional[str] = None, min_refresh_period: Optional[float] = None, max_session_length: Optional[float] = None, cookie: Optional[str] = None, @@ -346,14 +344,11 @@ def __init__( expires: Optional[KmlDateTime] = None, update:Optional[Update] = None, view: Optional[Union[Camera, LookAt]] = None, - schemata: Optional[Iterable[Schema]] = None, **kwargs: Any ) -> None: super().__init__( ns=ns, name_spaces=name_spaces, - id=id, - target_id=target_id, min_refresh_period=min_refresh_period, max_session_length=max_session_length, cookie=cookie, @@ -366,7 +361,6 @@ def __init__( view=view, **kwargs ) - self.schemata = list(schemata) if schemata else [] def __repr__(self) -> str: """ @@ -381,8 +375,6 @@ def __repr__(self) -> str: f"{self.__class__.__module__}.{self.__class__.__name__}(" f"ns={self.ns!r}, " f"name_spaces={self.name_spaces!r}, " - f"id={self.id!r}, " - f"target_id={self.target_id!r}, " f"min_refresh_period={self.min_refresh_period!r}, " f"max_session_length={self.max_session_length!r}, " f"cookie={self.cookie!r}, " @@ -393,7 +385,6 @@ def __repr__(self) -> str: f"expires={self.expires!r}, " f"update={self.update!r}, " f"view={self.view!r}, " - f"schemata={self.schemata!r}, " f"**{self._get_splat()!r}," ")" ) @@ -410,17 +401,6 @@ def __repr__(self) -> str: set_element=xml_subelement_list, ), ) -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="schemata", - node_name="Schema", - classes=(Schema,), - get_kwarg=xml_subelement_list_kwarg, - set_element=xml_subelement_list, - ), -) registry.register( Document, RegistryItem( diff --git a/fastkml/features.py b/fastkml/features.py index 83beeefa..07963b5b 100644 --- a/fastkml/features.py +++ b/fastkml/features.py @@ -43,8 +43,6 @@ from fastkml.geometry import Polygon from fastkml.geometry import create_kml_geometry from fastkml.helpers import attribute_int_kwarg -from fastkml.helpers import datetime_subelement -from fastkml.helpers import datetime_subelement_kwarg from fastkml.helpers import bool_subelement from fastkml.helpers import clean_string from fastkml.helpers import int_attribute @@ -65,9 +63,8 @@ from fastkml.styles import Style from fastkml.styles import StyleMap from fastkml.styles import StyleUrl -from fastkml.times import KmlDateTime, TimeSpan +from fastkml.times import TimeSpan from fastkml.times import TimeStamp -from fastkml.update import Update from fastkml.views import Camera from fastkml.views import LookAt from fastkml.views import Region @@ -225,15 +222,6 @@ class _Feature(TimeMixin, _BaseObject): view: Union[Camera, LookAt, None] region: Optional[Region] extended_data: Optional[ExtendedData] - min_refresh_period: Optional[float] = None, - max_session_length: Optional[float] = None, - cookie: Optional[str] = None, - message: Optional[str] = None, - link_name: Optional[str] = None, - link_description: Optional[str] = None, - link_snippet: Optional[str] = None, - expires: Optional[KmlDateTime] = None, - update:Optional[Update] = None, def __init__( self, @@ -256,15 +244,6 @@ def __init__( styles: Optional[Iterable[Union[Style, StyleMap]]] = None, region: Optional[Region] = None, extended_data: Optional[ExtendedData] = None, - min_refresh_period: Optional[float] = None, - max_session_length: Optional[float] = None, - cookie: Optional[str] = None, - message: Optional[str] = None, - link_name: Optional[str] = None, - link_description: Optional[str] = None, - link_snippet: Optional[str] = None, - expires: Optional[KmlDateTime] = None, - update:Optional[Update] = None, **kwargs: Any, ) -> None: """ @@ -325,16 +304,6 @@ def __init__( self.region = region self.extended_data = extended_data self.times = times - self.min_refresh_period = min_refresh_period - self.max_session_length = max_session_length - self.cookie = cookie - self.message = message - self.link_name = link_name - self.link_description = link_description - self.link_snippet = link_snippet - self.expires = expires - self.update = update - registry.register( _Feature, @@ -437,95 +406,6 @@ def __init__( set_element=text_subelement, ), ) -registry.register( - _Feature, - RegistryItem( - ns_ids=("kml",), - attr_name="min_refresh_period", - node_name="minRefreshPeriod", - classes=(float,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _Feature, - RegistryItem( - ns_ids=("kml",), - attr_name="max_session_length", - node_name="maxSessionLength", - classes=(float,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _Feature, - RegistryItem( - ns_ids=("kml",), - attr_name="cookie", - node_name="cookie", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _Feature, - RegistryItem( - ns_ids=("kml",), - attr_name="message", - node_name="message", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _Feature, - RegistryItem( - ns_ids=("kml",), - attr_name="link_name", - node_name="linkName", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _Feature, - RegistryItem( - ns_ids=("kml",), - attr_name="link_description", - node_name="linkDescription", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _Feature, - RegistryItem( - ns_ids=("kml",), - attr_name="link_snippet", - node_name="linkSnippet", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _Feature, - item=RegistryItem( - ns_ids=("kml", ), - classes=(KmlDateTime,), - attr_name="expires", - node_name="expires", - get_kwarg=datetime_subelement_kwarg, - set_element=datetime_subelement, - ), -) - registry.register( _Feature, RegistryItem( diff --git a/fastkml/network_control.py b/fastkml/network_control.py new file mode 100644 index 00000000..312ce5f4 --- /dev/null +++ b/fastkml/network_control.py @@ -0,0 +1,184 @@ +# Copyright (C) 2023 Christian Ledermann +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +from typing import Any +from typing import Dict +from typing import Optional +from typing import Union +from fastkml.helpers import datetime_subelement +from fastkml.helpers import datetime_subelement_kwarg +from fastkml.helpers import subelement_text_kwarg +from fastkml.helpers import text_subelement +from fastkml.helpers import xml_subelement +from fastkml.helpers import xml_subelement_kwarg +from fastkml.registry import registry +from fastkml.registry import RegistryItem +from fastkml.base import _XMLObject +from fastkml.times import KmlDateTime +from fastkml.update import Update +from fastkml.views import Camera, LookAt + + +class _NetworkControl(_XMLObject): + """ + Absrtact base class representing NetworkLinkControl in KML. + """ + min_refresh_period: Optional[float] + max_session_length: Optional[float] + cookie: Optional[str] + message: Optional[str] + link_name: Optional[str] + link_description: Optional[str] + link_snippet: Optional[str] + expires: Optional[KmlDateTime] + view: Union[Camera, LookAt, None] + update:Optional[Update] + + def __init__( + self, + ns: Optional[str] = None, + name_spaces: Optional[Dict[str, str]] = None, + min_refresh_period: Optional[float] = None, + max_session_length: Optional[float] = None, + cookie: Optional[str] = None, + message: Optional[str] = None, + link_name: Optional[str] = None, + link_description: Optional[str] = None, + link_snippet: Optional[str] = None, + expires: Optional[KmlDateTime] = None, + view: Optional[Union[Camera, LookAt]] = None, + update:Optional[Update] = None, + **kwargs: Any, + ): + super().__init__( + ns=ns, + name_spaces=name_spaces, + **kwargs, + ) + self.min_refresh_period = min_refresh_period + self.max_session_length = max_session_length + self.cookie = cookie + self.message = message + self.link_name = link_name + self.link_description = link_description + self.link_snippet = link_snippet + self.expires = expires + self.view = view + self.update = update + +registry.register( + _NetworkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="min_refresh_period", + node_name="minRefreshPeriod", + classes=(float,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _NetworkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="max_session_length", + node_name="maxSessionLength", + classes=(float,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _NetworkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="cookie", + node_name="cookie", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _NetworkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="message", + node_name="message", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _NetworkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_name", + node_name="linkName", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _NetworkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_description", + node_name="linkDescription", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _NetworkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_snippet", + node_name="linkSnippet", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + _NetworkControl, + item=RegistryItem( + ns_ids=("kml", ), + classes=(KmlDateTime,), + attr_name="expires", + node_name="expires", + get_kwarg=datetime_subelement_kwarg, + set_element=datetime_subelement, + ), +) + +registry.register( + _NetworkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="view", + node_name="Camera,LookAt", + classes=( + Camera, + LookAt, + ), + get_kwarg=xml_subelement_kwarg, + set_element=xml_subelement, + ), +) \ No newline at end of file diff --git a/fastkml/update.py b/fastkml/update.py index b73b873a..948e02a4 100644 --- a/fastkml/update.py +++ b/fastkml/update.py @@ -1,15 +1,41 @@ -from typing import Any, Dict, List, Optional +# Copyright (C) 2023 Christian Ledermann +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +from typing import Any +from typing import Union +from typing import Dict +from typing import Iterable +from typing import List +from typing import Optional +# from fastkml.containers import Folder +from fastkml.helpers import xml_subelement +from fastkml.helpers import xml_subelement_kwarg +from fastkml.registry import registry +from fastkml.registry import RegistryItem from fastkml.base import _XMLObject +from fastkml.times import TimeSpan class Change(_XMLObject): def __int__( self, target_id: str, - elements: List[Dict[str, Any]] = None + elements: Optional[Union[TimeSpan]] = None ): - super.__init__( + super().__init__( target_id=target_id, elements=elements ) @@ -18,19 +44,90 @@ def parse_children(self): pass class Create(_XMLObject): - def __init__(): + def __int__( + self, + target_id: str, + elements: Optional[Union[TimeSpan]] = None + ): + super().__init__( + target_id=target_id, + elements=elements + ) + + def parse_children(self): pass class Delete(_XMLObject): - def __init__(): + def __int__( + self, + target_id: str, + elements: Optional[Union[TimeSpan]] = None + ): + super().__init__( + target_id=target_id, + elements=elements + ) + + def parse_children(self): pass class Update: def __init__( target_href: Optional[str] = None, - change: Optional[Change] = None, - create: Optional[Create] = None, - delete: Optional[Delete] = None + change: Optional[Iterable[Change]] = None, + create: Optional[Iterable[Create]] = None, + delete: Optional[Iterable[Delete]] = None ): - pass + super().__init__( + target_href=target_href, + change=change, + create=create, + delete=delete + ) + +registry.register( + Update, + RegistryItem( + ns_ids=("kml",), + attr_name="change", + node_name="TimeSpan", + classes=( + # PhotoOverlay, + # Folder, + TimeSpan, + ), + get_kwarg=xml_subelement_kwarg, + set_element=xml_subelement, + ) +) +registry.register( + Update, + RegistryItem( + ns_ids=("kml",), + attr_name="create", + node_name="TimeSpan", + classes=( + # PhotoOverlay, + # Folder, + TimeSpan, + ), + get_kwarg=xml_subelement_kwarg, + set_element=xml_subelement, + ) +) +registry.register( + Update, + RegistryItem( + ns_ids=("kml",), + attr_name="delete", + node_name="TimeSpan", + classes=( + # PhotoOverlay, + # Folder, + TimeSpan, + ), + get_kwarg=xml_subelement_kwarg, + set_element=xml_subelement, + ) +) \ No newline at end of file From 15516aedda0c1ff0a9d9d0c632e9ac55fd9d4b45 Mon Sep 17 00:00:00 2001 From: apurvabanka Date: Thu, 28 Nov 2024 20:36:02 -0500 Subject: [PATCH 03/11] requested change --- fastkml/containers.py | 175 +++++++++++++++++++++++++++++------ fastkml/features.py | 1 + fastkml/network_control.py | 184 ------------------------------------- fastkml/times.py | 5 - 4 files changed, 149 insertions(+), 216 deletions(-) delete mode 100644 fastkml/network_control.py diff --git a/fastkml/containers.py b/fastkml/containers.py index 3a9b3984..3343bb29 100644 --- a/fastkml/containers.py +++ b/fastkml/containers.py @@ -25,7 +25,9 @@ from typing import Union from fastkml import atom +from fastkml import config from fastkml import gx +from fastkml.base import _XMLObject from fastkml.data import ExtendedData from fastkml.data import Schema from fastkml.features import NetworkLink @@ -37,6 +39,12 @@ from fastkml.geometry import MultiGeometry from fastkml.geometry import Point from fastkml.geometry import Polygon +from fastkml.helpers import datetime_subelement +from fastkml.helpers import datetime_subelement_kwarg +from fastkml.helpers import subelement_text_kwarg +from fastkml.helpers import text_subelement +from fastkml.helpers import xml_subelement +from fastkml.helpers import xml_subelement_kwarg from fastkml.helpers import xml_subelement_list from fastkml.helpers import xml_subelement_list_kwarg from fastkml.network_control import _NetworkControl @@ -328,11 +336,55 @@ def get_style_by_url(self, style_url: str) -> Optional[Union[Style, StyleMap]]: None, ) +registry.register( + _Container, + RegistryItem( + ns_ids=("kml",), + attr_name="features", + node_name=( + "Folder,Placemark,Document,GroundOverlay,PhotoOverlay,ScreenOverlay," + "NetworkLink" + ), + classes=( + Document, + Folder, + Placemark, + GroundOverlay, + PhotoOverlay, + ScreenOverlay, + NetworkLink, + ), + get_kwarg=xml_subelement_list_kwarg, + set_element=xml_subelement_list, + ), +) +registry.register( + Document, + RegistryItem( + ns_ids=("kml",), + attr_name="schemata", + node_name="Schema", + classes=(Schema,), + get_kwarg=xml_subelement_list_kwarg, + set_element=xml_subelement_list, + ), +) -class NetworkLinkControl(_NetworkControl): +class NetworkLinkControl(_XMLObject): + + _default_nsid = config.KML + + min_refresh_period: Optional[float] + max_session_length: Optional[float] + cookie: Optional[str] + message: Optional[str] + link_name: Optional[str] + link_description: Optional[str] + link_snippet: Optional[str] + expires: Optional[KmlDateTime] + view: Union[Camera, LookAt, None] + update:Optional[Update] - schemata: List[Schema] - def __init__( self, ns: Optional[str] = None, @@ -392,37 +444,106 @@ def __repr__(self) -> str: ")" ) - registry.register( - _Container, + NetworkLinkControl, RegistryItem( ns_ids=("kml",), - attr_name="features", - node_name=( - "Folder,Placemark,Document,GroundOverlay,PhotoOverlay,ScreenOverlay," - "NetworkLink" - ), - classes=( - Document, - Folder, - Placemark, - GroundOverlay, - PhotoOverlay, - ScreenOverlay, - NetworkLink, - ), - get_kwarg=xml_subelement_list_kwarg, - set_element=xml_subelement_list, + attr_name="min_refresh_period", + node_name="minRefreshPeriod", + classes=(float,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, ), ) registry.register( - Document, + NetworkLinkControl, RegistryItem( ns_ids=("kml",), - attr_name="schemata", - node_name="Schema", - classes=(Schema,), - get_kwarg=xml_subelement_list_kwarg, - set_element=xml_subelement_list, + attr_name="max_session_length", + node_name="maxSessionLength", + classes=(float,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="cookie", + node_name="cookie", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="message", + node_name="message", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_name", + node_name="linkName", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_description", + node_name="linkDescription", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_snippet", + node_name="linkSnippet", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + item=RegistryItem( + ns_ids=("kml", ), + classes=(KmlDateTime,), + attr_name="expires", + node_name="expires", + get_kwarg=datetime_subelement_kwarg, + set_element=datetime_subelement, ), ) + +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="view", + node_name="Camera,LookAt", + classes=( + Camera, + LookAt, + ), + get_kwarg=xml_subelement_kwarg, + set_element=xml_subelement, + ), +) \ No newline at end of file diff --git a/fastkml/features.py b/fastkml/features.py index f8c8e34d..e8635bd2 100644 --- a/fastkml/features.py +++ b/fastkml/features.py @@ -305,6 +305,7 @@ def __init__( self.extended_data = extended_data self.times = times + registry.register( _Feature, RegistryItem( diff --git a/fastkml/network_control.py b/fastkml/network_control.py deleted file mode 100644 index 312ce5f4..00000000 --- a/fastkml/network_control.py +++ /dev/null @@ -1,184 +0,0 @@ -# Copyright (C) 2023 Christian Ledermann -# -# This library is free software; you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation; either version 2.1 of the License, or (at your option) -# any later version. -# -# This library is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this library; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -from typing import Any -from typing import Dict -from typing import Optional -from typing import Union -from fastkml.helpers import datetime_subelement -from fastkml.helpers import datetime_subelement_kwarg -from fastkml.helpers import subelement_text_kwarg -from fastkml.helpers import text_subelement -from fastkml.helpers import xml_subelement -from fastkml.helpers import xml_subelement_kwarg -from fastkml.registry import registry -from fastkml.registry import RegistryItem -from fastkml.base import _XMLObject -from fastkml.times import KmlDateTime -from fastkml.update import Update -from fastkml.views import Camera, LookAt - - -class _NetworkControl(_XMLObject): - """ - Absrtact base class representing NetworkLinkControl in KML. - """ - min_refresh_period: Optional[float] - max_session_length: Optional[float] - cookie: Optional[str] - message: Optional[str] - link_name: Optional[str] - link_description: Optional[str] - link_snippet: Optional[str] - expires: Optional[KmlDateTime] - view: Union[Camera, LookAt, None] - update:Optional[Update] - - def __init__( - self, - ns: Optional[str] = None, - name_spaces: Optional[Dict[str, str]] = None, - min_refresh_period: Optional[float] = None, - max_session_length: Optional[float] = None, - cookie: Optional[str] = None, - message: Optional[str] = None, - link_name: Optional[str] = None, - link_description: Optional[str] = None, - link_snippet: Optional[str] = None, - expires: Optional[KmlDateTime] = None, - view: Optional[Union[Camera, LookAt]] = None, - update:Optional[Update] = None, - **kwargs: Any, - ): - super().__init__( - ns=ns, - name_spaces=name_spaces, - **kwargs, - ) - self.min_refresh_period = min_refresh_period - self.max_session_length = max_session_length - self.cookie = cookie - self.message = message - self.link_name = link_name - self.link_description = link_description - self.link_snippet = link_snippet - self.expires = expires - self.view = view - self.update = update - -registry.register( - _NetworkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="min_refresh_period", - node_name="minRefreshPeriod", - classes=(float,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _NetworkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="max_session_length", - node_name="maxSessionLength", - classes=(float,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _NetworkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="cookie", - node_name="cookie", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _NetworkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="message", - node_name="message", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _NetworkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="link_name", - node_name="linkName", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _NetworkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="link_description", - node_name="linkDescription", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _NetworkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="link_snippet", - node_name="linkSnippet", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - _NetworkControl, - item=RegistryItem( - ns_ids=("kml", ), - classes=(KmlDateTime,), - attr_name="expires", - node_name="expires", - get_kwarg=datetime_subelement_kwarg, - set_element=datetime_subelement, - ), -) - -registry.register( - _NetworkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="view", - node_name="Camera,LookAt", - classes=( - Camera, - LookAt, - ), - get_kwarg=xml_subelement_kwarg, - set_element=xml_subelement, - ), -) \ No newline at end of file diff --git a/fastkml/times.py b/fastkml/times.py index 58ca8987..8f7a451e 100644 --- a/fastkml/times.py +++ b/fastkml/times.py @@ -193,11 +193,6 @@ def __str__(self) -> str: else self.dt.isoformat() ) return self.dt.isoformat() - - @classmethod - def get_tag_name(cls) -> str: - """Return the tag name.""" - return cls.__name__.lower() @classmethod def parse(cls, datestr: str) -> Optional["KmlDateTime"]: From aa307b5c751a3c85e79fb6d903c5379ef972f2d4 Mon Sep 17 00:00:00 2001 From: apurvabanka Date: Sat, 30 Nov 2024 23:53:59 -0500 Subject: [PATCH 04/11] removing update --- docs/network.kml | 16 +++ fastkml/__init__.py | 3 +- fastkml/containers.py | 190 +------------------------------- fastkml/kml.py | 2 +- fastkml/network_link_control.py | 190 ++++++++++++++++++++++++++++++++ fastkml/update.py | 133 ---------------------- 6 files changed, 210 insertions(+), 324 deletions(-) create mode 100644 docs/network.kml create mode 100644 fastkml/network_link_control.py delete mode 100644 fastkml/update.py diff --git a/docs/network.kml b/docs/network.kml new file mode 100644 index 00000000..48f6004d --- /dev/null +++ b/docs/network.kml @@ -0,0 +1,16 @@ + + + + 43200 + -1 + + A snippet of XHTML

+ ]]> +
+ 2008-05-30 +
+
\ No newline at end of file diff --git a/fastkml/__init__.py b/fastkml/__init__.py index b9936355..e364876b 100644 --- a/fastkml/__init__.py +++ b/fastkml/__init__.py @@ -31,6 +31,7 @@ from fastkml.atom import Link as AtomLink from fastkml.containers import Document from fastkml.containers import Folder +from fastkml.network_link_control import NetworkLinkControl from fastkml.data import Data from fastkml.data import ExtendedData from fastkml.data import Schema @@ -84,7 +85,7 @@ __all__ = [ "KML", - "NetworkLinkControl" + "NetworkLinkControl", "AtomAuthor", "AtomContributor", "AtomLink", diff --git a/fastkml/containers.py b/fastkml/containers.py index 3343bb29..8d0f6cfe 100644 --- a/fastkml/containers.py +++ b/fastkml/containers.py @@ -25,9 +25,7 @@ from typing import Union from fastkml import atom -from fastkml import config from fastkml import gx -from fastkml.base import _XMLObject from fastkml.data import ExtendedData from fastkml.data import Schema from fastkml.features import NetworkLink @@ -39,15 +37,8 @@ from fastkml.geometry import MultiGeometry from fastkml.geometry import Point from fastkml.geometry import Polygon -from fastkml.helpers import datetime_subelement -from fastkml.helpers import datetime_subelement_kwarg -from fastkml.helpers import subelement_text_kwarg -from fastkml.helpers import text_subelement -from fastkml.helpers import xml_subelement -from fastkml.helpers import xml_subelement_kwarg from fastkml.helpers import xml_subelement_list from fastkml.helpers import xml_subelement_list_kwarg -from fastkml.network_control import _NetworkControl from fastkml.overlays import GroundOverlay from fastkml.overlays import PhotoOverlay from fastkml.overlays import ScreenOverlay @@ -57,9 +48,7 @@ from fastkml.styles import StyleMap from fastkml.styles import StyleUrl from fastkml.times import TimeSpan -from fastkml.times import KmlDateTime from fastkml.times import TimeStamp -from fastkml.update import Update from fastkml.utils import find_all from fastkml.views import Camera from fastkml.views import LookAt @@ -336,6 +325,7 @@ def get_style_by_url(self, style_url: str) -> Optional[Union[Style, StyleMap]]: None, ) + registry.register( _Container, RegistryItem( @@ -369,181 +359,3 @@ def get_style_by_url(self, style_url: str) -> Optional[Union[Style, StyleMap]]: set_element=xml_subelement_list, ), ) - -class NetworkLinkControl(_XMLObject): - - _default_nsid = config.KML - - min_refresh_period: Optional[float] - max_session_length: Optional[float] - cookie: Optional[str] - message: Optional[str] - link_name: Optional[str] - link_description: Optional[str] - link_snippet: Optional[str] - expires: Optional[KmlDateTime] - view: Union[Camera, LookAt, None] - update:Optional[Update] - - def __init__( - self, - ns: Optional[str] = None, - name_spaces: Optional[Dict[str, str]] = None, - min_refresh_period: Optional[float] = None, - max_session_length: Optional[float] = None, - cookie: Optional[str] = None, - message: Optional[str] = None, - link_name: Optional[str] = None, - link_description: Optional[str] = None, - link_snippet: Optional[str] = None, - expires: Optional[KmlDateTime] = None, - update:Optional[Update] = None, - view: Optional[Union[Camera, LookAt]] = None, - **kwargs: Any - ) -> None: - super().__init__( - ns=ns, - name_spaces=name_spaces, - min_refresh_period=min_refresh_period, - max_session_length=max_session_length, - cookie=cookie, - message=message, - link_name=link_name, - link_description=link_description, - link_snippet=link_snippet, - expires=expires, - update=update, - view=view, - **kwargs - ) - - def __repr__(self) -> str: - """ - Return a string representation of the NetworkLinkControl object. - - Returns - ------- - str: A string representation of the NetworkLinkControl object. - - """ - return ( - f"{self.__class__.__module__}.{self.__class__.__name__}(" - f"ns={self.ns!r}, " - f"name_spaces={self.name_spaces!r}, " - f"min_refresh_period={self.min_refresh_period!r}, " - f"max_session_length={self.max_session_length!r}, " - f"cookie={self.cookie!r}, " - f"message={self.message!r}, " - f"link_name={self.link_name!r}, " - f"link_description={self.link_description!r}, " - f"link_snippet={self.link_snippet!r}, " - f"expires={self.expires!r}, " - f"update={self.update!r}, " - f"view={self.view!r}, " - f"**{self._get_splat()!r}," - ")" - ) - -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="min_refresh_period", - node_name="minRefreshPeriod", - classes=(float,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="max_session_length", - node_name="maxSessionLength", - classes=(float,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="cookie", - node_name="cookie", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="message", - node_name="message", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="link_name", - node_name="linkName", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="link_description", - node_name="linkDescription", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="link_snippet", - node_name="linkSnippet", - classes=(str,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, - ), -) -registry.register( - NetworkLinkControl, - item=RegistryItem( - ns_ids=("kml", ), - classes=(KmlDateTime,), - attr_name="expires", - node_name="expires", - get_kwarg=datetime_subelement_kwarg, - set_element=datetime_subelement, - ), -) - -registry.register( - NetworkLinkControl, - RegistryItem( - ns_ids=("kml",), - attr_name="view", - node_name="Camera,LookAt", - classes=( - Camera, - LookAt, - ), - get_kwarg=xml_subelement_kwarg, - set_element=xml_subelement, - ), -) \ No newline at end of file diff --git a/fastkml/kml.py b/fastkml/kml.py index 3edba7cb..121044f5 100644 --- a/fastkml/kml.py +++ b/fastkml/kml.py @@ -45,7 +45,7 @@ from fastkml import validator from fastkml.base import _XMLObject from fastkml.containers import Document -from fastkml.containers import NetworkLinkControl +from fastkml.network_link_control import NetworkLinkControl from fastkml.containers import Folder from fastkml.enums import Verbosity from fastkml.features import NetworkLink diff --git a/fastkml/network_link_control.py b/fastkml/network_link_control.py new file mode 100644 index 00000000..42a599a0 --- /dev/null +++ b/fastkml/network_link_control.py @@ -0,0 +1,190 @@ +from typing import Any +from typing import Dict +from typing import Optional +from typing import Union +from fastkml import config +from fastkml.base import _XMLObject +from fastkml.helpers import datetime_subelement +from fastkml.helpers import datetime_subelement_kwarg +from fastkml.helpers import subelement_text_kwarg +from fastkml.helpers import text_subelement +from fastkml.helpers import xml_subelement_list +from fastkml.helpers import xml_subelement_list_kwarg +from fastkml.registry import RegistryItem +from fastkml.registry import registry +from fastkml.times import KmlDateTime +from fastkml.views import Camera, LookAt + + +class NetworkLinkControl(_XMLObject): + + _default_nsid = config.KML + + min_refresh_period: Optional[float] + max_session_length: Optional[float] + cookie: Optional[str] + message: Optional[str] + link_name: Optional[str] + link_description: Optional[str] + link_snippet: Optional[str] + expires: Optional[KmlDateTime] + view: Union[Camera, LookAt, None] # TODO: Add Update field to the parameters + + def __init__( + self, + ns: Optional[str] = None, + name_spaces: Optional[Dict[str, str]] = None, + min_refresh_period: Optional[float] = None, + max_session_length: Optional[float] = None, + cookie: Optional[str] = None, + message: Optional[str] = None, + link_name: Optional[str] = None, + link_description: Optional[str] = None, + link_snippet: Optional[str] = None, + expires: Optional[KmlDateTime] = None, + view: Optional[Union[Camera, LookAt]] = None, + **kwargs: Any + ) -> None: + super().__init__( + ns=ns, + name_spaces=name_spaces, + min_refresh_period=min_refresh_period, + max_session_length=max_session_length, + cookie=cookie, + message=message, + link_name=link_name, + link_description=link_description, + link_snippet=link_snippet, + expires=expires, + view=view, + **kwargs + ) + + def __repr__(self) -> str: + """ + Return a string representation of the NetworkLinkControl object. + + Returns + ------- + str: A string representation of the NetworkLinkControl object. + + """ + return ( + f"{self.__class__.__module__}.{self.__class__.__name__}(" + f"ns={self.ns!r}, " + f"name_spaces={self.name_spaces!r}, " + f"min_refresh_period={self.min_refresh_period!r}, " + f"max_session_length={self.max_session_length!r}, " + f"cookie={self.cookie!r}, " + f"message={self.message!r}, " + f"link_name={self.link_name!r}, " + f"link_description={self.link_description!r}, " + f"link_snippet={self.link_snippet!r}, " + f"expires={self.expires!r}, " + f"view={self.view!r}, " + f"**{self._get_splat()!r}," + ")" + ) + +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="min_refresh_period", + node_name="minRefreshPeriod", + classes=(float,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="max_session_length", + node_name="maxSessionLength", + classes=(float,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="cookie", + node_name="cookie", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="message", + node_name="message", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_name", + node_name="linkName", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_description", + node_name="linkDescription", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="link_snippet", + node_name="linkSnippet", + classes=(str,), + get_kwarg=subelement_text_kwarg, + set_element=text_subelement, + ), +) +registry.register( + NetworkLinkControl, + item=RegistryItem( + ns_ids=("kml", ), + classes=(KmlDateTime,), + attr_name="expires", + node_name="expires", + get_kwarg=datetime_subelement_kwarg, + set_element=datetime_subelement, + ), +) +registry.register( + NetworkLinkControl, + RegistryItem( + ns_ids=("kml",), + attr_name="view", + node_name="Camera,LookAt", + classes=( + Camera, + LookAt, + ), + get_kwarg=xml_subelement_list_kwarg, + set_element=xml_subelement_list, + ), +) diff --git a/fastkml/update.py b/fastkml/update.py deleted file mode 100644 index 948e02a4..00000000 --- a/fastkml/update.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (C) 2023 Christian Ledermann -# -# This library is free software; you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation; either version 2.1 of the License, or (at your option) -# any later version. -# -# This library is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this library; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -from typing import Any -from typing import Union -from typing import Dict -from typing import Iterable -from typing import List -from typing import Optional -# from fastkml.containers import Folder -from fastkml.helpers import xml_subelement -from fastkml.helpers import xml_subelement_kwarg -from fastkml.registry import registry -from fastkml.registry import RegistryItem -from fastkml.base import _XMLObject -from fastkml.times import TimeSpan - -class Change(_XMLObject): - - def __int__( - self, - target_id: str, - elements: Optional[Union[TimeSpan]] = None - ): - super().__init__( - target_id=target_id, - elements=elements - ) - - def parse_children(self): - pass - -class Create(_XMLObject): - def __int__( - self, - target_id: str, - elements: Optional[Union[TimeSpan]] = None - ): - super().__init__( - target_id=target_id, - elements=elements - ) - - def parse_children(self): - pass - -class Delete(_XMLObject): - def __int__( - self, - target_id: str, - elements: Optional[Union[TimeSpan]] = None - ): - super().__init__( - target_id=target_id, - elements=elements - ) - - def parse_children(self): - pass - -class Update: - - def __init__( - target_href: Optional[str] = None, - change: Optional[Iterable[Change]] = None, - create: Optional[Iterable[Create]] = None, - delete: Optional[Iterable[Delete]] = None - ): - super().__init__( - target_href=target_href, - change=change, - create=create, - delete=delete - ) - -registry.register( - Update, - RegistryItem( - ns_ids=("kml",), - attr_name="change", - node_name="TimeSpan", - classes=( - # PhotoOverlay, - # Folder, - TimeSpan, - ), - get_kwarg=xml_subelement_kwarg, - set_element=xml_subelement, - ) -) -registry.register( - Update, - RegistryItem( - ns_ids=("kml",), - attr_name="create", - node_name="TimeSpan", - classes=( - # PhotoOverlay, - # Folder, - TimeSpan, - ), - get_kwarg=xml_subelement_kwarg, - set_element=xml_subelement, - ) -) -registry.register( - Update, - RegistryItem( - ns_ids=("kml",), - attr_name="delete", - node_name="TimeSpan", - classes=( - # PhotoOverlay, - # Folder, - TimeSpan, - ), - get_kwarg=xml_subelement_kwarg, - set_element=xml_subelement, - ) -) \ No newline at end of file From 4f4a3f0ac184081702cf7ee72d920d5d33e43fd5 Mon Sep 17 00:00:00 2001 From: apurvabanka Date: Sun, 1 Dec 2024 01:24:49 -0500 Subject: [PATCH 05/11] test cases --- fastkml/network_link_control.py | 24 +++++++++ tests/network_link_control_test.py | 85 ++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 tests/network_link_control_test.py diff --git a/fastkml/network_link_control.py b/fastkml/network_link_control.py index 42a599a0..d65569f2 100644 --- a/fastkml/network_link_control.py +++ b/fastkml/network_link_control.py @@ -1,3 +1,20 @@ +# Copyright (C) 2012-2024 Christian Ledermann +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import logging + from typing import Any from typing import Dict from typing import Optional @@ -16,6 +33,13 @@ from fastkml.views import Camera, LookAt +__all__ = [ + "NetworkLinkControl", +] + +logger = logging.getLogger(__name__) + + class NetworkLinkControl(_XMLObject): _default_nsid = config.KML diff --git a/tests/network_link_control_test.py b/tests/network_link_control_test.py new file mode 100644 index 00000000..4a5ffe98 --- /dev/null +++ b/tests/network_link_control_test.py @@ -0,0 +1,85 @@ +# Copyright (C) 2021 - 2022 Christian Ledermann +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +"""Test the Network Link Control classes.""" + +import datetime + +import pytest + +from fastkml.kml import KML +from fastkml.network_link_control import NetworkLinkControl +from fastkml.times import KmlDateTime +from tests.base import StdLibrary +from fastkml import views + +class TestStdLibrary(StdLibrary): + """Test with the standard library.""" + + def test_network_link_control_obj(self) -> None: + dt = datetime.datetime.now() + kml_datetime = KmlDateTime(dt=dt) + view = views.Camera() + + network_control_obj = NetworkLinkControl( + min_refresh_period=1.1, + max_session_length=100.1, + cookie="cookie", + message="message", + link_name="link_name", + link_description="link_description", + link_snippet="link_snippet", + expires=kml_datetime, + view=view + ) + + assert network_control_obj.min_refresh_period == 1.1 + assert network_control_obj.max_session_length == 100.1 + assert network_control_obj.cookie == "cookie" + assert network_control_obj.message == "message" + assert network_control_obj.link_name == "link_name" + assert network_control_obj.link_description == "link_description" + assert network_control_obj.link_snippet == "link_snippet" + assert network_control_obj.expires == kml_datetime + + assert network_control_obj.view == view + + def test_network_link_control_kml(self) -> None: + doc = ( + '' + "43200" + "-1" + "A Snippet" + "2008-05-30" + "" + ) + + network_control = NetworkLinkControl.from_string(doc) + + dt = datetime.date(2008, 5, 30) + kml_datetime = KmlDateTime(dt=dt) + + network_control_obj = NetworkLinkControl( + min_refresh_period=43200, + max_session_length=-1, + link_snippet="A Snippet", + expires=kml_datetime, + ) + + assert network_control.min_refresh_period == str(network_control_obj.min_refresh_period) + assert network_control.max_session_length == str(network_control_obj.max_session_length) + assert network_control.link_snippet == network_control_obj.link_snippet + assert network_control.expires == network_control_obj.expires \ No newline at end of file From 5f37b544daa49c3c3d253e9a3031b903a6f05b64 Mon Sep 17 00:00:00 2001 From: apurvabanka Date: Sun, 1 Dec 2024 02:06:51 -0500 Subject: [PATCH 06/11] mypt fixes --- fastkml/kml.py | 24 +++++++++++++++++++++--- fastkml/network_link_control.py | 16 ++++++++++------ tests/network_link_control_test.py | 20 +++++++++----------- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/fastkml/kml.py b/fastkml/kml.py index 121044f5..a5712482 100644 --- a/fastkml/kml.py +++ b/fastkml/kml.py @@ -60,7 +60,14 @@ logger = logging.getLogger(__name__) -kml_children = Union[Folder, Document, Placemark, GroundOverlay, PhotoOverlay, NetworkLinkControl] +kml_children = Union[ + Folder, + Document, + Placemark, + GroundOverlay, + PhotoOverlay, + NetworkLinkControl + ] def lxml_parse_and_validate( @@ -287,8 +294,19 @@ def write( KML, RegistryItem( ns_ids=("kml",), - classes=(Document, Folder, Placemark, GroundOverlay, PhotoOverlay, NetworkLink, NetworkLinkControl), - node_name="Document,Folder,Placemark,GroundOverlay,PhotoOverlay,NetworkLink,NetworkLinkControl", + classes=( + Document, + Folder, + Placemark, + GroundOverlay, + PhotoOverlay, + NetworkLink, + NetworkLinkControl + ), + node_name=( + "Document,Folder,Placemark,GroundOverlay,PhotoOverlay,NetworkLink," + "NetworkLinkControl" + ), attr_name="features", get_kwarg=xml_subelement_list_kwarg, set_element=xml_subelement_list, diff --git a/fastkml/network_link_control.py b/fastkml/network_link_control.py index d65569f2..ab812fbe 100644 --- a/fastkml/network_link_control.py +++ b/fastkml/network_link_control.py @@ -22,6 +22,8 @@ from fastkml import config from fastkml.base import _XMLObject from fastkml.helpers import datetime_subelement +from fastkml.helpers import float_subelement +from fastkml.helpers import subelement_float_kwarg from fastkml.helpers import datetime_subelement_kwarg from fastkml.helpers import subelement_text_kwarg from fastkml.helpers import text_subelement @@ -41,7 +43,7 @@ class NetworkLinkControl(_XMLObject): - + _default_nsid = config.KML min_refresh_period: Optional[float] @@ -54,6 +56,7 @@ class NetworkLinkControl(_XMLObject): expires: Optional[KmlDateTime] view: Union[Camera, LookAt, None] # TODO: Add Update field to the parameters + def __init__( self, ns: Optional[str] = None, @@ -83,7 +86,7 @@ def __init__( view=view, **kwargs ) - + def __repr__(self) -> str: """ Return a string representation of the NetworkLinkControl object. @@ -110,6 +113,7 @@ def __repr__(self) -> str: ")" ) + registry.register( NetworkLinkControl, RegistryItem( @@ -117,8 +121,8 @@ def __repr__(self) -> str: attr_name="min_refresh_period", node_name="minRefreshPeriod", classes=(float,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, + get_kwarg=subelement_float_kwarg, + set_element=float_subelement, ), ) registry.register( @@ -128,8 +132,8 @@ def __repr__(self) -> str: attr_name="max_session_length", node_name="maxSessionLength", classes=(float,), - get_kwarg=subelement_text_kwarg, - set_element=text_subelement, + get_kwarg=subelement_float_kwarg, + set_element=float_subelement, ), ) registry.register( diff --git a/tests/network_link_control_test.py b/tests/network_link_control_test.py index 4a5ffe98..5fc9720e 100644 --- a/tests/network_link_control_test.py +++ b/tests/network_link_control_test.py @@ -18,14 +18,12 @@ import datetime -import pytest - -from fastkml.kml import KML from fastkml.network_link_control import NetworkLinkControl from fastkml.times import KmlDateTime from tests.base import StdLibrary from fastkml import views + class TestStdLibrary(StdLibrary): """Test with the standard library.""" @@ -60,26 +58,26 @@ def test_network_link_control_obj(self) -> None: def test_network_link_control_kml(self) -> None: doc = ( '' - "43200" + "432000" "-1" "A Snippet" "2008-05-30" "" ) - network_control = NetworkLinkControl.from_string(doc) + nc = NetworkLinkControl.from_string(doc) dt = datetime.date(2008, 5, 30) kml_datetime = KmlDateTime(dt=dt) - network_control_obj = NetworkLinkControl( - min_refresh_period=43200, + nc_obj = NetworkLinkControl( + min_refresh_period=432000, max_session_length=-1, link_snippet="A Snippet", expires=kml_datetime, ) - assert network_control.min_refresh_period == str(network_control_obj.min_refresh_period) - assert network_control.max_session_length == str(network_control_obj.max_session_length) - assert network_control.link_snippet == network_control_obj.link_snippet - assert network_control.expires == network_control_obj.expires \ No newline at end of file + assert nc.min_refresh_period == nc_obj.min_refresh_period + assert nc.max_session_length == nc_obj.max_session_length + assert nc.link_snippet == nc_obj.link_snippet + assert nc.expires == nc_obj.expires From 9ece33b45951e3ebc7b5aee482db30bce178afbd Mon Sep 17 00:00:00 2001 From: apurvabanka Date: Sun, 1 Dec 2024 02:08:34 -0500 Subject: [PATCH 07/11] typo --- fastkml/network_link_control.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fastkml/network_link_control.py b/fastkml/network_link_control.py index ab812fbe..1e9d05bd 100644 --- a/fastkml/network_link_control.py +++ b/fastkml/network_link_control.py @@ -54,8 +54,7 @@ class NetworkLinkControl(_XMLObject): link_description: Optional[str] link_snippet: Optional[str] expires: Optional[KmlDateTime] - view: Union[Camera, LookAt, None] # TODO: Add Update field to the parameters - + view: Union[Camera, LookAt, None] # TODO: Add Update field to the parameters def __init__( self, From 10ebe81d2cb1ff7a1142ae1aaefe801e8fe896a0 Mon Sep 17 00:00:00 2001 From: apurvabanka Date: Sun, 1 Dec 2024 17:35:14 -0500 Subject: [PATCH 08/11] requested changes --- fastkml/__init__.py | 4 ++-- fastkml/kml.py | 2 +- fastkml/network_link_control.py | 22 ++++++++++++---------- tests/network_link_control_test.py | 10 +++------- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/fastkml/__init__.py b/fastkml/__init__.py index 0c9fb66f..e94dae15 100644 --- a/fastkml/__init__.py +++ b/fastkml/__init__.py @@ -31,7 +31,6 @@ from fastkml.atom import Link as AtomLink from fastkml.containers import Document from fastkml.containers import Folder -from fastkml.network_link_control import NetworkLinkControl from fastkml.data import Data from fastkml.data import ExtendedData from fastkml.data import Schema @@ -59,6 +58,7 @@ from fastkml.model import Orientation from fastkml.model import ResourceMap from fastkml.model import Scale +from fastkml.network_link_control import NetworkLinkControl from fastkml.overlays import GroundOverlay from fastkml.overlays import ImagePyramid from fastkml.overlays import LatLonBox @@ -91,7 +91,6 @@ __all__ = [ "KML", - "NetworkLinkControl", "Alias", "AtomAuthor", "AtomContributor", @@ -121,6 +120,7 @@ "Model", "MultiGeometry", "NetworkLink", + "NetworkLinkControl", "Orientation", "OuterBoundaryIs", "OverlayXY", diff --git a/fastkml/kml.py b/fastkml/kml.py index b858e40f..70d1b8ec 100644 --- a/fastkml/kml.py +++ b/fastkml/kml.py @@ -66,7 +66,7 @@ Placemark, GroundOverlay, PhotoOverlay, - NetworkLinkControl + NetworkLinkControl, ] diff --git a/fastkml/network_link_control.py b/fastkml/network_link_control.py index 1e9d05bd..feeec67d 100644 --- a/fastkml/network_link_control.py +++ b/fastkml/network_link_control.py @@ -14,26 +14,26 @@ # along with this library; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import logging - from typing import Any from typing import Dict from typing import Optional from typing import Union + from fastkml import config from fastkml.base import _XMLObject from fastkml.helpers import datetime_subelement +from fastkml.helpers import datetime_subelement_kwarg from fastkml.helpers import float_subelement from fastkml.helpers import subelement_float_kwarg -from fastkml.helpers import datetime_subelement_kwarg from fastkml.helpers import subelement_text_kwarg from fastkml.helpers import text_subelement -from fastkml.helpers import xml_subelement_list -from fastkml.helpers import xml_subelement_list_kwarg +from fastkml.helpers import xml_subelement +from fastkml.helpers import xml_subelement_kwarg from fastkml.registry import RegistryItem from fastkml.registry import registry from fastkml.times import KmlDateTime -from fastkml.views import Camera, LookAt - +from fastkml.views import Camera +from fastkml.views import LookAt __all__ = [ "NetworkLinkControl", @@ -69,7 +69,7 @@ def __init__( link_snippet: Optional[str] = None, expires: Optional[KmlDateTime] = None, view: Optional[Union[Camera, LookAt]] = None, - **kwargs: Any + **kwargs: Any, ) -> None: super().__init__( ns=ns, @@ -83,7 +83,7 @@ def __init__( link_snippet=link_snippet, expires=expires, view=view, - **kwargs + **kwargs, ) def __repr__(self) -> str: @@ -122,6 +122,7 @@ def __repr__(self) -> str: classes=(float,), get_kwarg=subelement_float_kwarg, set_element=float_subelement, + default=0, ), ) registry.register( @@ -133,6 +134,7 @@ def __repr__(self) -> str: classes=(float,), get_kwarg=subelement_float_kwarg, set_element=float_subelement, + default=-1, ), ) registry.register( @@ -211,7 +213,7 @@ def __repr__(self) -> str: Camera, LookAt, ), - get_kwarg=xml_subelement_list_kwarg, - set_element=xml_subelement_list, + get_kwarg=xml_subelement_kwarg, + set_element=xml_subelement, ), ) diff --git a/tests/network_link_control_test.py b/tests/network_link_control_test.py index 5fc9720e..b348ee52 100644 --- a/tests/network_link_control_test.py +++ b/tests/network_link_control_test.py @@ -51,9 +51,8 @@ def test_network_link_control_obj(self) -> None: assert network_control_obj.link_name == "link_name" assert network_control_obj.link_description == "link_description" assert network_control_obj.link_snippet == "link_snippet" - assert network_control_obj.expires == kml_datetime - - assert network_control_obj.view == view + assert str(network_control_obj.expires) == str(kml_datetime) + assert str(network_control_obj.view) == str(view) def test_network_link_control_kml(self) -> None: doc = ( @@ -77,7 +76,4 @@ def test_network_link_control_kml(self) -> None: expires=kml_datetime, ) - assert nc.min_refresh_period == nc_obj.min_refresh_period - assert nc.max_session_length == nc_obj.max_session_length - assert nc.link_snippet == nc_obj.link_snippet - assert nc.expires == nc_obj.expires + assert nc == nc_obj From bb7c364cfd59a9124b57e7a3cfbe636d94aad855 Mon Sep 17 00:00:00 2001 From: Christian Ledermann Date: Mon, 2 Dec 2024 00:04:15 +0000 Subject: [PATCH 09/11] Refactor NetworkLinkControl to use clean_string for input parameters and add Hypothesis tests for validation --- fastkml/network_link_control.py | 66 ++++++++-- tests/hypothesis/network_link_control_test.py | 122 ++++++++++++++++++ tests/network_link_control_test.py | 8 +- 3 files changed, 181 insertions(+), 15 deletions(-) create mode 100644 tests/hypothesis/network_link_control_test.py diff --git a/fastkml/network_link_control.py b/fastkml/network_link_control.py index feeec67d..01d2d066 100644 --- a/fastkml/network_link_control.py +++ b/fastkml/network_link_control.py @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2024 Christian Ledermann +# Copyright (C) 2024 Christian Ledermann # # This library is free software; you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the Free @@ -13,6 +13,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +""" +NetworkLinkControl class. + +Controls the behavior of files fetched by a . + +https://developers.google.com/kml/documentation/kmlreference#networklinkcontrol +""" + import logging from typing import Any from typing import Dict @@ -21,6 +29,7 @@ from fastkml import config from fastkml.base import _XMLObject +from fastkml.helpers import clean_string from fastkml.helpers import datetime_subelement from fastkml.helpers import datetime_subelement_kwarg from fastkml.helpers import float_subelement @@ -43,6 +52,7 @@ class NetworkLinkControl(_XMLObject): + """Controls the behavior of files fetched by a .""" _default_nsid = config.KML @@ -54,7 +64,7 @@ class NetworkLinkControl(_XMLObject): link_description: Optional[str] link_snippet: Optional[str] expires: Optional[KmlDateTime] - view: Union[Camera, LookAt, None] # TODO: Add Update field to the parameters + view: Union[Camera, LookAt, None] def __init__( self, @@ -71,20 +81,52 @@ def __init__( view: Optional[Union[Camera, LookAt]] = None, **kwargs: Any, ) -> None: + """ + Create a NetworkLinkControl object. + + Parameters + ---------- + ns : str, optional + The namespace to use for the NetworkLinkControl object. + name_spaces : dict, optional + A dictionary of namespaces to use for the NetworkLinkControl object. + min_refresh_period : float, optional + The minimum number of seconds between fetches. A value of -1 indicates that + the NetworkLinkControl object should be fetched only once. + max_session_length : float, optional + The maximum number of seconds that the link should be followed. + cookie : str, optional + A string value that can be used to identify the client request. + message : str, optional + A message to be displayed to the user in case of a failure. + link_name : str, optional + The name of the link. + link_description : str, optional + A description of the link. + link_snippet : str, optional + A snippet of text to be displayed in the link. + expires : KmlDateTime, optional + The time at which the link should expire. + view : Camera or LookAt, optional + The view to be used when the link is followed. + **kwargs : Any, optional + Additional keyword arguments. + + """ super().__init__( ns=ns, name_spaces=name_spaces, - min_refresh_period=min_refresh_period, - max_session_length=max_session_length, - cookie=cookie, - message=message, - link_name=link_name, - link_description=link_description, - link_snippet=link_snippet, - expires=expires, - view=view, **kwargs, ) + self.min_refresh_period = min_refresh_period + self.max_session_length = max_session_length + self.cookie = clean_string(cookie) + self.message = clean_string(message) + self.link_name = clean_string(link_name) + self.link_description = clean_string(link_description) + self.link_snippet = clean_string(link_snippet) + self.expires = expires + self.view = view def __repr__(self) -> str: """ @@ -195,7 +237,7 @@ def __repr__(self) -> str: registry.register( NetworkLinkControl, item=RegistryItem( - ns_ids=("kml", ), + ns_ids=("kml",), classes=(KmlDateTime,), attr_name="expires", node_name="expires", diff --git a/tests/hypothesis/network_link_control_test.py b/tests/hypothesis/network_link_control_test.py new file mode 100644 index 00000000..3ff1d963 --- /dev/null +++ b/tests/hypothesis/network_link_control_test.py @@ -0,0 +1,122 @@ +# Copyright (C) 2024 Christian Ledermann +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +"""Hypothesis tests for the fastkml.network_link_control module.""" + +import typing + +from hypothesis import given +from hypothesis import strategies as st + +import fastkml +import fastkml.enums +import fastkml.model +import fastkml.views +from tests.base import Lxml +from tests.hypothesis.common import assert_repr_roundtrip +from tests.hypothesis.common import assert_str_roundtrip +from tests.hypothesis.common import assert_str_roundtrip_terse +from tests.hypothesis.common import assert_str_roundtrip_verbose +from tests.hypothesis.strategies import kml_datetimes +from tests.hypothesis.strategies import xml_text + + +class TestLxml(Lxml): + @given( + min_refresh_period=st.one_of( + st.none(), + st.floats(allow_nan=False, allow_infinity=False).filter(lambda x: x != 0), + ), + max_session_length=st.one_of( + st.none(), + st.floats(allow_nan=False, allow_infinity=False).filter(lambda x: x != -1), + ), + cookie=st.one_of(st.none(), xml_text()), + message=st.one_of(st.none(), xml_text()), + link_name=st.one_of(st.none(), xml_text()), + link_description=st.one_of(st.none(), xml_text()), + link_snippet=st.one_of(st.none(), xml_text()), + expires=st.one_of( + st.none(), + kml_datetimes(), + ), + view=st.one_of( + st.none(), + st.builds( + fastkml.views.Camera, + longitude=st.floats( + allow_nan=False, + allow_infinity=False, + min_value=-180, + max_value=180, + ).filter(lambda x: x != 0), + latitude=st.floats( + allow_nan=False, + allow_infinity=False, + min_value=-90, + max_value=90, + ).filter(lambda x: x != 0), + altitude=st.floats(allow_nan=False, allow_infinity=False).filter( + lambda x: x != 0, + ), + ), + st.builds( + fastkml.views.LookAt, + longitude=st.floats( + allow_nan=False, + allow_infinity=False, + min_value=-180, + max_value=180, + ).filter(lambda x: x != 0), + latitude=st.floats( + allow_nan=False, + allow_infinity=False, + min_value=-90, + max_value=90, + ).filter(lambda x: x != 0), + altitude=st.floats(allow_nan=False, allow_infinity=False).filter( + lambda x: x != 0, + ), + ), + ), + ) + def test_fuzz_network_link_control( + self, + min_refresh_period: typing.Optional[float], + max_session_length: typing.Optional[float], + cookie: typing.Optional[str], + message: typing.Optional[str], + link_name: typing.Optional[str], + link_description: typing.Optional[str], + link_snippet: typing.Optional[str], + expires: typing.Optional[fastkml.KmlDateTime], + view: typing.Union[fastkml.Camera, fastkml.LookAt, None], + ) -> None: + nlc = fastkml.NetworkLinkControl( + min_refresh_period=min_refresh_period, + max_session_length=max_session_length, + cookie=cookie, + message=message, + link_name=link_name, + link_description=link_description, + link_snippet=link_snippet, + expires=expires, + view=view, + ) + + assert_repr_roundtrip(nlc) + assert_str_roundtrip(nlc) + assert_str_roundtrip_terse(nlc) + assert_str_roundtrip_verbose(nlc) diff --git a/tests/network_link_control_test.py b/tests/network_link_control_test.py index b348ee52..5cfa0ac4 100644 --- a/tests/network_link_control_test.py +++ b/tests/network_link_control_test.py @@ -18,17 +18,19 @@ import datetime +from dateutil.tz import tzutc + +from fastkml import views from fastkml.network_link_control import NetworkLinkControl from fastkml.times import KmlDateTime from tests.base import StdLibrary -from fastkml import views class TestStdLibrary(StdLibrary): """Test with the standard library.""" def test_network_link_control_obj(self) -> None: - dt = datetime.datetime.now() + dt = datetime.datetime.now(tz=tzutc()) kml_datetime = KmlDateTime(dt=dt) view = views.Camera() @@ -41,7 +43,7 @@ def test_network_link_control_obj(self) -> None: link_description="link_description", link_snippet="link_snippet", expires=kml_datetime, - view=view + view=view, ) assert network_control_obj.min_refresh_period == 1.1 From 82605bc71418bcbdc1b26fa1546d6697e6cb9127 Mon Sep 17 00:00:00 2001 From: Christian Ledermann Date: Mon, 2 Dec 2024 00:08:07 +0000 Subject: [PATCH 10/11] fix black --- fastkml/kml.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fastkml/kml.py b/fastkml/kml.py index 70d1b8ec..aee6f9cd 100644 --- a/fastkml/kml.py +++ b/fastkml/kml.py @@ -45,13 +45,13 @@ from fastkml import validator from fastkml.base import _XMLObject from fastkml.containers import Document -from fastkml.network_link_control import NetworkLinkControl from fastkml.containers import Folder from fastkml.enums import Verbosity from fastkml.features import NetworkLink from fastkml.features import Placemark from fastkml.helpers import xml_subelement_list from fastkml.helpers import xml_subelement_list_kwarg +from fastkml.network_link_control import NetworkLinkControl from fastkml.overlays import GroundOverlay from fastkml.overlays import PhotoOverlay from fastkml.registry import RegistryItem @@ -61,13 +61,13 @@ logger = logging.getLogger(__name__) kml_children = Union[ - Folder, - Document, - Placemark, - GroundOverlay, - PhotoOverlay, - NetworkLinkControl, - ] + Folder, + Document, + Placemark, + GroundOverlay, + PhotoOverlay, + NetworkLinkControl, +] def lxml_parse_and_validate( From 453ccfe17410ac90fef2a7177736c52900282351 Mon Sep 17 00:00:00 2001 From: Christian Ledermann Date: Mon, 2 Dec 2024 00:08:25 +0000 Subject: [PATCH 11/11] Add support for NetworkLinkControl in the changelog --- docs/HISTORY.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/HISTORY.rst b/docs/HISTORY.rst index 360ef1f5..4e171fa8 100644 --- a/docs/HISTORY.rst +++ b/docs/HISTORY.rst @@ -6,6 +6,7 @@ Changelog - Add support for ScreenOverlay and Model. - allow parsing kml files without namespace declarations. +- Add support for NetworkLinkControl. [Apurva Banka] 1.0 (2024/11/19)