[tor-commits] [stem/master] Supporting list of paths in static checker functions

atagar at torproject.org atagar at torproject.org
Sun Apr 14 04:33:47 UTC 2013


commit f141a007655ae4d667942745b1acafa77391e0d0
Author: Damian Johnson <atagar at torproject.org>
Date:   Fri Apr 12 08:31:49 2013 -0700

    Supporting list of paths in static checker functions
    
    Reudcing a bit of redundancy by having the static_checks module support list of
    paths.
---
 run_tests.py          |   18 +++++++-----------
 test/runner.py        |    1 -
 test/static_checks.py |   42 +++++++++++++++++++++++++++++++++---------
 3 files changed, 40 insertions(+), 21 deletions(-)

diff --git a/run_tests.py b/run_tests.py
index ab35592..65c3444 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -41,13 +41,16 @@ CONFIG = stem.util.conf.config_dict("test", {
 
 DEFAULT_RUN_TARGET = Target.RUN_OPEN
 
+base = os.path.sep.join(__file__.split(os.path.sep)[:-1]).lstrip("./")
+SOURCE_BASE_PATHS = [os.path.join(base, path) for path in ('stem', 'test', 'run_tests.py')]
+
 
 def _clean_orphaned_pyc():
   test.output.print_noline("  checking for orphaned .pyc files... ", *test.runner.STATUS_ATTR)
 
   orphaned_pyc = []
 
-  for base_dir in ('stem', 'test', 'run_tests.py'):
+  for base_dir in SOURCE_BASE_PATHS:
     for pyc_path in test.static_checks._get_files_with_suffix(base_dir, ".pyc"):
       # If we're running python 3 then the *.pyc files are no longer bundled
       # with the *.py. Rather, they're in a __pycache__ directory.
@@ -121,10 +124,7 @@ def _python3_setup(python3_destination, clean):
 
 
 def _print_style_issues(run_unit, run_integ, run_style):
-  base_path = os.path.sep.join(__file__.split(os.path.sep)[:-1]).lstrip("./")
-  style_issues = test.static_checks.get_issues(os.path.join(base_path, "stem"))
-  style_issues.update(test.static_checks.get_issues(os.path.join(base_path, "test")))
-  style_issues.update(test.static_checks.get_issues(os.path.join(base_path, "run_tests.py")))
+  style_issues = test.static_checks.get_issues(SOURCE_BASE_PATHS)
 
   # If we're doing some sort of testing (unit or integ) and pyflakes is
   # available then use it. Its static checks are pretty quick so there's not
@@ -132,17 +132,13 @@ def _print_style_issues(run_unit, run_integ, run_style):
 
   if run_unit or run_integ:
     if system.is_available("pyflakes"):
-      style_issues.update(test.static_checks.pyflakes_issues(os.path.join(base_path, "stem")))
-      style_issues.update(test.static_checks.pyflakes_issues(os.path.join(base_path, "test")))
-      style_issues.update(test.static_checks.pyflakes_issues(os.path.join(base_path, "run_tests.py")))
+      style_issues.update(test.static_checks.pyflakes_issues(SOURCE_BASE_PATHS))
     else:
       test.output.print_error("Static error checking requires pyflakes. Please install it from ...\n  http://pypi.python.org/pypi/pyflakes\n")
 
   if run_style:
     if system.is_available("pep8"):
-      style_issues.update(test.static_checks.pep8_issues(os.path.join(base_path, "stem")))
-      style_issues.update(test.static_checks.pep8_issues(os.path.join(base_path, "test")))
-      style_issues.update(test.static_checks.pep8_issues(os.path.join(base_path, "run_tests.py")))
+      style_issues.update(test.static_checks.pep8_issues(SOURCE_BASE_PATHS))
     else:
       test.output.print_error("Style checks require pep8. Please install it from...\n  http://pypi.python.org/pypi/pep8\n")
 
diff --git a/test/runner.py b/test/runner.py
index 2787795..fb30c9f 100644
--- a/test/runner.py
+++ b/test/runner.py
@@ -227,7 +227,6 @@ def exercise_controller(test_case, controller):
   test_case.assertEquals("config-file=%s\nOK" % torrc_path, str(config_file_response))
 
 
-
 def get_unit_tests(prefix = None):
   """
   Provides the classes for our unit tests.
diff --git a/test/static_checks.py b/test/static_checks.py
index b8cc664..6d0a508 100644
--- a/test/static_checks.py
+++ b/test/static_checks.py
@@ -27,16 +27,24 @@ CONFIG = conf.config_dict("test", {
 })
 
 
-def pep8_issues(base_path = DEFAULT_TARGET):
+def pep8_issues(base_paths = DEFAULT_TARGET):
   """
   Checks for stylistic issues that are an issue according to the parts of PEP8
   we conform to.
 
-  :param str base_path: directory to be iterated over
+  :param str,list base_paths: directory to be iterated over
 
   :returns: dict of the form ``path => [(line_number, message)...]``
   """
 
+  if isinstance(base_paths, (tuple, list)):
+    results = {}
+
+    for path in base_paths:
+      results.update(pep8_issues(path))
+
+    return results
+
   # The pep8 command give output of the form...
   #
   #   FILE:LINE:CHARACTER ISSUE
@@ -76,7 +84,7 @@ def pep8_issues(base_path = DEFAULT_TARGET):
   ignored_issues = "E111,E121,E501,E251,E127"
 
   issues = {}
-  pep8_output = system.call("pep8 --ignore %s %s" % (ignored_issues, base_path))
+  pep8_output = system.call("pep8 --ignore %s %s" % (ignored_issues, base_paths))
 
   for line in pep8_output:
     line_match = re.match("^(.*):(\d+):(\d+): (.*)$", line)
@@ -90,16 +98,24 @@ def pep8_issues(base_path = DEFAULT_TARGET):
   return issues
 
 
-def pyflakes_issues(base_path = DEFAULT_TARGET):
+def pyflakes_issues(base_paths = DEFAULT_TARGET):
   """
   Checks for issues via pyflakes. False positives can be whitelisted via our
   test configuration.
 
-  :param str base_path: directory to be iterated over
+  :param str,list base_paths: directory to be iterated over
 
   :returns: dict of the form ``path => [(line_number, message)...]``
   """
 
+  if isinstance(base_paths, (tuple, list)):
+    results = {}
+
+    for path in base_paths:
+      results.update(pyflakes_issues(path))
+
+    return results
+
   global PYFLAKES_IGNORE
 
   if PYFLAKES_IGNORE is None:
@@ -121,7 +137,7 @@ def pyflakes_issues(base_path = DEFAULT_TARGET):
   #   stem/control.py:957: undefined name 'entry'
 
   issues = {}
-  pyflakes_output = system.call("pyflakes %s" % base_path)
+  pyflakes_output = system.call("pyflakes %s" % base_paths)
 
   for line in pyflakes_output:
     line_match = re.match("^(.*):(\d+): (.*)$", line)
@@ -135,22 +151,30 @@ def pyflakes_issues(base_path = DEFAULT_TARGET):
   return issues
 
 
-def get_issues(base_path = DEFAULT_TARGET):
+def get_issues(base_paths = DEFAULT_TARGET):
   """
   Checks python source code in the given directory for whitespace issues.
 
-  :param str base_path: directory to be iterated over
+  :param str,list base_paths: directory to be iterated over
 
   :returns: dict of the form ``path => [(line_number, message)...]``
   """
 
+  if isinstance(base_paths, (tuple, list)):
+    results = {}
+
+    for path in base_paths:
+      results.update(get_issues(path))
+
+    return results
+
   # TODO: This does not check that block indentations are two spaces because
   # differentiating source from string blocks ("""foo""") is more of a pita
   # than I want to deal with right now.
 
   issues = {}
 
-  for file_path in _get_files_with_suffix(base_path):
+  for file_path in _get_files_with_suffix(base_paths):
     if _is_test_data(file_path):
       continue
 





More information about the tor-commits mailing list