spack.repo: remove "import from" statements (#15505)

spack.repo: remove "import from" statements
This commit is contained in:
Massimiliano Culpo 2020-03-24 22:26:35 +01:00 committed by GitHub
parent 862e13183d
commit 1a5e4232ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 71 additions and 39 deletions

View File

@ -8,10 +8,9 @@
import os import os
import llnl.util.tty as tty import llnl.util.tty as tty
import spack.spec
import spack.config import spack.config
from spack.repo import Repo, create_repo, canonicalize_path, RepoError import spack.repo
import spack.util.path
description = "manage package source repositories" description = "manage package source repositories"
section = "config" section = "config"
@ -61,7 +60,9 @@ def setup_parser(subparser):
def repo_create(args): def repo_create(args):
"""Create a new package repository.""" """Create a new package repository."""
full_path, namespace = create_repo(args.directory, args.namespace) full_path, namespace = spack.repo.create_repo(
args.directory, args.namespace
)
tty.msg("Created repo with namespace '%s'." % namespace) tty.msg("Created repo with namespace '%s'." % namespace)
tty.msg("To register it with spack, run this command:", tty.msg("To register it with spack, run this command:",
'spack repo add %s' % full_path) 'spack repo add %s' % full_path)
@ -72,7 +73,7 @@ def repo_add(args):
path = args.path path = args.path
# real_path is absolute and handles substitution. # real_path is absolute and handles substitution.
canon_path = canonicalize_path(path) canon_path = spack.util.path.canonicalize_path(path)
# check if the path exists # check if the path exists
if not os.path.exists(canon_path): if not os.path.exists(canon_path):
@ -83,7 +84,7 @@ def repo_add(args):
tty.die("Not a Spack repository: %s" % path) tty.die("Not a Spack repository: %s" % path)
# Make sure it's actually a spack repository by constructing it. # Make sure it's actually a spack repository by constructing it.
repo = Repo(canon_path) repo = spack.repo.Repo(canon_path)
# If that succeeds, finally add it to the configuration. # If that succeeds, finally add it to the configuration.
repos = spack.config.get('repos', scope=args.scope) repos = spack.config.get('repos', scope=args.scope)
@ -104,9 +105,9 @@ def repo_remove(args):
namespace_or_path = args.namespace_or_path namespace_or_path = args.namespace_or_path
# If the argument is a path, remove that repository from config. # If the argument is a path, remove that repository from config.
canon_path = canonicalize_path(namespace_or_path) canon_path = spack.util.path.canonicalize_path(namespace_or_path)
for repo_path in repos: for repo_path in repos:
repo_canon_path = canonicalize_path(repo_path) repo_canon_path = spack.util.path.canonicalize_path(repo_path)
if canon_path == repo_canon_path: if canon_path == repo_canon_path:
repos.remove(repo_path) repos.remove(repo_path)
spack.config.set('repos', repos, args.scope) spack.config.set('repos', repos, args.scope)
@ -116,14 +117,14 @@ def repo_remove(args):
# If it is a namespace, remove corresponding repo # If it is a namespace, remove corresponding repo
for path in repos: for path in repos:
try: try:
repo = Repo(path) repo = spack.repo.Repo(path)
if repo.namespace == namespace_or_path: if repo.namespace == namespace_or_path:
repos.remove(path) repos.remove(path)
spack.config.set('repos', repos, args.scope) spack.config.set('repos', repos, args.scope)
tty.msg("Removed repository %s with namespace '%s'." tty.msg("Removed repository %s with namespace '%s'."
% (repo.root, repo.namespace)) % (repo.root, repo.namespace))
return return
except RepoError: except spack.repo.RepoError:
continue continue
tty.die("No repository with path or namespace: %s" tty.die("No repository with path or namespace: %s"
@ -136,8 +137,8 @@ def repo_list(args):
repos = [] repos = []
for r in roots: for r in roots:
try: try:
repos.append(Repo(r)) repos.append(spack.repo.Repo(r))
except RepoError: except spack.repo.RepoError:
continue continue
msg = "%d package repositor" % len(repos) msg = "%d package repositor" % len(repos)

View File

@ -16,22 +16,20 @@
import stat import stat
import sys import sys
import traceback import traceback
import types
from six import string_types, add_metaclass
try: try:
from collections.abc import Mapping # novm from collections.abc import Mapping # novm
except ImportError: except ImportError:
from collections import Mapping from collections import Mapping
from types import ModuleType import six
import ruamel.yaml as yaml import ruamel.yaml as yaml
import llnl.util.lang import llnl.util.lang
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.filesystem import mkdirp, install import llnl.util.filesystem as fs
import spack.config import spack.config
import spack.caches import spack.caches
import spack.error import spack.error
@ -39,11 +37,9 @@
import spack.spec import spack.spec
import spack.util.spack_json as sjson import spack.util.spack_json as sjson
import spack.util.imp as simp import spack.util.imp as simp
from spack.provider_index import ProviderIndex import spack.provider_index
from spack.util.path import canonicalize_path import spack.util.path
from spack.util.naming import NamespaceTrie, valid_module_name import spack.util.naming as nm
from spack.util.naming import mod_to_class, possible_spack_module_names
#: Super-namespace for all packages. #: Super-namespace for all packages.
#: Package modules are imported as spack.pkg.<namespace>.<pkg-name>. #: Package modules are imported as spack.pkg.<namespace>.<pkg-name>.
@ -95,7 +91,7 @@ def converter(self, spec_like, *args, **kwargs):
return converter return converter
class SpackNamespace(ModuleType): class SpackNamespace(types.ModuleType):
""" Allow lazy loading of modules.""" """ Allow lazy loading of modules."""
def __init__(self, namespace): def __init__(self, namespace):
@ -151,7 +147,7 @@ def _create_new_cache(self):
pkg_dir = os.path.join(self.packages_path, pkg_name) pkg_dir = os.path.join(self.packages_path, pkg_name)
# Warn about invalid names that look like packages. # Warn about invalid names that look like packages.
if not valid_module_name(pkg_name): if not nm.valid_module_name(pkg_name):
if not pkg_name.startswith('.'): if not pkg_name.startswith('.'):
tty.warn('Skipping package at {0}. "{1}" is not ' tty.warn('Skipping package at {0}. "{1}" is not '
'a valid Spack module name.'.format( 'a valid Spack module name.'.format(
@ -247,7 +243,7 @@ def update_package(self, pkg_name):
self._tag_dict[tag].append(package.name) self._tag_dict[tag].append(package.name)
@add_metaclass(abc.ABCMeta) @six.add_metaclass(abc.ABCMeta)
class Indexer(object): class Indexer(object):
"""Adaptor for indexes that need to be generated when repos are updated.""" """Adaptor for indexes that need to be generated when repos are updated."""
@ -305,10 +301,10 @@ def write(self, stream):
class ProviderIndexer(Indexer): class ProviderIndexer(Indexer):
"""Lifecycle methods for virtual package providers.""" """Lifecycle methods for virtual package providers."""
def _create(self): def _create(self):
return ProviderIndex() return spack.provider_index.ProviderIndex()
def read(self, stream): def read(self, stream):
self.index = ProviderIndex.from_json(stream) self.index = spack.provider_index.ProviderIndex.from_json(stream)
def update(self, pkg_fullname): def update(self, pkg_fullname):
self.index.remove_provider(pkg_fullname) self.index.remove_provider(pkg_fullname)
@ -447,7 +443,7 @@ class RepoPath(object):
def __init__(self, *repos): def __init__(self, *repos):
self.repos = [] self.repos = []
self.by_namespace = NamespaceTrie() self.by_namespace = nm.NamespaceTrie()
self._all_package_names = None self._all_package_names = None
self._provider_index = None self._provider_index = None
@ -456,7 +452,7 @@ def __init__(self, *repos):
# Add each repo to this path. # Add each repo to this path.
for repo in repos: for repo in repos:
try: try:
if isinstance(repo, string_types): if isinstance(repo, six.string_types):
repo = Repo(repo) repo = Repo(repo)
self.put_last(repo) self.put_last(repo)
except RepoError as e: except RepoError as e:
@ -544,7 +540,7 @@ def all_packages(self):
def provider_index(self): def provider_index(self):
"""Merged ProviderIndex from all Repos in the RepoPath.""" """Merged ProviderIndex from all Repos in the RepoPath."""
if self._provider_index is None: if self._provider_index is None:
self._provider_index = ProviderIndex() self._provider_index = spack.provider_index.ProviderIndex()
for repo in reversed(self.repos): for repo in reversed(self.repos):
self._provider_index.merge(repo.provider_index) self._provider_index.merge(repo.provider_index)
@ -707,7 +703,7 @@ def __init__(self, root):
""" """
# Root directory, containing _repo.yaml and package dirs # Root directory, containing _repo.yaml and package dirs
# Allow roots to by spack-relative by starting with '$spack' # Allow roots to by spack-relative by starting with '$spack'
self.root = canonicalize_path(root) self.root = spack.util.path.canonicalize_path(root)
# check and raise BadRepoError on fail. # check and raise BadRepoError on fail.
def check(condition, msg): def check(condition, msg):
@ -803,7 +799,7 @@ def real_name(self, import_name):
if import_name in self: if import_name in self:
return import_name return import_name
options = possible_spack_module_names(import_name) options = nm.possible_spack_module_names(import_name)
options.remove(import_name) options.remove(import_name)
for name in options: for name in options:
if name in self: if name in self:
@ -921,18 +917,18 @@ def dump_provenance(self, spec, path):
% (self.namespace, spec.fullname)) % (self.namespace, spec.fullname))
# Install patch files needed by the package. # Install patch files needed by the package.
mkdirp(path) fs.mkdirp(path)
for patch in itertools.chain.from_iterable( for patch in itertools.chain.from_iterable(
spec.package.patches.values()): spec.package.patches.values()):
if patch.path: if patch.path:
if os.path.exists(patch.path): if os.path.exists(patch.path):
install(patch.path, path) fs.install(patch.path, path)
else: else:
tty.warn("Patch file did not exist: %s" % patch.path) tty.warn("Patch file did not exist: %s" % patch.path)
# Install the package.py file itself. # Install the package.py file itself.
install(self.filename_for_package_name(spec.name), path) fs.install(self.filename_for_package_name(spec.name), path)
def purge(self): def purge(self):
"""Clear entire package instance cache.""" """Clear entire package instance cache."""
@ -1082,7 +1078,7 @@ def get_pkg_class(self, pkg_name):
raise InvalidNamespaceError('Invalid namespace for %s repo: %s' raise InvalidNamespaceError('Invalid namespace for %s repo: %s'
% (self.namespace, namespace)) % (self.namespace, namespace))
class_name = mod_to_class(pkg_name) class_name = nm.mod_to_class(pkg_name)
module = self._get_pkg_module(pkg_name) module = self._get_pkg_module(pkg_name)
cls = getattr(module, class_name) cls = getattr(module, class_name)
@ -1107,7 +1103,7 @@ def create_repo(root, namespace=None):
If the namespace is not provided, use basename of root. If the namespace is not provided, use basename of root.
Return the canonicalized path and namespace of the created repository. Return the canonicalized path and namespace of the created repository.
""" """
root = canonicalize_path(root) root = spack.util.path.canonicalize_path(root)
if not namespace: if not namespace:
namespace = os.path.basename(root) namespace = os.path.basename(root)
@ -1141,7 +1137,7 @@ def create_repo(root, namespace=None):
config_path = os.path.join(root, repo_config_name) config_path = os.path.join(root, repo_config_name)
packages_path = os.path.join(root, packages_dir_name) packages_path = os.path.join(root, packages_dir_name)
mkdirp(packages_path) fs.mkdirp(packages_path)
with open(config_path, 'w') as config: with open(config_path, 'w') as config:
config.write("repo:\n") config.write("repo:\n")
config.write(" namespace: '%s'\n" % namespace) config.write(" namespace: '%s'\n" % namespace)
@ -1163,7 +1159,7 @@ def create_repo(root, namespace=None):
def create_or_construct(path, namespace=None): def create_or_construct(path, namespace=None):
"""Create a repository, or just return a Repo if it already exists.""" """Create a repository, or just return a Repo if it already exists."""
if not os.path.exists(path): if not os.path.exists(path):
mkdirp(path) fs.mkdirp(path)
create_repo(path, namespace) create_repo(path, namespace)
return Repo(path) return Repo(path)

View File

@ -0,0 +1,35 @@
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os.path
import pytest
import spack.main
repo = spack.main.SpackCommand('repo')
def test_help_option():
# Test 'spack repo --help' to check basic import works
# and the command exits successfully
with pytest.raises(SystemExit):
repo('--help')
assert repo.returncode in (None, 0)
def test_create_add_list_remove(mutable_config, tmpdir):
# Create a new repository and check that the expected
# files are there
repo('create', str(tmpdir), 'mockrepo')
assert os.path.exists(os.path.join(str(tmpdir), 'repo.yaml'))
# Add the new repository and check it appears in the list output
repo('add', '--scope=site', str(tmpdir))
output = repo('list', '--scope=site', output=str)
assert 'mockrepo' in output
# Then remove it and check it's not there
repo('remove', '--scope=site', str(tmpdir))
output = repo('list', '--scope=site', output=str)
assert 'mockrepo' not in output