From 665df606de7b966886cd2b74ca9421f3207be9d0 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Sun, 23 May 2021 08:21:33 +0100 Subject: [PATCH 01/16] add badges (#268) --- README.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index ee3aa9a6..6e379cb0 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ iris-grib ========= -|CirrusCI|_ |Coveralls|_ +|CirrusCI|_ |Coveralls|_ |conda-forge|_ |pypi|_ |License|_ |Commits|_ |Contributors|_ GRIB interface for `Iris `_. @@ -24,3 +24,18 @@ terms of its `GNU LGPLv3 license `_. .. |Coveralls| image:: https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=master .. _Coveralls: https://coveralls.io/github/SciTools/iris-grib?branch=master + +.. |conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/iris-grib?color=orange&label=conda-forge&logo=conda-forge&logoColor=white +.. _conda-forge: https://anaconda.org/conda-forge/iris-grib + +.. |pypi| image:: https://img.shields.io/pypi/v/iris-grib?color=orange&label=pypi&logo=python&logoColor=white +.. _pypi: https://pypi.org/project/iris-grib + +.. |License| image:: https://img.shields.io/github/license/SciTools/iris-grib?style=plastic +.. _License: https://github.com/SciTools/iris-grib/blob/master/COPYING + +.. |Contributors| image:: https://img.shields.io/github/contributors/SciTools/iris-grib?style=plastic +.. _Contributors: https://github.com/SciTools/iris-grib/graphs/contributors + +.. |Commits| image:: https://img.shields.io/github/commits-since/SciTools/iris-grib/latest.svg?style=plastic +.. _Commits: https://github.com/SciTools/iris-grib/commits/master \ No newline at end of file From 99d43447444e46f1a909d665ea7b4a89fb5c949d Mon Sep 17 00:00:00 2001 From: Tom Dufall Date: Tue, 25 May 2021 11:17:49 +0100 Subject: [PATCH 02/16] Fix Iris dev guide link (#267) The Iris dev guide has moved - update the link to the new location --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8952a210..6275cf90 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ Getting started 2. Fork the iris-grib repository, create your new fix/feature branch, and start commiting code. - The main - [Iris development guide](http://scitools.org.uk/iris/docs/latest/developers_guide/gitwash/git_development.html) + [Iris development guide](https://scitools-iris.readthedocs.io/en/latest/developers_guide/gitwash/index.html) has more detail. 3. Remember to add appropriate documentation and tests to supplement any new or changed functionality. From 3fddc50c2ad622ee210e135816e0ede55195c6c7 Mon Sep 17 00:00:00 2001 From: Tom Dufall Date: Tue, 1 Jun 2021 12:18:53 +0100 Subject: [PATCH 03/16] Fix nox when HOME not set --- noxfile.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index e9a029fe..ddeb9b25 100644 --- a/noxfile.py +++ b/noxfile.py @@ -29,7 +29,10 @@ IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ['source', 'conda-forge']) #: Default cartopy cache directory. -CARTOPY_CACHE_DIR = os.environ.get("HOME") / Path(".local/share/cartopy") +if os.getenv("HOME"): + CARTOPY_CACHE_DIR = Path(os.getenv("HOME")) / ".local/share/cartopy" +else: + CARTOPY_CACHE_DIR = None def venv_cached(session, requirements_file=None): From 1d8a2cc1d1fb1fb4ebcea2bc885edf03c37bc2c0 Mon Sep 17 00:00:00 2001 From: Tom Dufall Date: Tue, 1 Jun 2021 13:30:52 +0100 Subject: [PATCH 04/16] Actually remove the import --- iris_grib/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index ae718c6e..5775f3ed 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -25,7 +25,6 @@ from iris._lazy_data import as_lazy_data import iris.coord_systems as coord_systems from iris.exceptions import TranslationError, NotYetImplementedError -from iris.util import _array_slice_ifempty from . import grib_phenom_translation as gptx from . import _save_rules From a165da506f073d2ec85d0a9d4e32e6a25c44e494 Mon Sep 17 00:00:00 2001 From: Tom Dufall Date: Wed, 2 Jun 2021 00:47:36 +0100 Subject: [PATCH 05/16] Remove unused imports --- iris_grib/__init__.py | 3 +-- iris_grib/_grib1_load_rules.py | 5 +---- iris_grib/_load_convert.py | 2 +- iris_grib/_save_rules.py | 1 - iris_grib/tests/__init__.py | 4 +--- .../integration/load_convert/test_load_hybrid_coords.py | 2 +- .../integration/save_rules/test_grid_definition_section.py | 2 -- .../integration/save_rules/test_save_hybrid_coords.py | 1 - iris_grib/tests/test_license_headers.py | 1 - .../tests/unit/load_convert/test_ensemble_identifier.py | 1 - .../unit/load_convert/test_grid_definition_template_10.py | 1 - .../load_convert/test_product_definition_template_10.py | 1 - .../load_convert/test_product_definition_template_15.py | 3 --- .../load_convert/test_product_definition_template_31.py | 5 ----- .../load_convert/test_product_definition_template_32.py | 7 ------- iris_grib/tests/unit/load_convert/test_satellite_common.py | 2 -- .../tests/unit/load_convert/test_translate_phenomenon.py | 2 -- iris_grib/tests/unit/message/test_GribMessage.py | 2 +- iris_grib/tests/unit/save_rules/__init__.py | 3 +-- .../tests/unit/save_rules/test__missing_forecast_period.py | 3 --- .../unit/save_rules/test__non_missing_forecast_period.py | 2 -- .../unit/save_rules/test_grid_definition_template_10.py | 1 - .../unit/save_rules/test_grid_definition_template_12.py | 1 - .../unit/save_rules/test_grid_definition_template_30.py | 1 - .../unit/save_rules/test_product_definition_template_1.py | 2 +- iris_grib/tests/unit/test_GribWrapper.py | 4 ++-- iris_grib/tests/unit/test__load_generate.py | 3 --- iris_grib/tests/unit/test_load_cubes.py | 2 -- 28 files changed, 10 insertions(+), 57 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 5775f3ed..0d5578f7 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -12,7 +12,6 @@ import datetime import math # for fmod -import warnings import cartopy.crs as ccrs import cf_units @@ -21,7 +20,7 @@ import numpy.ma as ma # NOTE: careful here, to avoid circular imports (as iris imports grib) -import iris +import iris # noqa: F401 from iris._lazy_data import as_lazy_data import iris.coord_systems as coord_systems from iris.exceptions import TranslationError, NotYetImplementedError diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index fd537442..cdeaaf71 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -7,16 +7,13 @@ # Historically this was auto-generated from # SciTools/iris-code-generators:tools/gen_rules.py -import warnings from cf_units import CALENDAR_GREGORIAN, Unit -import numpy as np from iris.aux_factory import HybridPressureFactory from iris.coords import AuxCoord, CellMethod, DimCoord from iris.exceptions import TranslationError -from iris.fileformats.rules import (ConversionMetadata, Factory, Reference, - ReferenceTarget) +from iris.fileformats.rules import (ConversionMetadata, Factory, Reference) def grib1_convert(grib): diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index f27c551d..f987479c 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -17,7 +17,7 @@ import warnings import cartopy.crs as ccrs -from cf_units import CALENDAR_GREGORIAN, date2num, Unit +from cf_units import CALENDAR_GREGORIAN, Unit import numpy as np import numpy.ma as ma diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 0f0e4df3..d2362290 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -17,7 +17,6 @@ import gribapi import numpy as np import numpy.ma as ma -import cartopy.crs as ccrs import iris from iris.aux_factory import HybridHeightFactory, HybridPressureFactory diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index 6653ca5c..3833ec56 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -11,7 +11,7 @@ """ -import iris.tests +import iris.tests # noqa: F401 import inspect import os @@ -25,8 +25,6 @@ except ImportError: from iris.tests import IrisTest -from iris.tests import main, skip_data, get_data_path - from iris_grib.message import GribMessage diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index 2a7e61ad..b2f42e8f 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -13,7 +13,7 @@ import iris_grib.tests as tests -from iris import load_cube, load +from iris import load_cube from iris.aux_factory import HybridHeightFactory, HybridPressureFactory diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index 64b94510..64de2775 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -13,14 +13,12 @@ # importing anything else. import iris_grib.tests as tests -from iris.coords import DimCoord from iris.coord_systems import (GeogCS, RotatedGeogCS, Mercator, TransverseMercator, LambertConformal, AlbersEqualArea) -from iris.cube import Cube import numpy as np from iris_grib._save_rules import grid_definition_section diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index cc3fa0e2..9b1525b7 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -15,7 +15,6 @@ import numpy as np import iris -from iris.cube import Cube from iris_grib import save_pairs_from_cube, save_messages, GribMessage diff --git a/iris_grib/tests/test_license_headers.py b/iris_grib/tests/test_license_headers.py index 7c874b85..68bffb01 100644 --- a/iris_grib/tests/test_license_headers.py +++ b/iris_grib/tests/test_license_headers.py @@ -11,7 +11,6 @@ from datetime import datetime from fnmatch import fnmatch import os -import re import subprocess import unittest diff --git a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py index 0157547d..967e6551 100644 --- a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py +++ b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py @@ -13,7 +13,6 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock import warnings diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py index 670e7cd0..1d835b7a 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py @@ -20,7 +20,6 @@ import iris.exceptions from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI from iris_grib._load_convert import grid_definition_template_10 diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index a43f4f42..98118f01 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -12,7 +12,6 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock from iris.coords import DimCoord diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 0cc245ec..d1427f16 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -16,13 +16,10 @@ # before importing anything else. import iris_grib.tests as tests -from unittest import mock - import iris.coords from iris.exceptions import TranslationError from iris.coords import CellMethod, DimCoord -import iris_grib from iris_grib.tests.unit.load_convert import empty_metadata from iris_grib.tests.unit.load_convert import LoadConvertTest from iris_grib._load_convert import _MDI as MDI diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py index 03fdfd9a..dcb935b2 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py @@ -12,12 +12,7 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock -import warnings - -from iris.coords import AuxCoord -import numpy as np from iris_grib.tests.unit.load_convert import empty_metadata diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py index 8a94d0db..be992d3b 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -12,16 +12,9 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock -import warnings - -from iris.coords import AuxCoord, DimCoord -import numpy as np from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI - from iris_grib._load_convert import product_definition_template_32 diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/iris_grib/tests/unit/load_convert/test_satellite_common.py index d2814ddc..50c3b5fc 100644 --- a/iris_grib/tests/unit/load_convert/test_satellite_common.py +++ b/iris_grib/tests/unit/load_convert/test_satellite_common.py @@ -12,9 +12,7 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock -import warnings from iris.coords import AuxCoord import numpy as np diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index 6f79474f..49c30f85 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -12,8 +12,6 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy - from cf_units import Unit from iris.coords import DimCoord diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index 881c7db4..f8d25a90 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -41,7 +41,7 @@ def test_release_file(self): '3_layer.grib2')) my_file = open(filename) - import builtins + import builtins # noqa: F401 self.patch('builtins.open', mock.Mock(return_value=my_file)) messages = list(GribMessage.messages_from_filename(filename)) diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index 3779aea0..a3d7d5d8 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -7,8 +7,7 @@ # Import iris_grib.tests first so that some things can be initialised before # importing anything else. -import iris_grib.tests as tests - +import iris_grib.tests # noqa: F401 from unittest import mock import numpy as np diff --git a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py index b525b652..46775502 100644 --- a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py @@ -12,9 +12,6 @@ # importing anything else. import iris_grib.tests as tests -import datetime -import numpy as np - from iris.cube import Cube from iris.coords import DimCoord diff --git a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py index e558650d..cced408f 100644 --- a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py @@ -9,8 +9,6 @@ # importing anything else. import iris_grib.tests as tests -import cf_units - import iris from iris_grib._save_rules import _non_missing_forecast_period diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index 5410b186..e509a4f1 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -14,7 +14,6 @@ import numpy as np -import iris.coords from iris.coord_systems import GeogCS, Mercator from iris_grib._save_rules import grid_definition_template_10 diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index 2efcecb9..cf600a80 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -16,7 +16,6 @@ import iris.coords from iris.coord_systems import GeogCS, TransverseMercator -from iris.exceptions import TranslationError from iris_grib._save_rules import grid_definition_template_12 from iris_grib.tests.unit.save_rules import GdtTestMixin diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index 9622e5f0..8437ca31 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -16,7 +16,6 @@ import iris.coords from iris.coord_systems import GeogCS, LambertConformal -from iris.exceptions import TranslationError from iris_grib._save_rules import grid_definition_template_30 from iris_grib.tests.unit.save_rules import GdtTestMixin diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py index 2543aaac..c8f9acfa 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py @@ -17,7 +17,7 @@ from cf_units import Unit import gribapi -from iris.coords import CellMethod, DimCoord +from iris.coords import DimCoord import iris.tests.stock as stock from iris_grib._save_rules import product_definition_template_1 diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index 45a402c6..b7ae6272 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -15,10 +15,10 @@ import numpy as np from unittest import mock -from iris._lazy_data import as_concrete_data, is_lazy_data +from iris._lazy_data import is_lazy_data from iris.exceptions import TranslationError -from iris_grib import GribWrapper, GribDataProxy, _load_generate +from iris_grib import GribWrapper, _load_generate _message_length = 1000 diff --git a/iris_grib/tests/unit/test__load_generate.py b/iris_grib/tests/unit/test__load_generate.py index 049a98b4..ed2610f8 100644 --- a/iris_grib/tests/unit/test__load_generate.py +++ b/iris_grib/tests/unit/test__load_generate.py @@ -9,11 +9,8 @@ from unittest import mock -import iris from iris.exceptions import TranslationError -from iris.fileformats.rules import Loader -import iris_grib from iris_grib import GribWrapper from iris_grib import _load_generate from iris_grib.message import GribMessage diff --git a/iris_grib/tests/unit/test_load_cubes.py b/iris_grib/tests/unit/test_load_cubes.py index ea3ed0b1..48706981 100644 --- a/iris_grib/tests/unit/test_load_cubes.py +++ b/iris_grib/tests/unit/test_load_cubes.py @@ -9,10 +9,8 @@ from unittest import mock -import iris from iris.fileformats.rules import Loader -import iris_grib from iris_grib import load_cubes From b9ac1219359cad9ba213f088a15dd241cbaa4964 Mon Sep 17 00:00:00 2001 From: Tom Dufall Date: Wed, 2 Jun 2021 01:02:37 +0100 Subject: [PATCH 06/16] Fix whitespace flagged by Flake8 --- iris_grib/__init__.py | 2 +- iris_grib/_grib1_load_rules.py | 25 +++++++++---------- iris_grib/grib_phenom_translation.py | 1 + iris_grib/tests/__init__.py | 2 +- iris_grib/tests/unit/__init__.py | 8 +++--- .../tests/unit/message/test_GribMessage.py | 2 +- iris_grib/tests/unit/save_rules/__init__.py | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 0d5578f7..40335316 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -20,7 +20,7 @@ import numpy.ma as ma # NOTE: careful here, to avoid circular imports (as iris imports grib) -import iris # noqa: F401 +import iris # noqa: F401 from iris._lazy_data import as_lazy_data import iris.coord_systems as coord_systems from iris.exceptions import TranslationError, NotYetImplementedError diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index cdeaaf71..239c7c34 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -45,42 +45,42 @@ def grib1_convert(grib): aux_coords_and_dims = [] if \ - (grib.gridType=="reduced_gg"): + (grib.gridType == "reduced_gg"): aux_coords_and_dims.append((AuxCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) aux_coords_and_dims.append((AuxCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system), 0)) if \ - (grib.gridType=="regular_ll") and \ + (grib.gridType == "regular_ll") and \ (grib.jPointsAreConsecutive == 0): dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) if \ - (grib.gridType=="regular_ll") and \ + (grib.gridType == "regular_ll") and \ (grib.jPointsAreConsecutive == 1): dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) if \ - (grib.gridType=="regular_gg") and \ + (grib.gridType == "regular_gg") and \ (grib.jPointsAreConsecutive == 0): dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) if \ - (grib.gridType=="regular_gg") and \ + (grib.gridType == "regular_gg") and \ (grib.jPointsAreConsecutive == 1): dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) if \ - (grib.gridType=="rotated_ll") and \ + (grib.gridType == "rotated_ll") and \ (grib.jPointsAreConsecutive == 0): dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) if \ - (grib.gridType=="rotated_ll") and \ + (grib.gridType == "rotated_ll") and \ (grib.jPointsAreConsecutive == 1): dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) @@ -225,12 +225,11 @@ def add_bounded_time_coords(aux_coords_and_dims, grib): if \ (grib.levelType == 'sfc'): - - if (grib._cf_data is not None) and \ - (grib._cf_data.set_height is not None): - aux_coords_and_dims.append((DimCoord(points=grib._cf_data.set_height, long_name="height", units="m", attributes={'positive':'up'}), None)) - elif grib.typeOfLevel == 'heightAboveGround': # required for NCAR - aux_coords_and_dims.append((DimCoord(points=grib.level, long_name="height", units="m", attributes={'positive':'up'}), None)) + if (grib._cf_data is not None) and \ + (grib._cf_data.set_height is not None): + aux_coords_and_dims.append((DimCoord(points=grib._cf_data.set_height, long_name="height", units="m", attributes={'positive': 'up'}), None)) + elif grib.typeOfLevel == 'heightAboveGround': # required for NCAR + aux_coords_and_dims.append((DimCoord(points=grib.level, long_name="height", units="m", attributes={'positive': 'up'}), None)) if \ (grib.levelType == 'ml') and \ diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index 988a1464..9a814db6 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -260,6 +260,7 @@ def _make_cf_grib2_entry(standard_name, long_name, return table + _CF_GRIB2_TABLE = _make_cf_to_grib2_table() diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index 3833ec56..bc9eaaec 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -11,7 +11,7 @@ """ -import iris.tests # noqa: F401 +import iris.tests # noqa: F401 import inspect import os diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index 258224bf..b077d253 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -213,8 +213,8 @@ def cube_from_message(self, grib): # Parameter translation now uses the GribWrapper, so we must convert # the Mock-based fake message to a FakeGribMessage. with mock.patch('iris_grib.gribapi', _mock_gribapi): - grib_message = FakeGribMessage(**grib.__dict__) - wrapped_msg = iris_grib.GribWrapper(grib_message) - cube, _, _ = iris.fileformats.rules._make_cube( - wrapped_msg, iris_grib._grib1_load_rules.grib1_convert) + grib_message = FakeGribMessage(**grib.__dict__) + wrapped_msg = iris_grib.GribWrapper(grib_message) + cube, _, _ = iris.fileformats.rules._make_cube( + wrapped_msg, iris_grib._grib1_load_rules.grib1_convert) return cube diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index f8d25a90..4f585bd5 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -41,7 +41,7 @@ def test_release_file(self): '3_layer.grib2')) my_file = open(filename) - import builtins # noqa: F401 + import builtins # noqa: F401 self.patch('builtins.open', mock.Mock(return_value=my_file)) messages = list(GribMessage.messages_from_filename(filename)) diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index a3d7d5d8..87e87938 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -7,7 +7,7 @@ # Import iris_grib.tests first so that some things can be initialised before # importing anything else. -import iris_grib.tests # noqa: F401 +import iris_grib.tests # noqa: F401 from unittest import mock import numpy as np From 3efeac4f99db6b813a038c5fd0f5b19ff498260f Mon Sep 17 00:00:00 2001 From: Tom Dufall Date: Wed, 2 Jun 2021 01:12:45 +0100 Subject: [PATCH 07/16] Flake8 ignore auto-generated file --- .flake8 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..2a930a03 --- /dev/null +++ b/.flake8 @@ -0,0 +1,4 @@ +[flake8] +exclude = + # Auto-generated file + iris_grib/_grib_cf_map.py From c2cbe15d6ead163507389bb89687f2ce0cc251ca Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 13:34:34 +0000 Subject: [PATCH 08/16] Restore imports actually needed --- iris_grib/tests/__init__.py | 2 ++ iris_grib/tests/unit/test_load_cubes.py | 1 + 2 files changed, 3 insertions(+) diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index bc9eaaec..7242a6fd 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -25,6 +25,8 @@ except ImportError: from iris.tests import IrisTest +from iris.tests import main, skip_data, get_data_path # noqa: F401 + from iris_grib.message import GribMessage diff --git a/iris_grib/tests/unit/test_load_cubes.py b/iris_grib/tests/unit/test_load_cubes.py index 48706981..440e2707 100644 --- a/iris_grib/tests/unit/test_load_cubes.py +++ b/iris_grib/tests/unit/test_load_cubes.py @@ -11,6 +11,7 @@ from iris.fileformats.rules import Loader +import iris_grib from iris_grib import load_cubes From 3a4fe21c9af28e9bbd032361adf371ddd34c8abc Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 13:35:11 +0000 Subject: [PATCH 09/16] Use raw strings for regex with escapes --- .../load_convert/test_product_definition_template_15.py | 4 ++-- .../tests/unit/load_convert/test_statistical_cell_method.py | 6 +++--- iris_grib/tests/unit/save_rules/test_set_time_range.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index d1427f16..92a703b2 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -87,14 +87,14 @@ def test_translation(self): def test_bad_statistic_method(self): section = section_4_sample() section['statisticalProcess'] = 999 - msg = 'unsupported statistical process type \[999\]' + msg = r'unsupported statistical process type \[999\]' with self.assertRaisesRegex(TranslationError, msg): self._translate(section) def test_bad_spatial_processing_code(self): section = section_4_sample() section['spatialProcessing'] = 999 - msg = 'unsupported spatial processing type \[999\]' + msg = r'unsupported spatial processing type \[999\]' with self.assertRaisesRegex(TranslationError, msg): self._translate(section) diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py index b2dd61d4..6f6973bd 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py @@ -67,21 +67,21 @@ def test_fail_bad_ranges(self): def test_fail_multiple_ranges(self): self.section['numberOfTimeRange'] = 2 with self.assertRaisesRegex(TranslationError, - 'multiple time ranges \[2\]'): + r'multiple time ranges \[2\]'): statistical_cell_method(self.section) def test_fail_unknown_statistic(self): self.section['typeOfStatisticalProcessing'] = 17 with self.assertRaisesRegex( TranslationError, - 'contains an unsupported statistical process type \[17\]'): + r'contains an unsupported statistical process type \[17\]'): statistical_cell_method(self.section) def test_fail_bad_increment_type(self): self.section['typeOfTimeIncrement'] = 7 with self.assertRaisesRegex( TranslationError, - 'time-increment type \[7\] is not supported'): + r'time-increment type \[7\] is not supported'): statistical_cell_method(self.section) def test_pdt_9(self): diff --git a/iris_grib/tests/unit/save_rules/test_set_time_range.py b/iris_grib/tests/unit/save_rules/test_set_time_range.py index ac823707..522e3bea 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_range.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_range.py @@ -80,7 +80,7 @@ def test_fractional_hours(self, mock_set_long): warnings.simplefilter("always") set_time_range(self.coord, mock.sentinel.grib) self.assertEqual(len(warn), 1) - msg = 'Truncating floating point lengthOfTimeRange 10\.8?9+ ' \ + msg = r'Truncating floating point lengthOfTimeRange 10\.8?9+ ' \ 'to integer value 10' self.assertRegex(str(warn[0].message), msg) mock_set_long.assert_any_call(mock.sentinel.grib, From 9a0a57d2fe54d5a20b7211c6a4f95815b791f17f Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 14:03:55 +0000 Subject: [PATCH 10/16] Remove unused variables --- .../tests/unit/load_convert/test_ensemble_identifier.py | 3 +-- .../load_convert/test_product_definition_template_10.py | 1 - .../load_convert/test_statistical_forecast_period_coord.py | 6 ++---- iris_grib/tests/unit/message/test_GribMessage.py | 2 +- iris_grib/tests/unit/message/test__RawGribMessage.py | 2 +- iris_grib/tests/unit/test_GribWrapper.py | 4 ++-- 6 files changed, 7 insertions(+), 11 deletions(-) diff --git a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py index 967e6551..97cd7ca1 100644 --- a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py +++ b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py @@ -23,9 +23,7 @@ class Test(tests.IrisGribTest): def setUp(self): - module = 'iris_grib._load_convert' self.patch('warnings.warn') - this = '{}.product_definition_template_0'.format(module) def _check(self, request_warning): section = {'perturbationNumber': 17} @@ -35,6 +33,7 @@ def _check(self, request_warning): expected = DimCoord(section['perturbationNumber'], standard_name='realization', units='no_unit') + self.assertEqual(realization, expected) if request_warning: warn_msgs = [mcall[1][0] for mcall in warnings.warn.mock_calls] diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index 98118f01..fadabb5a 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -22,7 +22,6 @@ class Test(tests.IrisGribTest): def setUp(self): module = 'iris_grib._load_convert' - this_module = '{}.product_definition_template_10'.format(module) self.patch_statistical_fp_coord = self.patch( module + '.statistical_forecast_period_coord', return_value=mock.sentinel.dummy_fp_coord) diff --git a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py index 3b941f1d..7bfc8b82 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py @@ -51,14 +51,12 @@ def test_basic(self): self.assertArrayAlmostEqual(coord.bounds, [[0.0, 8.0]]) def test_with_hindcast(self): - coord = statistical_forecast_period_coord(self.section, - self.frt_coord) + _ = statistical_forecast_period_coord(self.section, self.frt_coord) self.assertEqual(self.patch_hindcast.call_count, 1) def test_no_hindcast(self): self.patch(self.module + '.options.support_hindcast_values', False) - coord = statistical_forecast_period_coord(self.section, - self.frt_coord) + _ = statistical_forecast_period_coord(self.section, self.frt_coord) self.assertEqual(self.patch_hindcast.call_count, 0) diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index 4f585bd5..f4062754 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -274,7 +274,7 @@ def test(self): 7: {'codedValues': np.arange(12)}}) with self.assertRaisesRegex(TranslationError, 'template 999 is not supported'): - data = message.data + _ = message.data if __name__ == '__main__': diff --git a/iris_grib/tests/unit/message/test__RawGribMessage.py b/iris_grib/tests/unit/message/test__RawGribMessage.py index 67156e50..3213f784 100644 --- a/iris_grib/tests/unit/message/test__RawGribMessage.py +++ b/iris_grib/tests/unit/message/test__RawGribMessage.py @@ -27,7 +27,7 @@ def setUp(self): def test_sections__set(self): # Test that sections writes into the _sections attribute. - res = self.message.sections + _ = self.message.sections self.assertNotEqual(self.message._sections, None) def test_sections__indexing(self): diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index b7ae6272..cbd0f233 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -110,7 +110,7 @@ def test_regular_proxy_args(self): self.lookup(grib_message, 'Ni')) for offset in self.expected: with mock.patch('iris_grib.GribDataProxy') as mock_gdp: - gw = GribWrapper(grib_message, self.grib_fh) + _ = GribWrapper(grib_message, self.grib_fh) mock_gdp.assert_called_once_with(shape, self.dtype, self.path, offset) @@ -119,7 +119,7 @@ def test_reduced_proxy_args(self): shape = (self.lookup(grib_message, 'numberOfValues')) for offset in self.expected: with mock.patch('iris_grib.GribDataProxy') as mock_gdp: - gw = GribWrapper(grib_message, self.grib_fh) + _ = GribWrapper(grib_message, self.grib_fh) mock_gdp.assert_called_once_with((shape,), self.dtype, self.path, offset) From a815022319df5bce22fa56539dfc7c5795b1ea06 Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 14:28:53 +0000 Subject: [PATCH 11/16] Remove more unused imports that popped up --- iris_grib/tests/unit/message/test__DataProxy.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index b828c97c..d2de3266 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -12,9 +12,6 @@ # importing anything else. import iris_grib.tests as tests -from unittest import mock - -import numpy as np from numpy.random import randint from iris.exceptions import TranslationError From e4ec394f46085e96008846a05056c3425a05c0a0 Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 14:29:19 +0000 Subject: [PATCH 12/16] No bare 'except' --- iris_grib/_save_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index d2362290..8b437587 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -705,7 +705,7 @@ def set_discipline_and_parameter(cube, grib): category = gc.category number = gc.number identity_found = True - except: + except Exception: pass if not identity_found: From 1abffcf0c0cdf71b8ffc751a5f00981138f529cb Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 15:54:56 +0000 Subject: [PATCH 13/16] Reduce line lengths --- iris_grib/_grib1_load_rules.py | 255 ++++++++++++++++++++++++--------- 1 file changed, 186 insertions(+), 69 deletions(-) diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index 239c7c34..4520097e 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -44,50 +44,82 @@ def grib1_convert(grib): dim_coords_and_dims = [] aux_coords_and_dims = [] - if \ - (grib.gridType == "reduced_gg"): - aux_coords_and_dims.append((AuxCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - aux_coords_and_dims.append((AuxCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - - if \ - (grib.gridType == "regular_ll") and \ - (grib.jPointsAreConsecutive == 0): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) - - if \ - (grib.gridType == "regular_ll") and \ - (grib.jPointsAreConsecutive == 1): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) - - if \ - (grib.gridType == "regular_gg") and \ - (grib.jPointsAreConsecutive == 0): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) - - if \ - (grib.gridType == "regular_gg") and \ - (grib.jPointsAreConsecutive == 1): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) - - if \ - (grib.gridType == "rotated_ll") and \ - (grib.jPointsAreConsecutive == 0): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) - - if \ - (grib.gridType == "rotated_ll") and \ - (grib.jPointsAreConsecutive == 1): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) - - if grib.gridType in ["polar_stereographic", "lambert"]: - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units="m", coord_system=grib._coord_system), 0)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units="m", coord_system=grib._coord_system), 1)) + if grib.gridType == "reduced_gg": + aux_coords_and_dims.append( + ( + AuxCoord( + grib._y_points, + grib._y_coord_name, + units='degrees', + coord_system=grib._coord_system, + ), + 0 + ) + ) + aux_coords_and_dims.append( + ( + AuxCoord( + grib._x_points, + grib._x_coord_name, + units='degrees', + coord_system=grib._coord_system, + ), + 0 + ) + ) + elif grib.gridType in ("regular_ll", "rotated_ll", "regular_gg"): + j_points_are_consecutive = grib.jPointsAreConsecutive + + if j_points_are_consecutive not in (0, 1): + raise ValueError + + dim_coords_and_dims.append( + ( + DimCoord( + grib._y_points, + grib._y_coord_name, + units='degrees', + coord_system=grib._coord_system, + ), + j_points_are_consecutive + ) + ) + dim_coords_and_dims.append( + ( + DimCoord( + grib._x_points, + grib._x_coord_name, + units='degrees', + coord_system=grib._coord_system, + circular=grib._x_circular, + ), + int(not(j_points_are_consecutive)) + ) + ) + + elif grib.gridType in ["polar_stereographic", "lambert"]: + dim_coords_and_dims.append( + ( + DimCoord( + grib._y_points, + grib._y_coord_name, + units="m", + coord_system=grib._coord_system, + ), + 0 + ) + ) + dim_coords_and_dims.append( + ( + DimCoord( + grib._x_points, + grib._x_coord_name, + units="m", + coord_system=grib._coord_system, + ), + 1 + ) + ) if \ (grib.table2Version < 128) and \ @@ -119,19 +151,38 @@ def grib1_convert(grib): if \ (grib.table2Version >= 128) and \ (grib._cf_data is None): - long_name = "UNKNOWN LOCAL PARAM " + str(grib.indicatorOfParameter) + "." + str(grib.table2Version) + long_name = f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}"\ + f".{grib.table2Version}" units = "???" if \ (grib.table2Version == 1) and \ (grib.indicatorOfParameter >= 128): - long_name = "UNKNOWN LOCAL PARAM " + str(grib.indicatorOfParameter) + "." + str(grib.table2Version) + long_name = f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}"\ + f".{grib.table2Version}" units = "???" - if \ - (grib._phenomenonDateTime != -1.0): - aux_coords_and_dims.append((DimCoord(points=grib.startStep, standard_name='forecast_period', units=grib._forecastTimeUnit), None)) - aux_coords_and_dims.append((DimCoord(points=grib.phenomenon_points('hours'), standard_name='time', units=Unit('hours since epoch', CALENDAR_GREGORIAN)), None)) + if grib._phenomenonDateTime != -1.0: + aux_coords_and_dims.append( + ( + DimCoord( + points=grib.startStep, + standard_name='forecast_period', + units=grib._forecastTimeUnit, + ), + None + ) + ) + aux_coords_and_dims.append( + ( + DimCoord( + points=grib.phenomenon_points('hours'), + standard_name='time', + units=Unit('hours since epoch', CALENDAR_GREGORIAN), + ), + None + ) + ) def add_bounded_time_coords(aux_coords_and_dims, grib): t_bounds = grib.phenomenon_bounds('hours') @@ -219,28 +270,94 @@ def add_bounded_time_coords(aux_coords_and_dims, grib): add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("standard_deviation", coords="time")) - if \ - (grib.levelType == 'pl'): - aux_coords_and_dims.append((DimCoord(points=grib.level, long_name="pressure", units="hPa"), None)) - - if \ - (grib.levelType == 'sfc'): - if (grib._cf_data is not None) and \ - (grib._cf_data.set_height is not None): - aux_coords_and_dims.append((DimCoord(points=grib._cf_data.set_height, long_name="height", units="m", attributes={'positive': 'up'}), None)) + if grib.levelType == 'pl': + aux_coords_and_dims.append( + ( + DimCoord( + points=grib.level, long_name="pressure", units="hPa" + ), + None + ) + ) + + if grib.levelType == 'sfc': + if grib._cf_data is not None and grib._cf_data.set_height is not None: + aux_coords_and_dims.append( + ( + DimCoord( + points=grib._cf_data.set_height, + long_name="height", + units="m", + attributes={'positive': 'up'}, + ), + None + ) + ) elif grib.typeOfLevel == 'heightAboveGround': # required for NCAR - aux_coords_and_dims.append((DimCoord(points=grib.level, long_name="height", units="m", attributes={'positive': 'up'}), None)) - - if \ - (grib.levelType == 'ml') and \ - (hasattr(grib, 'pv')): - aux_coords_and_dims.append((AuxCoord(grib.level, standard_name='model_level_number', units=1, attributes={'positive': 'up'}), None)) - aux_coords_and_dims.append((DimCoord(grib.pv[grib.level], long_name='level_pressure', units='Pa'), None)) - aux_coords_and_dims.append((AuxCoord(grib.pv[grib.numberOfCoordinatesValues//2 + grib.level], long_name='sigma', units=1), None)) - factories.append(Factory(HybridPressureFactory, [{'long_name': 'level_pressure'}, {'long_name': 'sigma'}, Reference('surface_pressure')])) + aux_coords_and_dims.append( + ( + DimCoord( + points=grib.level, + long_name="height", + units="m", + attributes={'positive': 'up'}, + ), + None + ) + ) + + if grib.levelType == 'ml' and hasattr(grib, 'pv'): + aux_coords_and_dims.append( + ( + AuxCoord( + grib.level, + standard_name='model_level_number', + units=1, + attributes={'positive': 'up'}, + ), + None + ) + ) + aux_coords_and_dims.append( + ( + DimCoord( + grib.pv[grib.level], long_name='level_pressure', units='Pa' + ), + None + ) + ) + aux_coords_and_dims.append( + ( + AuxCoord( + grib.pv[grib.numberOfCoordinatesValues//2 + grib.level], + long_name='sigma', + units=1, + ), + None + ) + ) + factories.append( + Factory( + HybridPressureFactory, + [ + {'long_name': 'level_pressure'}, + {'long_name': 'sigma'}, + Reference('surface_pressure'), + ] + ) + ) if grib._originatingCentre != 'unknown': - aux_coords_and_dims.append((AuxCoord(points=grib._originatingCentre, long_name='originating_centre', units='no_unit'), None)) + aux_coords_and_dims.append( + ( + AuxCoord( + points=grib._originatingCentre, + long_name='originating_centre', + units='no_unit', + ), + None + ) + ) return ConversionMetadata(factories, references, standard_name, long_name, units, attributes, cell_methods, From 264b2aba7ec8e6f098f3423a6388695910281582 Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 15:55:24 +0000 Subject: [PATCH 14/16] Flake8 noxfile.py --- noxfile.py | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/noxfile.py b/noxfile.py index 11837e2d..70174ec0 100644 --- a/noxfile.py +++ b/noxfile.py @@ -17,12 +17,11 @@ import nox from nox.logger import logger -import yaml #: Default to reusing any pre-existing nox environments. nox.options.reuse_existing_virtualenvs = True -#: Name of the package to test. +#: Name of the package to test. PACKAGE = str("iris_grib") #: Cirrus-CI environment variable hook. @@ -58,10 +57,10 @@ def _write_iris_config(session: nox.sessions.Session) -> None: """ Add test data dir and libudunits2.so to iris config. - test data dir is set from session pos args. i.e. can be + test data dir is set from session pos args. i.e. can be configured by passing in on the command line: nox --session tests -- --test-data-dir $TEST_DATA_DIR/test_data - + Parameters ---------- session: object @@ -69,16 +68,28 @@ def _write_iris_config(session: nox.sessions.Session) -> None: """ try: - test_data_dir = session.posargs[session.posargs.index('--test-data-dir')+1] - except: + test_data_dir = session.posargs[ + session.posargs.index('--test-data-dir')+1 + ] + except Exception: test_data_dir = "" - - iris_config_file = os.path.join(session.virtualenv.location, 'lib', f'python{session.python}', 'site-packages', 'iris', 'etc', 'site.cfg') + + iris_config_file = os.path.join( + session.virtualenv.location, + 'lib', + f'python{session.python}', + 'site-packages', + 'iris', + 'etc', + 'site.cfg', + ) iris_config = f""" [Resources] test_data_dir = {test_data_dir} [System] -udunits2_path = {os.path.join(session.virtualenv.location, 'lib', 'libudunits2.so')} +udunits2_path = { + os.path.join(session.virtualenv.location,'lib', 'libudunits2.so') +} """ print("Iris config\n-----------") @@ -155,7 +166,9 @@ def _install_and_cache_venv(session: nox.sessions.Session) -> None: @contextmanager -def prepare_venv(session: nox.sessions.Session, iris_source: str ='conda_forge') -> None: +def prepare_venv( + session: nox.sessions.Session, iris_source: str = 'conda_forge' +) -> None: """ Create and cache the nox session conda environment, and additionally provide conda environment package details and info. From 1b25bb0d96f273f7c4297934802c49d3e6069bca Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 16:59:22 +0000 Subject: [PATCH 15/16] Include Flake8 in CI --- .cirrus.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 2da107f4..ccc98545 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -33,22 +33,22 @@ env: # # Linting -# [2021-03-01] jamesp: Currently not black or flake compliant. -# GitHub issues open #251 and #252 -# lint_task: -# auto_cancellation: true -# name: "${CIRRUS_OS}: flake8 and black" -# pip_cache: -# folder: ~/.cache/pip -# fingerprint_script: -# - echo "${CIRRUS_TASK_NAME}" -# - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${PIP_CACHE_BUILD} ${PIP_CACHE_PACKAGES}" -# lint_script: -# - pip list -# - python -m pip install --retries 3 --upgrade ${PIP_CACHE_PACKAGES} -# - pip list -# - nox --session flake8 -# - nox --session black +# [2021-03-01] jamesp: Currently not black compliant. +# GitHub issue open #251 +lint_task: + auto_cancellation: true + name: "${CIRRUS_OS}: flake8" # and black + pip_cache: + folder: ~/.cache/pip + fingerprint_script: + - echo "${CIRRUS_TASK_NAME}" + - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${PIP_CACHE_BUILD} ${PIP_CACHE_PACKAGES}" + lint_script: + - pip list + - python -m pip install --retries 3 --upgrade ${PIP_CACHE_PACKAGES} + - pip list + - nox --session flake8 +# - nox --session black # From 657e6ccf6e98e2f8bb5192621c2cf503472d4e13 Mon Sep 17 00:00:00 2001 From: tomdufall Date: Wed, 9 Jun 2021 20:15:47 +0000 Subject: [PATCH 16/16] Revert "Fix nox when HOME not set" This reverts commit 3fddc50c2ad622ee210e135816e0ede55195c6c7. --- noxfile.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/noxfile.py b/noxfile.py index 70174ec0..ca217d0d 100644 --- a/noxfile.py +++ b/noxfile.py @@ -29,10 +29,7 @@ IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ['source', 'conda-forge']) #: Default cartopy cache directory. -if os.getenv("HOME"): - CARTOPY_CACHE_DIR = Path(os.getenv("HOME")) / ".local/share/cartopy" -else: - CARTOPY_CACHE_DIR = None +CARTOPY_CACHE_DIR = os.environ.get("HOME") / Path(".local/share/cartopy") def _cache_cartopy(session: nox.sessions.Session) -> None: