Remove last vestiges of "special" deptypes.
- Remove `special_types` dict in spec.py, as only 'all' is still used - Still allow 'all' to be used as a deptype - Simplify `canonical_deptype` function - Clean up args in spack graph - Add tests
This commit is contained in:
parent
43f576cf19
commit
bd94a17066
@ -90,7 +90,8 @@ def graph(parser, args):
|
|||||||
deptype = alldeps
|
deptype = alldeps
|
||||||
if args.deptype:
|
if args.deptype:
|
||||||
deptype = tuple(args.deptype.split(','))
|
deptype = tuple(args.deptype.split(','))
|
||||||
validate_deptype(deptype)
|
if deptype == ('all',):
|
||||||
|
deptype = 'all'
|
||||||
deptype = canonical_deptype(deptype)
|
deptype = canonical_deptype(deptype)
|
||||||
|
|
||||||
if args.dot: # Dot graph only if asked for.
|
if args.dot: # Dot graph only if asked for.
|
||||||
|
@ -241,8 +241,7 @@ def _depends_on(pkg, spec, when=None, type=None):
|
|||||||
# but is most backwards-compatible.
|
# but is most backwards-compatible.
|
||||||
type = ('build', 'link')
|
type = ('build', 'link')
|
||||||
|
|
||||||
if isinstance(type, str):
|
type = spack.spec.canonical_deptype(type)
|
||||||
type = spack.spec.special_types.get(type, (type,))
|
|
||||||
|
|
||||||
for deptype in type:
|
for deptype in type:
|
||||||
if deptype not in spack.spec.alldeps:
|
if deptype not in spack.spec.alldeps:
|
||||||
|
@ -137,7 +137,6 @@
|
|||||||
'Spec',
|
'Spec',
|
||||||
'alldeps',
|
'alldeps',
|
||||||
'canonical_deptype',
|
'canonical_deptype',
|
||||||
'validate_deptype',
|
|
||||||
'parse',
|
'parse',
|
||||||
'parse_anonymous_spec',
|
'parse_anonymous_spec',
|
||||||
'SpecError',
|
'SpecError',
|
||||||
@ -150,7 +149,6 @@
|
|||||||
'DuplicateArchitectureError',
|
'DuplicateArchitectureError',
|
||||||
'InconsistentSpecError',
|
'InconsistentSpecError',
|
||||||
'InvalidDependencyError',
|
'InvalidDependencyError',
|
||||||
'InvalidDependencyTypeError',
|
|
||||||
'NoProviderError',
|
'NoProviderError',
|
||||||
'MultipleProviderError',
|
'MultipleProviderError',
|
||||||
'UnsatisfiableSpecError',
|
'UnsatisfiableSpecError',
|
||||||
@ -197,44 +195,27 @@
|
|||||||
every time we call str()"""
|
every time we call str()"""
|
||||||
_any_version = VersionList([':'])
|
_any_version = VersionList([':'])
|
||||||
|
|
||||||
# Special types of dependencies.
|
"""Types of dependencies that Spack understands."""
|
||||||
alldeps = ('build', 'link', 'run')
|
alldeps = ('build', 'link', 'run')
|
||||||
norun = ('link', 'build')
|
|
||||||
special_types = {
|
|
||||||
'alldeps': alldeps,
|
|
||||||
'all': alldeps, # allow "all" as string but not symbol.
|
|
||||||
'norun': norun,
|
|
||||||
}
|
|
||||||
|
|
||||||
legal_deps = tuple(special_types) + alldeps
|
|
||||||
|
|
||||||
"""Max integer helps avoid passing too large a value to cyaml."""
|
"""Max integer helps avoid passing too large a value to cyaml."""
|
||||||
maxint = 2 ** (ctypes.sizeof(ctypes.c_int) * 8 - 1) - 1
|
maxint = 2 ** (ctypes.sizeof(ctypes.c_int) * 8 - 1) - 1
|
||||||
|
|
||||||
|
|
||||||
def validate_deptype(deptype):
|
|
||||||
if isinstance(deptype, str):
|
|
||||||
if deptype not in legal_deps:
|
|
||||||
raise InvalidDependencyTypeError(
|
|
||||||
"Invalid dependency type: %s" % deptype)
|
|
||||||
|
|
||||||
elif isinstance(deptype, (list, tuple)):
|
|
||||||
for t in deptype:
|
|
||||||
validate_deptype(t)
|
|
||||||
|
|
||||||
elif deptype is None:
|
|
||||||
raise InvalidDependencyTypeError("deptype cannot be None!")
|
|
||||||
|
|
||||||
|
|
||||||
def canonical_deptype(deptype):
|
def canonical_deptype(deptype):
|
||||||
if deptype is None:
|
if deptype in (None, 'all', all):
|
||||||
return alldeps
|
return alldeps
|
||||||
|
|
||||||
elif isinstance(deptype, string_types):
|
elif isinstance(deptype, string_types):
|
||||||
return special_types.get(deptype, (deptype,))
|
if deptype not in alldeps:
|
||||||
|
raise ValueError('Invalid dependency type: %s' % deptype)
|
||||||
|
return (deptype,)
|
||||||
|
|
||||||
elif isinstance(deptype, (tuple, list)):
|
elif isinstance(deptype, (tuple, list)):
|
||||||
return (sum((canonical_deptype(d) for d in deptype), ()))
|
invalid = next((d for d in deptype if d not in alldeps), None)
|
||||||
|
if invalid:
|
||||||
|
raise ValueError('Invalid dependency type: %s' % invalid)
|
||||||
|
return tuple(sorted(deptype))
|
||||||
|
|
||||||
return deptype
|
return deptype
|
||||||
|
|
||||||
@ -3338,10 +3319,6 @@ class InvalidDependencyError(SpecError):
|
|||||||
of the package."""
|
of the package."""
|
||||||
|
|
||||||
|
|
||||||
class InvalidDependencyTypeError(SpecError):
|
|
||||||
"""Raised when a dependency type is not a legal Spack dep type."""
|
|
||||||
|
|
||||||
|
|
||||||
class NoProviderError(SpecError):
|
class NoProviderError(SpecError):
|
||||||
"""Raised when there is no package that provides a particular
|
"""Raised when there is no package that provides a particular
|
||||||
virtual dependency.
|
virtual dependency.
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
import spack.architecture
|
import spack.architecture
|
||||||
import spack.package
|
import spack.package
|
||||||
|
|
||||||
from spack.spec import Spec
|
from spack.spec import Spec, canonical_deptype, alldeps
|
||||||
|
|
||||||
|
|
||||||
def check_links(spec_to_check):
|
def check_links(spec_to_check):
|
||||||
@ -737,3 +737,54 @@ def test_getitem_exceptional_paths(self):
|
|||||||
|
|
||||||
with pytest.raises(AttributeError):
|
with pytest.raises(AttributeError):
|
||||||
q.libs
|
q.libs
|
||||||
|
|
||||||
|
def test_canonical_deptype(self):
|
||||||
|
# special values
|
||||||
|
assert canonical_deptype(all) == alldeps
|
||||||
|
assert canonical_deptype('all') == alldeps
|
||||||
|
assert canonical_deptype(None) == alldeps
|
||||||
|
|
||||||
|
# everything in alldeps is canonical
|
||||||
|
for v in alldeps:
|
||||||
|
assert canonical_deptype(v) == (v,)
|
||||||
|
|
||||||
|
# tuples
|
||||||
|
assert canonical_deptype(('build',)) == ('build',)
|
||||||
|
assert canonical_deptype(
|
||||||
|
('build', 'link', 'run')) == ('build', 'link', 'run')
|
||||||
|
assert canonical_deptype(
|
||||||
|
('build', 'link')) == ('build', 'link')
|
||||||
|
assert canonical_deptype(
|
||||||
|
('build', 'run')) == ('build', 'run')
|
||||||
|
|
||||||
|
# lists
|
||||||
|
assert canonical_deptype(
|
||||||
|
['build', 'link', 'run']) == ('build', 'link', 'run')
|
||||||
|
assert canonical_deptype(
|
||||||
|
['build', 'link']) == ('build', 'link')
|
||||||
|
assert canonical_deptype(
|
||||||
|
['build', 'run']) == ('build', 'run')
|
||||||
|
|
||||||
|
# sorting
|
||||||
|
assert canonical_deptype(
|
||||||
|
('run', 'build', 'link')) == ('build', 'link', 'run')
|
||||||
|
assert canonical_deptype(
|
||||||
|
('run', 'link', 'build')) == ('build', 'link', 'run')
|
||||||
|
assert canonical_deptype(
|
||||||
|
('run', 'link')) == ('link', 'run')
|
||||||
|
assert canonical_deptype(
|
||||||
|
('link', 'build')) == ('build', 'link')
|
||||||
|
|
||||||
|
# can't put 'all' in tuple or list
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
canonical_deptype(['all'])
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
canonical_deptype(('all',))
|
||||||
|
|
||||||
|
# invalid values
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
canonical_deptype('foo')
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
canonical_deptype(('foo', 'bar'))
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
canonical_deptype(('foo',))
|
||||||
|
Loading…
Reference in New Issue
Block a user