overpy-0.4/ 0000755 0001750 0001750 00000000000 13022347701 013124 5 ustar phibo phibo 0000000 0000000 overpy-0.4/PKG-INFO 0000644 0001750 0001750 00000007666 13022347701 014240 0 ustar phibo phibo 0000000 0000000 Metadata-Version: 1.1
Name: overpy
Version: 0.4
Summary: Python Wrapper to access the OpenStreepMap Overpass API
Home-page: https://github.com/DinoTools/python-overpy
Author: PhiBo (DinoTools)
Author-email: UNKNOWN
License: MIT
Description: Python Overpass Wrapper
=======================
A Python Wrapper to access the Overpass API.
Have a look at the `documentation`_ to find additional information.
.. image:: https://pypip.in/version/overpy/badge.svg
:target: https://pypi.python.org/pypi/overpy/
:alt: Latest Version
.. image:: https://pypip.in/license/overpy/badge.svg
:target: https://pypi.python.org/pypi/overpy/
:alt: License
.. image:: https://travis-ci.org/DinoTools/python-overpy.svg?branch=master
:target: https://travis-ci.org/DinoTools/python-overpy
.. image:: https://coveralls.io/repos/DinoTools/python-overpy/badge.png?branch=master
:target: https://coveralls.io/r/DinoTools/python-overpy?branch=master
Features
--------
* Query Overpass API
* Parse JSON and XML response data
* Additional helper functions
Install
-------
**Requirements:**
Supported Python versions:
* Python 2.7
* Python >= 3.2
* PyPy and PyPy3
**Install:**
.. code-block:: console
$ pip install overpy
Examples
--------
Additional examples can be found in the `documentation`_ and in the *examples* directory.
.. code-block:: python
import overpy
api = overpy.Overpass()
# fetch all ways and nodes
result = api.query("""
way(50.746,7.154,50.748,7.157) ["highway"];
(._;>;);
out body;
""")
for way in result.ways:
print("Name: %s" % way.tags.get("name", "n/a"))
print(" Highway: %s" % way.tags.get("highway", "n/a"))
print(" Nodes:")
for node in way.nodes:
print(" Lat: %f, Lon: %f" % (node.lat, node.lon))
Helper
~~~~~~
Helper methods are available to provide easy access to often used requests.
.. code-block:: python
import overpy.helper
# 3600062594 is the OSM id of Chemnitz and is the bounding box for the request
street = overpy.helper.get_street(
"Straße der Nationen",
"3600062594"
)
# this finds an intersection between Straße der Nationen and Carolastraße in Chemnitz
intersection = overpy.helper.get_intersection(
"Straße der Nationen",
"Carolastraße",
"3600062594"
)
License
-------
Published under the MIT (see LICENSE for more information)
.. _`documentation`: http://python-overpy.readthedocs.org/
Keywords: OverPy Overpass OSM OpenStreetMap
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
overpy-0.4/setup.py 0000644 0001750 0001750 00000003162 13022347635 014646 0 ustar phibo phibo 0000000 0000000 #!/usr/bin/env python
import os
import sys
from setuptools import setup, find_packages
base_dir = os.path.dirname(__file__)
about = {}
with open(os.path.join(base_dir, "overpy", "__about__.py")) as f:
exec(f.read(), about)
filename_readme = os.path.join(base_dir, "README.rst")
if sys.version_info[0] == 2:
import io
fp = io.open(filename_readme, encoding="utf-8")
else:
fp = open(filename_readme, encoding="utf-8")
long_description = fp.read()
setup(
name=about["__title__"],
version=about["__version__"],
description=about["__summary__"],
long_description=long_description,
license=about["__license__"],
url=about["__uri__"],
zip_safe=False,
author=about["__author__"],
classifiers=[
"Development Status :: 4 - Beta",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.2",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy"
],
keywords="OverPy Overpass OSM OpenStreetMap",
install_requires=[],
packages=find_packages(exclude=["*.tests", "*.tests.*"]),
include_package_data=True,
package_data={
#"": ["README"],
},
setup_requires=["pytest-runner"],
tests_require=["pytest"],
)
overpy-0.4/setup.cfg 0000644 0001750 0001750 00000000240 13022347701 014741 0 ustar phibo phibo 0000000 0000000 [metadata]
license-file = LICENSE
[aliases]
test = pytest
[tool:pytest]
python_files = tests/*.py
[egg_info]
tag_build =
tag_date = 0
tag_svn_revision = 0
overpy-0.4/README.rst 0000644 0001750 0001750 00000004367 13022347635 014633 0 ustar phibo phibo 0000000 0000000 Python Overpass Wrapper
=======================
A Python Wrapper to access the Overpass API.
Have a look at the `documentation`_ to find additional information.
.. image:: https://pypip.in/version/overpy/badge.svg
:target: https://pypi.python.org/pypi/overpy/
:alt: Latest Version
.. image:: https://pypip.in/license/overpy/badge.svg
:target: https://pypi.python.org/pypi/overpy/
:alt: License
.. image:: https://travis-ci.org/DinoTools/python-overpy.svg?branch=master
:target: https://travis-ci.org/DinoTools/python-overpy
.. image:: https://coveralls.io/repos/DinoTools/python-overpy/badge.png?branch=master
:target: https://coveralls.io/r/DinoTools/python-overpy?branch=master
Features
--------
* Query Overpass API
* Parse JSON and XML response data
* Additional helper functions
Install
-------
**Requirements:**
Supported Python versions:
* Python 2.7
* Python >= 3.2
* PyPy and PyPy3
**Install:**
.. code-block:: console
$ pip install overpy
Examples
--------
Additional examples can be found in the `documentation`_ and in the *examples* directory.
.. code-block:: python
import overpy
api = overpy.Overpass()
# fetch all ways and nodes
result = api.query("""
way(50.746,7.154,50.748,7.157) ["highway"];
(._;>;);
out body;
""")
for way in result.ways:
print("Name: %s" % way.tags.get("name", "n/a"))
print(" Highway: %s" % way.tags.get("highway", "n/a"))
print(" Nodes:")
for node in way.nodes:
print(" Lat: %f, Lon: %f" % (node.lat, node.lon))
Helper
~~~~~~
Helper methods are available to provide easy access to often used requests.
.. code-block:: python
import overpy.helper
# 3600062594 is the OSM id of Chemnitz and is the bounding box for the request
street = overpy.helper.get_street(
"Straße der Nationen",
"3600062594"
)
# this finds an intersection between Straße der Nationen and Carolastraße in Chemnitz
intersection = overpy.helper.get_intersection(
"Straße der Nationen",
"Carolastraße",
"3600062594"
)
License
-------
Published under the MIT (see LICENSE for more information)
.. _`documentation`: http://python-overpy.readthedocs.org/
overpy-0.4/MANIFEST.in 0000644 0001750 0001750 00000000430 13022347635 014665 0 ustar phibo phibo 0000000 0000000 include README.rst CHANGELOG.rst
include LICENSE
include MANIFEST.in
include docs/make.bat docs.Makefile
include docs/source/conf.py
include docs/source/*.rst
include examples/*.py
include tests/*.py
include tests/json/*.json
include tests/response/*.html
include tests/xml/*.xml
overpy-0.4/LICENSE 0000644 0001750 0001750 00000002075 13022347635 014143 0 ustar phibo phibo 0000000 0000000 The MIT License (MIT)
Copyright (c) 2014 PhiBo (DinoTools)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
overpy-0.4/CHANGELOG.rst 0000644 0001750 0001750 00000001775 13022347635 015165 0 ustar phibo phibo 0000000 0000000 Changelog
=========
0.x (`master`_)
~~~~~~~~~~~~~~~
.. note:: This version is not yet released and is under development.
0.4 (2016-12-08)
~~~~~~~~~~~~~~~~
* Add SAX parser
* Add option to choose DOM or SAX parser
* Fix issues with CI builds with Python 3.2
* Add Python 3.5 to CI builds
* Fix issues (Thanks to all contributors)
* Add property for default API URL
* Add examples
* Build Fixes
* GitHub templates
* Parse center information
* Parse geometry information
* Support Areas
0.3.1 (2015-04-30)
~~~~~~~~~~~~~~~~~~
* Improve example
0.3.0 (2015-04-30)
~~~~~~~~~~~~~~~~~~
* Improve internal data handling (Dominik)
* Add helper functions (Morris Jobke)
0.2.0 (2014-12-27)
~~~~~~~~~~~~~~~~~~
* Added support for xml response data
* Added support for exceptions
* Added tests with 100% code coverage
* Removed Python 2.6 support
* Added more examples to the documentation
0.1.0 (2014-12-14)
~~~~~~~~~~~~~~~~~~
Proof of concept
* Initial release.
.. _`master`: https://github.com/DinoTools/python-overpy
overpy-0.4/tests/ 0000755 0001750 0001750 00000000000 13022347701 014266 5 ustar phibo phibo 0000000 0000000 overpy-0.4/tests/test_xml.py 0000644 0001750 0001750 00000013346 13022347635 016514 0 ustar phibo phibo 0000000 0000000 import pytest
import overpy
from tests.base_class import BaseTestAreas, BaseTestNodes, BaseTestRelation, BaseTestWay
from tests.base_class import read_file
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)
self._test_area01(result)
# SAX
result = api.parse_xml(read_file("xml/area-01.xml"), parser=overpy.XML_PARSER_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)
self._test_node01(result)
# SAX
result = api.parse_xml(read_file("xml/node-01.xml"), parser=overpy.XML_PARSER_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)
self._test_relation01(result)
# SAX
result = api.parse_xml(read_file("xml/relation-01.xml"), parser=overpy.XML_PARSER_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)
self._test_relation02(result)
# SAX
result = api.parse_xml(read_file("xml/relation-02.xml"), parser=overpy.XML_PARSER_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)
self._test_relation03(result)
# SAX
result = api.parse_xml(read_file("xml/relation-03.xml"), parser=overpy.XML_PARSER_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)
self._test_relation04(result)
# SAX
result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XML_PARSER_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)
self._test_way01(result)
# SAX
result = api.parse_xml(read_file("xml/way-01.xml"), parser=overpy.XML_PARSER_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)
self._test_way02(result)
# SAX
result = api.parse_xml(read_file("xml/way-02.xml"), parser=overpy.XML_PARSER_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)
self._test_way03(result)
# SAX
result = api.parse_xml(read_file("xml/way-03.xml"), parser=overpy.XML_PARSER_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)
# SAX
with pytest.raises(ValueError):
api.parse_xml(read_file("xml/way-04.xml"), parser=overpy.XML_PARSER_SAX)
class TestDataError(object):
def _get_element_wrong_type(self):
data = ""
import xml.etree.ElementTree as ET
return ET.fromstring(data)
def test_element_wrong_type(self):
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.Node.from_xml(
self._get_element_wrong_type()
)
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.Relation.from_xml(
self._get_element_wrong_type()
)
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.RelationNode.from_xml(
self._get_element_wrong_type()
)
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.RelationWay.from_xml(
self._get_element_wrong_type()
)
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.Way.from_xml(
self._get_element_wrong_type()
)
def test_node_missing_data(self):
import xml.etree.ElementTree as ET
# Tag without k attribute
data = """"""
node = ET.fromstring(data)
with pytest.raises(ValueError):
overpy.Node.from_xml(node)
def test_relation_missing_data(self):
import xml.etree.ElementTree as ET
# Tag without k attribute
data = """"""
node = ET.fromstring(data)
with pytest.raises(ValueError):
overpy.Relation.from_xml(node)
def test_way_missing_data(self):
import xml.etree.ElementTree as ET
# Node without ref attribute
data = """"""
node = ET.fromstring(data)
with pytest.raises(ValueError):
overpy.Way.from_xml(node)
# Tag without k attribute
data = """"""
node = ET.fromstring(data)
with pytest.raises(ValueError):
overpy.Way.from_xml(node)
overpy-0.4/tests/test_result_way.py 0000644 0001750 0001750 00000005473 13022347635 020114 0 ustar phibo phibo 0000000 0000000 import pytest
import overpy
from tests import read_file, new_server_thread, BaseRequestHandler
class HandleResponseJSON01(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 200 OK\r\n")
self.request.send(b"Content-Type: application/json\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("json/result-way-01.json", "rb"))
class HandleResponseJSON02(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 200 OK\r\n")
self.request.send(b"Content-Type: application/json\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("json/result-way-02.json", "rb"))
class HandleResponseJSON03(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 200 OK\r\n")
self.request.send(b"Content-Type: application/json\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("json/result-way-03.json", "rb"))
class TestNodes(object):
def test_missing_unresolvable(self):
url, t = new_server_thread(HandleResponseJSON01)
api = overpy.Overpass()
api.url = url
result = api.parse_json(read_file("json/result-way-01.json"))
assert len(result.nodes) == 0
assert len(result.ways) == 1
way = result.ways[0]
assert isinstance(way, overpy.Way)
with pytest.raises(overpy.exception.DataIncomplete):
way.get_nodes()
with pytest.raises(overpy.exception.DataIncomplete):
way.get_nodes(resolve_missing=True)
assert len(result.nodes) == 0
t.join()
def test_missing_partly_unresolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result = api.parse_json(read_file("json/result-way-01.json"))
assert len(result.nodes) == 0
assert len(result.ways) == 1
way = result.ways[0]
assert isinstance(way, overpy.Way)
with pytest.raises(overpy.exception.DataIncomplete):
way.get_nodes()
with pytest.raises(overpy.exception.DataIncomplete):
way.get_nodes(resolve_missing=True)
assert len(result.nodes) == 1
t.join()
def test_missing_resolvable(self):
url, t = new_server_thread(HandleResponseJSON03)
api = overpy.Overpass()
api.url = url
result = api.parse_json(read_file("json/result-way-01.json"))
assert len(result.nodes) == 0
assert len(result.ways) == 1
way = result.ways[0]
assert isinstance(way, overpy.Way)
with pytest.raises(overpy.exception.DataIncomplete):
way.get_nodes()
nodes = way.get_nodes(resolve_missing=True)
assert len(nodes) == 2
t.join() overpy-0.4/tests/test_result.py 0000644 0001750 0001750 00000012037 13022347635 017226 0 ustar phibo phibo 0000000 0000000 import pytest
import overpy
from tests import read_file, new_server_thread, BaseRequestHandler
class HandleResponseJSON02(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 200 OK\r\n")
self.request.send(b"Content-Type: application/json\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("json/result-expand-02.json", "rb"))
class TestResult(object):
def test_expand_error(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/result-expand-01.json"))
with pytest.raises(ValueError):
result.expand(123)
with pytest.raises(ValueError):
result.expand(1.23)
with pytest.raises(ValueError):
result.expand("abc")
def test_expand_01(self):
api = overpy.Overpass()
result1 = api.parse_json(read_file("json/result-expand-01.json"))
assert len(result1.nodes) == 2
assert len(result1.ways) == 1
result2 = api.parse_json(read_file("json/result-expand-02.json"))
assert len(result2.nodes) == 2
assert len(result2.ways) == 1
result1.expand(result2)
# Don't overwrite existing elements
assert len(result1.nodes) == 3
assert len(result1.ways) == 2
class TestArea(object):
def test_missing_unresolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_area(123, resolve_missing=True)
t.join()
def test_missing_resolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
# Node must not be available
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_area(3605945176)
# Node must be available
area = result1.get_area(3605945176, resolve_missing=True)
assert isinstance(area, overpy.Area)
assert area.id == 3605945176
t.join()
class TestNode(object):
def test_missing_unresolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_node(123, resolve_missing=True)
t.join()
def test_missing_resolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
# Node must not be available
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_node(3233854235)
# Node must be available
node = result1.get_node(3233854235, resolve_missing=True)
assert isinstance(node, overpy.Node)
assert node.id == 3233854235
t.join()
class TestRelation(object):
def test_missing_unresolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_relation(123, resolve_missing=True)
t.join()
def test_missing_resolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
# Relation must not be available
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_relation(2046898)
# Relation must be available
relation = result1.get_relation(2046898, resolve_missing=True)
assert isinstance(relation, overpy.Relation)
assert relation.id == 2046898
t.join()
class TestWay(object):
def test_missing_unresolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_way(123, resolve_missing=True)
t.join()
def test_missing_resolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
# Way must not be available
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_way(317146078)
# Way must be available
way = result1.get_way(317146078, resolve_missing=True)
assert isinstance(way, overpy.Way)
assert way.id == 317146078
t.join()
overpy-0.4/tests/test_request.py 0000644 0001750 0001750 00000013445 13022347635 017404 0 ustar phibo phibo 0000000 0000000 import pytest
import overpy
from tests import BaseRequestHandler
from tests import read_file, new_server_thread
class HandleOverpassBadRequest(BaseRequestHandler):
"""
Simulate the response if the query string has syntax errors
"""
def handle(self):
self.request.send(b"HTTP/1.0 400 Bad Request\r\n")
self.request.send(b"Content-Type text/html; charset=utf-8\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("response/bad-request.html", "rb"))
class HandleOverpassBadRequestEncoding(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 400 Bad Request\r\n")
self.request.send(b"Content-Type text/html; charset=utf-8\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("response/bad-request-encoding.html", "rb"))
class HandleOverpassTooManyRequests(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 429 Too Many Requests\r\n")
self.request.send(b"Content-Type text/html; charset=utf-8\r\n")
self.request.send(b"\r\n")
self.request.send(b"Too Many Requests")
class HandleOverpassGatewayTimeout(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 504 Gateway Timeout\r\n")
self.request.send(b"Content-Type text/html; charset=utf-8\r\n")
self.request.send(b"\r\n")
self.request.send(b"Gateway Timeout")
class HandleOverpassUnknownHTTPStatusCode(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 123 Unknown\r\n")
self.request.send(b"Content-Type text/html; charset=utf-8\r\n")
self.request.send(b"\r\n")
self.request.send(b"Unknown status code")
class HandleResponseJSON(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 200 OK\r\n")
self.request.send(b"Content-Type: application/json\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("json/way-02.json", "rb"))
class HandleResponseXML(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 200 OK\r\n")
self.request.send(b"Content-Type: application/osm3s+xml\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("xml/way-02.xml", "rb"))
class HandleResponseUnknown(BaseRequestHandler):
"""
"""
def handle(self):
self.request.send(b"HTTP/1.0 200 OK\r\n")
self.request.send(b"Content-Type: application/foobar\r\n")
self.request.send(b"\r\n")
self.request.send(read_file("xml/way-02.xml", "rb"))
class TestQuery(object):
def test_chunk_size(self):
url, t = new_server_thread(HandleResponseJSON)
api = overpy.Overpass(read_chunk_size=128)
api.url = url
result = api.query("[out:json];node(50.745,7.17,50.75,7.18);out;")
t.join()
assert len(result.nodes) > 0
def test_overpass_syntax_error(self):
url, t = new_server_thread(HandleOverpassBadRequest)
api = overpy.Overpass()
api.url = url
with pytest.raises(overpy.exception.OverpassBadRequest):
# Missing ; after way(1)
api.query((
"way(1)"
"out body;"
))
t.join()
def test_overpass_syntax_error_encoding_error(self):
with pytest.raises(UnicodeDecodeError):
# File should be encoded with iso8859-15 and will raise an exception
tmp = read_file("response/bad-request-encoding.html", "rb")
tmp.decode("utf-8")
url, t = new_server_thread(HandleOverpassBadRequestEncoding)
api = overpy.Overpass()
api.url = url
with pytest.raises(overpy.exception.OverpassBadRequest):
# Missing ; after way(1)
api.query((
"way(1)"
"out body;"
))
t.join()
def test_overpass_too_many_requests(self):
url, t = new_server_thread(HandleOverpassTooManyRequests)
api = overpy.Overpass()
api.url = url
with pytest.raises(overpy.exception.OverpassTooManyRequests):
api.query((
"way(1);"
"out body;"
))
t.join()
def test_overpass_gateway_timeout(self):
url, t = new_server_thread(HandleOverpassGatewayTimeout)
api = overpy.Overpass()
api.url = url
with pytest.raises(overpy.exception.OverpassGatewayTimeout):
api.query((
"way(1);"
"out body;"
))
t.join()
def test_overpass_unknown_status_code(self):
url, t = new_server_thread(HandleOverpassUnknownHTTPStatusCode)
api = overpy.Overpass()
api.url = url
with pytest.raises(overpy.exception.OverpassUnknownHTTPStatusCode):
api.query((
"way(1);"
"out body;"
))
t.join()
def test_response_json(self):
url, t = new_server_thread(HandleResponseJSON)
api = overpy.Overpass()
api.url = url
result = api.query("[out:json];node(50.745,7.17,50.75,7.18);out;")
t.join()
assert len(result.nodes) > 0
def test_response_unknown(self):
url, t = new_server_thread(HandleResponseUnknown)
api = overpy.Overpass()
api.url = url
with pytest.raises(overpy.exception.OverpassUnknownContentType):
api.query("[out:xml];node(50.745,7.17,50.75,7.18);out;")
t.join()
def test_response_xml(self):
url, t = new_server_thread(HandleResponseXML)
api = overpy.Overpass()
api.url = url
result = api.query("[out:xml];node(50.745,7.17,50.75,7.18);out;")
t.join()
assert len(result.nodes) > 0 overpy-0.4/tests/test_json.py 0000644 0001750 0001750 00000005562 13022347635 016666 0 ustar phibo phibo 0000000 0000000 import pytest
import overpy
from tests.base_class import BaseTestAreas, BaseTestNodes, BaseTestRelation, BaseTestWay
from tests.base_class import read_file
class TestAreas(BaseTestAreas):
def test_area01(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/area-01.json"))
self._test_area01(result)
class TestNodes(BaseTestNodes):
def test_node01(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/node-01.json"))
self._test_node01(result)
class TestRelation(BaseTestRelation):
def test_relation01(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/relation-01.json"))
self._test_relation01(result)
def test_relation02(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/relation-02.json"))
self._test_relation02(result)
def test_relation03(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/relation-03.json"))
self._test_relation03(result)
def test_relation04(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/relation-04.json"))
self._test_relation04(result)
class TestWay(BaseTestWay):
def test_way01(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/way-01.json"))
self._test_way01(result)
def test_way02(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/way-02.json"))
self._test_way02(result)
def test_way03(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/way-03.json"))
self._test_way03(result)
def test_way04(self):
api = overpy.Overpass()
with pytest.raises(ValueError):
api.parse_json(read_file("json/way-04.json"))
class TestDataError(object):
def test_element_wrong_type(self):
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.Node.from_json(
{
"type": "foo"
}
)
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.Relation.from_json(
{
"type": "foo"
}
)
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.RelationNode.from_json(
{
"type": "foo"
}
)
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.RelationWay.from_json(
{
"type": "foo"
}
)
with pytest.raises(overpy.exception.ElementDataWrongType):
overpy.Way.from_json(
{
"type": "foo"
}
) overpy-0.4/tests/test_exception.py 0000644 0001750 0001750 00000002746 13022347635 017714 0 ustar phibo phibo 0000000 0000000 import overpy
class TestExceptions(object):
def test_element_data_wrong_type(self):
e = overpy.exception.ElementDataWrongType("from1")
assert e.type_expected == "from1"
assert e.type_provided == None
assert isinstance(str(e), str)
e = overpy.exception.ElementDataWrongType("from2", "to2")
assert e.type_expected == "from2"
assert e.type_provided == "to2"
assert isinstance(str(e), str)
def test_overpass_bad_request(self):
e = overpy.exception.OverpassBadRequest("query")
assert e.query == "query"
assert isinstance(e.msgs, list)
assert len(e.msgs) == 0
assert str(e) == ""
e = overpy.exception.OverpassBadRequest("test\nquery\n123", ["abc", 1])
assert e.query == "test\nquery\n123"
assert isinstance(e.msgs, list)
assert len(e.msgs) == 2
assert str(e) == "abc\n1"
def test_overpass_unknown_content_type(self):
e = overpy.exception.OverpassUnknownContentType(None)
assert e.content_type == None
assert str(e).startswith("No content")
e = overpy.exception.OverpassUnknownContentType("content")
assert e.content_type == "content"
assert str(e).startswith("Unknown content")
assert str(e).endswith("content")
def test_overpass_unknown_http_status_code(self):
e = overpy.exception.OverpassUnknownHTTPStatusCode(123)
assert e.code == 123
assert str(e).endswith("123") overpy-0.4/tests/base_class.py 0000644 0001750 0001750 00000036641 13022347635 016757 0 ustar phibo phibo 0000000 0000000 from decimal import Decimal
from datetime import datetime
import os
import pytest
import overpy
from tests import read_file
class BaseTestAreas(object):
def _test_area01(self, result):
assert len(result.areas) == 4
assert len(result.nodes) == 0
assert len(result.relations) == 0
assert len(result.ways) == 0
area = result.areas[0]
assert isinstance(area, overpy.Area)
assert isinstance(area.id, int)
assert area.id == 2448756446
assert isinstance(area.tags, dict)
assert len(area.tags) == 12
area = result.areas[1]
assert isinstance(area, overpy.Area)
assert isinstance(area.id, int)
assert area.id == 3600055060
assert isinstance(area.tags, dict)
assert len(area.tags) == 13
area = result.areas[2]
assert isinstance(area, overpy.Area)
assert isinstance(area.id, int)
assert area.id == 3605945175
assert isinstance(area.tags, dict)
assert len(area.tags) == 12
area = result.areas[3]
assert isinstance(area, overpy.Area)
assert isinstance(area.id, int)
assert area.id == 3605945176
assert isinstance(area.tags, dict)
assert len(area.tags) == 14
# try to get a single area by id
area = result.get_area(3605945175)
assert area.id == 3605945175
# try to get a single area by id not available in the result
with pytest.raises(overpy.exception.DataIncomplete):
result.get_area(123456)
# area_ids is an alias for get_node_ids() and should return the same data
for area_ids in (result.area_ids, result.get_area_ids()):
assert len(area_ids) == 4
assert area_ids[0] == 2448756446
assert area_ids[1] == 3600055060
assert area_ids[2] == 3605945175
assert area_ids[3] == 3605945176
assert len(result.node_ids) == 0
assert len(result.get_node_ids()) == 0
assert len(result.relation_ids) == 0
assert len(result.get_relation_ids()) == 0
assert len(result.way_ids) == 0
assert len(result.get_way_ids()) == 0
class BaseTestNodes(object):
def _test_node01(self, result):
assert len(result.nodes) == 3
assert len(result.relations) == 0
assert len(result.ways) == 0
node = result.nodes[0]
assert isinstance(node, overpy.Node)
assert isinstance(node.id, int)
assert isinstance(node.lat, Decimal)
assert isinstance(node.lon, Decimal)
assert node.id == 50878400
assert node.lat == Decimal("50.7461788")
assert node.lon == Decimal("7.1742257")
assert isinstance(node.tags, dict)
assert len(node.tags) == 0
node = result.nodes[1]
assert isinstance(node, overpy.Node)
assert isinstance(node.id, int)
assert isinstance(node.lat, Decimal)
assert isinstance(node.lon, Decimal)
assert node.id == 100793192
assert node.lat == Decimal("50.7468472")
assert node.lon == Decimal("7.1709376")
assert isinstance(node.tags, dict)
assert len(node.tags) == 1
assert node.tags["highway"] == "turning_circle"
node = result.nodes[2]
assert isinstance(node, overpy.Node)
assert isinstance(node.id, int)
assert isinstance(node.lat, Decimal)
assert isinstance(node.lon, Decimal)
assert node.id == 3233854234
assert node.lat == Decimal("50.7494236")
assert node.lon == Decimal("7.1757664")
assert isinstance(node.attributes, dict)
assert len(node.attributes) == 5
assert node.attributes["changeset"] == 23456789
assert node.attributes["timestamp"] == datetime(2014, 12, 14, 7, 27, 19, 0, None)
assert node.attributes["uid"] == 345678
assert node.attributes["user"] == "TestUser"
assert node.attributes["version"] == 1
# try to get a single node by id
node = result.get_node(50878400)
assert node.id == 50878400
# try to get a single node by id not available in the result
with pytest.raises(overpy.exception.DataIncomplete):
result.get_node(123456)
# node_ids is an alias for get_node_ids() and should return the same data
for node_ids in (result.node_ids, result.get_node_ids()):
assert len(node_ids) == 3
assert node_ids[0] == 50878400
assert node_ids[1] == 100793192
assert node_ids[2] == 3233854234
assert len(result.relation_ids) == 0
assert len(result.get_relation_ids()) == 0
assert len(result.way_ids) == 0
assert len(result.get_way_ids()) == 0
class BaseTestRelation(object):
def _test_relation01(self, result):
assert len(result.nodes) == 0
assert len(result.relations) == 1
assert len(result.ways) == 0
relation = result.relations[0]
assert isinstance(relation, overpy.Relation)
assert isinstance(relation.id, int)
assert relation.id == 2046898
assert isinstance(relation.tags, dict)
assert len(relation.tags) == 6
assert relation.tags["from"] == "Here"
assert relation.tags["name"] == "Test relation"
assert relation.tags["ref"] == "609"
assert relation.tags["route"] == "bus"
assert relation.tags["to"] == "There"
assert relation.tags["type"] == "route"
assert isinstance(relation.attributes, dict)
assert len(relation.attributes) == 5
assert relation.attributes["changeset"] == 17433822
assert relation.attributes["timestamp"] == datetime(2014, 12, 15, 13, 13, 11, 0, None)
assert relation.attributes["uid"] == 12345
assert relation.attributes["user"] == "Username"
assert relation.attributes["version"] == 12
assert len(relation.members) == 5
assert isinstance(relation.members[0], overpy.RelationNode)
assert isinstance(relation.members[1], overpy.RelationNode)
assert isinstance(relation.members[2], overpy.RelationNode)
assert isinstance(relation.members[3], overpy.RelationNode)
assert isinstance(relation.members[4], overpy.RelationWay)
def _test_relation02(self, result):
assert len(result.nodes) == 3
assert len(result.relations) == 1
assert len(result.ways) == 1
relation = result.relations[0]
assert isinstance(relation, overpy.Relation)
assert isinstance(relation.id, int)
assert relation.id == 2046898
assert isinstance(relation.tags, dict)
assert len(relation.tags) == 6
assert relation.tags["from"] == "Here"
assert relation.tags["name"] == "Test relation"
assert relation.tags["ref"] == "609"
assert relation.tags["route"] == "bus"
assert relation.tags["to"] == "There"
assert relation.tags["type"] == "route"
assert isinstance(relation.attributes, dict)
assert len(relation.attributes) == 5
assert len(relation.members) == 4
member = relation.members[0]
assert isinstance(member, overpy.RelationNode)
node = member.resolve()
assert isinstance(node, overpy.Node)
assert node.id == 3233854233
assert member.ref == node.id
member = relation.members[1]
assert isinstance(member, overpy.RelationNode)
node = member.resolve()
assert isinstance(node, overpy.Node)
assert node.id == 3233854234
assert member.ref == node.id
member = relation.members[2]
assert isinstance(member, overpy.RelationNode)
node = member.resolve()
assert isinstance(node, overpy.Node)
assert node.id == 3233854235
assert member.ref == node.id
member = relation.members[3]
assert isinstance(member, overpy.RelationWay)
way = member.resolve()
assert isinstance(way, overpy.Way)
assert way.id == 317146078
assert member.ref == way.id
def _test_relation03(self, result):
assert len(result.nodes) == 0
assert len(result.relations) == 1
assert len(result.ways) == 0
relation = result.relations[0]
assert isinstance(relation, overpy.Relation)
assert isinstance(relation.id, int)
assert relation.id == 23092
assert isinstance(relation.tags, dict)
assert len(relation.tags) == 10
assert isinstance(relation.center_lat, Decimal)
assert isinstance(relation.center_lon, Decimal)
assert relation.center_lat == Decimal("50.8176646")
assert relation.center_lon == Decimal("7.0208539")
def _test_relation04(self, result):
assert len(result.nodes) == 0
assert len(result.relations) == 1
assert len(result.ways) == 0
relation = result.relations[0]
assert isinstance(relation, overpy.Relation)
assert isinstance(relation.id, int)
assert relation.id == 23092
assert isinstance(relation.tags, dict)
assert len(relation.tags) == 10
way = relation.members[2]
assert isinstance(way, overpy.RelationWay)
assert len(way.attributes) == 0
assert isinstance(way.attributes, dict)
assert isinstance(way.geometry, list)
assert len(way.geometry) == 2
assert isinstance(way.geometry[0], overpy.RelationWayGeometryValue)
assert isinstance(way.geometry[0].lat, Decimal)
assert isinstance(way.geometry[0].lon, Decimal)
assert way.geometry[0].lat == Decimal("50.8137408")
assert way.geometry[0].lon == Decimal("6.9813352")
class BaseTestWay(object):
def _test_way01(self, result):
assert len(result.nodes) == 0
assert len(result.relations) == 0
assert len(result.ways) == 2
way = result.ways[0]
assert isinstance(way, overpy.Way)
assert isinstance(way.id, int)
assert way.id == 317146077
assert isinstance(way.tags, dict)
assert len(way.tags) == 1
assert way.tags["building"] == "yes"
assert isinstance(way.attributes, dict)
assert len(way.attributes) == 0
way = result.ways[1]
assert isinstance(way, overpy.Way)
assert isinstance(way.id, int)
assert way.id == 317146078
assert isinstance(way.tags, dict)
assert len(way.tags) == 0
assert isinstance(way.attributes, dict)
assert len(way.attributes) == 5
assert way.attributes["changeset"] == 23456789
assert way.attributes["timestamp"] == datetime(2014, 12, 14, 7, 27, 21, 0, None)
assert way.attributes["uid"] == 345678
assert way.attributes["user"] == "TestUser"
assert way.attributes["version"] == 1
# try to get a single way by id
way = result.get_way(317146077)
assert way.id == 317146077
# try to get a single way by id not available in the result
with pytest.raises(overpy.exception.DataIncomplete):
result.get_way(123456)
assert len(result.node_ids) == 0
assert len(result.get_node_ids()) == 0
assert len(result.relation_ids) == 0
assert len(result.get_relation_ids()) == 0
# way_ids is an alias for get_way_ids() and should return the same data
for way_ids in (result.way_ids, result.get_way_ids()):
assert len(way_ids) == 2
assert way_ids[0] == 317146077
assert way_ids[1] == 317146078
def _test_way02(self, result):
assert len(result.nodes) == 6
assert len(result.relations) == 0
assert len(result.ways) == 1
node = result.nodes[0]
assert isinstance(node, overpy.Node)
assert isinstance(node.id, int)
assert isinstance(node.lat, Decimal)
assert isinstance(node.lon, Decimal)
assert node.id == 3233854233
assert node.lat == Decimal("50.7494187")
assert node.lon == Decimal("7.1758731")
way = result.ways[0]
assert isinstance(way, overpy.Way)
assert isinstance(way.id, int)
assert way.id == 317146077
assert isinstance(way.tags, dict)
assert len(way.tags) == 1
assert way.tags["building"] == "yes"
nodes = way.nodes
assert len(nodes) == 7
node = nodes[0]
assert isinstance(node, overpy.Node)
assert node.id == 3233854241
# try to get a single way by id
way = result.get_way(317146077)
assert way.id == 317146077
# try to get a single way by id not available in the result
with pytest.raises(overpy.exception.DataIncomplete):
result.get_way(123456)
# node_ids is an alias for get_node_ids() and should return the same data
for node_ids in (result.node_ids, result.get_node_ids()):
assert len(node_ids) == 6
assert node_ids[0] == 3233854233
assert node_ids[1] == 3233854234
assert node_ids[2] == 3233854236
assert node_ids[3] == 3233854237
assert node_ids[4] == 3233854238
assert node_ids[5] == 3233854241
assert len(result.relation_ids) == 0
assert len(result.get_relation_ids()) == 0
# way_ids is an alias for get_way_ids() and should return the same data
for way_ids in (result.way_ids, result.get_way_ids()):
assert len(way_ids) == 1
assert way_ids[0] == 317146077
def _test_way03(self, result):
assert len(result.nodes) == 4
assert len(result.relations) == 0
assert len(result.ways) == 1
way = result.ways[0]
assert isinstance(way, overpy.Way)
assert isinstance(way.id, int)
assert way.id == 225576797
assert isinstance(way.tags, dict)
assert len(way.tags) == 2
assert way.tags["building"] == "kiosk"
assert way.tags["shop"] == "florist"
assert isinstance(way.center_lat, Decimal)
assert isinstance(way.center_lon, Decimal)
assert way.center_lat == Decimal("41.8954998")
assert way.center_lon == Decimal("12.5032265")
for nodes in (way.nodes, way.get_nodes()):
assert len(nodes) == 5
for node in nodes:
assert isinstance(node, overpy.Node)
assert isinstance(node.id, int)
assert nodes[0].id == 2343425525
assert nodes[1].id == 2343425528
assert nodes[2].id == 2343425526
assert nodes[3].id == 2343425523
assert nodes[4].id == 2343425525
# try to get a single way by id
way = result.get_way(225576797)
assert way.id == 225576797
# try to get a single way by id not available in the result
with pytest.raises(overpy.exception.DataIncomplete):
result.get_way(123456)
# node_ids is an alias for get_node_ids() and should return the same data
for node_ids in (result.node_ids, result.get_node_ids()):
assert len(node_ids) == 4
assert node_ids[0] == 2343425523
assert node_ids[1] == 2343425525
assert node_ids[2] == 2343425526
assert node_ids[3] == 2343425528
assert len(result.relation_ids) == 0
assert len(result.get_relation_ids()) == 0
# way_ids is an alias for get_way_ids() and should return the same data
for way_ids in (result.way_ids, result.get_way_ids()):
assert len(way_ids) == 1
assert way_ids[0] == 225576797
overpy-0.4/tests/__init__.py 0000644 0001750 0001750 00000002316 13022347635 016407 0 ustar phibo phibo 0000000 0000000 import os
import sys
import time
from multiprocessing import Process
from threading import Lock
PY2 = sys.version_info[0] == 2
if PY2:
from SocketServer import TCPServer, BaseRequestHandler
else:
from socketserver import TCPServer, BaseRequestHandler
TCPServer.allow_reuse_address = True
HOST = "127.0.0.1"
PORT_START = sys.version_info[0] * 10000 + sys.version_info[1] * 100
current_port = PORT_START
test_lock = Lock()
def read_file(filename, mode="r"):
filename = os.path.join(os.path.dirname(__file__), filename)
return open(filename, mode).read()
def server_thread(server):
request = server.get_request()
server.process_request(*request)
server.server_close()
server.socket.close()
def new_server_thread(handle_cls, port=None):
global current_port
if port is None:
test_lock.acquire()
port = current_port
current_port += 1
test_lock.release()
server = TCPServer(
(HOST, port),
handle_cls
)
p = Process(target=server_thread, args=(server,))
p.start()
# Give the server some time to bind
# Is there a better option?
time.sleep(0.2)
return (
"http://%s:%d" % (HOST, port),
p
)
overpy-0.4/tests/xml/ 0000755 0001750 0001750 00000000000 13022347701 015066 5 ustar phibo phibo 0000000 0000000 overpy-0.4/tests/xml/way-04.xml 0000644 0001750 0001750 00000000762 13022347635 016644 0 ustar phibo phibo 0000000 0000000
The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.
overpy-0.4/tests/xml/way-03.xml 0000644 0001750 0001750 00000002332 13022347635 016636 0 ustar phibo phibo 0000000 0000000
The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.
overpy-0.4/tests/xml/way-02.xml 0000644 0001750 0001750 00000001530 13022347635 016634 0 ustar phibo phibo 0000000 0000000
The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.