diff --git a/overpy/__init__.py b/overpy/__init__.py index a85bb01..facaba3 100644 --- a/overpy/__init__.py +++ b/overpy/__init__.py @@ -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 @@ -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 @@ -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): """ @@ -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 @@ -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. @@ -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) @@ -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") diff --git a/tests/test_xml.py b/tests/test_xml.py index 8a00b76..ed78867 100644 --- a/tests/test_xml.py +++ b/tests/test_xml.py @@ -10,10 +10,10 @@ 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) @@ -21,10 +21,10 @@ 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) @@ -32,37 +32,37 @@ 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) @@ -70,39 +70,39 @@ 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: