[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