[Git][debian-gis-team/pyosmium][upstream] New upstream version 2.15.2

Bas Couwenberg gitlab at salsa.debian.org
Sun Mar 10 07:13:30 GMT 2019


Bas Couwenberg pushed to branch upstream at Debian GIS Project / pyosmium


Commits:
7e5a8d74 by Bas Couwenberg at 2019-03-10T06:52:39Z
New upstream version 2.15.2
- - - - -


14 changed files:

- .travis.yml
- CHANGELOG.md
- README.md
- appveyor.yml
- lib/osm.cc
- lib/osmium.cc
- lib/simple_handler.h
- src/osmium/osm/__init__.py
- src/osmium/version.py
- test/test_memberlist.py
- test/test_osm.py
- test/test_pyosmium_get_changes.py
- test/test_taglist.py
- + test/test_threaded.py


Changes:

=====================================
.travis.yml
=====================================
@@ -6,7 +6,7 @@
 
 language: cpp
 
-dist: trusty
+dist: xenial
 
 matrix:
     include:
@@ -41,9 +41,7 @@ addons:
         sources:
             - boost-latest
         packages:
-            - g++-4.8
-            - gcc-4.8
-            - libboost1.55-dev
+            - libboost1.58-dev
             - python-dev
             - python-nose
             - python-mock
@@ -61,10 +59,6 @@ install:
       fi
 
 script:
-    - if [ "${CXX}" = 'g++' ]; then
-          CXX=g++-4.8;
-          CC=gcc-4.8;
-      fi
     - if [ "$TRAVIS_OS_NAME" = 'osx' ]; then
           PYTHON=python${USE_PYTHON_VERSION};
       else


