Add a test case to ensure that Spack is v2.6 compliant.
This commit is contained in:
		| @@ -46,7 +46,8 @@ | ||||
|               'install', | ||||
|               'package_sanity', | ||||
|               'config', | ||||
|               'directory_layout'] | ||||
|               'directory_layout', | ||||
|               'python_version'] | ||||
|  | ||||
|  | ||||
| def list_tests(): | ||||
|   | ||||
							
								
								
									
										96
									
								
								lib/spack/spack/test/python_version.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								lib/spack/spack/test/python_version.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| ############################################################################## | ||||
| # Copyright (c) 2013, Lawrence Livermore National Security, LLC. | ||||
| # Produced at the Lawrence Livermore National Laboratory. | ||||
| # | ||||
| # This file is part of Spack. | ||||
| # Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. | ||||
| # LLNL-CODE-647188 | ||||
| # | ||||
| # For details, see https://scalability-llnl.github.io/spack | ||||
| # Please also see the LICENSE file for our notice and the LGPL. | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License (as published by | ||||
| # the Free Software Foundation) version 2.1 dated February 1999. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, but | ||||
| # WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and | ||||
| # conditions of the GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU Lesser General Public License | ||||
| # along with this program; if not, write to the Free Software Foundation, | ||||
| # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
| ############################################################################## | ||||
| """ | ||||
| This test ensures that all Spack files are Python version 2.6 or less. | ||||
|  | ||||
| Spack was originally 2.7, but enough systems in 2014 are still using | ||||
| 2.6 on their frontend nodes that we need 2.6 to get adopted. | ||||
| """ | ||||
| import unittest | ||||
| import os | ||||
| import re | ||||
| from contextlib import closing | ||||
|  | ||||
| import llnl.util.tty as tty | ||||
|  | ||||
| from external import pyqver2 | ||||
| import spack | ||||
|  | ||||
| spack_max_version = (2,6) | ||||
|  | ||||
| class PythonVersionTest(unittest.TestCase): | ||||
|  | ||||
|     def spack_python_files(self): | ||||
|         # first file is the spack script. | ||||
|         yield spack.spack_file | ||||
|  | ||||
|         # Next files are all the source files and package files. | ||||
|         search_paths = [spack.lib_path, spack.var_path] | ||||
|  | ||||
|         # Iterate through the whole spack source tree. | ||||
|         for path in search_paths: | ||||
|             for root, dirnames, filenames in os.walk(path): | ||||
|                 for filename in filenames: | ||||
|                     if re.match(r'^[^.#].*\.py$', filename): | ||||
|                         yield os.path.join(root, filename) | ||||
|  | ||||
|  | ||||
|     def test_python_versions(self): | ||||
|         # dict version -> filename -> reasons | ||||
|         all_issues = {} | ||||
|  | ||||
|         for fn in self.spack_python_files(): | ||||
|             with closing(open(fn)) as pyfile: | ||||
|                 versions = pyqver2.get_versions(pyfile.read()) | ||||
|                 for ver, reasons in versions.items(): | ||||
|                     if ver > spack_max_version: | ||||
|                         if not ver in all_issues: | ||||
|                             all_issues[ver] = {} | ||||
|                         all_issues[ver][fn] = reasons | ||||
|  | ||||
|         if all_issues: | ||||
|             tty.error("Spack must run on Python version %d.%d" | ||||
|                       % spack_max_version) | ||||
|  | ||||
|         for v in sorted(all_issues.keys(), reverse=True): | ||||
|             msgs = [] | ||||
|             for fn in sorted(all_issues[v].keys()): | ||||
|                 short_fn = fn | ||||
|                 if fn.startswith(spack.prefix): | ||||
|                     short_fn = fn[len(spack.prefix):] | ||||
|  | ||||
|                 reasons = [r for r in set(all_issues[v][fn]) if r] | ||||
|                 for r in reasons: | ||||
|                     msgs.append(("%s:%s" % ('spack' + short_fn, r[0]), r[1])) | ||||
|  | ||||
|             tty.error("These files require version %d.%d:" % v) | ||||
|             maxlen = max(len(f) for f, prob in msgs) | ||||
|             fmt = "%%-%ds%%s" % (maxlen+3) | ||||
|             print fmt % ('File', 'Reason') | ||||
|             print fmt % ('-' * (maxlen), '-' * 20) | ||||
|             for msg in msgs: | ||||
|                 print fmt % msg | ||||
|  | ||||
|         self.assertTrue(len(all_issues) == 0) | ||||
		Reference in New Issue
	
	Block a user
	 Todd Gamblin
					Todd Gamblin