summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@googlemail.com>2016-12-29 16:48:48 +0100
committerTodd Gamblin <tgamblin@llnl.gov>2016-12-29 07:48:48 -0800
commit7ea10e768ee1a7deab98ae538d916bbeeb0346b8 (patch)
tree0ece6f20cd24c6b6294135c59e1c3506c895bcab /bin
parent88f57d7543a6b08d6b0436cca9649e9dd1eb6b6d (diff)
downloadspack-7ea10e768ee1a7deab98ae538d916bbeeb0346b8.tar.gz
spack-7ea10e768ee1a7deab98ae538d916bbeeb0346b8.tar.bz2
spack-7ea10e768ee1a7deab98ae538d916bbeeb0346b8.tar.xz
spack-7ea10e768ee1a7deab98ae538d916bbeeb0346b8.zip
unit tests: replace nose with pytest (#2502)
* Porting: substitute nose with ytest This huge commit substitutes nose with pytest as a testing system. Things done here: * deleted external/nose as it is no longer used * moved mock resources in their own directory 'test/mock/' * ported two tests (cmd/find, build_system) to pytest native syntax as an example * build_environment, log: used monkeypatch instead of try/catch * moved global mocking of fetch_cache to an auto-used fixture * moved global mocking from test/__init__.py to conftest.py * made `spack test` a wrapper around pytest * run-unit-tests: avoid running python 2.6 tests under coverage to speed them up * use `pytest --cov` instead of coverage run to cut down testing time * mock/packages_test: moved mock yaml configuration to files instead of leaving it in the code as string literals * concretize.py: ported tests to native pytest, reverted multiprocessing in pytest.ini as it was creating the wrong report for coveralls * conftest.py, fixtures: added docstrings * concretize_preferences.py: uses fixtures instead of subclassing MockPackagesTest * directory_layout.py: uses fixtures instead of subclassing MockPackagesTest * install.py: uses fixtures instead of subclassing MockPackagesTest * optional_deps.py: uses fixtures instead of subclassing MockPackagesTest optional_deps.py: uses fixtures instead of subclassing MockPackagesTest * packages.py: uses fixtures instead of subclassing MockPackagesTest * provider_index.py: uses fixtures instead of subclassing MockPackagesTest * spec_yaml.py: uses fixtures instead of subclassing MockPackagesTest * multimethod.py: uses fixtures instead of subclassing MockPackagesTest * install.py: now uses mock_archive_url * git_fetch.py: uses fixtures instead of subclassing MockPackagesTest * hg_fetch.py: uses fixtures instead of subclassing MockPackagesTest * svn_fetch.py, mirror.py: uses fixtures instead of subclassing MockPackagesTest repo.py: deleted * test_compiler_cmd.py: uses fixtures instead of subclassing MockPackagesTest * cmd/module.py, cmd/uninstall.py: uses fixtures instead of subclassing MockDatabase * database.py: uses fixtures instead of subclassing MockDatabase, removed mock/database * pytest: uncluttering fixture implementations * database: changing the scope to 'module' * config.py: uses fixtures instead of subclassing MockPackagesTest * spec_dag.py, spec_semantics.py: uses fixtures instead of subclassing MockPackagesTest * stage.py: uses fixtures instead of subclassing MockPackagesTest. Removed mock directory * pytest: added docstrings to all the fixtures * pytest: final cleanup * build_system_guess.py: fixed naming and docstrings as suggested by @scheibelp * spec_syntax.py: added expected failure on parsing multiple specs closes #1976 * Add pytest and pytest-cov to Spack externals. * Make `spack flake8` ignore externals. * run-unit-tests runs spack test and not pytest. * Remove all the special stuff for `spack test` - Remove `conftest.py` magic and all the special case stuff in `bin/spack` - Spack commands can optionally take unknown arguments, if they want to handle them. - `spack test` is now a command like the others. - `spack test` now just delegates its arguments to `pytest`, but it does it by receiving unknown arguments and NOT taking an explicit help argument. * Fix error in fixtures. * Improve `spack test` command a bit. - Now supports an approximation of the old simple interface - Also supports full pytest options if you want them. * Use external coverage instead of pytest-cov * Make coverage use parallel-mode. * change __init__.py docs to include pytest
Diffstat (limited to 'bin')
-rwxr-xr-xbin/spack58
1 files changed, 40 insertions, 18 deletions
diff --git a/bin/spack b/bin/spack
index cc9450ade7..2ff55a486b 100755
--- a/bin/spack
+++ b/bin/spack
@@ -31,6 +31,7 @@ if (sys.version_info[0] > 2) or (sys.version_info[:2] < (2, 6)):
"This is Python %d.%d.%d." % v_info)
import os
+import inspect
# Find spack's location and its prefix.
SPACK_FILE = os.path.realpath(os.path.expanduser(__file__))
@@ -129,6 +130,7 @@ parser.add_argument('-V', '--version', action='version',
# subparser for setup.
subparsers = parser.add_subparsers(metavar='SUBCOMMAND', dest="command")
+
import spack.cmd
for cmd in spack.cmd.commands:
module = spack.cmd.get_module(cmd)
@@ -136,16 +138,8 @@ for cmd in spack.cmd.commands:
subparser = subparsers.add_parser(cmd_name, help=module.description)
module.setup_parser(subparser)
-# Just print help and exit if run with no arguments at all
-if len(sys.argv) == 1:
- parser.print_help()
- sys.exit(1)
-
-# actually parse the args.
-args = parser.parse_args()
-
-def main():
+def _main(args, unknown_args):
# Set up environment based on args.
tty.set_verbose(args.verbose)
tty.set_debug(args.debug)
@@ -171,8 +165,21 @@ def main():
# Try to load the particular command asked for and run it
command = spack.cmd.get_command(args.command.replace('-', '_'))
+
+ # Allow commands to inject an optional argument and get unknown args
+ # if they want to handle them.
+ info = dict(inspect.getmembers(command))
+ varnames = info['__code__'].co_varnames
+ argcount = info['__code__'].co_argcount
+
+ # Actually execute the command
try:
- return_val = command(parser, args)
+ if argcount == 3 and varnames[2] == 'unknown_args':
+ return_val = command(parser, args, unknown_args)
+ else:
+ if unknown_args:
+ tty.die('unrecognized arguments: %s' % ' '.join(unknown_args))
+ return_val = command(parser, args)
except SpackError as e:
e.die()
except KeyboardInterrupt:
@@ -188,11 +195,26 @@ def main():
tty.die("Bad return value from command %s: %s"
% (args.command, return_val))
-if args.profile:
- import cProfile
- cProfile.run('main()', sort='time')
-elif args.pdb:
- import pdb
- pdb.run('main()')
-else:
- main()
+
+def main(args):
+ # Just print help and exit if run with no arguments at all
+ if len(args) == 1:
+ parser.print_help()
+ sys.exit(1)
+
+ # actually parse the args.
+ args, unknown = parser.parse_known_args()
+
+ if args.profile:
+ import cProfile
+ cProfile.runctx('_main(args, unknown)', globals(), locals(),
+ sort='time')
+ elif args.pdb:
+ import pdb
+ pdb.runctx('_main(args, unknown)', globals(), locals())
+ else:
+ _main(args, unknown)
+
+
+if __name__ == '__main__':
+ main(sys.argv)