=====================================
CHANGELOG.md
=====================================
@@ -4,6 +4,23 @@
 All notable changes to this project will be documented in this file.
 This project adheres to [Semantic Versioning](http://semver.org/).
 
+## [2.15.2] - 2019-03-09
+
+### Added
+
+- NodeLocationsForWays (accidentally removed in 2.15.0)
+- more tests
+
+### Changed
+
+- GIL lock now released while apply() is in C++ code
+
+### Fixed
+
+- unicode output of tag str() representation for python 2
+- handling of tempfile in test for pyosmium_get_changes
+- documentation for ends_have_same_location()
+
 ## [2.15.1] - 2019-01-24
 
 ### Added


=====================================
README.md
=====================================
@@ -5,7 +5,9 @@ library, a library for working with OpenStreetMap data in a fast and flexible
 manner.
 
 [![Travis Build Status](https://api.travis-ci.org/osmcode/pyosmium.svg)](http://travis-ci.org/osmcode/pyosmium)
-[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/osmcode/pyosmium?svg=true)](https://ci.appveyor.com/project/Mapbox/pyosmium)
+[![Appeveyor Build status](https://ci.appveyor.com/api/projects/status/dr69wsw855lwrg8w/branch/master?svg=true)](https://ci.appveyor.com/project/lonvia/pyosmium/branch/master)
+
+
 
 ## Dependencies
 


=====================================
appveyor.yml
=====================================
@@ -7,9 +7,15 @@ environment:
   matrix:
     - PYTHON: "C:\\Python27-x64"
       PIPINSTALLS: nose wheel mock
+      MINICONDA: "C:\\Miniconda-x64"
       arch: x64
     - PYTHON: "C:\\Python36-x64"
       PIPINSTALLS: nose wheel
+      MINICONDA: "C:\\Miniconda36-x64"
+      arch: x64
+    - PYTHON: "C:\\Python37-x64"
+      PIPINSTALLS: nose wheel
+      MINICONDA: "C:\\Miniconda37-x64"
       arch: x64
 
 os: Visual Studio 2015
@@ -20,15 +26,13 @@ init:
   - git config --global core.autocrlf input
   - if "%arch%"=="x86" (
       set vcvarsall_arg=x86&&
-      set conda_path=C:\Miniconda36\Scripts&&
-      set conda_library_path=C:\Miniconda36\envs\pyosmium\Library&&
       set build_type=Release)
   - if "%arch%"=="x64" (
       set vcvarsall_arg=amd64&&
-      set conda_path=C:\Miniconda36-x64\Scripts&&
-      set conda_library_path=C:\Miniconda36-x64\envs\pyosmium\Library&&
       set build_type=Release)
   - '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall" %vcvarsall_arg%'
+  - set conda_path=%MINICONDA%\Scripts
+  - set conda_library_path=%MINICONDA%\envs\pyosmium\Library
 
 install:
   - set PATH=%PATH%;%conda_path%
@@ -40,9 +44,9 @@ install:
   - SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%
   - python --version
   - cd c:\dev
-  - git clone --depth 10 https://github.com/osmcode/libosmium.git pyosmium/contrib/libosmium
-  - git clone --depth 10 https://github.com/mapbox/protozero.git pyosmium/contrib/protozero
-  - git clone --depth 10 https://github.com/pybind/pybind11.git pyosmium/contrib/pybind11
+  - git clone --depth 1 https://github.com/osmcode/libosmium.git pyosmium/contrib/libosmium
+  - git clone --depth 1 https://github.com/mapbox/protozero.git pyosmium/contrib/protozero
+  - git clone --depth 1 https://github.com/pybind/pybind11.git pyosmium/contrib/pybind11
   - dir c:\dev
   - cd c:\
   - pip install %PIPINSTALLS%


=====================================
lib/osm.cc
=====================================
@@ -31,9 +31,13 @@ PYBIND11_MODULE(_osm, m) {
         .def_property_readonly("y", &osmium::Location::y,
              "(read-only) Y coordinate (latitude) as a fixed-point integer.")
         .def_property_readonly("lon", &osmium::Location::lon,
-             "(read-only) Longitude (x coordinate) as floating point number.")
+             "(read-only) Longitude (x coordinate) as floating point number."
+             "Raises an :py:class:`osmium.InvalidLocationError` when the "
+             "location is invalid.")
         .def_property_readonly("lat", &osmium::Location::lat,
-             "(read-only) Latitude (y coordinate) as floating point number.")
+             "(read-only) Latitude (y coordinate) as floating point number."
+             "Raises an :py:class:`osmium.InvalidLocationError` when the "
+             "location is invalid.")
         .def("valid", &osmium::Location::valid,
              "Check that the location is a valid WGS84 coordinate, i.e. "
              "that it is within the usual bounds.")
@@ -191,7 +195,10 @@ PYBIND11_MODULE(_osm, m) {
              "True if the start and end node are exactly the same.")
         .def("ends_have_same_location", &osmium::NodeRefList::ends_have_same_location,
              "True if the start and end node of the way are at the same location. "
-             "Throws an exception if the location of one of the nodes is missing.")
+             "Expects that the coordinates of the way nodes have been loaded "
+             "(see :py:func:`osmium.SimpleHandler.apply_buffer` and "
+             ":py:func:`osmium.SimpleHandler.apply_file`). "
+             "If the locations are not present then the function returns always true.")
     ;
 
     py::class_<osmium::WayNodeList, osmium::NodeRefList>(m, "WayNodeList",
@@ -280,7 +287,10 @@ PYBIND11_MODULE(_osm, m) {
              "True if the start and end node are exactly the same.")
         .def("ends_have_same_location", &osmium::Way::ends_have_same_location,
              "True if the start and end node of the way are at the same location."
-             "Throws an exception if the location of one of the nodes is missing.")
+             "Expects that the coordinates of the way nodes have been loaded "
+             "(see :py:func:`osmium.SimpleHandler.apply_buffer` and "
+             ":py:func:`osmium.SimpleHandler.apply_file`). "
+             "If the locations are not present then the function returns always true.")
     ;
 
     py::class_<osmium::Relation, osmium::OSMObject>(m, "Relation",


=====================================
lib/osmium.cc
=====================================
@@ -25,17 +25,23 @@ PYBIND11_MODULE(_osmium, m) {
         }
     });
 
+    py::class_<osmium::handler::NodeLocationsForWays<LocationTable>>(
+        m, "NodeLocationsForWays")
+        .def(py::init<LocationTable&>())
+        .def("ignore_errors", &osmium::handler::NodeLocationsForWays<LocationTable>::ignore_errors)
+    ;
+
     m.def("apply", [](osmium::io::Reader &rd, BaseHandler &h)
-                   { osmium::apply(rd, h); },
+                   { py::gil_scoped_release release; osmium::apply(rd, h); },
           py::arg("reader"), py::arg("handler"),
           "Apply a chain of handlers.");
     m.def("apply", [](osmium::io::Reader &rd, NodeLocationHandler &h)
-                   { osmium::apply(rd, h); },
+                   { py::gil_scoped_release release; osmium::apply(rd, h); },
           py::arg("reader"), py::arg("handler"),
           "Apply a chain of handlers.");
     m.def("apply", [](osmium::io::Reader &rd, NodeLocationHandler &l,
                       BaseHandler &h)
-                     { osmium::apply(rd, l, h); },
+                     { py::gil_scoped_release release; osmium::apply(rd, l, h); },
           py::arg("reader"), py::arg("node_handler"), py::arg("handler"),
           "Apply a chain of handlers.");
 


=====================================
lib/simple_handler.h
=====================================
@@ -58,6 +58,7 @@ private:
         if (callbacks & osmium::osm_entity_bits::changeset)
             entities |= osmium::osm_entity_bits::changeset;
 
+        pybind11::gil_scoped_release release;
         apply(file, entities, handler, idx);
     }
 };
