[tor-commits] [stem/master] Simplify static test check tasks

atagar at torproject.org atagar at torproject.org
Sun May 28 23:12:02 UTC 2017


commit 3feb659a72badec309253a6e5d77ab2444d68575
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun May 28 14:29:16 2017 -0700

    Simplify static test check tasks
    
    Just about to add mypy as our third static check so good time to simplify how
    we do these so it slips right in.
---
 run_tests.py            | 41 +++++++++++------------------------------
 stem/util/test_tools.py | 19 ++++++++++---------
 test/task.py            | 32 ++++++++++++++++++++++++--------
 3 files changed, 45 insertions(+), 47 deletions(-)

diff --git a/run_tests.py b/run_tests.py
index 2bb75fc..8cb1404 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -149,7 +149,6 @@ def get_torrc_entries(target):
 
 def main():
   start_time = time.time()
-
   try:
     stem.prereq.check_requirements()
   except ImportError as exc:
@@ -161,6 +160,7 @@ def main():
 
   try:
     args = test.arguments.parse(sys.argv[1:])
+    test.task.TOR_VERSION.args = (args.tor_path,)
   except ValueError as exc:
     println(str(exc))
     sys.exit(1)
@@ -193,23 +193,10 @@ def main():
 
     sys.exit(1)
 
-  tor_version_check, pyflakes_task, pycodestyle_task = None, None, None
-
-  if not args.specific_test:
-    if stem.util.test_tools.is_pyflakes_available():
-      pyflakes_task = test.task.PYFLAKES_TASK
-
-    if stem.util.test_tools.is_pycodestyle_available():
-      pycodestyle_task = test.task.PYCODESTYLE_TASK
-
-  if args.run_integ:
-    tor_version_check = test.task.TOR_VERSION
-    tor_version_check.args = (args.tor_path,)
-
   test.task.run(
     'INITIALISING',
     test.task.STEM_VERSION,
-    tor_version_check,
+    test.task.TOR_VERSION if args.run_integ else None,
     test.task.PYTHON_VERSION,
     test.task.CRYPTO_VERSION,
     test.task.PYNACL_VERSION,
@@ -218,8 +205,8 @@ def main():
     test.task.PYCODESTYLE_VERSION,
     test.task.CLEAN_PYC,
     test.task.UNUSED_TESTS,
-    pyflakes_task,
-    pycodestyle_task,
+    test.task.PYFLAKES_TASK if not args.specific_test else None,
+    test.task.PYCODESTYLE_TASK if not args.specific_test else None,
   )
 
   # buffer that we log messages into so they can be printed after a test has finished
@@ -339,19 +326,13 @@ def main():
 
   static_check_issues = {}
 
-  if pyflakes_task and pyflakes_task.is_successful:
-    for path, issues in pyflakes_task.result.items():
-      for issue in issues:
-        static_check_issues.setdefault(path, []).append(issue)
-  elif not stem.util.test_tools.is_pyflakes_available():
-    println('Static error checking requires pyflakes version 0.7.3 or later. Please install it from ...\n  http://pypi.python.org/pypi/pyflakes\n', ERROR)
-
-  if pycodestyle_task and pycodestyle_task.is_successful:
-    for path, issues in pycodestyle_task.result.items():
-      for issue in issues:
-        static_check_issues.setdefault(path, []).append(issue)
-  elif not stem.util.test_tools.is_pycodestyle_available():
-    println('Style checks require pycodestyle version 1.4.2 or later. Please install it from...\n  http://pypi.python.org/pypi/pycodestyle\n', ERROR)
+  for task in (test.task.PYFLAKES_TASK, test.task.PYCODESTYLE_TASK):
+    if task and task.is_successful:
+      for path, issues in task.result.items():
+        for issue in issues:
+          static_check_issues.setdefault(path, []).append(issue)
+    elif not task.is_available and task.unavailable_msg:
+      println(task.unavailable_msg, ERROR)
 
   _print_static_issues(static_check_issues)
 
diff --git a/stem/util/test_tools.py b/stem/util/test_tools.py
index 51ac244..6964572 100644
--- a/stem/util/test_tools.py
+++ b/stem/util/test_tools.py
@@ -4,20 +4,28 @@
 """
 Helper functions for testing.
 
+Our **stylistic_issues**, **pyflakes_issues**, and **type_check_issues**
+respect a 'exclude_paths' in our test config, excluding any absolute paths
+matching those regexes. Issue strings can start or end with an asterisk
+to match just against the prefix or suffix. For instance...
+
+::
+
+  exclude_paths .*/stem/test/data/.*
+
 .. versionadded:: 1.2.0
 
 ::
 
   TimedTestRunner - test runner that tracks test runtimes
   test_runtimes - provides runtime of tests excuted through TimedTestRunners
-
   clean_orphaned_pyc - delete *.pyc files without corresponding *.py
 
   is_pyflakes_available - checks if pyflakes is available
   is_pycodestyle_available - checks if pycodestyle is available
 
-  stylistic_issues - checks for PEP8 and other stylistic issues
   pyflakes_issues - static checks for problems via pyflakes
+  stylistic_issues - checks for PEP8 and other stylistic issues
 """
 
 import collections
