commit f141a007655ae4d667942745b1acafa77391e0d0 Author: Damian Johnson atagar@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%5Cn")
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%5Cn")
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