Fix comparisons for abstract specs (#20341)
bug only relevant for python3
This commit is contained in:
		
				
					committed by
					
						
						Tamara Dahlgren
					
				
			
			
				
	
			
			
			
						parent
						
							12d035b225
						
					
				
				
					commit
					378af922a2
				
			@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user