commit d14c2803eca669022a64a5caf16699ce77e2fb70 Author: Damian Johnson atagar@torproject.org Date: Fri Apr 10 08:50:49 2015 -0700
When reporting static issues reporting the line's content
For example, rather than...
* /home/atagar/Desktop/stem/stem/descriptor/server_descriptor.py line 125 - uses single rather than double quotes line 180 - uses single rather than double quotes line 206 - uses single rather than double quotes line 226 - uses single rather than double quotes line 269 - uses single rather than double quotes
... we now show...
* /home/atagar/Desktop/stem/stem/descriptor/server_descriptor.py line 125 - uses single rather than double quotes # @source "145.53.65.130" line 180 - uses single rather than double quotes # "router" nickname address ORPort SocksPort DirPort line 206 - uses single rather than double quotes # "bandwidth" bandwidth-avg bandwidth-burst bandwidth-observed line 226 - uses single rather than double quotes # "platform" string line 269 - uses single rather than double quotes # "hibernating" 0|1 (in practice only set if one) --- docs/change_log.rst | 1 + run_tests.py | 8 ++++---- stem/util/test_tools.py | 39 +++++++++++++++++++++++++++++---------- 3 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/docs/change_log.rst b/docs/change_log.rst index 6a6c23c..4c96528 100644 --- a/docs/change_log.rst +++ b/docs/change_log.rst @@ -70,6 +70,7 @@ conversion (:trac:`14075`).
* Windows support for connection resolution (:trac:`14844`) * :func:`stem.util.connection.port_usage` always returned None (:trac:`14046`) + * :func:`~stem.util.test_tools.stylistic_issues` and :func:`~stem.util.test_tools.pyflakes_issues` now provide namedtuples that also includes the line * Added :func:`stem.util.system.tail` * Proc connection resolution could fail on especially busy systems (:trac:`14048`)
diff --git a/run_tests.py b/run_tests.py index 824b16c..0407ece 100755 --- a/run_tests.py +++ b/run_tests.py @@ -320,13 +320,13 @@ def _print_static_issues(static_check_issues):
line_to_issues = {}
- for line_number, msg in static_check_issues[file_path]: - line_to_issues.setdefault(line_number, set()).add(msg) + for issue in static_check_issues[file_path]: + line_to_issues.setdefault(issue.line_number, set()).add((issue.message, issue.line))
for line_number in sorted(line_to_issues.keys()): - for msg in line_to_issues[line_number]: + for msg, line in line_to_issues[line_number]: line_count = '%-4s' % line_number - println(' line %s - %s' % (line_count, msg)) + println(' line %s - %-40s %s' % (line_count, msg, line.strip()))
println()
diff --git a/stem/util/test_tools.py b/stem/util/test_tools.py index c8fe76a..c84c58d 100644 --- a/stem/util/test_tools.py +++ b/stem/util/test_tools.py @@ -17,6 +17,8 @@ Helper functions for testing. pyflakes_issues - static checks for problems via pyflakes """
+import collections +import linecache import os import re
@@ -29,6 +31,12 @@ CONFIG = stem.util.conf.config_dict('test', { 'exclude_paths': [], })
+Issue = collections.namedtuple('Issue', [ + 'line_number', + 'message', + 'line', +]) +
def clean_orphaned_pyc(paths): """ @@ -145,6 +153,10 @@ def stylistic_issues(paths, check_two_space_indents = False, check_newlines = Fa 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.
+ .. versionchanged:: 1.4.0 + Changing tuples in return value to be namedtuple instances, and adding the + line that had the issue. + :param list paths: paths to search for stylistic issues :param bool check_two_space_indents: check for two space indentations and that no tabs snuck in @@ -171,7 +183,7 @@ def stylistic_issues(paths, check_two_space_indents = False, check_newlines = Fa code = super(StyleReport, self).error(line_number, offset, text, check)
if code: - issues.setdefault(self.filename, []).append((line_number, '%s %s' % (code, text))) + issues.setdefault(self.filename, []).append(Issue(line_number, '%s %s' % (code, text), text))
style_checker = pep8.StyleGuide(ignore = CONFIG['pep8.ignore'], reporter = StyleReport) style_checker.check_files(list(_python_files(paths))) @@ -195,11 +207,11 @@ def stylistic_issues(paths, check_two_space_indents = False, check_newlines = Fa is_block_comment = not is_block_comment
if check_two_space_indents and '\t' in whitespace: - issues.setdefault(path, []).append((index + 1, 'indentation has a tab')) + issues.setdefault(path, []).append(Issue(index + 1, 'indentation has a tab', line)) elif check_newlines and '\r' in content: - issues.setdefault(path, []).append((index + 1, 'contains a windows newline')) + issues.setdefault(path, []).append(Issue(index + 1, 'contains a windows newline', line)) elif check_trailing_whitespace and content != content.rstrip(): - issues.setdefault(path, []).append((index + 1, 'line has trailing whitespace')) + issues.setdefault(path, []).append(Issue(index + 1, 'line has trailing whitespace', line)) elif check_exception_keyword and content.lstrip().startswith('except') and content.endswith(', exc:'): # Python 2.6 - 2.7 supports two forms for exceptions... # @@ -213,7 +225,7 @@ def stylistic_issues(paths, check_two_space_indents = False, check_newlines = Fa # 'exc'. We should generalize this via a regex so other names work # too.
- issues.setdefault(path, []).append((index + 1, "except clause should use 'as', not comma")) + issues.setdefault(path, []).append(Issue(index + 1, "except clause should use 'as', not comma", line))
return issues
@@ -235,6 +247,10 @@ def pyflakes_issues(paths): 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.
+ .. versionchanged:: 1.4.0 + Changing tuples in return value to be namedtuple instances, and adding the + line that had the issue. + :param list paths: paths to search for problems
:returns: dict of the form ``path => [(line_number, message)...]`` @@ -255,13 +271,13 @@ def pyflakes_issues(paths): self._ignored_issues.setdefault(path.strip(), []).append(issue.strip())
def unexpectedError(self, filename, msg): - self._register_issue(filename, None, msg) + self._register_issue(filename, None, msg, None)
def syntaxError(self, filename, msg, lineno, offset, text): - self._register_issue(filename, lineno, msg) + self._register_issue(filename, lineno, msg, text)
def flake(self, msg): - self._register_issue(msg.filename, msg.lineno, msg.message % msg.message_args) + self._register_issue(msg.filename, msg.lineno, msg.message % msg.message_args, None)
def _is_ignored(self, path, issue): # Paths in pyflakes_ignore are relative, so we need to check to see if our @@ -273,9 +289,12 @@ def pyflakes_issues(paths):
return False
- def _register_issue(self, path, line_number, issue): + def _register_issue(self, path, line_number, issue, line): if not self._is_ignored(path, issue): - issues.setdefault(path, []).append((line_number, issue)) + if path and line_number and not line: + line = linecache.getline(path, line_number) + + issues.setdefault(path, []).append(Issue(line_number, issue, line))
reporter = Reporter()
tor-commits@lists.torproject.org