@@ -86,19 +87,34 @@ public:
 
     // handler functions
     void node(osmium::Node const *n) override
-    { PYBIND11_OVERLOAD(void, SimpleHandler, node, n); }
+    {
+        pybind11::gil_scoped_acquire acquire;
+        PYBIND11_OVERLOAD(void, SimpleHandler, node, n);
+    }
 
     void way(osmium::Way const *w) override
-    { PYBIND11_OVERLOAD(void, SimpleHandler, way, w); }
+    {
+        pybind11::gil_scoped_acquire acquire;
+        PYBIND11_OVERLOAD(void, SimpleHandler, way, w);
+    }
 
     void relation(osmium::Relation const *r) override
-    { PYBIND11_OVERLOAD(void, SimpleHandler, relation, r); }
+    {
+        pybind11::gil_scoped_acquire acquire;
+        PYBIND11_OVERLOAD(void, SimpleHandler, relation, r);
+    }
 
     void changeset(osmium::Changeset const *c) override
-    { PYBIND11_OVERLOAD(void, SimpleHandler, changeset, c); }
+    {
+        pybind11::gil_scoped_acquire acquire;
+        PYBIND11_OVERLOAD(void, SimpleHandler, changeset, c);
+    }
 
     void area(osmium::Area const *a) override
-    { PYBIND11_OVERLOAD(void, SimpleHandler, area, a); }
+    {
+        pybind11::gil_scoped_acquire acquire;
+        PYBIND11_OVERLOAD(void, SimpleHandler, area, a);
+    }
 
 private:
     bool hasfunc(char const *name)


=====================================
src/osmium/osm/__init__.py
=====================================
@@ -1,5 +1,6 @@
 from ._osm import *
 import osmium.osm.mutable
