Skip to content

Commit f4a8108

Browse files
authored
minor fixes (#4025)
* minor fixes * wip
1 parent 206cdcc commit f4a8108

File tree

3 files changed

+49
-14
lines changed

3 files changed

+49
-14
lines changed

lib/iris/common/metadata.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,19 @@
2727

2828

2929
__all__ = [
30-
"SERVICES_COMBINE",
31-
"SERVICES_DIFFERENCE",
32-
"SERVICES_EQUAL",
33-
"SERVICES",
3430
"AncillaryVariableMetadata",
3531
"BaseMetadata",
3632
"CellMeasureMetadata",
3733
"CoordMetadata",
3834
"CubeMetadata",
3935
"DimCoordMetadata",
4036
"hexdigest",
37+
"metadata_filter",
4138
"metadata_manager_factory",
39+
"SERVICES",
40+
"SERVICES_COMBINE",
41+
"SERVICES_DIFFERENCE",
42+
"SERVICES_EQUAL",
4243
]
4344

4445

@@ -1353,13 +1354,13 @@ def metadata_filter(
13531354
):
13541355
"""
13551356
Filter a collection of objects by their metadata to fit the given metadata
1356-
criteria. Criteria be one or both of: specific properties / other objects
1357+
criteria. Criteria can be one or both of: specific properties / other objects
13571358
carrying metadata to be matched.
13581359
13591360
Args:
13601361
13611362
* instances
1362-
An iterable of objects to be filtered.
1363+
One or more objects to be filtered.
13631364
13641365
Kwargs:
13651366
@@ -1408,6 +1409,10 @@ def metadata_filter(
14081409
else:
14091410
obj = item
14101411

1412+
# apply de morgan's law for one less logical operation
1413+
if not (isinstance(instances, str) or isinstance(instances, Iterable)):
1414+
instances = [instances]
1415+
14111416
result = instances
14121417

14131418
if name is not None:
@@ -1449,10 +1454,16 @@ def attr_filter(instance):
14491454

14501455
if axis is not None:
14511456
axis = axis.upper()
1457+
1458+
def get_axis(instance):
1459+
if hasattr(instance, "axis"):
1460+
axis = instance.axis.upper()
1461+
else:
1462+
axis = guess_coord_axis(instance)
1463+
return axis
1464+
14521465
result = [
1453-
instance
1454-
for instance in result
1455-
if guess_coord_axis(instance) == axis
1466+
instance for instance in result if get_axis(instance) == axis
14561467
]
14571468

14581469
if obj is not None:

lib/iris/experimental/ugrid.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"""
1212

1313
from abc import ABC, abstractmethod
14-
from collections import namedtuple
14+
from collections import Iterable, namedtuple
1515
from functools import wraps
1616

1717
import dask.array as da
@@ -20,18 +20,18 @@
2020
from .. import _lazy_data as _lazy
2121
from ..common.metadata import (
2222
BaseMetadata,
23+
metadata_filter,
2324
metadata_manager_factory,
2425
SERVICES,
2526
SERVICES_COMBINE,
2627
SERVICES_EQUAL,
2728
SERVICES_DIFFERENCE,
28-
metadata_filter,
2929
)
3030
from ..common.lenient import _lenient_service as lenient_service
3131
from ..common.mixin import CFVariableMixin
3232
from ..config import get_logger
3333
from ..coords import _DimensionalMetadata, AuxCoord
34-
from ..exceptions import CoordinateNotFoundError, ConnectivityNotFoundError
34+
from ..exceptions import ConnectivityNotFoundError, CoordinateNotFoundError
3535
from ..util import guess_coord_axis
3636

3737

@@ -831,14 +831,14 @@ def __init__(
831831
self,
832832
topology_dimension,
833833
node_coords_and_axes,
834+
connectivities,
834835
standard_name=None,
835836
long_name=None,
836837
var_name=None,
837838
units=None,
838839
attributes=None,
839840
edge_coords_and_axes=None,
840841
face_coords_and_axes=None,
841-
connectivities=None,
842842
node_dimension=None,
843843
edge_dimension=None,
844844
face_dimension=None,
@@ -874,6 +874,12 @@ def normalise(location, axis):
874874
raise ValueError(emsg)
875875
return f"{location}_{axis}"
876876

877+
if not isinstance(node_coords_and_axes, Iterable):
878+
node_coords_and_axes = [node_coords_and_axes]
879+
880+
if not isinstance(connectivities, Iterable):
881+
connectivities = [connectivities]
882+
877883
kwargs = {}
878884
for coord, axis in node_coords_and_axes:
879885
kwargs[normalise("node", axis)] = coord

lib/iris/tests/unit/common/metadata/test_metadata_filter.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@
2525

2626

2727
class Test_standard(tests.IrisTest):
28+
def test_instances_non_iterable(self):
29+
item = Mock()
30+
item.name.return_value = "one"
31+
result = metadata_filter(item, item="one")
32+
self.assertEqual(1, len(result))
33+
self.assertIn(item, result)
34+
2835
def test_name(self):
2936
name_one = Mock()
3037
name_one.name.return_value = "one"
@@ -101,14 +108,25 @@ def test_invalid_attributes(self):
101108
attributes="one",
102109
)
103110

104-
def test_axis(self):
111+
def test_axis__by_guess(self):
112+
# see https://docs.python.org/3/library/unittest.mock.html#deleting-attributes
105113
axis_lon = Mock(standard_name="longitude")
114+
del axis_lon.axis
106115
axis_lat = Mock(standard_name="latitude")
116+
del axis_lat.axis
107117
input_list = [axis_lon, axis_lat]
108118
result = metadata_filter(input_list, axis="x")
109119
self.assertIn(axis_lon, result)
110120
self.assertNotIn(axis_lat, result)
111121

122+
def test_axis__by_member(self):
123+
axis_x = Mock(axis="x")
124+
axis_y = Mock(axis="y")
125+
input_list = [axis_x, axis_y]
126+
result = metadata_filter(input_list, axis="x")
127+
self.assertEqual(1, len(result))
128+
self.assertIn(axis_x, result)
129+
112130
def test_multiple_args(self):
113131
coord_one = Mock(__class__=AuxCoord, long_name="one")
114132
coord_two = Mock(__class__=AuxCoord, long_name="two")

0 commit comments

Comments
 (0)