From df2d79f2865d9a1f7e34f0f9bf3bd6c5057ea4c6 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sat, 19 Nov 2022 16:24:33 -0500 Subject: [PATCH 1/7] Use tempfile::tempdir instead of /tmp (fix Windows tests) --- src/raster/tests.rs | 8 +++++--- src/vector/vector_tests/mod.rs | 11 +++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/raster/tests.rs b/src/raster/tests.rs index 17879f31b..7a36f1da9 100644 --- a/src/raster/tests.rs +++ b/src/raster/tests.rs @@ -10,6 +10,7 @@ use crate::vsi::unlink_mem_file; use crate::DriverManager; use gdal_sys::GDALDataType; use std::path::Path; +use tempfile::tempdir; #[cfg(feature = "ndarray")] use ndarray::arr2; @@ -308,17 +309,18 @@ fn test_create_with_band_type_with_options() { }, ]; - let tmp_filename = "/tmp/test.tif"; + let tmp_dir = tempdir().unwrap(); + let tmp_filename = tmp_dir.path().join("test.tif"); { let dataset = driver - .create_with_band_type_with_options::(tmp_filename, 256, 256, 1, &options) + .create_with_band_type_with_options::(&tmp_filename, 256, 256, 1, &options) .unwrap(); let rasterband = dataset.rasterband(1).unwrap(); let block_size = rasterband.block_size(); assert_eq!(block_size, (128, 64)); } - let dataset = Dataset::open(Path::new(tmp_filename)).unwrap(); + let dataset = Dataset::open(tmp_filename).unwrap(); let key = "INTERLEAVE"; let domain = "IMAGE_STRUCTURE"; let meta = dataset.metadata_item(key, domain); diff --git a/src/vector/vector_tests/mod.rs b/src/vector/vector_tests/mod.rs index 881643475..e199349d4 100644 --- a/src/vector/vector_tests/mod.rs +++ b/src/vector/vector_tests/mod.rs @@ -4,6 +4,8 @@ use super::{ }; use crate::spatial_ref::SpatialRef; use crate::{assert_almost_eq, Dataset, DatasetOptions, GdalOpenFlags}; +use std::path::Path; +use tempfile::tempdir; mod convert_geo; mod sql; @@ -755,8 +757,6 @@ mod tests { #[test] fn test_write_features() { - use std::fs; - { let driver = DriverManager::get_driver_by_name("GeoJSON").unwrap(); let mut ds = driver @@ -785,7 +785,6 @@ mod tests { } let ds = Dataset::open(fixture!("output.geojson")).unwrap(); - fs::remove_file(fixture!("output.geojson")).unwrap(); let mut layer = ds.layer(0).unwrap(); let ft = layer.features().next().unwrap(); assert_eq!(ft.geometry().wkt().unwrap(), "POINT (1 2)"); @@ -851,7 +850,11 @@ mod tests { open_flags: GdalOpenFlags::GDAL_OF_UPDATE, ..DatasetOptions::default() }; - let tmp_file = "/tmp/test.s3db"; + + let tmpdir = tempdir().unwrap(); + let tmp_pathbuf = tmpdir.path().join("test.s3db"); + let tmp_file = Path::new(&tmp_pathbuf); + std::fs::copy(fixture!("three_layer_ds.s3db"), tmp_file).unwrap(); let ds = Dataset::open_ex(tmp_file, ds_options).unwrap(); let mut layer = ds.layer(0).unwrap(); From 232fbe4066cd8d132a74e012089f2743995c5a5d Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sat, 19 Nov 2022 21:23:10 -0500 Subject: [PATCH 2/7] Fix deprecated warnings --- src/vector/feature.rs | 34 ++++++++++++++------ src/vector/gdal_to_geo.rs | 4 +-- src/vector/vector_tests/convert_geo.rs | 44 +++++++++++++------------- src/vector/vector_tests/mod.rs | 12 ++++--- 4 files changed, 56 insertions(+), 38 deletions(-) diff --git a/src/vector/feature.rs b/src/vector/feature.rs index 07459f2e0..27833109a 100644 --- a/src/vector/feature.rs +++ b/src/vector/feature.rs @@ -7,7 +7,7 @@ use std::convert::TryInto; use std::ffi::{CString, NulError}; use std::ptr; -use chrono::{Date, DateTime, Datelike, FixedOffset, TimeZone, Timelike}; +use chrono::{DateTime, Datelike, FixedOffset, NaiveDate, TimeZone, Timelike}; use crate::errors::*; use std::slice; @@ -152,7 +152,7 @@ impl<'a> Feature<'a> { self._field_as_datetime(field_id)?, ))), OGRFieldType::OFTDate => Ok(Some(FieldValue::DateValue( - self._field_as_datetime(field_id)?.date(), + self._field_as_datetime(field_id)?.date_naive(), ))), _ => Err(GdalError::UnhandledFieldType { field_type, @@ -428,10 +428,18 @@ impl<'a> Feature<'a> { } else { (tzflag as i32 - 100) * 15 * 60 }; - let rv = FixedOffset::east(tzoffset_secs) - .ymd(year as i32, month as u32, day as u32) - .and_hms(hour as u32, minute as u32, second as u32); - Ok(rv) + let rv = FixedOffset::east_opt(tzoffset_secs) + .ok_or_else(|| GdalError::BadArgument("Invalid offset".to_string()))?; + rv.with_ymd_and_hms( + year as i32, + month as u32, + day as u32, + hour as u32, + minute as u32, + second as u32, + ) + .single() + .ok_or_else(|| GdalError::BadArgument("Invalid datetime".to_string())) } /// Get the field's geometry. @@ -614,7 +622,13 @@ impl<'a> Feature<'a> { FieldValue::RealValue(value) => self.set_field_double(field_name, *value), FieldValue::RealListValue(value) => self.set_field_double_list(field_name, value), FieldValue::DateValue(value) => { - self.set_field_datetime(field_name, value.and_hms(0, 0, 0)) + let naive_datetime = value + .and_hms_opt(0, 0, 0) + .ok_or_else(|| GdalError::BadArgument("Bad datetime".to_string()))?; + self.set_field_datetime( + field_name, + DateTime::from_local(naive_datetime, FixedOffset::east_opt(0).unwrap()), + ) } FieldValue::DateTimeValue(value) => self.set_field_datetime(field_name, *value), } @@ -709,7 +723,7 @@ pub enum FieldValue { StringListValue(Vec), RealValue(f64), RealListValue(Vec), - DateValue(Date), + DateValue(NaiveDate), DateTimeValue(DateTime), } @@ -749,10 +763,10 @@ impl FieldValue { } /// Interpret the value as `Date`. Returns `None` if the value is something else. - pub fn into_date(self) -> Option> { + pub fn into_date(self) -> Option { match self { FieldValue::DateValue(rv) => Some(rv), - FieldValue::DateTimeValue(rv) => Some(rv.date()), + FieldValue::DateTimeValue(rv) => Some(rv.date_naive()), _ => None, } } diff --git a/src/vector/gdal_to_geo.rs b/src/vector/gdal_to_geo.rs index fa1e42f77..b20401579 100644 --- a/src/vector/gdal_to_geo.rs +++ b/src/vector/gdal_to_geo.rs @@ -23,7 +23,7 @@ impl TryFrom<&Geometry> for geo_types::Geometry { OGRwkbGeometryType::wkbPoint => { let (x, y, _) = geo.get_point(0); Ok(geo_types::Geometry::Point(geo_types::Point( - geo_types::Coordinate { x, y }, + geo_types::Coord { x, y }, ))) } OGRwkbGeometryType::wkbMultiPoint => { @@ -47,7 +47,7 @@ impl TryFrom<&Geometry> for geo_types::Geometry { let coords = geo .get_point_vec() .iter() - .map(|&(x, y, _)| geo_types::Coordinate { x, y }) + .map(|&(x, y, _)| geo_types::Coord { x, y }) .collect(); Ok(geo_types::Geometry::LineString(geo_types::LineString( coords, diff --git a/src/vector/vector_tests/convert_geo.rs b/src/vector/vector_tests/convert_geo.rs index 13681752c..6b5c99e3b 100644 --- a/src/vector/vector_tests/convert_geo.rs +++ b/src/vector/vector_tests/convert_geo.rs @@ -5,7 +5,7 @@ use crate::vector::{Geometry, ToGdal}; #[test] fn test_import_export_point() { let wkt = "POINT (1 2)"; - let coord = geo_types::Coordinate { x: 1., y: 2. }; + let coord = geo_types::Coord { x: 1., y: 2. }; let geo = geo_types::Geometry::Point(geo_types::Point(coord)); assert_eq!( @@ -19,9 +19,9 @@ fn test_import_export_point() { fn test_import_export_multipoint() { let wkt = "MULTIPOINT (0 0,0 1,1 2)"; let coord = vec![ - geo_types::Point(geo_types::Coordinate { x: 0., y: 0. }), - geo_types::Point(geo_types::Coordinate { x: 0., y: 1. }), - geo_types::Point(geo_types::Coordinate { x: 1., y: 2. }), + geo_types::Point(geo_types::Coord { x: 0., y: 0. }), + geo_types::Point(geo_types::Coord { x: 0., y: 1. }), + geo_types::Point(geo_types::Coord { x: 1., y: 2. }), ]; let geo = geo_types::Geometry::MultiPoint(geo_types::MultiPoint(coord)); @@ -36,9 +36,9 @@ fn test_import_export_multipoint() { fn test_import_export_linestring() { let wkt = "LINESTRING (0 0,0 1,1 2)"; let coord = vec![ - geo_types::Coordinate { x: 0., y: 0. }, - geo_types::Coordinate { x: 0., y: 1. }, - geo_types::Coordinate { x: 1., y: 2. }, + geo_types::Coord { x: 0., y: 0. }, + geo_types::Coord { x: 0., y: 1. }, + geo_types::Coord { x: 1., y: 2. }, ]; let geo = geo_types::Geometry::LineString(geo_types::LineString(coord)); @@ -54,14 +54,14 @@ fn test_import_export_multilinestring() { let wkt = "MULTILINESTRING ((0 0,0 1,1 2),(3 3,3 4,4 5))"; let strings = vec![ geo_types::LineString(vec![ - geo_types::Coordinate { x: 0., y: 0. }, - geo_types::Coordinate { x: 0., y: 1. }, - geo_types::Coordinate { x: 1., y: 2. }, + geo_types::Coord { x: 0., y: 0. }, + geo_types::Coord { x: 0., y: 1. }, + geo_types::Coord { x: 1., y: 2. }, ]), geo_types::LineString(vec![ - geo_types::Coordinate { x: 3., y: 3. }, - geo_types::Coordinate { x: 3., y: 4. }, - geo_types::Coordinate { x: 4., y: 5. }, + geo_types::Coord { x: 3., y: 3. }, + geo_types::Coord { x: 3., y: 4. }, + geo_types::Coord { x: 4., y: 5. }, ]), ]; let geo = geo_types::Geometry::MultiLineString(geo_types::MultiLineString(strings)); @@ -75,23 +75,23 @@ fn test_import_export_multilinestring() { fn square(x0: isize, y0: isize, x1: isize, y1: isize) -> geo_types::LineString { geo_types::LineString(vec![ - geo_types::Coordinate { + geo_types::Coord { x: x0 as f64, y: y0 as f64, }, - geo_types::Coordinate { + geo_types::Coord { x: x0 as f64, y: y1 as f64, }, - geo_types::Coordinate { + geo_types::Coord { x: x1 as f64, y: y1 as f64, }, - geo_types::Coordinate { + geo_types::Coord { x: x1 as f64, y: y0 as f64, }, - geo_types::Coordinate { + geo_types::Coord { x: x0 as f64, y: y0 as f64, }, @@ -146,12 +146,12 @@ fn test_import_export_multipolygon() { #[test] fn test_import_export_geometrycollection() { let wkt = "GEOMETRYCOLLECTION (POINT (1 2),LINESTRING (0 0,0 1,1 2))"; - let coord = geo_types::Coordinate { x: 1., y: 2. }; + let coord = geo_types::Coord { x: 1., y: 2. }; let point = geo_types::Geometry::Point(geo_types::Point(coord)); let coords = vec![ - geo_types::Coordinate { x: 0., y: 0. }, - geo_types::Coordinate { x: 0., y: 1. }, - geo_types::Coordinate { x: 1., y: 2. }, + geo_types::Coord { x: 0., y: 0. }, + geo_types::Coord { x: 0., y: 1. }, + geo_types::Coord { x: 1., y: 2. }, ]; let linestring = geo_types::Geometry::LineString(geo_types::LineString(coords)); let collection = geo_types::GeometryCollection(vec![point, linestring]); diff --git a/src/vector/vector_tests/mod.rs b/src/vector/vector_tests/mod.rs index e199349d4..6464ca67b 100644 --- a/src/vector/vector_tests/mod.rs +++ b/src/vector/vector_tests/mod.rs @@ -395,11 +395,15 @@ mod tests { with_features("points_with_datetime.json", |mut features| { let feature = features.next().unwrap(); - let dt = FixedOffset::east(-5 * hour_secs) - .ymd(2011, 7, 14) - .and_hms(19, 43, 37); + let dt = FixedOffset::east_opt(-5 * hour_secs) + .unwrap() + .with_ymd_and_hms(2011, 7, 14, 19, 43, 37) + .unwrap(); - let d = FixedOffset::east(0).ymd(2018, 1, 4).and_hms(0, 0, 0); + let d = FixedOffset::east_opt(0) + .unwrap() + .with_ymd_and_hms(2018, 1, 4, 0, 0, 0) + .unwrap(); assert_eq!(feature.field_as_datetime_by_name("dt").unwrap(), Some(dt)); From f54b6bf498f4d23ffdaf5c868343a1a22efa763f Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sat, 19 Nov 2022 21:35:39 -0500 Subject: [PATCH 3/7] revert --- src/vector/vector_tests/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vector/vector_tests/mod.rs b/src/vector/vector_tests/mod.rs index 6464ca67b..cc0b77e67 100644 --- a/src/vector/vector_tests/mod.rs +++ b/src/vector/vector_tests/mod.rs @@ -761,6 +761,8 @@ mod tests { #[test] fn test_write_features() { + use std::fs; + { let driver = DriverManager::get_driver_by_name("GeoJSON").unwrap(); let mut ds = driver @@ -798,6 +800,7 @@ mod tests { ); assert_eq!(ft.field("Value").unwrap().unwrap().into_real(), Some(45.78)); assert_eq!(ft.field("Int_value").unwrap().unwrap().into_int(), Some(1)); + fs::remove_file(fixture!("output.geojson")).unwrap(); } #[test] From 049ccfe069ace825299e1f39be5c09f577efa919 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sun, 20 Nov 2022 19:57:52 -0500 Subject: [PATCH 4/7] revert --- src/vector/feature.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vector/feature.rs b/src/vector/feature.rs index 3a9668f75..46052cec7 100644 --- a/src/vector/feature.rs +++ b/src/vector/feature.rs @@ -629,7 +629,6 @@ impl<'a> Feature<'a> { FieldValue::RealValue(value) => self.set_field_double(field_name, *value), FieldValue::RealListValue(value) => self.set_field_double_list(field_name, value), FieldValue::DateValue(value) => { - let dv = value .and_hms_opt(0, 0, 0) .ok_or_else(|| GdalError::DateError("offset to midnight".into()))?; From f18d97778eed8d0d9c93e7030e7529a07f6426c1 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sun, 20 Nov 2022 20:14:53 -0500 Subject: [PATCH 5/7] Use TempFixture --- src/raster/tests.rs | 4 +--- src/vector/vector_tests/mod.rs | 13 +++++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/raster/tests.rs b/src/raster/tests.rs index 7a36f1da9..809c1ac3d 100644 --- a/src/raster/tests.rs +++ b/src/raster/tests.rs @@ -10,7 +10,6 @@ use crate::vsi::unlink_mem_file; use crate::DriverManager; use gdal_sys::GDALDataType; use std::path::Path; -use tempfile::tempdir; #[cfg(feature = "ndarray")] use ndarray::arr2; @@ -309,8 +308,7 @@ fn test_create_with_band_type_with_options() { }, ]; - let tmp_dir = tempdir().unwrap(); - let tmp_filename = tmp_dir.path().join("test.tif"); + let tmp_filename = TempFixture::empty("test.tif"); { let dataset = driver .create_with_band_type_with_options::(&tmp_filename, 256, 256, 1, &options) diff --git a/src/vector/vector_tests/mod.rs b/src/vector/vector_tests/mod.rs index cc0b77e67..93cbf7f2a 100644 --- a/src/vector/vector_tests/mod.rs +++ b/src/vector/vector_tests/mod.rs @@ -3,9 +3,8 @@ use super::{ OGRwkbGeometryType, OwnedLayer, }; use crate::spatial_ref::SpatialRef; +use crate::test_utils::TempFixture; use crate::{assert_almost_eq, Dataset, DatasetOptions, GdalOpenFlags}; -use std::path::Path; -use tempfile::tempdir; mod convert_geo; mod sql; @@ -858,12 +857,10 @@ mod tests { ..DatasetOptions::default() }; - let tmpdir = tempdir().unwrap(); - let tmp_pathbuf = tmpdir.path().join("test.s3db"); - let tmp_file = Path::new(&tmp_pathbuf); + let tmp_file = TempFixture::empty("test.s3db"); - std::fs::copy(fixture!("three_layer_ds.s3db"), tmp_file).unwrap(); - let ds = Dataset::open_ex(tmp_file, ds_options).unwrap(); + std::fs::copy(fixture!("three_layer_ds.s3db"), &tmp_file).unwrap(); + let ds = Dataset::open_ex(&tmp_file, ds_options).unwrap(); let mut layer = ds.layer(0).unwrap(); let fids: Vec = layer.features().map(|f| f.fid().unwrap()).collect(); let feature = layer.feature(fids[0]).unwrap(); @@ -872,7 +869,7 @@ mod tests { layer.set_feature(feature).ok(); // now we check that the field is 1. - let ds = Dataset::open(tmp_file).unwrap(); + let ds = Dataset::open(&tmp_file).unwrap(); let layer = ds.layer(0).unwrap(); let feature = layer.feature(fids[0]).unwrap(); let value = feature.field("id").unwrap().unwrap().into_int().unwrap(); From 95438ccf29cba80cdd73d74ac8840cf0a9bf6171 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sun, 20 Nov 2022 20:16:25 -0500 Subject: [PATCH 6/7] reformat --- src/vector/vector_tests/mod.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vector/vector_tests/mod.rs b/src/vector/vector_tests/mod.rs index 93cbf7f2a..4fb7e75ef 100644 --- a/src/vector/vector_tests/mod.rs +++ b/src/vector/vector_tests/mod.rs @@ -856,9 +856,7 @@ mod tests { open_flags: GdalOpenFlags::GDAL_OF_UPDATE, ..DatasetOptions::default() }; - let tmp_file = TempFixture::empty("test.s3db"); - std::fs::copy(fixture!("three_layer_ds.s3db"), &tmp_file).unwrap(); let ds = Dataset::open_ex(&tmp_file, ds_options).unwrap(); let mut layer = ds.layer(0).unwrap(); From dfc37ee2e13a5f3c86c0d2fbb859f620e1a14fbc Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Mon, 21 Nov 2022 09:16:39 -0500 Subject: [PATCH 7/7] Close output.geojson dataset before deleting the file (avoid Windows error) --- src/vector/vector_tests/mod.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/vector/vector_tests/mod.rs b/src/vector/vector_tests/mod.rs index 4fb7e75ef..528946d7d 100644 --- a/src/vector/vector_tests/mod.rs +++ b/src/vector/vector_tests/mod.rs @@ -789,16 +789,18 @@ mod tests { // dataset is closed here } - let ds = Dataset::open(fixture!("output.geojson")).unwrap(); - let mut layer = ds.layer(0).unwrap(); - let ft = layer.features().next().unwrap(); - assert_eq!(ft.geometry().wkt().unwrap(), "POINT (1 2)"); - assert_eq!( - ft.field("Name").unwrap().unwrap().into_string(), - Some("Feature 1".to_string()) - ); - assert_eq!(ft.field("Value").unwrap().unwrap().into_real(), Some(45.78)); - assert_eq!(ft.field("Int_value").unwrap().unwrap().into_int(), Some(1)); + { + let ds = Dataset::open(fixture!("output.geojson")).unwrap(); + let mut layer = ds.layer(0).unwrap(); + let ft = layer.features().next().unwrap(); + assert_eq!(ft.geometry().wkt().unwrap(), "POINT (1 2)"); + assert_eq!( + ft.field("Name").unwrap().unwrap().into_string(), + Some("Feature 1".to_string()) + ); + assert_eq!(ft.field("Value").unwrap().unwrap().into_real(), Some(45.78)); + assert_eq!(ft.field("Int_value").unwrap().unwrap().into_int(), Some(1)); + } fs::remove_file(fixture!("output.geojson")).unwrap(); }