+from sys import version_info as python_version
 
 def create_mutable_node(node, **args):
     """ Create a mutable node replacing the properties given in the
@@ -36,8 +37,12 @@ Box.__repr__ = lambda b : 'osmium.osm.Box(bottom_left=%r, top_right=%r)' \
                           % (b.bottom_left, b.top_right)
 Box.__str__ = lambda b : '(%s %s)' % (b.bottom_left, b.top_right)
 
-Tag.__repr__ = lambda t : 'osmium.osm.Tag(k=%s, v=%s)' % (t.k, t.v)
-Tag.__str__ = lambda t : '%s=%s' % (t.k, t.v)
+Tag.__repr__ = lambda t : 'osmium.osm.Tag(k=%r, v=%r)' % (t.k, t.v)
+
+if python_version >= (3,0):
+    Tag.__str__ = lambda t : '%s=%s' % (t.k, t.v)
+else:
+    Tag.__str__ = lambda t : '%s=%s' % (t.k.encode('utf-8'), t.v.encode('utf-8'))
 
 TagList.__repr__ = lambda t : "osmium.osm.TagList({%s})" \
                               % ",".join(["%r=%r" % (i.k, i.v) for i in t])


=====================================
src/osmium/version.py
=====================================
@@ -5,11 +5,11 @@ Version information.
 # the major version
 pyosmium_major = '2.15'
 # current release (Pip version)
-pyosmium_release = '2.15.1'
+pyosmium_release = '2.15.2'
 
 # libosmium version shipped with the Pip release
-libosmium_version = '2.15.0'
+libosmium_version = '2.15.1'
 # protozero version shipped with the Pip release
-protozero_version = '1.6.4'
+protozero_version = '1.6.7'
 # pybind11 version shipped with the Pip release
 pybind11_version = '2.2.4'


=====================================
test/test_memberlist.py
=====================================
@@ -1,11 +1,11 @@
-
+# vim: set fileencoding=utf-8 :
 from nose.tools import *
 import unittest
 import os
 import sys
 from datetime import datetime
 
-from helpers import create_osm_file, osmobj, HandlerTestBase
+from helpers import create_osm_file, osmobj, HandlerTestBase, check_repr
 
 import osmium as o
 
@@ -23,7 +23,7 @@ class TestLength(HandlerTestBase, unittest.TestCase):
             assert_equals(self.expected_length[r.id], len(r.members))
 
 class TestMembers(HandlerTestBase, unittest.TestCase):
-    data = """r34 Mn23@,n12 at foo,w5 at .,r34359737784@()"""
+    data = u"""r34 Mn23@,n12 at foo,w5 at .,r34359737784@(ü)"""
 
     class Handler(o.SimpleHandler):
 
@@ -41,4 +41,5 @@ class TestMembers(HandlerTestBase, unittest.TestCase):
             eq_('.', m[2].role)
             eq_(34359737784, m[3].ref)
             eq_('r', m[3].type)
-            eq_('()', m[3].role)
+            eq_(u'(ü)', m[3].role)
+            assert_true(check_repr(m))


=====================================
test/test_osm.py
=====================================
@@ -1,3 +1,4 @@
+# vim: set fileencoding=utf-8 :
 from nose.tools import *
 import unittest
 import os
@@ -12,6 +13,13 @@ class TestLocation(unittest.TestCase):
         loc = o.osm.Location()
         assert_false(loc.valid())
         assert_true(check_repr(loc))
+        with assert_raises(o.InvalidLocationError):
+            lat = loc.lat
+        with assert_raises(o.InvalidLocationError):
+            lon = loc.lon
+        # these two don't raise an exception
+        lat = loc.lat_without_check()
+        lon = loc.lon_without_check()
 
     def test_valid_location(self):
         loc = o.osm.Location(1,10)
@@ -24,7 +32,7 @@ class TestLocation(unittest.TestCase):
 
 class TestNodeAttributes(HandlerTestBase, unittest.TestCase):
     data = [osmobj('N', id=1, version=5, changeset=58674, uid=42,
-                   timestamp='2014-01-31T06:23:35Z', user='anonymous')]
+                   timestamp='2014-01-31T06:23:35Z', user=u'änonymous')]
 
     class Handler(o.SimpleHandler):
         def node(self, n):
@@ -36,7 +44,7 @@ class TestNodeAttributes(HandlerTestBase, unittest.TestCase):
             assert_equals(n.uid, 42)
             assert_equals(n.user_is_anonymous(), False)
             assert_equals(n.timestamp, mkdate(2014, 1, 31, 6, 23, 35))
-            assert_equals(n.user, 'anonymous')
+            assert_equals(n.user, u'änonymous')
             assert_equals(n.positive_id(), 1)
             assert_true(check_repr(n))
 
@@ -88,7 +96,7 @@ class TestWayAttributes(HandlerTestBase, unittest.TestCase):
 
 class TestRelationAttributes(HandlerTestBase, unittest.TestCase):
     data = [osmobj('R', id=1, version=5, changeset=58674, uid=42,
-                   timestamp='2014-01-31T06:23:35Z', user='anonymous',
+                   timestamp='2014-01-31T06:23:35Z', user=' anonymous',
                    members=[('way',1,'')])]
 
     class Handler(o.SimpleHandler):
@@ -101,7 +109,7 @@ class TestRelationAttributes(HandlerTestBase, unittest.TestCase):
             assert_equals(n.uid, 42)
             assert_equals(n.user_is_anonymous(), False)
             assert_equals(n.timestamp, mkdate(2014, 1, 31, 6, 23, 35))
-            assert_equals(n.user, 'anonymous')
+            assert_equals(n.user, ' anonymous')
             assert_equals(n.positive_id(), 1)
             assert_true(check_repr(n))
             assert_true(check_repr(n.members))


=====================================
test/test_pyosmium_get_changes.py
=====================================
@@ -9,6 +9,7 @@ from os import path as osp
 from textwrap import dedent
 import sys
 import tempfile
+from os import unlink
 
 try:
     from cStringIO import StringIO
@@ -76,17 +77,26 @@ class TestPyosmiumGetChanges(unittest.TestCase):
         assert_equals('1', self.stdout[0])
 
     def test_init_to_file(self):
-        with tempfile.NamedTemporaryFile(dir=tempfile.gettempdir(), suffix='.seq') as fd:
-            assert_equals(0, self.main('-I', '453', '-f', fd.name))
-            content = fd.read()
-            assert_equals('454', content.decode('utf-8'))
+        fd = tempfile.NamedTemporaryFile(dir=tempfile.gettempdir(), suffix='.seq', delete=False)
+        fname = fd.name
+        fd.close()
+
+        assert_equals(0, self.main('-I', '453', '-f', fd.name))
+        fd = open(fname, 'r')
+        content = fd.read()
+        try:
+            assert_equals('454', content)
+            fd.close()
+        finally:
+            unlink(fname)
 
     def test_init_from_seq_file(self):
-        with tempfile.NamedTemporaryFile(dir=tempfile.gettempdir(), suffix='.seq') as fd:
+        with tempfile.NamedTemporaryFile(dir=tempfile.gettempdir(), suffix='.seq', delete=False) as fd:
             fd.write('453'.encode('utf-8'))
-            fd.flush()
-            assert_equals(0, self.main('-f', fd.name))
-            fd.seek(0)
-            content = fd.read()
-            assert_equals('454', content.decode('utf-8'))
+            fname = fd.name
+
+        assert_equals(0, self.main('-f', fname))
+        fd = open(fname, 'r')
+        content = fd.read()
+        assert_equals('454', content)
 


=====================================
test/test_taglist.py
=====================================
@@ -1,3 +1,4 @@
+# vim: set fileencoding=utf-8 :
 from nose.tools import *
 import unittest
 import os
@@ -47,10 +48,10 @@ class TestTagEmptyTagListIndexOp(HandlerTestBase, unittest.TestCase):
                 n.tags[None]
 
 class TestTagListLen(HandlerTestBase, unittest.TestCase):
-    data = """\
+    data = u"""\
            n1 x0 y0 Ta=a
-           n2 Tkey=value
-           n3 Tfoo=1,bar=2,foobar=33
+           n2 Tkeyñ=value
+           n3 Tfoo=1ß,bar=2,foobar=33
            """
     class Handler(o.SimpleHandler):
 
