Rename packages.py to repository.py, PackageFinder to RepoPath.
This commit is contained in:
parent
8c06b92225
commit
e6d232bfef
@ -54,11 +54,11 @@
|
|||||||
#
|
#
|
||||||
# Set up the default packages database.
|
# Set up the default packages database.
|
||||||
#
|
#
|
||||||
import spack.packages
|
import spack.repository
|
||||||
_repo_paths = spack.config.get_repos_config()
|
_repo_paths = spack.config.get_repos_config()
|
||||||
if not _repo_paths:
|
if not _repo_paths:
|
||||||
tty.die("Spack configuration contains no package repositories.")
|
tty.die("Spack configuration contains no package repositories.")
|
||||||
db = spack.packages.PackageFinder(*_repo_paths)
|
db = spack.repository.RepoPath(*_repo_paths)
|
||||||
sys.meta_path.append(db)
|
sys.meta_path.append(db)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
import spack.spec
|
import spack.spec
|
||||||
import spack.config
|
import spack.config
|
||||||
from spack.util.environment import get_path
|
from spack.util.environment import get_path
|
||||||
from spack.packages import repo_config_filename
|
from spack.repository import repo_config_filename
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import exceptions
|
import exceptions
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
import spack
|
import spack
|
||||||
import spack.cmd
|
import spack.cmd
|
||||||
import spack.packages
|
import spack.repository
|
||||||
from spack.cmd.find import display_specs
|
from spack.cmd.find import display_specs
|
||||||
from spack.package import PackageStillNeededError
|
from spack.package import PackageStillNeededError
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ def uninstall(parser, args):
|
|||||||
# should work if package is known to spack
|
# should work if package is known to spack
|
||||||
pkgs.append(s.package)
|
pkgs.append(s.package)
|
||||||
|
|
||||||
except spack.packages.UnknownPackageError, e:
|
except spack.repository.UnknownPackageError, e:
|
||||||
# The package.py file has gone away -- but still want to uninstall.
|
# The package.py file has gone away -- but still want to uninstall.
|
||||||
spack.Package(s).do_uninstall(force=True)
|
spack.Package(s).do_uninstall(force=True)
|
||||||
|
|
||||||
|
@ -1,110 +0,0 @@
|
|||||||
import re
|
|
||||||
import sys
|
|
||||||
import types
|
|
||||||
import traceback
|
|
||||||
|
|
||||||
from llnl.util.lang import *
|
|
||||||
import spack
|
|
||||||
|
|
||||||
# Name of module under which packages are imported
|
|
||||||
imported_packages_module = 'spack.repos'
|
|
||||||
|
|
||||||
# Name of the package file inside a package directory
|
|
||||||
package_file_name = 'package.py'
|
|
||||||
|
|
||||||
class LazyLoader:
|
|
||||||
"""The LazyLoader handles cases when repo modules or classes
|
|
||||||
are imported. It watches for 'spack.repos.*' loads, then
|
|
||||||
redirects the load to the appropriate module."""
|
|
||||||
def find_module(self, fullname, pathname):
|
|
||||||
if not fullname.startswith(imported_packages_module):
|
|
||||||
return None
|
|
||||||
|
|
||||||
partial_name = fullname[len(imported_packages_module)+1:]
|
|
||||||
|
|
||||||
print "partial: ", partial_name
|
|
||||||
print
|
|
||||||
|
|
||||||
last_dot = partial_name.rfind('.')
|
|
||||||
repo = partial_name[:last_dot]
|
|
||||||
module = partial_name[last_dot+1:]
|
|
||||||
|
|
||||||
repo_loader = spack.db.repo_loaders.get(repo)
|
|
||||||
if repo_loader:
|
|
||||||
try:
|
|
||||||
self.mod = repo_loader.get_module(module)
|
|
||||||
return self
|
|
||||||
except (ImportError, spack.packages.UnknownPackageError):
|
|
||||||
return None
|
|
||||||
|
|
||||||
def load_module(self, fullname):
|
|
||||||
return self.mod
|
|
||||||
|
|
||||||
#sys.meta_path.append(LazyLoader())
|
|
||||||
|
|
||||||
_reponames = {}
|
|
||||||
class RepoNamespace(types.ModuleType):
|
|
||||||
"""The RepoNamespace holds the repository namespaces under
|
|
||||||
spack.repos. For example, when accessing spack.repos.original
|
|
||||||
this class will use __getattr__ to translate the 'original'
|
|
||||||
into one of spack's known repositories"""
|
|
||||||
def __init__(self):
|
|
||||||
sys.modules[imported_packages_module] = self
|
|
||||||
|
|
||||||
def __getattr__(self, name):
|
|
||||||
if name in _reponames:
|
|
||||||
return _reponames[name]
|
|
||||||
raise AttributeError
|
|
||||||
|
|
||||||
@property
|
|
||||||
def __file__(self):
|
|
||||||
return None
|
|
||||||
|
|
||||||
@property
|
|
||||||
def __path__(self):
|
|
||||||
return []
|
|
||||||
|
|
||||||
|
|
||||||
class RepoLoader(types.ModuleType):
|
|
||||||
"""Each RepoLoader is associated with a repository, and the RepoLoader is
|
|
||||||
responsible for loading packages out of that repository. For example,
|
|
||||||
a RepoLoader may be responsible for spack.repos.original, and when someone
|
|
||||||
references spack.repos.original.libelf that RepoLoader will load the
|
|
||||||
libelf package."""
|
|
||||||
def __init__(self, reponame, repopath):
|
|
||||||
self.path = repopath
|
|
||||||
self.reponame = reponame
|
|
||||||
self.module_name = imported_packages_module + '.' + reponame
|
|
||||||
if not reponame in _reponames:
|
|
||||||
_reponames[reponame] = self
|
|
||||||
|
|
||||||
sys.modules[self.module_name] = self
|
|
||||||
|
|
||||||
|
|
||||||
@property
|
|
||||||
def __path__(self):
|
|
||||||
return [ self.path ]
|
|
||||||
|
|
||||||
|
|
||||||
def __getattr__(self, name):
|
|
||||||
if name[0] == '_':
|
|
||||||
raise AttributeError
|
|
||||||
return self.get_module(name)
|
|
||||||
|
|
||||||
|
|
||||||
@memoized
|
|
||||||
def get_module(self, pkg_name):
|
|
||||||
import os
|
|
||||||
import imp
|
|
||||||
import llnl.util.tty as tty
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
module_name = imported_packages_module + '.' + self.reponame + '.' + pkg_name
|
|
||||||
module = imp.load_source(module_name, file_path)
|
|
||||||
|
|
||||||
except ImportError, e:
|
|
||||||
tty.die("Error while importing %s from %s:\n%s" % (
|
|
||||||
pkg_name, file_path, e.message))
|
|
||||||
|
|
||||||
return module
|
|
@ -67,8 +67,8 @@ def _make_namespace_module(ns):
|
|||||||
return module
|
return module
|
||||||
|
|
||||||
|
|
||||||
class PackageFinder(object):
|
class RepoPath(object):
|
||||||
"""A PackageFinder is a wrapper around a list of Repos.
|
"""A RepoPath is a list of repos that function as one.
|
||||||
|
|
||||||
It functions exactly like a Repo, but it operates on the
|
It functions exactly like a Repo, but it operates on the
|
||||||
combined results of the Repos in its list instead of on a
|
combined results of the Repos in its list instead of on a
|
||||||
@ -83,7 +83,10 @@ def __init__(self, *repo_dirs):
|
|||||||
self._provider_index = None
|
self._provider_index = None
|
||||||
|
|
||||||
for root in repo_dirs:
|
for root in repo_dirs:
|
||||||
repo = Repo(root)
|
# Try to make it a repo if it's not one.
|
||||||
|
if not isinstance(root, Repo):
|
||||||
|
repo = Repo(root)
|
||||||
|
# Add the repo to the path.
|
||||||
self.put_last(repo)
|
self.put_last(repo)
|
||||||
|
|
||||||
|
|
||||||
@ -94,7 +97,11 @@ def swap(self, other):
|
|||||||
TODO: Maybe there is a cleaner way.
|
TODO: Maybe there is a cleaner way.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
attrs = ['repos', 'by_namespace', 'by_path', '_all_package_names', '_provider_index']
|
attrs = ['repos',
|
||||||
|
'by_namespace',
|
||||||
|
'by_path',
|
||||||
|
'_all_package_names',
|
||||||
|
'_provider_index']
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
tmp = getattr(self, attr)
|
tmp = getattr(self, attr)
|
||||||
setattr(self, attr, getattr(other, attr))
|
setattr(self, attr, getattr(other, attr))
|
||||||
@ -185,7 +192,7 @@ def find_module(self, fullname, path=None):
|
|||||||
return repo
|
return repo
|
||||||
|
|
||||||
# No repo provides the namespace, but it is a valid prefix of
|
# No repo provides the namespace, but it is a valid prefix of
|
||||||
# something in the PackageFinder.
|
# something in the RepoPath.
|
||||||
if self.by_namespace.is_prefix(fullname):
|
if self.by_namespace.is_prefix(fullname):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
@ -603,7 +610,7 @@ def __init__(self, name, repo=None):
|
|||||||
|
|
||||||
|
|
||||||
class DuplicateRepoError(spack.error.SpackError):
|
class DuplicateRepoError(spack.error.SpackError):
|
||||||
"""Raised when duplicate repos are added to a PackageFinder."""
|
"""Raised when duplicate repos are added to a RepoPath."""
|
||||||
def __init__(self, msg, repo1, repo2):
|
def __init__(self, msg, repo1, repo2):
|
||||||
super(UnknownPackageError, self).__init__(
|
super(UnknownPackageError, self).__init__(
|
||||||
"%s: %s, %s" % (msg, repo1, repo2))
|
"%s: %s, %s" % (msg, repo1, repo2))
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
import spack
|
import spack
|
||||||
from spack.spec import Spec
|
from spack.spec import Spec
|
||||||
from spack.packages import PackageFinder
|
from spack.repository import RepoPath
|
||||||
from spack.directory_layout import YamlDirectoryLayout
|
from spack.directory_layout import YamlDirectoryLayout
|
||||||
|
|
||||||
# number of packages to test (to reduce test time)
|
# number of packages to test (to reduce test time)
|
||||||
@ -123,7 +123,7 @@ def test_handle_unknown_package(self):
|
|||||||
information about installed packages' specs to uninstall
|
information about installed packages' specs to uninstall
|
||||||
or query them again if the package goes away.
|
or query them again if the package goes away.
|
||||||
"""
|
"""
|
||||||
mock_db = PackageFinder(spack.mock_packages_path)
|
mock_db = RepoPath(spack.mock_packages_path)
|
||||||
|
|
||||||
not_in_mock = set.difference(
|
not_in_mock = set.difference(
|
||||||
set(spack.db.all_package_names()),
|
set(spack.db.all_package_names()),
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
import spack
|
import spack
|
||||||
import spack.config
|
import spack.config
|
||||||
from spack.packages import PackageFinder
|
from spack.repository import RepoPath
|
||||||
from spack.spec import Spec
|
from spack.spec import Spec
|
||||||
|
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ def initmock(self):
|
|||||||
# Use the mock packages database for these tests. This allows
|
# Use the mock packages database for these tests. This allows
|
||||||
# us to set up contrived packages that don't interfere with
|
# us to set up contrived packages that don't interfere with
|
||||||
# real ones.
|
# real ones.
|
||||||
self.db = PackageFinder(spack.mock_packages_path)
|
self.db = RepoPath(spack.mock_packages_path)
|
||||||
spack.db.swap(self.db)
|
spack.db.swap(self.db)
|
||||||
|
|
||||||
spack.config.clear_config_caches()
|
spack.config.clear_config_caches()
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import spack
|
import spack
|
||||||
from spack.packages import PackageFinder
|
from spack.repository import RepoPath
|
||||||
|
|
||||||
|
|
||||||
class PackageSanityTest(unittest.TestCase):
|
class PackageSanityTest(unittest.TestCase):
|
||||||
@ -46,7 +46,7 @@ def test_get_all_packages(self):
|
|||||||
|
|
||||||
def ztest_get_all_mock_packages(self):
|
def ztest_get_all_mock_packages(self):
|
||||||
"""Get the mock packages once each too."""
|
"""Get the mock packages once each too."""
|
||||||
db = PackageFinder(spack.mock_packages_path)
|
db = RepoPath(spack.mock_packages_path)
|
||||||
spack.db.swap(db)
|
spack.db.swap(db)
|
||||||
self.check_db()
|
self.check_db()
|
||||||
spack.db.swap(db)
|
spack.db.swap(db)
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
from llnl.util.filesystem import join_path
|
from llnl.util.filesystem import join_path
|
||||||
|
|
||||||
import spack
|
import spack
|
||||||
from spack.packages import Repo
|
from spack.repository import Repo
|
||||||
from spack.util.naming import mod_to_class
|
from spack.util.naming import mod_to_class
|
||||||
from spack.test.mock_packages_test import *
|
from spack.test.mock_packages_test import *
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user