[tor-commits] [stem/master] Avoid an extra read for style checks

atagar at torproject.org atagar at torproject.org
Thu Feb 23 21:28:49 UTC 2017


commit bf6d1b56153dc5133b67dbcc3b7e661b2d6b5881
Author: Damian Johnson <atagar at torproject.org>
Date:   Wed Feb 22 10:34:27 2017 -0800

    Avoid an extra read for style checks
    
    Our StyleReport already reads all the files so no need for us to read them
    again afterward. I hoped this would speed up the static checks but no such
    luck. :(
    
    Still gonna include this since it's cleaner and I've made a handful of minor
    edge case fixes while attempting to improve it.
---
 stem/util/test_tools.py | 89 +++++++++++++++++++++++++------------------------
 1 file changed, 45 insertions(+), 44 deletions(-)

diff --git a/stem/util/test_tools.py b/stem/util/test_tools.py
index 3b11713..f2da36f 100644
--- a/stem/util/test_tools.py
+++ b/stem/util/test_tools.py
@@ -163,10 +163,7 @@ def is_pycodestyle_available():
   else:
     return False
 
-  if not hasattr(pycodestyle, 'BaseReport'):
-    return False
-  else:
-    return True
+  return hasattr(pycodestyle, 'BaseReport')
 
 
 def stylistic_issues(paths, check_newlines = False, check_exception_keyword = False, prefer_single_quotes = False):
@@ -258,6 +255,50 @@ def stylistic_issues(paths, check_newlines = False, check_exception_keyword = Fa
       def __init__(self, options):
         super(StyleReport, self).__init__(options)
 
+      def init_file(self, filename, lines, expected, line_offset):
+        super(StyleReport, self).init_file(filename, lines, expected, line_offset)
+
+        if not check_newlines and not check_exception_keyword and not prefer_single_quotes:
+          return
+
+        is_block_comment = False
+
+        for index, line in enumerate(lines):
+          content = line.split('#', 1)[0].strip()
+
+          if check_newlines and '\r' in line:
+            issues.setdefault(filename, []).append(Issue(index + 1, 'contains a windows newline', line))
+
+          if not content:
+            continue  # blank line
+
+          if '"""' in content:
+            is_block_comment = not is_block_comment
+
+          if check_exception_keyword and content.startswith('except') and content.endswith(', exc:'):
+            # Python 2.6 - 2.7 supports two forms for exceptions...
+            #
+            #   except ValueError, exc:
+            #   except ValueError as exc:
+            #
+            # The former is the old method and no longer supported in python 3
+            # going forward.
+
+            # TODO: This check only works if the exception variable is called
+            # 'exc'. We should generalize this via a regex so other names work
+            # too.
+
+            issues.setdefault(filename, []).append(Issue(index + 1, "except clause should use 'as', not comma", line))
+
+          if prefer_single_quotes and not is_block_comment:
+            if '"' in content and "'" not in content and '"""' not in content and not content.endswith('\\'):
+              # Checking if the line already has any single quotes since that
+              # usually means double quotes are preferable for the content (for
+              # instance "I'm hungry"). Also checking for '\' at the end since
+              # that can indicate a multi-line string.
+
+              issues.setdefault(filename, []).append(Issue(index + 1, 'use single rather than double quotes', line))
+
       def error(self, line_number, offset, text, check):
         code = super(StyleReport, self).error(line_number, offset, text, check)
 
@@ -270,46 +311,6 @@ def stylistic_issues(paths, check_newlines = False, check_exception_keyword = Fa
     style_checker = pycodestyle.StyleGuide(ignore = ignore_rules, reporter = StyleReport)
     style_checker.check_files(list(_python_files(paths)))
 
-  if check_newlines or check_exception_keyword:
-    for path in _python_files(paths):
-      with open(path) as f:
-        file_contents = f.read()
-
-      lines = file_contents.split('\n')
-      is_block_comment = False
-
-      for index, line in enumerate(lines):
-        if '"""' in line:
-          is_block_comment = not is_block_comment
-
-        if check_newlines and '\r' in line:
-          issues.setdefault(path, []).append(Issue(index + 1, 'contains a windows newline', line))
-        elif check_exception_keyword and line.strip().startswith('except') and line.strip().endswith(', exc:'):
-          # Python 2.6 - 2.7 supports two forms for exceptions...
-          #
-          #   except ValueError, exc:
-          #   except ValueError as exc:
-          #
-          # The former is the old method and no longer supported in python 3
-          # going forward.
-
-          # TODO: This check only works if the exception variable is called
-          # 'exc'. We should generalize this via a regex so other names work
-          # too.
-
-          issues.setdefault(path, []).append(Issue(index + 1, "except clause should use 'as', not comma", line))
-
-        if prefer_single_quotes and line and not is_block_comment:
-          content = line.strip().split('#', 1)[0]
-
-          if '"' in content and "'" not in content and '"""' not in content and not content.endswith('\\'):
-            # Checking if the line already has any single quotes since that
-            # usually means double quotes are preferable for the content (for
-            # instance "I'm hungry"). Also checking for '\' at the end since
-            # that can indicate a multi-line string.
-
-            issues.setdefault(path, []).append(Issue(index + 1, 'use single rather than double quotes', line))
-
   return issues
 
 





More information about the tor-commits mailing list