From a1556d8e071ac7bbe0f0ed299a8347ccc9839071 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Tue, 8 Sep 2020 16:40:11 +0200 Subject: [PATCH 1/3] Reintroduce support for pygrib 1.9.6 The create_grid_mapping need a newer version of pyproj, by moving the import to that function data with lat/lon can still be written. --- satpy/writers/cf_writer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/writers/cf_writer.py b/satpy/writers/cf_writer.py index 80e9bc7491..308d48bf99 100644 --- a/satpy/writers/cf_writer.py +++ b/satpy/writers/cf_writer.py @@ -114,10 +114,6 @@ from satpy.writers.utils import flatten_dict from distutils.version import LooseVersion -import pyproj -if LooseVersion(pyproj.__version__) < LooseVersion('2.4.1'): - # technically 2.2, but important bug fixes in 2.4.1 - raise ImportError("'cf' writer requires pyproj 2.4.1 or greater") logger = logging.getLogger(__name__) @@ -147,6 +143,10 @@ def create_grid_mapping(area): """Create the grid mapping instance for `area`.""" + import pyproj + if LooseVersion(pyproj.__version__) < LooseVersion('2.4.1'): + # technically 2.2, but important bug fixes in 2.4.1 + raise ImportError("'cf' writer requires pyproj 2.4.1 or greater") # let pyproj do the heavily lifting # pyproj 2.0+ required grid_mapping = area.crs.to_cf() From 1a4129fa856afb9e356c9b4bb81a5512a9028267 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Tue, 8 Sep 2020 20:52:36 +0200 Subject: [PATCH 2/3] Added a test --- satpy/tests/writer_tests/test_cf.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/satpy/tests/writer_tests/test_cf.py b/satpy/tests/writer_tests/test_cf.py index 0976ab16e4..e3de7685f2 100644 --- a/satpy/tests/writer_tests/test_cf.py +++ b/satpy/tests/writer_tests/test_cf.py @@ -955,6 +955,18 @@ def test_area2lonlat(self): self.assertDictContainsSubset({'name': 'longitude', 'standard_name': 'longitude', 'units': 'degrees_east'}, lon.attrs) + def test_init_with_old_pyproj(self): + """Test that cf_writer can still be loaded with pyproj 1.9.6.""" + import pyproj # noqa 401 + import sys + import importlib + old_version = sys.modules['pyproj'].__version__ + sys.modules['pyproj'].__version__ = "1.9.6" + importlib.reload(sys.modules['satpy.writers.cf_writer']) + # Tear down + sys.modules['pyproj'].__version__ = old_version + importlib.reload(sys.modules['satpy.writers.cf_writer']) + def suite(): """Test suite for this writer's tests.""" From c415a94ae2904d98b096648ad9c93b2d17e41074 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Wed, 9 Sep 2020 08:50:32 +0200 Subject: [PATCH 3/3] Fix style --- satpy/tests/writer_tests/test_cf.py | 46 ++++++++++------------------- 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/satpy/tests/writer_tests/test_cf.py b/satpy/tests/writer_tests/test_cf.py index e3de7685f2..7bb8175433 100644 --- a/satpy/tests/writer_tests/test_cf.py +++ b/satpy/tests/writer_tests/test_cf.py @@ -923,12 +923,10 @@ def test_area2lonlat(self): self.assertEqual(set(res.coords), {'longitude', 'latitude'}) lat = res['latitude'] lon = res['longitude'] - self.assertTrue(np.all(lat.data == lats_ref)) - self.assertTrue(np.all(lon.data == lons_ref)) - self.assertDictContainsSubset({'name': 'latitude', 'standard_name': 'latitude', 'units': 'degrees_north'}, - lat.attrs) - self.assertDictContainsSubset({'name': 'longitude', 'standard_name': 'longitude', 'units': 'degrees_east'}, - lon.attrs) + np.testing.assert_array_equal(lat.data, lats_ref) + np.testing.assert_array_equal(lon.data, lons_ref) + assert {'name': 'latitude', 'standard_name': 'latitude', 'units': 'degrees_north'}.items() <= lat.attrs.items() + assert {'name': 'longitude', 'standard_name': 'longitude', 'units': 'degrees_east'}.items() <= lon.attrs.items() area = pyresample.geometry.AreaDefinition( 'seviri', @@ -948,33 +946,21 @@ def test_area2lonlat(self): self.assertEqual(set(res.coords), {'longitude', 'latitude'}) lat = res['latitude'] lon = res['longitude'] - self.assertTrue(np.all(lat.data == lats_ref)) - self.assertTrue(np.all(lon.data == lons_ref)) - self.assertDictContainsSubset({'name': 'latitude', 'standard_name': 'latitude', 'units': 'degrees_north'}, - lat.attrs) - self.assertDictContainsSubset({'name': 'longitude', 'standard_name': 'longitude', 'units': 'degrees_east'}, - lon.attrs) - - def test_init_with_old_pyproj(self): + np.testing.assert_array_equal(lat.data, lats_ref) + np.testing.assert_array_equal(lon.data, lons_ref) + assert {'name': 'latitude', 'standard_name': 'latitude', 'units': 'degrees_north'}.items() <= lat.attrs.items() + assert {'name': 'longitude', 'standard_name': 'longitude', 'units': 'degrees_east'}.items() <= lon.attrs.items() + + def test_load_module_with_old_pyproj(self): """Test that cf_writer can still be loaded with pyproj 1.9.6.""" import pyproj # noqa 401 import sys import importlib old_version = sys.modules['pyproj'].__version__ sys.modules['pyproj'].__version__ = "1.9.6" - importlib.reload(sys.modules['satpy.writers.cf_writer']) - # Tear down - sys.modules['pyproj'].__version__ = old_version - importlib.reload(sys.modules['satpy.writers.cf_writer']) - - -def suite(): - """Test suite for this writer's tests.""" - loader = unittest.TestLoader() - mysuite = unittest.TestSuite() - mysuite.addTest(loader.loadTestsFromTestCase(TestCFWriter)) - return mysuite - - -if __name__ == "__main__": - unittest.main() + try: + importlib.reload(sys.modules['satpy.writers.cf_writer']) + finally: + # Tear down + sys.modules['pyproj'].__version__ = old_version + importlib.reload(sys.modules['satpy.writers.cf_writer'])