extensions.py: remove import of spack.cmd (#47963)
This commit is contained in:
parent
77e2187e13
commit
05acd29f38
@ -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)
|
||||||
|
@ -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.
|
||||||
|
@ -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")
|
||||||
|
@ -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"],
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user