@@ -59,6 +60,7 @@ class TestTagListLen(HandlerTestBase, unittest.TestCase):
         def node(self, n):
             assert_true(n.tags)
             assert_equals(self.expected_len[n.id], len(n.tags))
+            assert_true(check_repr(n.tags))
 
 class TestTagContains(HandlerTestBase, unittest.TestCase):
     data = "n234 Tabba=x,2=vvv,xx=abba"


=====================================
test/test_threaded.py
=====================================
@@ -0,0 +1,34 @@
+from nose.tools import *
+import unittest
+import os
+import threading
+
+from helpers import create_osm_file, osmobj, HandlerTestBase, CountingHandler
+import osmium as o
+
+def import_data(function_complete):
+    data = [osmobj('N', id=1, lat=28.0, lon=-23.3)]
+    fn = create_osm_file(data)
+
+    c = CountingHandler()
+    try:
+        c.apply_file(fn)
+    finally:
+        os.remove(fn)
+
+    function_complete.set()
+
+
+def test_threaded_processing():
+    """ Process a file in a different thread nad make sure that processing
+        completes.
+    """
+
+    function_complete = threading.Event()
+    t = threading.Thread(target=import_data, args=(function_complete,))
+    t.start()
+    function_complete.wait(timeout=2)
+
+    assert_true(function_complete.is_set());
+
+



View it on GitLab: https://salsa.debian.org/debian-gis-team/pyosmium/commit/7e5a8d74fd2c60014365e0e8202396c25d499934

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pyosmium/commit/7e5a8d74fd2c60014365e0e8202396c25d499934
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20190310/fbe085d4/attachment-0001.html>


More information about the Pkg-grass-devel mailing list