Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions overpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import json
import re
import time
import enum
from typing import Any, Callable, ClassVar, Dict, List, NoReturn, Optional, Tuple, Type, TypeVar, Union

from overpy import exception
Expand All @@ -19,8 +20,11 @@

ElementTypeVar = TypeVar("ElementTypeVar", bound="Element")

XML_PARSER_DOM = 1
XML_PARSER_SAX = 2

class XMLParser(enum.IntEnum):
DOM = 1
SAX = 2


# Try to convert some common attributes
# http://wiki.openstreetmap.org/wiki/Elements#Common_attributes
Expand Down Expand Up @@ -64,7 +68,7 @@ def __init__(
self,
read_chunk_size: Optional[int] = None,
url: Optional[str] = None,
xml_parser: int = XML_PARSER_SAX,
xml_parser: XMLParser = XMLParser.SAX,
max_retry_count: int = None,
retry_timeout: float = None):
"""
Expand Down Expand Up @@ -213,7 +217,7 @@ def parse_json(self, data: Union[bytes, str], encoding: str = "utf-8") -> "Resul
self._handle_remark_msg(msg=data_parsed.get("remark"))
return Result.from_json(data_parsed, api=self)

def parse_xml(self, data: Union[bytes, str], encoding: str = "utf-8", parser: Optional[int] = None):
def parse_xml(self, data: Union[bytes, str], encoding: str = "utf-8", parser: Optional[XMLParser] = None):
"""

:param data: Raw XML Data
Expand Down Expand Up @@ -371,7 +375,7 @@ def from_xml(
cls,
data: Union[str, xml.etree.ElementTree.Element],
api: Optional[Overpass] = None,
parser: Optional[int] = None) -> "Result":
parser: Optional[XMLParser] = None) -> "Result":
"""
Create a new instance and load data from xml data or object.

Expand All @@ -387,12 +391,12 @@ def from_xml(
"""
if parser is None:
if isinstance(data, str):
parser = XML_PARSER_SAX
parser = XMLParser.SAX
else:
parser = XML_PARSER_DOM
parser = XMLParser.DOM

result = cls(api=api)
if parser == XML_PARSER_DOM:
if parser == XMLParser.DOM:
import xml.etree.ElementTree as ET
if isinstance(data, str):
root = ET.fromstring(data)
Expand All @@ -407,7 +411,7 @@ def from_xml(
if child.tag.lower() == elem_cls._type_value:
result.append(elem_cls.from_xml(child, result=result))

elif parser == XML_PARSER_SAX:
elif parser == XMLParser.SAX:
from io import StringIO
if not isinstance(data, str):
raise ValueError("data must be of type str if using the SAX parser")
Expand Down
40 changes: 20 additions & 20 deletions tests/test_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,99 +10,99 @@ class TestAreas(BaseTestAreas):
def test_node01(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/area-01.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/area-01.xml"), parser=overpy.XMLParser.DOM)
self._test_area01(result)
# SAX
result = api.parse_xml(read_file("xml/area-01.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/area-01.xml"), parser=overpy.XMLParser.SAX)
self._test_area01(result)


class TestNodes(BaseTestNodes):
def test_node01(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/node-01.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/node-01.xml"), parser=overpy.XMLParser.DOM)
self._test_node01(result)
# SAX
result = api.parse_xml(read_file("xml/node-01.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/node-01.xml"), parser=overpy.XMLParser.SAX)
self._test_node01(result)


class TestRelation(BaseTestRelation):
def test_relation01(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/relation-01.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/relation-01.xml"), parser=overpy.XMLParser.DOM)
self._test_relation01(result)
# SAX
result = api.parse_xml(read_file("xml/relation-01.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/relation-01.xml"), parser=overpy.XMLParser.SAX)
self._test_relation01(result)

def test_relation02(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/relation-02.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/relation-02.xml"), parser=overpy.XMLParser.DOM)
self._test_relation02(result)
# SAX
result = api.parse_xml(read_file("xml/relation-02.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/relation-02.xml"), parser=overpy.XMLParser.SAX)
self._test_relation02(result)

def test_relation03(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/relation-03.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/relation-03.xml"), parser=overpy.XMLParser.DOM)
self._test_relation03(result)
# SAX
result = api.parse_xml(read_file("xml/relation-03.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/relation-03.xml"), parser=overpy.XMLParser.SAX)
self._test_relation03(result)

def test_relation04(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XMLParser.DOM)
self._test_relation04(result)
# SAX
result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XMLParser.SAX)
self._test_relation04(result)


class TestWay(BaseTestWay):
def test_way01(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/way-01.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/way-01.xml"), parser=overpy.XMLParser.DOM)
self._test_way01(result)
# SAX
result = api.parse_xml(read_file("xml/way-01.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/way-01.xml"), parser=overpy.XMLParser.SAX)
self._test_way01(result)

def test_way02(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/way-02.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/way-02.xml"), parser=overpy.XMLParser.DOM)
self._test_way02(result)
# SAX
result = api.parse_xml(read_file("xml/way-02.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/way-02.xml"), parser=overpy.XMLParser.SAX)
self._test_way02(result)

def test_way03(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/way-03.xml"), parser=overpy.XML_PARSER_DOM)
result = api.parse_xml(read_file("xml/way-03.xml"), parser=overpy.XMLParser.DOM)
self._test_way03(result)
# SAX
result = api.parse_xml(read_file("xml/way-03.xml"), parser=overpy.XML_PARSER_SAX)
result = api.parse_xml(read_file("xml/way-03.xml"), parser=overpy.XMLParser.SAX)
self._test_way03(result)

def test_way04(self):
api = overpy.Overpass()
# DOM
with pytest.raises(ValueError):
api.parse_xml(read_file("xml/way-04.xml"), parser=overpy.XML_PARSER_DOM)
api.parse_xml(read_file("xml/way-04.xml"), parser=overpy.XMLParser.DOM)

# SAX
with pytest.raises(ValueError):
api.parse_xml(read_file("xml/way-04.xml"), parser=overpy.XML_PARSER_SAX)
api.parse_xml(read_file("xml/way-04.xml"), parser=overpy.XMLParser.SAX)


class TestDataError:
Expand Down