[python-osmapi] 01/05: New upstream version 1.1.0

Bas Couwenberg sebastic at debian.org
Thu Oct 12 06:12:47 UTC 2017


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository python-osmapi.

commit 04db7011279cb62fa2db8a723de407554663f99f
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Thu Oct 12 08:01:36 2017 +0200

    New upstream version 1.1.0
---
 CHANGELOG.md                                       |   7 +
 README.md                                          |  11 +-
 osmapi/OsmApi.py                                   | 201 +++++++++++----------
 osmapi/__init__.py                                 |   2 +-
 tests/changeset_tests.py                           |  63 ++++++-
 tests/fixtures/passwordfile.txt                    |   1 +
 .../test_ChangesetDownload_invalid_response.xml    |   1 +
 .../test_ChangesetUpload_invalid_response.xml      |   1 +
 tests/fixtures/test_NodeGet_invalid_response.xml   |   3 +
 tests/fixtures/test_NoteGet_invalid_xml.xml        |  13 ++
 tests/fixtures/test_WayFull_invalid_response.xml   |   1 +
 tests/helper_tests.py                              |  12 +-
 tests/node_tests.py                                |   6 +
 tests/notes_tests.py                               |   7 +
 tests/way_tests.py                                 |   6 +
 15 files changed, 222 insertions(+), 113 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index c512de1..e04c610 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
 
 ## [Unreleased][unreleased]
 
