Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/iris/experimental/fieldsfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ def load(filenames, callback=None):
erroneous results.

"""
loader = Loader(_collations_from_filename, {}, _convert_collation, None)
loader = Loader(_collations_from_filename, {}, _convert_collation)
return CubeList(load_cubes(filenames, callback, loader, None))


Expand Down
40 changes: 6 additions & 34 deletions lib/iris/fileformats/rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -850,11 +850,9 @@ def _ensure_aligned(regrid_cache, src_cube, target_cube):
return result_cube


_loader_attrs = ('field_generator', 'field_generator_kwargs',
'converter', 'legacy_custom_rules')
_loader_attrs = ('field_generator', 'field_generator_kwargs', 'converter')
class Loader(collections.namedtuple('Loader', _loader_attrs)):
def __new__(cls, field_generator, field_generator_kwargs, converter,
legacy_custom_rules=None):
def __new__(cls, field_generator, field_generator_kwargs, converter):
"""
Create a definition of a field-based Cube loader.

Expand All @@ -870,21 +868,9 @@ def __new__(cls, field_generator, field_generator_kwargs, converter,
* converter
A callable that converts a field object into a Cube.

Kwargs:

* legacy_custom_rules
An object with a callable `verify` attribute with two
parameters: (cube, field). Legacy method for modifying
Cubes during the load process. Default is None.

.. deprecated:: 1.9

"""
if legacy_custom_rules is not None:
warn_deprecated('The `legacy_custom_rules` attribute is '
'deprecated.')
return tuple.__new__(cls, (field_generator, field_generator_kwargs,
converter, legacy_custom_rules))
converter))


ConversionMetadata = collections.namedtuple('ConversionMetadata',
Expand Down Expand Up @@ -950,7 +936,7 @@ def _resolve_factory_references(cube, factories, concrete_reference_targets,


def _load_pairs_from_fields_and_filenames(fields_and_filenames, converter,
user_callback_wrapper=None):
user_callback=None):
# The underlying mechanism for the public 'load_pairs_from_fields' and
# 'load_cubes'.
# Slightly more complicated than 'load_pairs_from_fields', only because it
Expand All @@ -963,8 +949,7 @@ def _load_pairs_from_fields_and_filenames(fields_and_filenames, converter,

# Post modify the new cube with a user-callback.
# This is an ordinary Iris load callback, so it takes the filename.
cube = iris.io.run_callback(user_callback_wrapper,
cube, field, filename)
cube = iris.io.run_callback(user_callback, cube, field, filename)
# Callback mechanism may return None, which must not be yielded.
if cube is None:
continue
Expand Down Expand Up @@ -1027,23 +1012,10 @@ def _generate_all_fields_and_filenames():
if filter_function is None or filter_function(field):
yield (field, filename)

def loadcubes_user_callback_wrapper(cube, field, filename):
# First run any custom user-provided rules.
if loader.legacy_custom_rules:
warn_deprecated('The `legacy_custom_rules` attribute of '
'the `loader` is deprecated.')
loader.legacy_custom_rules.verify(cube, field)

# Then also run user-provided original callback function.
result = cube
if user_callback is not None:
result = user_callback(cube, field, filename)
return result

all_fields_and_filenames = _generate_all_fields_and_filenames()
for cube, field in _load_pairs_from_fields_and_filenames(
all_fields_and_filenames,
converter=loader.converter,
user_callback_wrapper=loadcubes_user_callback_wrapper):
user_callback=user_callback):
yield cube

5 changes: 2 additions & 3 deletions lib/iris/tests/unit/fileformats/grib/test_load_cubes.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,8 @@ def _test(self, mode, generator, converter):
kw_args = {}
else:
kw_args = {'auto_regularise': mock.sentinel.REGULARISE}
loader = iris.fileformats.rules.Loader(
generator, kw_args,
converter, None)
loader = iris.fileformats.rules.Loader(generator, kw_args,
converter)
rules_load.assert_called_once_with(mock.sentinel.FILES,
mock.sentinel.CALLBACK,
loader)
Expand Down
21 changes: 2 additions & 19 deletions lib/iris/tests/unit/fileformats/rules/test_Loader.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# (C) British Crown Copyright 2015, Met Office
# (C) British Crown Copyright 2015 - 2016, Met Office
#
# This file is part of Iris.
#
Expand Down Expand Up @@ -39,34 +39,17 @@ def test_normal(self):
self.assertIs(loader.field_generator_kwargs,
mock.sentinel.GEN_FUNC_KWARGS)
self.assertIs(loader.converter, mock.sentinel.CONVERTER)
self.assertIs(loader.legacy_custom_rules, None)

def test_normal_with_explicit_none(self):
with mock.patch('warnings.warn') as warn:
loader = Loader(mock.sentinel.GEN_FUNC,
mock.sentinel.GEN_FUNC_KWARGS,
mock.sentinel.CONVERTER, None)
mock.sentinel.CONVERTER)
self.assertEqual(warn.call_count, 0)
self.assertIs(loader.field_generator, mock.sentinel.GEN_FUNC)
self.assertIs(loader.field_generator_kwargs,
mock.sentinel.GEN_FUNC_KWARGS)
self.assertIs(loader.converter, mock.sentinel.CONVERTER)
self.assertIs(loader.legacy_custom_rules, None)

def test_deprecated_custom_rules(self):
with mock.patch('warnings.warn') as warn:
loader = Loader(mock.sentinel.GEN_FUNC,
mock.sentinel.GEN_FUNC_KWARGS,
mock.sentinel.CONVERTER,
mock.sentinel.CUSTOM_RULES)
self.assertEqual(warn.call_count, 1)
self.assertEqual(warn.call_args[0][0],
'The `legacy_custom_rules` attribute is deprecated.')
self.assertIs(loader.field_generator, mock.sentinel.GEN_FUNC)
self.assertIs(loader.field_generator_kwargs,
mock.sentinel.GEN_FUNC_KWARGS)
self.assertIs(loader.converter, mock.sentinel.CONVERTER)
self.assertIs(loader.legacy_custom_rules, mock.sentinel.CUSTOM_RULES)


if __name__ == '__main__':
Expand Down
4 changes: 2 additions & 2 deletions lib/iris/tests/unit/fileformats/test_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ def converter(field):
return ConversionMetadata([factory], [], '', '', '', {}, [], [],
[])
# Finish by making a fake Loader
fake_loader = Loader(field_generator, {}, converter, None)
fake_loader = Loader(field_generator, {}, converter)
cubes = load_cubes(['fake_filename'], None, fake_loader)

# Check the result is a generator with a single entry.
Expand Down Expand Up @@ -191,7 +191,7 @@ def converter(field):
src.cell_methods, dim_coords_and_dims,
aux_coords_and_dims)
# Finish by making a fake Loader
fake_loader = Loader(field_generator, {}, converter, None)
fake_loader = Loader(field_generator, {}, converter)
cubes = load_cubes(['fake_filename'], None, fake_loader)

# Check the result is a generator containing two Cubes.
Expand Down