Kaydet (Commit) 66657eb0 authored tarafından Nick Pope's avatar Nick Pope Kaydeden (comit) Tim Graham

Improved messages in IndexErrors raised by GDAL objects.

üst 0d9e1163
...@@ -89,12 +89,12 @@ class DataSource(GDALBase): ...@@ -89,12 +89,12 @@ class DataSource(GDALBase):
if isinstance(index, str): if isinstance(index, str):
layer = capi.get_layer_by_name(self.ptr, force_bytes(index)) layer = capi.get_layer_by_name(self.ptr, force_bytes(index))
if not layer: if not layer:
raise IndexError('invalid OGR Layer name given: "%s"' % index) raise IndexError('Invalid OGR layer name given: %s.' % index)
elif isinstance(index, int): elif isinstance(index, int):
if 0 <= index < self.layer_count: if 0 <= index < self.layer_count:
layer = capi.get_layer(self._ptr, index) layer = capi.get_layer(self._ptr, index)
else: else:
raise IndexError('index out of range') raise IndexError('Index out of range when accessing layers in a datasource: %s.' % index)
else: else:
raise TypeError('Invalid index type: %s' % type(index)) raise TypeError('Invalid index type: %s' % type(index))
return Layer(layer, self) return Layer(layer, self)
......
...@@ -38,7 +38,7 @@ class Feature(GDALBase): ...@@ -38,7 +38,7 @@ class Feature(GDALBase):
elif 0 <= index < self.num_fields: elif 0 <= index < self.num_fields:
i = index i = index
else: else:
raise IndexError('index out of range') raise IndexError('Index out of range when accessing field in a feature: %s.' % index)
return Field(self, i) return Field(self, i)
def __len__(self): def __len__(self):
...@@ -111,5 +111,5 @@ class Feature(GDALBase): ...@@ -111,5 +111,5 @@ class Feature(GDALBase):
"Return the index of the given field name." "Return the index of the given field name."
i = capi.get_field_index(self.ptr, force_bytes(field_name)) i = capi.get_field_index(self.ptr, force_bytes(field_name))
if i < 0: if i < 0:
raise IndexError('invalid OFT field name given: "%s"' % field_name) raise IndexError('Invalid OFT field name given: %s.' % field_name)
return i return i
...@@ -564,7 +564,7 @@ class LineString(OGRGeometry): ...@@ -564,7 +564,7 @@ class LineString(OGRGeometry):
elif dim == 3: elif dim == 3:
return (x.value, y.value, z.value) return (x.value, y.value, z.value)
else: else:
raise IndexError('index out of range: %s' % index) raise IndexError('Index out of range when accessing points of a line string: %s.' % index)
def __len__(self): def __len__(self):
"Return the number of points in the LineString." "Return the number of points in the LineString."
...@@ -616,7 +616,7 @@ class Polygon(OGRGeometry): ...@@ -616,7 +616,7 @@ class Polygon(OGRGeometry):
if 0 <= index < self.geom_count: if 0 <= index < self.geom_count:
return OGRGeometry(capi.clone_geom(capi.get_geom_ref(self.ptr, index)), self.srs) return OGRGeometry(capi.clone_geom(capi.get_geom_ref(self.ptr, index)), self.srs)
else: else:
raise IndexError('index out of range: %s' % index) raise IndexError('Index out of range when accessing rings of a polygon: %s.' % index)
# Polygon Properties # Polygon Properties
@property @property
...@@ -655,7 +655,7 @@ class GeometryCollection(OGRGeometry): ...@@ -655,7 +655,7 @@ class GeometryCollection(OGRGeometry):
if 0 <= index < self.geom_count: if 0 <= index < self.geom_count:
return OGRGeometry(capi.clone_geom(capi.get_geom_ref(self.ptr, index)), self.srs) return OGRGeometry(capi.clone_geom(capi.get_geom_ref(self.ptr, index)), self.srs)
else: else:
raise IndexError('index out of range: %s' % index) raise IndexError('Index out of range when accessing geometry in a collection: %s.' % index)
def __len__(self): def __len__(self):
"Return the number of geometries in this Geometry Collection." "Return the number of geometries in this Geometry Collection."
......
import os import os
import re import re
import unittest
from django.contrib.gis.gdal import ( from django.contrib.gis.gdal import (
GDAL_VERSION, DataSource, Envelope, GDALException, OGRGeometry, GDAL_VERSION, DataSource, Envelope, GDALException, OGRGeometry,
) )
from django.contrib.gis.gdal.field import OFTInteger, OFTReal, OFTString from django.contrib.gis.gdal.field import OFTInteger, OFTReal, OFTString
from django.test import SimpleTestCase
from ..test_data import TEST_DATA, TestDS, get_ds_file from ..test_data import TEST_DATA, TestDS, get_ds_file
...@@ -64,7 +64,7 @@ ds_list = ( ...@@ -64,7 +64,7 @@ ds_list = (
bad_ds = (TestDS('foo'),) bad_ds = (TestDS('foo'),)
class DataSourceTest(unittest.TestCase): class DataSourceTest(SimpleTestCase):
def test01_valid_shp(self): def test01_valid_shp(self):
"Testing valid SHP Data Source files." "Testing valid SHP Data Source files."
...@@ -83,11 +83,12 @@ class DataSourceTest(unittest.TestCase): ...@@ -83,11 +83,12 @@ class DataSourceTest(unittest.TestCase):
self.assertEqual(source.driver, str(ds.driver)) self.assertEqual(source.driver, str(ds.driver))
# Making sure indexing works # Making sure indexing works
with self.assertRaises(IndexError): msg = 'Index out of range when accessing layers in a datasource: %s.'
ds[len(ds)] with self.assertRaisesMessage(IndexError, msg % len(ds)):
ds.__getitem__(len(ds))
with self.assertRaises(IndexError): with self.assertRaisesMessage(IndexError, 'Invalid OGR layer name given: invalid.'):
ds['invalid'] ds.__getitem__('invalid')
def test02_invalid_shp(self): def test02_invalid_shp(self):
"Testing invalid SHP files for the Data Source." "Testing invalid SHP files for the Data Source."
...@@ -122,9 +123,9 @@ class DataSourceTest(unittest.TestCase): ...@@ -122,9 +123,9 @@ class DataSourceTest(unittest.TestCase):
self.assertIn(f, source.fields) self.assertIn(f, source.fields)
# Negative FIDs are not allowed. # Negative FIDs are not allowed.
with self.assertRaises(IndexError): with self.assertRaisesMessage(IndexError, 'Negative indices are not allowed on OGR Layers.'):
layer.__getitem__(-1) layer.__getitem__(-1)
with self.assertRaises(IndexError): with self.assertRaisesMessage(IndexError, 'Invalid feature id: 50000.'):
layer.__getitem__(50000) layer.__getitem__(50000)
if hasattr(source, 'field_values'): if hasattr(source, 'field_values'):
...@@ -141,6 +142,13 @@ class DataSourceTest(unittest.TestCase): ...@@ -141,6 +142,13 @@ class DataSourceTest(unittest.TestCase):
for fld_name, fld_value in source.field_values.items(): for fld_name, fld_value in source.field_values.items():
self.assertEqual(fld_value[i], feat.get(fld_name)) self.assertEqual(fld_value[i], feat.get(fld_name))
msg = 'Index out of range when accessing field in a feature: %s.'
with self.assertRaisesMessage(IndexError, msg % len(feat)):
feat.__getitem__(len(feat))
with self.assertRaisesMessage(IndexError, 'Invalid OFT field name given: invalid.'):
feat.__getitem__('invalid')
def test03b_layer_slice(self): def test03b_layer_slice(self):
"Test indexing and slicing on Layers." "Test indexing and slicing on Layers."
# Using the first data-source because the same slice # Using the first data-source because the same slice
......
import json import json
import pickle import pickle
import unittest
from binascii import b2a_hex from binascii import b2a_hex
from django.contrib.gis.gdal import ( from django.contrib.gis.gdal import (
...@@ -8,11 +7,12 @@ from django.contrib.gis.gdal import ( ...@@ -8,11 +7,12 @@ from django.contrib.gis.gdal import (
) )
from django.template import Context from django.template import Context
from django.template.engine import Engine from django.template.engine import Engine
from django.test import SimpleTestCase
from ..test_data import TestDataMixin from ..test_data import TestDataMixin
class OGRGeomTest(unittest.TestCase, TestDataMixin): class OGRGeomTest(SimpleTestCase, TestDataMixin):
"This tests the OGR Geometry." "This tests the OGR Geometry."
def test_geomtype(self): def test_geomtype(self):
...@@ -158,7 +158,8 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin): ...@@ -158,7 +158,8 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin):
self.assertEqual(ls.coords, linestr.tuple) self.assertEqual(ls.coords, linestr.tuple)
self.assertEqual(linestr, OGRGeometry(ls.wkt)) self.assertEqual(linestr, OGRGeometry(ls.wkt))
self.assertNotEqual(linestr, prev) self.assertNotEqual(linestr, prev)
with self.assertRaises(IndexError): msg = 'Index out of range when accessing points of a line string: %s.'
with self.assertRaisesMessage(IndexError, msg % len(linestr)):
linestr.__getitem__(len(linestr)) linestr.__getitem__(len(linestr))
prev = linestr prev = linestr
...@@ -183,7 +184,8 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin): ...@@ -183,7 +184,8 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin):
for ls in mlinestr: for ls in mlinestr:
self.assertEqual(2, ls.geom_type) self.assertEqual(2, ls.geom_type)
self.assertEqual('LINESTRING', ls.geom_name) self.assertEqual('LINESTRING', ls.geom_name)
with self.assertRaises(IndexError): msg = 'Index out of range when accessing geometry in a collection: %s.'
with self.assertRaisesMessage(IndexError, msg % len(mlinestr)):
mlinestr.__getitem__(len(mlinestr)) mlinestr.__getitem__(len(mlinestr))
def test_linearring(self): def test_linearring(self):
...@@ -213,6 +215,9 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin): ...@@ -213,6 +215,9 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin):
self.assertEqual('POLYGON', poly.geom_name) self.assertEqual('POLYGON', poly.geom_name)
self.assertEqual(p.n_p, poly.point_count) self.assertEqual(p.n_p, poly.point_count)
self.assertEqual(p.n_i + 1, len(poly)) self.assertEqual(p.n_i + 1, len(poly))
msg = 'Index out of range when accessing rings of a polygon: %s.'
with self.assertRaisesMessage(IndexError, msg % len(poly)):
poly.__getitem__(len(poly))
# Testing area & centroid. # Testing area & centroid.
self.assertAlmostEqual(p.area, poly.area, 9) self.assertAlmostEqual(p.area, poly.area, 9)
...@@ -263,7 +268,8 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin): ...@@ -263,7 +268,8 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin):
if mp.valid: if mp.valid:
self.assertEqual(mp.n_p, mpoly.point_count) self.assertEqual(mp.n_p, mpoly.point_count)
self.assertEqual(mp.num_geom, len(mpoly)) self.assertEqual(mp.num_geom, len(mpoly))
with self.assertRaises(IndexError): msg = 'Index out of range when accessing geometry in a collection: %s.'
with self.assertRaisesMessage(IndexError, msg % len(mpoly)):
mpoly.__getitem__(len(mpoly)) mpoly.__getitem__(len(mpoly))
for p in mpoly: for p in mpoly:
self.assertEqual('POLYGON', p.geom_name) self.assertEqual('POLYGON', p.geom_name)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment