This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository fiona.
commit 774de739ec84610a72461fc0af0ff90439fae6b5 Author: Bas Couwenberg <sebas...@xs4all.nl> Date: Fri Dec 25 01:56:37 2015 +0100 Imported Upstream version 1.6.3 --- CHANGES.txt | 9 +++++++++ fiona/__init__.py | 2 +- fiona/errors.py | 21 ++++++++++++++++++++- fiona/ogrext.pyx | 40 +++++++++++++++++++++++++--------------- tests/test_unicode.py | 28 ++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 17 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 64e8d90..ed42d05 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -3,6 +3,15 @@ Changes All issue numbers are relative to https://github.com/Toblerity/Fiona/issues. +1.6.3 (2015-09-22) +------------------ +- Daytime has been decreasing in the Northern Hemisphere, but is now + increasing again as it should. +- Non-UTF strings were being passed into OGR functions in some situations + and on Windows this would sometimes crash a Python process (#303). Fiona + now raises errors derived from UnicodeError when field names or field + values can't be encoded. + 1.6.2 (2015-09-22) ------------------ - Providing only PROJ4 representations in the dataset meta property resulted in diff --git a/fiona/__init__.py b/fiona/__init__.py index ac0592c..6277ab8 100644 --- a/fiona/__init__.py +++ b/fiona/__init__.py @@ -63,7 +63,7 @@ writing modes) flush contents to disk when their ``with`` blocks end. """ __all__ = ['bounds', 'listlayers', 'open', 'prop_type', 'prop_width'] -__version__ = "1.6.2" +__version__ = "1.6.3" import logging import os diff --git a/fiona/errors.py b/fiona/errors.py index ac48847..ed520d0 100644 --- a/fiona/errors.py +++ b/fiona/errors.py @@ -1,14 +1,33 @@ +# Errors. + + class FionaValueError(ValueError): """Fiona-specific value errors""" + class DriverError(FionaValueError): """Encapsulates unsupported driver and driver mode errors.""" + class SchemaError(FionaValueError): """When a schema mapping has no properties or no geometry.""" + class CRSError(FionaValueError): """When a crs mapping has neither init or proj items.""" + class DataIOError(IOError): - """IO errors involving driver registration or availability""" + """IO errors involving driver registration or availability.""" + + +class FieldNameEncodeError(UnicodeEncodeError): + """Failure to encode a field name.""" + + +class StringFieldEncodeError(UnicodeEncodeError): + """Failure to encode a string field value.""" + + +class StringFieldDecodeError(UnicodeDecodeError): + """Failure to decode a string field value.""" diff --git a/fiona/ogrext.pyx b/fiona/ogrext.pyx index 85b9b02..9773ebd 100644 --- a/fiona/ogrext.pyx +++ b/fiona/ogrext.pyx @@ -16,7 +16,9 @@ from fiona cimport ograpi from fiona._geometry cimport GeomBuilder, OGRGeomBuilder from fiona._err import cpl_errs from fiona._geometry import GEOMETRY_TYPES -from fiona.errors import DriverError, SchemaError, CRSError, FionaValueError +from fiona.errors import ( + DriverError, SchemaError, CRSError, FionaValueError, FieldNameEncodeError, + StringFieldEncodeError, StringFieldDecodeError) from fiona.odict import OrderedDict from fiona.rfc3339 import parse_date, parse_datetime, parse_time from fiona.rfc3339 import FionaDateType, FionaDateTimeType, FionaTimeType @@ -180,9 +182,10 @@ cdef class FeatureBuilder: try: val = ograpi.OGR_F_GetFieldAsString(feature, i) val = val.decode(encoding) - except UnicodeDecodeError: - log.warn( - "Failed to decode %s using %s codec", val, encoding) + except UnicodeError as exc: + raise StringFieldDecodeError( + "Failed to decode {0} using {1} codec: {2}".format( + val, encoding, str(exc))) # Does the text contain a JSON object? Let's check. # Let's check as cheaply as we can. @@ -258,11 +261,15 @@ cdef class OGRFeatureBuilder: "Looking up %s in %s", key, repr(session._schema_mapping)) ogr_key = session._schema_mapping[key] schema_type = collection.schema['properties'][key] + + # Catch and re-raise unicode encoding errors. try: key_bytes = ogr_key.encode(encoding) - except UnicodeDecodeError: - log.warn("Failed to encode %s using %s codec", key, encoding) - key_bytes = ogr_key + except UnicodeError as exc: + raise FieldNameEncodeError( + "Failed to encode {0} using {1} codec: {2}".format( + key, encoding, str(exc))) + key_c = key_bytes i = ograpi.OGR_F_GetFieldIndex(cogr_feature, key_c) if i < 0: @@ -304,12 +311,15 @@ cdef class OGRFeatureBuilder: ograpi.OGR_F_SetFieldDateTime( cogr_feature, i, 0, 0, 0, hh, mm, ss, 0) elif isinstance(value, string_types): + + # Catch and re-raise string field value encoding errors. try: value_bytes = value.encode(encoding) - except UnicodeDecodeError: - log.warn( - "Failed to encode %s using %s codec", value, encoding) - value_bytes = value + except UnicodeError as exc: + raise StringFieldEncodeError( + "Failed to encode {0} using {1} codec: {2}".format( + value, encoding, str(exc))) + string_c = value_bytes ograpi.OGR_F_SetFieldString(cogr_feature, i, string_c) elif value is None: @@ -376,7 +386,7 @@ cdef class Session: path = collection.path try: path_b = path.encode('utf-8') - except UnicodeDecodeError: + except UnicodeError: # Presume already a UTF-8 encoded string path_b = path path_c = path_b @@ -699,7 +709,7 @@ cdef class WritingSession(Session): if os.path.exists(path): try: path_b = path.encode('utf-8') - except UnicodeDecodeError: + except UnicodeError: path_b = path path_c = path_b with cpl_errs: @@ -735,7 +745,7 @@ cdef class WritingSession(Session): elif collection.mode == 'w': try: path_b = path.encode('utf-8') - except UnicodeDecodeError: + except UnicodeError: path_b = path path_c = path_b driver_b = collection.driver.encode() @@ -1188,7 +1198,7 @@ def _listlayers(path): # Open OGR data source. try: path_b = path.encode('utf-8') - except UnicodeDecodeError: + except UnicodeError: path_b = path path_c = path_b with cpl_errs: diff --git a/tests/test_unicode.py b/tests/test_unicode.py index 5e94876..6696567 100644 --- a/tests/test_unicode.py +++ b/tests/test_unicode.py @@ -13,6 +13,7 @@ import fiona logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) + class UnicodePathTest(unittest.TestCase): def setUp(self): @@ -44,3 +45,30 @@ class UnicodePathTest(unittest.TestCase): if sys.version_info < (3,): with fiona.open(path) as c: assert len(c) == 67 + + +class UnicodeStringFieldTest(unittest.TestCase): + + def setUp(self): + self.tempdir = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.tempdir) + + def test_write(self): + schema = { + 'geometry': 'Point', + 'properties': {'label': 'str', u'verit\xe9': 'int'}} + with fiona.open(os.path.join(self.tempdir, "test-write.shp"), + "w", "ESRI Shapefile", schema=schema, + encoding='utf-8') as c: + c.writerecords([ + {'type': 'Feature', 'geometry': {'type': 'Point', + 'coordinates': [0, 0]}, + 'properties': {'label': u'Ba\u2019kelalan', + u'verit\xe9': 0}}]) + + with fiona.open(os.path.join(self.tempdir)) as c: + f = next(c) + self.assertEquals(f['properties']['label'], u'Ba\u2019kelalan') + self.assertEquals(f['properties'][u'verit\xe9'], 0) -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/fiona.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel