Skip to content

Commit

Permalink
support namespaces for xml attributes #318
Browse files Browse the repository at this point in the history
  • Loading branch information
cleder committed Jun 19, 2024
1 parent 6055f57 commit 2f4d3a4
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 25 deletions.
12 changes: 6 additions & 6 deletions fastkml/atom.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ def __eq__(self, other: object) -> bool:
registry.register(
Link,
item=RegistryItem(
ns_ids=("atom",),
ns_ids=("atom", ""),
attr_name="href",
node_name="href",
classes=(str,),
Expand All @@ -175,7 +175,7 @@ def __eq__(self, other: object) -> bool:
registry.register(
Link,
item=RegistryItem(
ns_ids=("atom",),
ns_ids=("atom", ""),
attr_name="rel",
node_name="rel",
classes=(str,),
Expand All @@ -186,7 +186,7 @@ def __eq__(self, other: object) -> bool:
registry.register(
Link,
item=RegistryItem(
ns_ids=("atom",),
ns_ids=("atom", ""),
attr_name="type",
node_name="type",
classes=(str,),
Expand All @@ -197,7 +197,7 @@ def __eq__(self, other: object) -> bool:
registry.register(
Link,
item=RegistryItem(
ns_ids=("atom",),
ns_ids=("atom", ""),
attr_name="hreflang",
node_name="hreflang",
classes=(str,),
Expand All @@ -209,7 +209,7 @@ def __eq__(self, other: object) -> bool:
registry.register(
Link,
item=RegistryItem(
ns_ids=("atom",),
ns_ids=("atom", ""),
attr_name="title",
node_name="title",
classes=(str,),
Expand All @@ -220,7 +220,7 @@ def __eq__(self, other: object) -> bool:
registry.register(
Link,
item=RegistryItem(
ns_ids=("atom",),
ns_ids=("atom", ""),
attr_name="length",
node_name="length",
classes=(int,),
Expand Down
14 changes: 7 additions & 7 deletions fastkml/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ def __bool__(self) -> bool:
registry.register(
SimpleField,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="name",
node_name="name",
classes=(str,),
Expand All @@ -135,7 +135,7 @@ def __bool__(self) -> bool:
registry.register(
SimpleField,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="type",
node_name="type",
classes=(DataType,),
Expand Down Expand Up @@ -215,7 +215,7 @@ def append(self, field: SimpleField) -> None:
registry.register(
Schema,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="name",
node_name="name",
classes=(str,),
Expand Down Expand Up @@ -287,7 +287,7 @@ def __bool__(self) -> bool:
registry.register(
Data,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="name",
node_name="name",
classes=(str,),
Expand All @@ -299,7 +299,7 @@ def __bool__(self) -> bool:
registry.register(
Data,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="value",
node_name="value",
classes=(str,),
Expand Down Expand Up @@ -376,7 +376,7 @@ def __bool__(self) -> bool:
registry.register(
SimpleData,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="name",
node_name="name",
classes=(str,),
Expand Down Expand Up @@ -446,7 +446,7 @@ def append_data(self, data: SimpleData) -> None:
registry.register(
SchemaData,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="schema_url",
node_name="schemaUrl",
classes=(str,),
Expand Down
2 changes: 1 addition & 1 deletion fastkml/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ def __bool__(self) -> bool:
registry.register(
Snippet,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="max_lines",
node_name="maxLines",
classes=(int,),
Expand Down
2 changes: 1 addition & 1 deletion fastkml/geometry.py
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ def __repr__(self) -> str:
registry.register(
_Geometry,
item=RegistryItem(
ns_ids=("kml",),
ns_ids=("kml", "gx"),
classes=(AltitudeMode,),
attr_name="altitude_mode",
node_name="altitudeMode",
Expand Down
11 changes: 7 additions & 4 deletions fastkml/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,8 @@ def attribute_text_kwarg(
classes: Tuple[known_types, ...],
strict: bool,
) -> Dict[str, str]:
return {kwarg: element.get(node_name)} if element.get(node_name) else {}
attr = element.get(f"{ns}{node_name}")
return {kwarg: attr} if attr else {}


def _get_boolean_value(text: str, strict: bool) -> bool:
Expand Down Expand Up @@ -475,7 +476,8 @@ def attribute_int_kwarg(
classes: Tuple[known_types, ...],
strict: bool,
) -> Dict[str, int]:
return {kwarg: int(element.get(node_name))} if element.get(node_name) else {}
attr = element.get(f"{ns}{node_name}")
return {kwarg: int(attr)} if attr else {}


def subelement_float_kwarg(
Expand Down Expand Up @@ -515,8 +517,9 @@ def attribute_float_kwarg(
classes: Tuple[known_types, ...],
strict: bool,
) -> Dict[str, float]:
attr = element.get(f"{ns}{node_name}")
try:
return {kwarg: float(element.get(node_name))} if element.get(node_name) else {}
return {kwarg: float(attr)} if attr else {}
except ValueError as exc:
handle_error(
error=exc,
Expand Down Expand Up @@ -578,7 +581,7 @@ def attribute_enum_kwarg(
) -> Dict[str, Enum]:
assert len(classes) == 1
assert issubclass(classes[0], Enum)
if raw := element.get(node_name):
if raw := element.get(f"{ns}{node_name}"):
try:
value = classes[0](raw)
if raw != value.value and strict:
Expand Down
4 changes: 2 additions & 2 deletions fastkml/kml_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def __eq__(self, other: object) -> bool:
registry.register(
_BaseObject,
item=RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="id",
node_name="id",
classes=(str,),
Expand All @@ -97,7 +97,7 @@ def __eq__(self, other: object) -> bool:
registry.register(
_BaseObject,
item=RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="target_id",
node_name="targetId",
classes=(str,),
Expand Down
8 changes: 4 additions & 4 deletions fastkml/styles.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ def get_tag_name(cls) -> str:
registry.register(
HotSpot,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="x",
node_name="x",
classes=(float,),
Expand All @@ -296,7 +296,7 @@ def get_tag_name(cls) -> str:
registry.register(
HotSpot,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="y",
node_name="y",
classes=(float,),
Expand All @@ -307,7 +307,7 @@ def get_tag_name(cls) -> str:
registry.register(
HotSpot,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="xunits",
node_name="xunits",
classes=(Units,),
Expand All @@ -318,7 +318,7 @@ def get_tag_name(cls) -> str:
registry.register(
HotSpot,
RegistryItem(
ns_ids=("kml",),
ns_ids=("", "kml"),
attr_name="yunits",
node_name="yunits",
classes=(Units,),
Expand Down
10 changes: 10 additions & 0 deletions tests/base_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,16 @@ def test_from_string(self) -> None:
assert be.id == "id-0"
assert be.target_id == "target-id-0"

def test_from_string_attr_ns_prefix(self) -> None:
be = kml_base._BaseObject.class_from_string(
string=(
'<kml:test xmlns:kml="http://www.opengis.net/kml/2.2" '
'kml:id="id-0" kml:targetId="target-id-0" />'
),
)
assert be.id == "id-0"
assert be.target_id == "target-id-0"

def test_base_class_from_string(self) -> None:
be = kml_base._BaseObject.class_from_string(
'<test id="id-0" targetId="td-00" />',
Expand Down
12 changes: 12 additions & 0 deletions tests/geometries/geometry_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,18 @@ def test_altitude_mode(self) -> None:

assert g.altitude_mode == AltitudeMode("clampToGround")

def test_gx_altitude_mode(self) -> None:
doc = (
'<kml:Point xmlns:kml="http://www.opengis.net/kml/2.2" '
'xmlns:gx="http://www.google.com/kml/ext/2.2">'
"<kml:coordinates>0.000000,1.000000</kml:coordinates>"
"<gx:altitudeMode>clampToSeaFloor</gx:altitudeMode>"
"</kml:Point>"
)
g = Point.class_from_string(doc)

assert g.altitude_mode == AltitudeMode("clampToSeaFloor")

def test_extrude(self) -> None:
doc = """<kml:Point xmlns:kml="http://www.opengis.net/kml/2.2">
<kml:coordinates>0.000000,1.000000</kml:coordinates>
Expand Down

0 comments on commit 2f4d3a4

Please sign in to comment.