[pyosmium] 03/06: Imported Upstream version 2.11.1

Bas Couwenberg sebastic at debian.org
Fri May 5 08:02:49 UTC 2017


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

sebastic pushed a commit to branch stretch
in repository pyosmium.

commit e18970cbf3e5ac798c3f6e3f4a45503bdbd1345c
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Fri May 5 09:49:41 2017 +0200

    Imported Upstream version 2.11.1
---
 CHANGELOG.md            | 16 ++++++++++-
 lib/generic_handler.hpp | 71 ++++++++++++++++++++++++++++++++++---------------
 lib/generic_writer.hpp  |  9 ++++---
 lib/index.cc            |  9 +++++--
 lib/osm.cc              | 13 ++++++---
 lib/osmium.cc           | 24 ++++-------------
 osmium/version.py       |  4 +--
 7 files changed, 94 insertions(+), 52 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ddc9423..0a3fffe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,19 @@ This project adheres to [Semantic Versioning](http://semver.org/).
 ### Fixed
 
 
+## [2.11.1] - 2017-05-04
+
+### Added
+
+### Changed
+
+### Fixed
+
+- prevent unnecessary calls to callbacks
+- correctly throw KeyError in taglist accessor
+- fix output type of index.map_types() function
+- don't overgrow writer buffers over requested size
+
 ## [2.11.0] - 2017-01-15
 
 ### Changed
@@ -123,7 +136,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
 
 - Exception not caught in test.
 
-[unreleased]: https://github.com/osmcode/pyosmium/compare/v2.11.0...HEAD
+[unreleased]: https://github.com/osmcode/pyosmium/compare/v2.11.1...HEAD
+[2.11.1]: https://github.com/osmcode/pyosmium/compare/v2.11.0...v2.11.1
 [2.11.0]: https://github.com/osmcode/pyosmium/compare/v2.10.2...v2.11.0
 [2.10.2]: https://github.com/osmcode/pyosmium/compare/v2.9.0...v2.10.2
 [2.9.0]: https://github.com/osmcode/pyosmium/compare/v2.8.0...v2.9.0
diff --git a/lib/generic_handler.hpp b/lib/generic_handler.hpp
index 46a2958..778d87f 100644
--- a/lib/generic_handler.hpp
+++ b/lib/generic_handler.hpp
@@ -104,45 +104,46 @@ using namespace boost::python;
 struct SimpleHandlerWrap: BaseHandler, wrapper<BaseHandler> {
 
     void node(const osmium::Node& node) const {
-        if (override f = this->get_override("node"))
-            f(boost::ref(node));
-    }
+        if (!(m_callbacks & osmium::osm_entity_bits::node))
+            return;
 
-    void default_node(const osmium::Node&) const {
+        if (override f = this->get_override("node")) {
+            f(boost::ref(node));
+        }
     }
 
     void way(const osmium::Way& way) const {
+        if (!(m_callbacks & osmium::osm_entity_bits::way))
+            return;
+
         if (override f = this->get_override("way"))
             f(boost::ref(way));
     }
 
-    void default_way(const osmium::Way&) const {
-    }
-
     void relation(const osmium::Relation& rel) const {
+        if (!(m_callbacks & osmium::osm_entity_bits::relation))
+            return;
+
         if (override f = this->get_override("relation"))
             f(boost::ref(rel));
     }
 
-    void default_relation(const osmium::Relation&) const {
-    }
-
     void changeset(const osmium::Changeset& cs) const {
+        if (!(m_callbacks & osmium::osm_entity_bits::changeset))
+            return;
+
         if (override f = this->get_override("changeset"))
             f(boost::ref(cs));
     }
 
-    void default_changeset(const osmium::Changeset&) const {
-    }
-
     void area(const osmium::Area& area) const {
+        if (!(m_callbacks & osmium::osm_entity_bits::area))
+            return;
+
         if (override f = this->get_override("area"))
             f(boost::ref(area));
     }
 
-    void default_area(const osmium::Area&) const {
-    }
-
     void apply_file(const std::string &filename, bool locations = false,
                     const std::string &idx = "sparse_mem_array")
     {
@@ -155,7 +156,7 @@ struct SimpleHandlerWrap: BaseHandler, wrapper<BaseHandler> {
     {
         Py_buffer pybuf;
         PyObject_GetBuffer(buf.ptr(), &pybuf, PyBUF_C_CONTIGUOUS);
-        size_t len = pybuf.len;
+        size_t len = (size_t) pybuf.len;
         const char *cbuf = reinterpret_cast<const char *>(pybuf.buf);
         const char *cfmt = boost::python::extract<const char *>(format);
 
@@ -170,24 +171,50 @@ private:
                                             BaseHandler::location_handler
                                             :BaseHandler::no_handler;
 
-        if (this->get_override("area"))
+        m_callbacks = osmium::osm_entity_bits::nothing;
+        if (hasfunc("node"))
+            m_callbacks |= osmium::osm_entity_bits::node;
+        if (hasfunc("way"))
+            m_callbacks |= osmium::osm_entity_bits::way;
+        if (hasfunc("relation"))
+            m_callbacks |= osmium::osm_entity_bits::relation;
+        if (hasfunc("area"))
+            m_callbacks |= osmium::osm_entity_bits::area;
+        if (hasfunc("changeset"))
+            m_callbacks |= osmium::osm_entity_bits::changeset;
+
+        if (m_callbacks & osmium::osm_entity_bits::area)
         {
             entities = osmium::osm_entity_bits::object;
             handler = BaseHandler::area_handler;
         } else {
-            if (locations || this->get_override("node"))
+            if (locations || m_callbacks & osmium::osm_entity_bits::node)
                 entities |= osmium::osm_entity_bits::node;
-            if (this->get_override("way"))
+            if (m_callbacks & osmium::osm_entity_bits::way)
                 entities |= osmium::osm_entity_bits::way;
-            if (this->get_override("relation"))
+            if (m_callbacks & osmium::osm_entity_bits::relation)
                 entities |= osmium::osm_entity_bits::relation;
         }
 
-        if (this->get_override("changeset"))
+        if (m_callbacks & osmium::osm_entity_bits::changeset)
             entities |= osmium::osm_entity_bits::changeset;
 
         apply(file, entities, handler, idx);
     }
+
+    bool hasfunc(char const *name) {
+        reference_existing_object::apply<SimpleHandlerWrap*>::type converter;
+        PyObject* obj = converter( this );
+
+        if (PyObject_HasAttrString(obj, name)) {
+            auto o = boost::python::object(handle<>(obj));
+            return o.attr(name) != boost::python::object();
+        }
+
+        return false;
+    }
+
+    osmium::osm_entity_bits::type m_callbacks;
 };
 
 #endif
diff --git a/lib/generic_writer.hpp b/lib/generic_writer.hpp
index 1dc7c4f..5840283 100644
--- a/lib/generic_writer.hpp
+++ b/lib/generic_writer.hpp
@@ -16,7 +16,9 @@ class SimpleWriterWrap {
 public:
     SimpleWriterWrap(const char* filename, size_t bufsz=4096*1024)
     : writer(filename),
-      buffer(bufsz < 2*BUFFER_WRAP ? 2*BUFFER_WRAP : bufsz, osmium::memory::Buffer::auto_grow::yes)
+      buffer(bufsz < 2 * BUFFER_WRAP ? 2 * BUFFER_WRAP : bufsz,
+             osmium::memory::Buffer::auto_grow::yes),
+      buffer_size(buffer.capacity()) // same rounding to BUFFER_WRAP
     {}
 
     virtual ~SimpleWriterWrap()
@@ -261,8 +263,8 @@ private:
     void flush_buffer() {
         buffer.commit();
 
-        if (buffer.committed() > buffer.capacity() - BUFFER_WRAP) {
-            osmium::memory::Buffer new_buffer(buffer.capacity(), osmium::memory::Buffer::auto_grow::yes);
+        if (buffer.committed() > buffer_size - BUFFER_WRAP) {
+            osmium::memory::Buffer new_buffer(buffer_size, osmium::memory::Buffer::auto_grow::yes);
             using std::swap;
             swap(buffer, new_buffer);
             writer(std::move(new_buffer));
@@ -271,6 +273,7 @@ private:
 
     osmium::io::Writer writer;
     osmium::memory::Buffer buffer;
+    size_t buffer_size;
 };
 
 #endif // PYOSMIUM_GENERIC_WRITER_HPP
diff --git a/lib/index.cc b/lib/index.cc
index 981feeb..81b9f4f 100644
--- a/lib/index.cc
+++ b/lib/index.cc
@@ -12,9 +12,14 @@ LocationTable *create_map(const std::string& config_string) {
     return map_factory.create_map(config_string).release();
 }
 
-std::vector<std::string> map_types() {
+PyObject *map_types() {
     const auto& map_factory = osmium::index::MapFactory<osmium::unsigned_object_id_type, osmium::Location>::instance();
-    return map_factory.map_types();
+
+    boost::python::list* l = new boost::python::list();
+    for(auto const &e : map_factory.map_types())
+        (*l).append(e);
+
+    return l->ptr();
 }
 
 BOOST_PYTHON_MODULE(index)
diff --git a/lib/osm.cc b/lib/osm.cc
index f9b8425..7ffef27 100644
--- a/lib/osm.cc
+++ b/lib/osm.cc
@@ -9,11 +9,18 @@
 #include "std_pair.hpp"
 
 
-inline const char *get_tag_by_key(osmium::TagList const& obj, const char *value)
+inline const char *get_tag_by_key(osmium::TagList const& obj, const char *key)
 {
-    const char* v = obj.get_value_by_key(value);
-    if (!v)
+    if (!key) {
+        PyErr_SetString(PyExc_KeyError, "Key 'None' not allowed.");
+        boost::python::throw_error_already_set();
+    }
+
+    const char* v = obj.get_value_by_key(key);
+    if (!v) {
         PyErr_SetString(PyExc_KeyError, "No tag with that key.");
+        boost::python::throw_error_already_set();
+    }
     return v;
 }
 
diff --git a/lib/osmium.cc b/lib/osmium.cc
index b1299f0..c598424 100644
--- a/lib/osmium.cc
+++ b/lib/osmium.cc
@@ -66,28 +66,14 @@ BOOST_PYTHON_MODULE(_osmium)
     ;
 
     class_<SimpleHandlerWrap, boost::noncopyable>("SimpleHandler",
-        "The most generic of OSM data handlers. For each data type "
-        "a callback can be implemented where the object is processed. Note that "
+        "The most generic of OSM data handlers. Derive your data processor "
+        "from this class and implement callbacks for each object type you are "
+        "interested in. The following data types are recognised: \n"
+        " `node`, `way`, `relation`, `area` and `changeset`.\n "
+        "A callback takes exactly one parameter which is the object. Note that "
         "all objects that are handed into the handler are only readable and are "
         "only valid until the end of the callback is reached. Any data that "
         "should be retained must be copied into other data structures.")
-        .def("node", &BaseHandler::node, &SimpleHandlerWrap::default_node,
-             (arg("self"), arg("node")),
-             "Handler called for node objects.")
-        .def("way", &BaseHandler::way, &SimpleHandlerWrap::default_way,
-             (arg("self"), arg("way")),
-             "Handler called for way objects. If the geometry of the way is "
-             "needed then ``locations`` must be set to true when calling "
-             "apply_file.")
-        .def("relation", &BaseHandler::relation, &SimpleHandlerWrap::default_relation,
-             (arg("self"), arg("relation")),
-             "Handler called for relation objects.")
-        .def("changeset", &BaseHandler::changeset, &SimpleHandlerWrap::default_changeset,
-             (arg("self"), arg("changeset")),
-             "Handler called for changeset objects.")
-        .def("area", &BaseHandler::area, &SimpleHandlerWrap::default_area,
-             (arg("self"), arg("area")),
-             "Handler called for area objects.")
         .def("apply_file", &SimpleHandlerWrap::apply_file,
               (arg("self"), arg("filename"),
                arg("locations")=false, arg("idx")="sparse_mem_array"),
diff --git a/osmium/version.py b/osmium/version.py
index 92b5eb9..7644885 100644
--- a/osmium/version.py
+++ b/osmium/version.py
@@ -5,7 +5,7 @@ Version information.
 # the major version
 pyosmium_major = '2.11'
 # current release (Pip version)
-pyosmium_release = '2.11.0'
+pyosmium_release = '2.11.1'
 
 # libosmium version shipped with the Pip release
-libosmium_version = '2.11.0'
+libosmium_version = '2.11.3'

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



More information about the Pkg-grass-devel mailing list