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:
		| @@ -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',)) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Todd Gamblin
					Todd Gamblin