refactor: make Package.name consistent with other class attributes

- The 'name' attribute for packages was being set in DirectiveMeta, which
  wasn't consistent with other class properties (like fullname, etc.)

- Move it to be a class property of `PackageMeta`, and add the
  corresponding property method wrapper on `PackageBase`
This commit is contained in:
Todd Gamblin 2019-04-20 21:08:41 -07:00
parent 3f5141d629
commit 87e6cb9f72
2 changed files with 18 additions and 11 deletions

View File

@ -100,11 +100,6 @@ def __init__(cls, name, bases, attr_dict):
# that the directives are called on the class to set it up
if 'spack.pkg' in cls.__module__:
# Package name as taken
# from llnl.util.lang.get_calling_module_name
pkg_name = cls.__module__.split('.')[-1]
setattr(cls, 'name', pkg_name)
# Ensure the presence of the dictionaries associated
# with the directives
for d in DirectiveMeta._directive_names:

View File

@ -229,6 +229,19 @@ def fullname(self):
"""Name of this package, including the namespace"""
return '%s.%s' % (self.namespace, self.name)
@property
def name(self):
"""The name of this package.
The name of a package is the name of its Python module, without
the containing module names.
"""
if not hasattr(self, '_name'):
self._name = self.module.__name__
if '.' in self._name:
self._name = self._name[self._name.rindex('.') + 1:]
return self._name
def run_before(*phases):
"""Registers a method of a package to be run before a given phase"""
@ -472,12 +485,6 @@ def __init__(self, spec):
# this determines how the package should be built.
self.spec = spec
# Name of package is the name of its module, without the
# containing module names.
self.name = self.module.__name__
if '.' in self.name:
self.name = self.name[self.name.rindex('.') + 1:]
# Allow custom staging paths for packages
self.path = None
@ -585,6 +592,11 @@ def fullname(self):
"""Name of this package, including namespace: namespace.name."""
return type(self).fullname
@property
def name(self):
"""Name of this package (the module without parent modules)."""
return type(self).name
@property
def global_license_dir(self):
"""Returns the directory where global license files for all