@@ -218,9 +226,6 @@ def stylistic_issues(paths, check_newlines = False, check_exception_keyword = Fa
 
     issues = stylistic_issues('my_project')
 
-  If a 'exclude_paths' was set in our test config then we exclude any absolute
-  paths matching those regexes.
-
   .. versionchanged:: 1.3.0
      Renamed from get_stylistic_issues() to stylistic_issues(). The old name
      still works as an alias, but will be dropped in Stem version 2.0.0.
@@ -345,10 +350,6 @@ def pyflakes_issues(paths):
     pyflakes.ignore stem/util/test_tools.py => 'pyflakes' imported but unused
     pyflakes.ignore stem/util/test_tools.py => 'pycodestyle' imported but unused
 
-  If a 'exclude_paths' was set in our test config then we exclude any absolute
-  paths matching those regexes. Issue strings can start or end with an asterisk
-  to match just against the prefix or suffix.
-
   .. versionchanged:: 1.3.0
      Renamed from get_pyflakes_issues() to pyflakes_issues(). The old name
      still works as an alias, but will be dropped in Stem version 2.0.0.
diff --git a/test/task.py b/test/task.py
index 1089cba..048eade 100644
--- a/test/task.py
+++ b/test/task.py
@@ -55,6 +55,9 @@ SRC_PATHS = [os.path.join(test.STEM_BASE, path) for path in (
   os.path.join('docs', 'roles.py'),
 )]
 
+PYFLAKES_UNAVAILABLE = 'Static error checking requires pyflakes version 0.7.3 or later. Please install it from ...\n  http://pypi.python.org/pypi/pyflakes\n'
+PYCODESTYLE_UNAVAILABLE = 'Style checks require pycodestyle version 1.4.2 or later. Please install it from...\n  http://pypi.python.org/pypi/pycodestyle\n'
+
 
 def _check_tor_version(tor_path):
   return str(test.tor_version(tor_path)).split()[0]
@@ -203,6 +206,21 @@ class ModuleVersion(Task):
     super(ModuleVersion, self).__init__(label, version_check)
 
 
+class StaticCheckTask(Task):
+  def __init__(self, label, runner, args = None, is_available = None, unavailable_msg = None):
+    super(StaticCheckTask, self).__init__(label, runner, args, is_required = False, print_result = False, print_runtime = True)
+    self.is_available = is_available
+    self.unavailable_msg = unavailable_msg
+
+  def run(self):
+    if self.is_available:
+      return super(StaticCheckTask, self).run()
+    else:
+      println('  %s...' % self.label, STATUS, NO_NL)
+      println(' ' * (50 - len(self.label)), NO_NL)
+      println('unavailable', STATUS)
+
+
 STEM_VERSION = Task('checking stem version', lambda: stem.__version__)
 TOR_VERSION = Task('checking tor version', _check_tor_version)
 PYTHON_VERSION = Task('checking python version', lambda: '.'.join(map(str, sys.version_info[:3])))
@@ -218,20 +236,18 @@ UNUSED_TESTS = Task('checking for unused tests', _check_for_unused_tests, [(
   os.path.join(test.STEM_BASE, 'test', 'integ'),
 )])
 
-PYFLAKES_TASK = Task(
+PYFLAKES_TASK = StaticCheckTask(
   'running pyflakes',
   stem.util.test_tools.pyflakes_issues,
   args = (SRC_PATHS,),
-  is_required = False,
-  print_result = False,
-  print_runtime = True,
+  is_available = stem.util.test_tools.is_pyflakes_available(),
+  unavailable_msg = PYFLAKES_UNAVAILABLE,
 )
 
-PYCODESTYLE_TASK = Task(
+PYCODESTYLE_TASK = StaticCheckTask(
   'running pycodestyle',
   stem.util.test_tools.stylistic_issues,
   args = (SRC_PATHS, True, True, True),
-  is_required = False,
-  print_result = False,
-  print_runtime = True,
+  is_available = stem.util.test_tools.is_pycodestyle_available(),
+  unavailable_msg = PYCODESTYLE_UNAVAILABLE,
 )





More information about the tor-commits mailing list