Fix comparisons for abstract specs (#20341)

bug only relevant for python3
This commit is contained in:
Greg Becker 2020-12-15 14:44:58 -08:00 committed by GitHub
parent c02625eb53
commit 352dc0624c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 3 deletions

View file

@ -3517,8 +3517,11 @@ def ne_dag(self, other, deptypes=True):
def _cmp_node(self):
"""Comparison key for just *this node* and not its deps."""
return (self.name,
self.namespace,
# Name or namespace None will lead to invalid comparisons for abstract
# specs. Replace them with the empty string, which is not a valid spec
# name nor namespace so it will not create spurious equalities.
return (self.name or '',
self.namespace or '',
tuple(self.versions),
self.variants,
self.architecture,

View file

@ -2,7 +2,7 @@
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import itertools
import os
import pytest
import shlex
@ -806,3 +806,26 @@ def test_kv_with_spaces(self):
])
def test_target_tokenization(self, expected_tokens, spec_string):
self.check_lex(expected_tokens, spec_string)
@pytest.mark.regression('20310')
def test_compare_abstract_specs(self):
"""Spec comparisons must be valid for abstract specs.
Check that the spec cmp_key appropriately handles comparing specs for
which some attributes are None in exactly one of two specs"""
# Add fields in order they appear in `Spec._cmp_node`
constraints = [
None,
'foo',
'foo.foo',
'foo.foo@foo',
'foo.foo@foo+foo',
'foo.foo@foo+foo arch=foo-foo-foo',
'foo.foo@foo+foo arch=foo-foo-foo %foo',
'foo.foo@foo+foo arch=foo-foo-foo %foo cflags=foo',
]
specs = [Spec(s) for s in constraints]
for a, b in itertools.product(specs, repeat=2):
# Check that we can compare without raising an error
assert a <= b or b < a