extensions.py: remove import of spack.cmd (#47963)

This commit is contained in:
Harmen Stoppels 2024-12-07 10:08:04 +01:00 committed by GitHub
parent 77e2187e13
commit 05acd29f38
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 30 additions and 34 deletions

View File

@ -4,6 +4,7 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT) # SPDX-License-Identifier: (Apache-2.0 OR MIT)
import argparse import argparse
import difflib
import importlib import importlib
import os import os
import re import re
@ -125,6 +126,8 @@ def get_module(cmd_name):
tty.debug("Imported {0} from built-in commands".format(pname)) tty.debug("Imported {0} from built-in commands".format(pname))
except ImportError: except ImportError:
module = spack.extensions.get_module(cmd_name) module = spack.extensions.get_module(cmd_name)
if not module:
raise CommandNotFoundError(cmd_name)
attr_setdefault(module, SETUP_PARSER, lambda *args: None) # null-op attr_setdefault(module, SETUP_PARSER, lambda *args: None) # null-op
attr_setdefault(module, DESCRIPTION, "") attr_setdefault(module, DESCRIPTION, "")
@ -691,3 +694,24 @@ def find_environment(args):
def first_line(docstring): def first_line(docstring):
"""Return the first line of the docstring.""" """Return the first line of the docstring."""
return docstring.split("\n")[0] return docstring.split("\n")[0]
class CommandNotFoundError(spack.error.SpackError):
"""Exception class thrown when a requested command is not recognized as
such.
"""
def __init__(self, cmd_name):
msg = (
f"{cmd_name} is not a recognized Spack command or extension command; "
"check with `spack commands`."
)
long_msg = None
similar = difflib.get_close_matches(cmd_name, all_commands())
if 1 <= len(similar) <= 5:
long_msg = "\nDid you mean one of the following commands?\n "
long_msg += "\n ".join(similar)
super().__init__(msg, long_msg)

View File

@ -5,7 +5,6 @@
"""Service functions and classes to implement the hooks """Service functions and classes to implement the hooks
for Spack's command extensions. for Spack's command extensions.
""" """
import difflib
import glob import glob
import importlib import importlib
import os import os
@ -17,7 +16,6 @@
import llnl.util.lang import llnl.util.lang
import spack.cmd
import spack.config import spack.config
import spack.error import spack.error
import spack.util.path import spack.util.path
@ -25,9 +23,6 @@
_extension_regexp = re.compile(r"spack-(\w[-\w]*)$") _extension_regexp = re.compile(r"spack-(\w[-\w]*)$")
# TODO: For consistency we should use spack.cmd.python_name(), but
# currently this would create a circular relationship between
# spack.cmd and spack.extensions.
def _python_name(cmd_name): def _python_name(cmd_name):
return cmd_name.replace("-", "_") return cmd_name.replace("-", "_")
@ -211,8 +206,7 @@ def get_module(cmd_name):
module = load_command_extension(cmd_name, folder) module = load_command_extension(cmd_name, folder)
if module: if module:
return module return module
else: return None
raise CommandNotFoundError(cmd_name)
def get_template_dirs(): def get_template_dirs():
@ -224,27 +218,6 @@ def get_template_dirs():
return extensions return extensions
class CommandNotFoundError(spack.error.SpackError):
"""Exception class thrown when a requested command is not recognized as
such.
"""
def __init__(self, cmd_name):
msg = (
"{0} is not a recognized Spack command or extension command;"
" check with `spack commands`.".format(cmd_name)
)
long_msg = None
similar = difflib.get_close_matches(cmd_name, spack.cmd.all_commands())
if 1 <= len(similar) <= 5:
long_msg = "\nDid you mean one of the following commands?\n "
long_msg += "\n ".join(similar)
super().__init__(msg, long_msg)
class ExtensionNamingError(spack.error.SpackError): class ExtensionNamingError(spack.error.SpackError):
"""Exception class thrown when a configured extension does not follow """Exception class thrown when a configured extension does not follow
the expected naming convention. the expected naming convention.

View File

@ -41,6 +41,7 @@
import spack.provider_index import spack.provider_index
import spack.spec import spack.spec
import spack.tag import spack.tag
import spack.tengine
import spack.util.file_cache import spack.util.file_cache
import spack.util.git import spack.util.git
import spack.util.naming as nm import spack.util.naming as nm
@ -1485,8 +1486,6 @@ def add_package(self, name, dependencies=None):
Both "dep_type" and "condition" can default to ``None`` in which case Both "dep_type" and "condition" can default to ``None`` in which case
``spack.dependency.default_deptype`` and ``spack.spec.Spec()`` are used. ``spack.dependency.default_deptype`` and ``spack.spec.Spec()`` are used.
""" """
import spack.tengine # avoid circular import
dependencies = dependencies or [] dependencies = dependencies or []
context = {"cls_name": nm.mod_to_class(name), "dependencies": dependencies} context = {"cls_name": nm.mod_to_class(name), "dependencies": dependencies}
template = spack.tengine.make_environment().get_template("mock-repository/package.pyt") template = spack.tengine.make_environment().get_template("mock-repository/package.pyt")

View File

@ -210,7 +210,7 @@ def test_missing_command():
"""Ensure that we raise the expected exception if the desired command is """Ensure that we raise the expected exception if the desired command is
not present. not present.
""" """
with pytest.raises(spack.extensions.CommandNotFoundError): with pytest.raises(spack.cmd.CommandNotFoundError):
spack.cmd.get_module("no-such-command") spack.cmd.get_module("no-such-command")
@ -220,9 +220,9 @@ def test_missing_command():
("/my/bad/extension", spack.extensions.ExtensionNamingError), ("/my/bad/extension", spack.extensions.ExtensionNamingError),
("", spack.extensions.ExtensionNamingError), ("", spack.extensions.ExtensionNamingError),
("/my/bad/spack--extra-hyphen", spack.extensions.ExtensionNamingError), ("/my/bad/spack--extra-hyphen", spack.extensions.ExtensionNamingError),
("/my/good/spack-extension", spack.extensions.CommandNotFoundError), ("/my/good/spack-extension", spack.cmd.CommandNotFoundError),
("/my/still/good/spack-extension/", spack.extensions.CommandNotFoundError), ("/my/still/good/spack-extension/", spack.cmd.CommandNotFoundError),
("/my/spack-hyphenated-extension", spack.extensions.CommandNotFoundError), ("/my/spack-hyphenated-extension", spack.cmd.CommandNotFoundError),
], ],
ids=["no_stem", "vacuous", "leading_hyphen", "basic_good", "trailing_slash", "hyphenated"], ids=["no_stem", "vacuous", "leading_hyphen", "basic_good", "trailing_slash", "hyphenated"],
) )