+## 1.1.0 - 2017-10-11
+### Added
+- Raise new `XmlResponseInvalidError` if XML response from the OpenStreetMap API is invalid
+
+### Changed
+- Improved README (thanks [Mateusz Konieczny](https://github.com/matkoniecz))
+
 ## 1.0.2 - 2017-09-07
 ### Added
 - Rais ResponseEmptyApiError if we expect a response from the OpenStreetMap API, but didn't get one
diff --git a/README.md b/README.md
index d536b11..620b02e 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,8 @@ To update the online documentation, you need to re-generate the documentation wi
 
 ## Examples
 
+To test this library, please create an account on the [development server of OpenStreetMap (https://api06.dev.openstreetmap.org)](https://api06.dev.openstreetmap.org).
+
 ### Read from OpenStreetMap
 
 ```python
@@ -45,18 +47,18 @@ print api.NodeGet(123)
 
 ```python
 import osmapi
-api = osmapi.OsmApi(api="api06.dev.openstreetmap.org", username = "you", password = "***")
+api = osmapi.OsmApi(api="https://api06.dev.openstreetmap.org", username = "you", password = "***")
 api = osmapi.OsmApi(username = "you", passwordfile = "/etc/mypasswords")
-api = osmapi.OsmApi(passwordfile = "/etc/mypasswords") # username will be first line username
+api = osmapi.OsmApi(passwordfile = "/etc/mypasswords") # if only the passwordfile is specified, the credentials on the first line of the file will be used
 ```
 
-Note: The password file should have the format _user:password_
+Note: Each line in the password file should have the format _user:password_
 
 ### Write to OpenStreetMap
 
 ```python
 import osmapi
-api = osmapi.OsmApi(api="api06.dev.openstreetmap.org", username = u"metaodi", password = u"*******")
+api = osmapi.OsmApi(api="https://api06.dev.openstreetmap.org", username = u"metaodi", password = u"*******")
 api.ChangesetCreate({u"comment": u"My first test"})
 print api.NodeCreate({u"lon":1, u"lat":1, u"tag": {}})
 # {u'changeset': 532907, u'lon': 1, u'version': 1, u'lat': 1, u'tag': {}, u'id': 164684}
@@ -99,6 +101,7 @@ To create a new release, follow these steps (please respect [Semantic Versioning
 1. Create a pull request to merge develop into master (make sure the tests pass!)
 1. Create a [new release/tag on GitHub](https://github.com/metaodi/osmapi/releases) (on the master branch)
 1. The [publication on PyPI](https://pypi.python.org/pypi/osmapi) happens via [Travis CI](https://travis-ci.org/metaodi/osmapi) on every tagged commit
+1. Re-build the documentation (see above) and copy the generated file to `index.html` on the `gh-pages` branch
 
 ## Attribution
 
diff --git a/osmapi/OsmApi.py b/osmapi/OsmApi.py
index 4c18572..1d4bdda 100644
--- a/osmapi/OsmApi.py
+++ b/osmapi/OsmApi.py
@@ -29,6 +29,7 @@ Find all information about changes of the different versions of this module
 
 from __future__ import (absolute_import, print_function, unicode_literals)
 import xml.dom.minidom
+import xml.parsers.expat
 import time
 import sys
 import urllib
@@ -84,6 +85,12 @@ class OsmTypeAlreadyExistsError(OsmApiError):
     pass
 
 
+class XmlResponseInvalidError(OsmApiError):
+    """
+    Error if the XML response from the OpenStreetMap API is invalid
+    """
+
+
 class ApiError(OsmApiError):
     """
     Error class, is thrown when an API request fails
@@ -291,9 +298,8 @@ class OsmApi:
         """
         uri = "/api/capabilities"
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("api")[0]
+
+        data = self._OsmResponseToDom(data, tag="api", single=True)
         result = {}
         for elem in data.childNodes:
             if elem.nodeType != elem.ELEMENT_NODE:
@@ -338,9 +344,7 @@ class OsmApi:
         if NodeVersion != -1:
             uri += "/%s" % (NodeVersion)
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("node")[0]
+        data = self._OsmResponseToDom(data, tag="node", single=True)
         return self._DomParseNode(data)
 
     def NodeCreate(self, NodeData):
@@ -476,11 +480,10 @@ class OsmApi:
         """
         uri = "/api/0.6/node/%s/history" % NodeId
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        nodes = self._OsmResponseToDom(data, tag="node")
         result = {}
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("node"):
-            data = self._DomParseNode(data)
+        for node in nodes:
+            data = self._DomParseNode(node)
             result[data["version"]] = data
         return result
 
@@ -509,11 +512,10 @@ class OsmApi:
         """
         uri = "/api/0.6/node/%d/ways" % NodeId
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        ways = self._OsmResponseToDom(data, tag="way")
         result = []
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("way"):
-            data = self._DomParseWay(data)
+        for way in ways:
+            data = self._DomParseWay(way)
             result.append(data)
         return result
 
@@ -551,11 +553,10 @@ class OsmApi:
         """
         uri = "/api/0.6/node/%d/relations" % NodeId
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        relations = self._OsmResponseToDom(data, tag="relation")
         result = []
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("relation"):
-            data = self._DomParseRelation(data)
+        for relation in relations:
+            data = self._DomParseRelation(relation)
             result.append(data)
         return result
 
@@ -577,11 +578,10 @@ class OsmApi:
         node_list = ",".join([str(x) for x in NodeIdList])
         uri = "/api/0.6/nodes?nodes=%s" % node_list
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        nodes = self._OsmResponseToDom(data, tag="node")
         result = {}
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("node"):
-            data = self._DomParseNode(data)
+        for node in nodes:
+            data = self._DomParseNode(node)
             result[data["id"]] = data
         return result
 
@@ -616,10 +616,8 @@ class OsmApi:
         if WayVersion != -1:
             uri += "/%s" % (WayVersion)
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("way")[0]
-        return self._DomParseWay(data)
+        way = self._OsmResponseToDom(data, tag="way", single=True)
+        return self._DomParseWay(way)
 
     def WayCreate(self, WayData):
         """
@@ -751,11 +749,10 @@ class OsmApi:
         """
         uri = "/api/0.6/way/%s/history" % (WayId)
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        ways = self._OsmResponseToDom(data, tag="way")
         result = {}
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("way"):
-            data = self._DomParseWay(data)
+        for way in ways:
+            data = self._DomParseWay(way)
             result[data["version"]] = data
         return result
 
@@ -793,11 +790,10 @@ class OsmApi:
         """
         uri = "/api/0.6/way/%d/relations" % WayId
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        relations = self._OsmResponseToDom(data, tag="relation")
         result = []
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("relation"):
-            data = self._DomParseRelation(data)
+        for relation in relations:
+            data = self._DomParseRelation(relation)
             result.append(data)
         return result
 
@@ -840,11 +836,10 @@ class OsmApi:
         way_list = ",".join([str(x) for x in WayIdList])
         uri = "/api/0.6/ways?ways=%s" % way_list
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        ways = self._OsmResponseToDom(data, tag="way")
         result = {}
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("way"):
-            data = self._DomParseWay(data)
+        for way in ways:
+            data = self._DomParseWay(way)
             result[data["id"]] = data
         return result
 
@@ -888,10 +883,8 @@ class OsmApi:
         if RelationVersion != -1:
             uri += "/%s" % (RelationVersion)
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("relation")[0]
-        return self._DomParseRelation(data)
+        relation = self._OsmResponseToDom(data, tag="relation", single=True)
+        return self._DomParseRelation(relation)
 
     def RelationCreate(self, RelationData):
         """
@@ -1050,11 +1043,10 @@ class OsmApi:
         """
         uri = "/api/0.6/relation/%s/history" % (RelationId)
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        relations = self._OsmResponseToDom(data, tag="relation")
         result = {}
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("relation"):
-            data = self._DomParseRelation(data)
+        for relation in relations:
+            data = self._DomParseRelation(relation)
             result[data["version"]] = data
         return result
 
@@ -1093,11 +1085,10 @@ class OsmApi:
         """
         uri = "/api/0.6/relation/%d/relations" % RelationId
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        relations = self._OsmResponseToDom(data, tag="relation")
         result = []
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("relation"):
-            data = self._DomParseRelation(data)
+        for relation in relations:
+            data = self._DomParseRelation(relation)
             result.append(data)
         return result
 
@@ -1184,11 +1175,10 @@ class OsmApi:
         relation_list = ",".join([str(x) for x in RelationIdList])
         uri = "/api/0.6/relations?relations=%s" % relation_list
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
+        relations = self._OsmResponseToDom(data, tag="relation")
         result = {}
-        osm_data = data.getElementsByTagName("osm")[0]
-        for data in osm_data.getElementsByTagName("relation"):
-            data = self._DomParseRelation(data)
+        for relation in relations:
+            data = self._DomParseRelation(relation)
             result[data["id"]] = data
         return result
 
@@ -1226,10 +1216,8 @@ class OsmApi:
         if (include_discussion):
             path += "?include_discussion=true"
         data = self._get(path)
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("changeset")[0]
-        return self._DomParseChangeset(data)
+        changeset = self._OsmResponseToDom(data, tag="changeset", single=True)
+        return self._DomParseChangeset(changeset)
 
     def ChangesetUpdate(self, ChangesetTags={}):
         """
@@ -1334,9 +1322,15 @@ class OsmApi:
             "/api/0.6/changeset/%s/upload" % (self._CurrentChangesetId),
             data.encode("utf-8")
         )
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("diffResult")[0]
-        data = [x for x in data.childNodes if x.nodeType == x.ELEMENT_NODE]
+        try:
+            data = xml.dom.minidom.parseString(data)
+            data = data.getElementsByTagName("diffResult")[0]
+            data = [x for x in data.childNodes if x.nodeType == x.ELEMENT_NODE]
+        except (xml.parsers.expat.ExpatError, IndexError) as e:
+            raise XmlResponseInvalidError(
+                "The XML response from the OSM API is invalid: %r" % e
+            )
+
         for i in range(len(ChangesData)):
             if ChangesData[i]["action"] == "delete":
                 ChangesData[i]["data"].pop("version")
@@ -1420,11 +1414,9 @@ class OsmApi:
             uri += "?" + urllib.urlencode(params)
 
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("changeset")
+        changesets = self._OsmResponseToDom(data, tag="changeset")
         result = {}
-        for curChangeset in data:
+        for curChangeset in changesets:
             tmpCS = self._DomParseChangeset(curChangeset)
             result[tmpCS["id"]] = tmpCS
         return result
@@ -1462,10 +1454,8 @@ class OsmApi:
             "/api/0.6/changeset/%s/comment" % (ChangesetId),
             params
         )
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("changeset")[0]
-        return self._DomParseChangeset(data)
+        changeset = self._OsmResponseToDom(data, tag="changeset", single=True)
+        return self._DomParseChangeset(changeset)
 
     def ChangesetSubscribe(self, ChangesetId):
         """
@@ -1504,10 +1494,8 @@ class OsmApi:
                 raise AlreadySubscribedApiError(e.status, e.reason, e.payload)
             else:
                 raise
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("changeset")[0]
-        return self._DomParseChangeset(data)
+        changeset = self._OsmResponseToDom(data, tag="changeset", single=True)
+        return self._DomParseChangeset(changeset)
 
     def ChangesetUnsubscribe(self, ChangesetId):
         """
@@ -1546,10 +1534,8 @@ class OsmApi:
                 raise NotSubscribedApiError(e.status, e.reason, e.payload)
             else:
                 raise
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
-        data = data.getElementsByTagName("changeset")[0]
-        return self._DomParseChangeset(data)
+        changeset = self._OsmResponseToDom(data, tag="changeset", single=True)
+        return self._DomParseChangeset(changeset)
 
     ##################################################
     # Notes                                          #
@@ -1617,12 +1603,8 @@ class OsmApi:
         """
         uri = "/api/0.6/notes/%s" % (id)
         data = self._get(uri)
-        data = xml.dom.minidom.parseString(data)
-        osm_data = data.getElementsByTagName("osm")[0]
-
-        noteElement = osm_data.getElementsByTagName("note")[0]
-        note = self._DomParseNote(noteElement)
-        return note
+        noteElement = self._OsmResponseToDom(data, tag="note", single=True)
+        return self._DomParseNote(noteElement)
 
     def NoteCreate(self, NoteData):
         """
@@ -1705,13 +1687,8 @@ class OsmApi:
         result = self._post(uri, None, optionalAuth=optionalAuth)
 
         # parse the result
-        data = xml.dom.minidom.parseString(result)
-        osm_data = data.getElementsByTagName("osm")[0]
-
-        noteElement = osm_data.getElementsByTagName("note")[0]
-        note = self._DomParseNote(noteElement)
-
-        return note
+        noteElement = self._OsmResponseToDom(result, tag="note", single=True)
+        return self._DomParseNote(noteElement)
 
     ##################################################
     # Other                                          #
@@ -1752,8 +1729,14 @@ class OsmApi:
                 data: {}
             }
         """
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osm")[0]
+        try:
+            data = xml.dom.minidom.parseString(data)
+            data = data.getElementsByTagName("osm")[0]
+        except (xml.parsers.expat.ExpatError, IndexError) as e:
+            raise XmlResponseInvalidError(
+                "The XML response from the OSM API is invalid: %r" % e
+            )
+
         result = []
         for elem in data.childNodes:
             if elem.nodeName == "node":
@@ -1786,8 +1769,14 @@ class OsmApi:
                 data: {}
             }
         """
-        data = xml.dom.minidom.parseString(data)
-        data = data.getElementsByTagName("osmChange")[0]
+        try:
+            data = xml.dom.minidom.parseString(data)
+            data = data.getElementsByTagName("osmChange")[0]
+        except (xml.parsers.expat.ExpatError, IndexError) as e:
+            raise XmlResponseInvalidError(
+                "The XML response from the OSM API is invalid: %r" % e
+            )
+
         result = []
         for action in data.childNodes:
             if action.nodeName == "#text":
@@ -1834,11 +1823,9 @@ class OsmApi:
                 { ... }
             ]
         """
-        data = xml.dom.minidom.parseString(data)
+        noteElements = self._OsmResponseToDom(data, tag="note")
         result = []
-        osm_data = data.getElementsByTagName("osm")[0]
-
-        for noteElement in osm_data.getElementsByTagName("note"):
+        for noteElement in noteElements:
             note = self._DomParseNote(noteElement)
             result.append(note)
         return result
@@ -2063,6 +2050,24 @@ class OsmApi:
     # Internal dom function                          #
     ##################################################
 
+    def _OsmResponseToDom(self, response, tag, single=False):
+        """
+        Returns the (sub-) DOM parsed from an OSM response
+        """
+        try:
+            dom = xml.dom.minidom.parseString(response)
+            osm_dom = dom.getElementsByTagName("osm")[0]
+            all_data = osm_dom.getElementsByTagName(tag)
+            first_element = all_data[0]
+        except (xml.parsers.expat.ExpatError, IndexError) as e:
+            raise XmlResponseInvalidError(
+                "The XML response from the OSM API is invalid: %r" % e
+            )
+
+        if single:
+            return first_element
+        return all_data
+
     def _DomGetAttributes(self, DomElement):  # noqa
         """
         Returns a formated dictionnary of attributes of a DomElement.
diff --git a/osmapi/__init__.py b/osmapi/__init__.py
index 9f8ccda..c86fa72 100644
--- a/osmapi/__init__.py
+++ b/osmapi/__init__.py
@@ -1,5 +1,5 @@
 from __future__ import (absolute_import, print_function, unicode_literals)
 
-__version__ = '1.0.2'
+__version__ = '1.1.0'
 
 from .OsmApi import *  # noqa
diff --git a/tests/changeset_tests.py b/tests/changeset_tests.py
index 7176d38..5173108 100644
--- a/tests/changeset_tests.py
+++ b/tests/changeset_tests.py
@@ -92,10 +92,10 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
             xmltosorteddict(kwargs['data']),
             xmltosorteddict(
                 b'<?xml version="1.0" encoding="UTF-8"?>\n'
-                b'<osm version="0.6" generator="osmapi/1.0.2">\n'
+                b'<osm version="0.6" generator="osmapi/1.1.0">\n'
                 b'  <changeset visible="true">\n'
                 b'    <tag k="test" v="foobar"/>\n'
-                b'    <tag k="created_by" v="osmapi/1.0.2"/>\n'
+                b'    <tag k="created_by" v="osmapi/1.1.0"/>\n'
                 b'  </changeset>\n'
                 b'</osm>\n'
             )
@@ -125,7 +125,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
             xmltosorteddict(kwargs['data']),
             xmltosorteddict(
                 b'<?xml version="1.0" encoding="UTF-8"?>\n'
-                b'<osm version="0.6" generator="osmapi/1.0.2">\n'
+                b'<osm version="0.6" generator="osmapi/1.1.0">\n'
                 b'  <changeset visible="true">\n'
                 b'    <tag k="test" v="foobar"/>\n'
                 b'    <tag k="created_by" v="MyTestOSMApp"/>\n'
@@ -163,10 +163,10 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
             xmltosorteddict(kwargs['data']),
             xmltosorteddict(
                 b'<?xml version="1.0" encoding="UTF-8"?>\n'
-                b'<osm version="0.6" generator="osmapi/1.0.2">\n'
+                b'<osm version="0.6" generator="osmapi/1.1.0">\n'
                 b'  <changeset visible="true">\n'
                 b'    <tag k="foobar" v="A new test changeset"/>\n'
-                b'    <tag k="created_by" v="osmapi/1.0.2"/>\n'
+                b'    <tag k="created_by" v="osmapi/1.1.0"/>\n'
                 b'  </changeset>\n'
                 b'</osm>\n'
             )
@@ -190,7 +190,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
             xmltosorteddict(kwargs['data']),
             xmltosorteddict(
                 b'<?xml version="1.0" encoding="UTF-8"?>\n'
-                b'<osm version="0.6" generator="osmapi/1.0.2">\n'
+                b'<osm version="0.6" generator="osmapi/1.1.0">\n'
                 b'  <changeset visible="true">\n'
                 b'    <tag k="foobar" v="A new test changeset"/>\n'
                 b'    <tag k="created_by" v="CoolTestApp"/>\n'
@@ -276,7 +276,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
             xmltosorteddict(kwargs['data']),
             xmltosorteddict(
                 b'<?xml version="1.0" encoding="UTF-8"?>\n'
-                b'<osmChange version="0.6" generator="osmapi/1.0.2">\n'
+                b'<osmChange version="0.6" generator="osmapi/1.1.0">\n'
                 b'<create>\n'
                 b'  <node lat="47.123" lon="8.555" visible="true" '
                 b'changeset="4444">\n'
@@ -350,7 +350,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
             xmltosorteddict(kwargs['data']),
             xmltosorteddict(
                 b'<?xml version="1.0" encoding="UTF-8"?>\n'
-                b'<osmChange version="0.6" generator="osmapi/1.0.2">\n'
+                b'<osmChange version="0.6" generator="osmapi/1.1.0">\n'
                 b'<modify>\n'
                 b'  <way id="4294967296" version="2" visible="true" '
                 b'changeset="4444">\n'
@@ -434,7 +434,7 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
             xmltosorteddict(kwargs['data']),
             xmltosorteddict(
                 b'<?xml version="1.0" encoding="UTF-8"?>\n'
-                b'<osmChange version="0.6" generator="osmapi/1.0.2">\n'
+                b'<osmChange version="0.6" generator="osmapi/1.1.0">\n'
                 b'<delete>\n'
                 b'  <relation id="676" version="2" visible="true" '
                 b'changeset="4444">\n'
@@ -458,6 +458,46 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
         self.assertEquals(data['id'], 676)
         self.assertNotIn('version', data)
 
+    def test_ChangesetUpload_invalid_response(self):
+        self._session_mock(auth=True)
+
+        # setup mock
+        self.api.ChangesetCreate = mock.Mock(
+            return_value=4444
+        )
+        self.api._CurrentChangesetId = 4444
+
+        changesdata = [
+            {
+                'type': 'relation',
+                'action': 'delete',
+                'data': {
+                    'id': 676,
+                    'version': 2,
+                    'member': [
+                        {
+                            'ref': 4799,
+                            'role': 'outer',
+                            'type': 'way'
+                        },
+                        {
+                            'ref': 9391,
+                            'role': 'outer',
+                            'type': 'way'
+                        },
+                    ],
+                    'tag': {
+                        'admin_level': '9',
+                        'boundary': 'administrative',
+                        'type': 'multipolygon'
+                    }
+                }
+            }
+        ]
+
+        with self.assertRaises(osmapi.XmlResponseInvalidError):
+            self.api.ChangesetUpload(changesdata)
+
     def test_ChangesetDownload(self):
         self._session_mock()
 
@@ -491,6 +531,11 @@ class TestOsmApiChangeset(osmapi_tests.TestOsmApi):
             }
         )
 
+    def test_ChangesetDownload_invalid_response(self):
+        self._session_mock()
+        with self.assertRaises(osmapi.XmlResponseInvalidError):
+            self.api.ChangesetDownload(23123)
+
     def test_ChangesetDownloadContainingUnicode(self):
         self._session_mock()
 
diff --git a/tests/fixtures/passwordfile.txt b/tests/fixtures/passwordfile.txt
index 708dc2e..20c4643 100644
--- a/tests/fixtures/passwordfile.txt
+++ b/tests/fixtures/passwordfile.txt
@@ -1 +1,2 @@
 testosm:testpass
+testuser:testuserpass
diff --git a/tests/fixtures/test_ChangesetDownload_invalid_response.xml b/tests/fixtures/test_ChangesetDownload_invalid_response.xml
new file mode 100644
index 0000000..12bbf74
--- /dev/null
+++ b/tests/fixtures/test_ChangesetDownload_invalid_response.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?>
diff --git a/tests/fixtures/test_ChangesetUpload_invalid_response.xml b/tests/fixtures/test_ChangesetUpload_invalid_response.xml
new file mode 100644
index 0000000..12bbf74
--- /dev/null
+++ b/tests/fixtures/test_ChangesetUpload_invalid_response.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?>
diff --git a/tests/fixtures/test_NodeGet_invalid_response.xml b/tests/fixtures/test_NodeGet_invalid_response.xml
new file mode 100644
index 0000000..0ca770b
--- /dev/null
+++ b/tests/fixtures/test_NodeGet_invalid_response.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" generator="OpenStreetMap server">
+</osm>
diff --git a/tests/fixtures/test_NoteGet_invalid_xml.xml b/tests/fixtures/test_NoteGet_invalid_xml.xml
new file mode 100644
index 0000000..064f790
--- /dev/null
+++ b/tests/fixtures/test_NoteGet_invalid_xml.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" generator="OpenStreetMap server">
+<note lon="12.3133135" lat="37.9305489">
+  <id>1111</id>
+  <url>http://api.openstreetmap.org/api/0.6/notes/1111</url>
+  <reopen_url>http://api.openstreetmap.org/api/0.6/notes/1111/reopen</reopen_url>
+  <date_created>2013-05-01 20:58:21 UTC</date_created>
+  <status>closed</status>
+  <date_closed>2013-08-21 16:43:26 UTC</date_closed>
+  <comments>
+    <comment>
+</note>
+</osm>
diff --git a/tests/fixtures/test_WayFull_invalid_response.xml b/tests/fixtures/test_WayFull_invalid_response.xml
new file mode 100644
index 0000000..12bbf74
--- /dev/null
+++ b/tests/fixtures/test_WayFull_invalid_response.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?>
diff --git a/tests/helper_tests.py b/tests/helper_tests.py
index 76fb596..667689a 100644
--- a/tests/helper_tests.py
+++ b/tests/helper_tests.py
@@ -26,7 +26,7 @@ class TestOsmApiHelper(osmapi_tests.TestOsmApi):
         self.api._username = 'testuser'
         self.api._password = 'testpassword'
 
-    def test_passwordfile(self):
+    def test_passwordfile_only(self):
         path = os.path.join(
             __location__,
             'fixtures',
@@ -36,6 +36,16 @@ class TestOsmApiHelper(osmapi_tests.TestOsmApi):
         self.assertEquals('testosm', my_api._username)
         self.assertEquals('testpass', my_api._password)
 
+    def test_passwordfile_with_user(self):
+        path = os.path.join(
+            __location__,
+            'fixtures',
+            'passwordfile.txt'
+        )
+        my_api = osmapi.OsmApi(username='testuser', passwordfile=path)
+        self.assertEquals('testuser', my_api._username)
+        self.assertEquals('testuserpass', my_api._password)
+
     def test_http_request_get(self):
         response = self.api._http_request(
             'GET',
diff --git a/tests/node_tests.py b/tests/node_tests.py
index 4a82419..cbb7f8c 100644
--- a/tests/node_tests.py
+++ b/tests/node_tests.py
@@ -56,6 +56,12 @@ class TestOsmApiNode(osmapi_tests.TestOsmApi):
             },
         })
 
+    def test_NodeGet_invalid_response(self):
+        self._session_mock()
+
+        with self.assertRaises(osmapi.XmlResponseInvalidError):
+            self.api.NodeGet(987)
+
     def test_NodeCreate_changesetauto(self):
         # setup mock
         self.api = osmapi.OsmApi(
diff --git a/tests/notes_tests.py b/tests/notes_tests.py
index 11e0d01..856ab39 100644
--- a/tests/notes_tests.py
+++ b/tests/notes_tests.py
@@ -1,6 +1,7 @@
 from __future__ import (unicode_literals, absolute_import)
 from . import osmapi_tests
 from datetime import datetime
+import osmapi
 
 try:
     import urlparse
@@ -98,6 +99,12 @@ class TestOsmApiNotes(osmapi_tests.TestOsmApi):
             ]
         })
 
+    def test_NoteGet_invalid_xml(self):
+        self._session_mock()
+
+        with self.assertRaises(osmapi.XmlResponseInvalidError):
+            self.api.NoteGet(1111)
+
     def test_NoteCreate(self):
         self._session_mock(auth=True)
 
diff --git a/tests/way_tests.py b/tests/way_tests.py
index 37d96f2..e09534c 100644
--- a/tests/way_tests.py
+++ b/tests/way_tests.py
@@ -246,6 +246,12 @@ class TestOsmApiWay(osmapi_tests.TestOsmApi):
         self.assertEquals(result[16]['data']['changeset'], 298)
         self.assertEquals(result[16]['type'], 'way')
 
+    def test_WayFull_invalid_response(self):
+        self._session_mock()
+
+        with self.assertRaises(osmapi.XmlResponseInvalidError):
+            self.api.WayFull(321)
+
     def test_WaysGet(self):
         self._session_mock()
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/python-osmapi.git



More information about the Pkg-grass-devel mailing list