Improve warning message for deprecated attributes in "packages.yaml"
The deprecatedProperties custom validator now can accept a function to compute a better error message. Improve error/warning message for deprecated properties
This commit is contained in:
parent
c9ad2affcc
commit
89181f253b
@ -598,9 +598,6 @@ def _get_config_memoized(self, section, scope):
|
|||||||
changed = _update_in_memory(data, section)
|
changed = _update_in_memory(data, section)
|
||||||
if changed:
|
if changed:
|
||||||
self.format_updates[section].append(scope)
|
self.format_updates[section].append(scope)
|
||||||
msg = ('OUTDATED CONFIGURATION FILE '
|
|
||||||
'[section={0}, scope={1}, dir={2}]')
|
|
||||||
tty.debug(msg.format(section, scope.name, scope.path))
|
|
||||||
|
|
||||||
merged_section = merge_yaml(merged_section, data)
|
merged_section = merge_yaml(merged_section, data)
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
"""This module contains jsonschema files for all of Spack's YAML formats."""
|
"""This module contains jsonschema files for all of Spack's YAML formats."""
|
||||||
|
|
||||||
import copy
|
import copy
|
||||||
@ -86,19 +85,18 @@ def _deprecated_properties(validator, deprecated, instance, schema):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Retrieve the template message
|
# Retrieve the template message
|
||||||
msg = deprecated['message']
|
msg_str_or_func = deprecated['message']
|
||||||
|
if isinstance(msg_str_or_func, six.string_types):
|
||||||
|
msg = msg_str_or_func.format(properties=deprecated_properties)
|
||||||
|
else:
|
||||||
|
msg = msg_str_or_func(instance, deprecated_properties)
|
||||||
|
|
||||||
is_error = deprecated['error']
|
is_error = deprecated['error']
|
||||||
if not is_error:
|
if not is_error:
|
||||||
for entry in deprecated_properties:
|
llnl.util.tty.warn(msg)
|
||||||
llnl.util.tty.warn(
|
|
||||||
msg.format(property=entry, entry=instance[entry])
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
import jsonschema
|
import jsonschema
|
||||||
for entry in deprecated_properties:
|
yield jsonschema.ValidationError(msg)
|
||||||
yield jsonschema.ValidationError(
|
|
||||||
msg.format(property=entry, entry=instance[entry])
|
|
||||||
)
|
|
||||||
|
|
||||||
return jsonschema.validators.extend(
|
return jsonschema.validators.extend(
|
||||||
jsonschema.Draft4Validator, {
|
jsonschema.Draft4Validator, {
|
||||||
|
@ -63,9 +63,9 @@
|
|||||||
},
|
},
|
||||||
'deprecatedProperties': {
|
'deprecatedProperties': {
|
||||||
'properties': ['dotkit'],
|
'properties': ['dotkit'],
|
||||||
'message': 'specifying a "{property}" module root has no '
|
'message': 'specifying a "dotkit" module root has no '
|
||||||
'effect [support for {property} module files'
|
'effect [support for "dotkit" has been '
|
||||||
' has been dropped]',
|
'dropped in v0.13.0]',
|
||||||
'error': False
|
'error': False
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -135,9 +135,9 @@
|
|||||||
},
|
},
|
||||||
'deprecatedProperties': {
|
'deprecatedProperties': {
|
||||||
'properties': ['dotkit'],
|
'properties': ['dotkit'],
|
||||||
'message': 'cannot enable "{property}" in modules.yaml '
|
'message': 'cannot enable "dotkit" in modules.yaml '
|
||||||
'[support for {property} module files has been'
|
'[support for "dotkit" has been dropped '
|
||||||
' dropped]',
|
'in v0.13.0]',
|
||||||
'error': False
|
'error': False
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -172,9 +172,8 @@
|
|||||||
},
|
},
|
||||||
'deprecatedProperties': {
|
'deprecatedProperties': {
|
||||||
'properties': ['dotkit'],
|
'properties': ['dotkit'],
|
||||||
'message': 'the section "{property}" in modules.yaml has no effect'
|
'message': 'the "dotkit" section in modules.yaml has no effect'
|
||||||
' [support for {property} module files has been '
|
' [support for "dotkit" has been dropped in v0.13.0]',
|
||||||
'dropped]',
|
|
||||||
'error': False
|
'error': False
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -9,6 +9,51 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def deprecate_paths_and_modules(instance, deprecated_properties):
|
||||||
|
"""Function to produce warning/error messages if "paths" and "modules" are
|
||||||
|
found in "packages.yaml"
|
||||||
|
|
||||||
|
Args:
|
||||||
|
instance: instance of the configuration file
|
||||||
|
deprecated_properties: deprecated properties in instance
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Warning/Error message to be printed
|
||||||
|
"""
|
||||||
|
import copy
|
||||||
|
import os.path
|
||||||
|
import llnl.util.tty
|
||||||
|
import spack.util.spack_yaml as syaml
|
||||||
|
# Copy the instance to remove default attributes that are not related
|
||||||
|
# to the part that needs to be reported
|
||||||
|
instance_copy = copy.copy(instance)
|
||||||
|
|
||||||
|
# Check if this configuration comes from an environment or not
|
||||||
|
absolute_path = instance_copy._end_mark.name
|
||||||
|
command_to_suggest = '$ spack config update packages'
|
||||||
|
if os.path.basename(absolute_path) == 'spack.yaml':
|
||||||
|
command_to_suggest = '$ spack env update <environment>'
|
||||||
|
|
||||||
|
# Retrieve the relevant part of the configuration as YAML
|
||||||
|
keys_to_be_removed = [
|
||||||
|
x for x in instance_copy if x not in deprecated_properties
|
||||||
|
]
|
||||||
|
for key in keys_to_be_removed:
|
||||||
|
instance_copy.pop(key)
|
||||||
|
yaml_as_str = syaml.dump_config(instance_copy, blame=True)
|
||||||
|
|
||||||
|
if llnl.util.tty.is_debug():
|
||||||
|
msg = 'OUTDATED CONFIGURATION FILE [file={0}]\n{1}'
|
||||||
|
llnl.util.tty.debug(msg.format(absolute_path, yaml_as_str))
|
||||||
|
|
||||||
|
msg = ('detected deprecated properties in {0}\nActivate the debug '
|
||||||
|
'flag to have more information on the deprecated parts or '
|
||||||
|
'run:\n\n\t{2}\n\nto update the file to the new format\n')
|
||||||
|
return msg.format(
|
||||||
|
absolute_path, yaml_as_str, command_to_suggest
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties = {
|
||||||
'packages': {
|
'packages': {
|
||||||
@ -95,9 +140,7 @@
|
|||||||
},
|
},
|
||||||
'deprecatedProperties': {
|
'deprecatedProperties': {
|
||||||
'properties': ['modules', 'paths'],
|
'properties': ['modules', 'paths'],
|
||||||
'message': 'the attribute "{property}" in the "packages" '
|
'message': deprecate_paths_and_modules,
|
||||||
'section of the configuration has been '
|
|
||||||
'deprecated [entry={entry}]',
|
|
||||||
'error': False
|
'error': False
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -118,21 +118,23 @@ def test_schema_validation(meta_schema, config_name):
|
|||||||
|
|
||||||
def test_deprecated_properties(module_suffixes_schema):
|
def test_deprecated_properties(module_suffixes_schema):
|
||||||
# Test that an error is reported when 'error: True'
|
# Test that an error is reported when 'error: True'
|
||||||
|
msg_fmt = r'deprecated properties detected [properties={properties}]'
|
||||||
module_suffixes_schema['deprecatedProperties'] = {
|
module_suffixes_schema['deprecatedProperties'] = {
|
||||||
'properties': ['tcl'],
|
'properties': ['tcl'],
|
||||||
'message': '{property} not allowed',
|
'message': msg_fmt,
|
||||||
'error': True
|
'error': True
|
||||||
}
|
}
|
||||||
v = spack.schema.Validator(module_suffixes_schema)
|
v = spack.schema.Validator(module_suffixes_schema)
|
||||||
data = {'tcl': {'all': {'suffixes': {'^python': 'py'}}}}
|
data = {'tcl': {'all': {'suffixes': {'^python': 'py'}}}}
|
||||||
|
|
||||||
with pytest.raises(jsonschema.ValidationError, match='tcl not allowed'):
|
expected_match = 'deprecated properties detected'
|
||||||
|
with pytest.raises(jsonschema.ValidationError, match=expected_match):
|
||||||
v.validate(data)
|
v.validate(data)
|
||||||
|
|
||||||
# Test that just a warning is reported when 'error: False'
|
# Test that just a warning is reported when 'error: False'
|
||||||
module_suffixes_schema['deprecatedProperties'] = {
|
module_suffixes_schema['deprecatedProperties'] = {
|
||||||
'properties': ['tcl'],
|
'properties': ['tcl'],
|
||||||
'message': '{property} not allowed',
|
'message': msg_fmt,
|
||||||
'error': False
|
'error': False
|
||||||
}
|
}
|
||||||
v = spack.schema.Validator(module_suffixes_schema)
|
v = spack.schema.Validator(module_suffixes_schema)
|
||||||
|
Loading…
Reference in New Issue
Block a user