| OLD | NEW |
| (Empty) |
| 1 # This file is part of Adblock Plus <https://adblockplus.org/>, | |
| 2 # Copyright (C) 2006-present eyeo GmbH | |
| 3 # | |
| 4 # Adblock Plus is free software: you can redistribute it and/or modify | |
| 5 # it under the terms of the GNU General Public License version 3 as | |
| 6 # published by the Free Software Foundation. | |
| 7 # | |
| 8 # Adblock Plus is distributed in the hope that it will be useful, | |
| 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 # GNU General Public License for more details. | |
| 12 # | |
| 13 # You should have received a copy of the GNU General Public License | |
| 14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
| 15 | |
| 16 from __future__ import print_function | |
| 17 | |
| 18 import os | |
| 19 import glob | |
| 20 import tokenize | |
| 21 import sys | |
| 22 import re | |
| 23 import subprocess | |
| 24 | |
| 25 from setuptools import setup, Command | |
| 26 | |
| 27 | |
| 28 class TestCommand(Command): | |
| 29 user_options = [] | |
| 30 | |
| 31 def _get_expected_errors(self, filename): | |
| 32 errors = set() | |
| 33 | |
| 34 def tokeneater(kind, token, start, end, line): | |
| 35 if kind == tokenize.COMMENT: | |
| 36 match = re.search(r'^#+[*\s]*(A\d+)', token) | |
| 37 if match: | |
| 38 try: | |
| 39 offset = token.index('*') | |
| 40 except ValueError: | |
| 41 offset = 0 | |
| 42 errors.add((start[0] + 1, | |
| 43 start[1] + 1 + offset, | |
| 44 match.group(1))) | |
| 45 | |
| 46 with open(filename, 'rb') as file: | |
| 47 if sys.version_info[0] >= 3: | |
| 48 for token in tokenize.tokenize(file.readline): | |
| 49 tokeneater(*token) | |
| 50 else: | |
| 51 tokenize.tokenize(file.readline, tokeneater) | |
| 52 | |
| 53 return errors | |
| 54 | |
| 55 def _get_reported_errors(self, filename): | |
| 56 output = subprocess.Popen(['flake8', '--select=A', filename], | |
| 57 stdout=subprocess.PIPE).communicate()[0] | |
| 58 | |
| 59 errors = set() | |
| 60 for line in output.decode('utf-8').splitlines(): | |
| 61 _, lineno, colno, error = line.split(':', 3) | |
| 62 errors.add((int(lineno), int(colno), error.split()[0])) | |
| 63 | |
| 64 return errors | |
| 65 | |
| 66 def initialize_options(self): | |
| 67 pass | |
| 68 | |
| 69 def finalize_options(self): | |
| 70 pass | |
| 71 | |
| 72 def run(self): | |
| 73 directory = os.path.dirname(__file__) | |
| 74 filenames = glob.glob(os.path.join(directory, 'tests', '*.py')) | |
| 75 failed = False | |
| 76 | |
| 77 for filename in sorted(filenames): | |
| 78 expected = self._get_expected_errors(filename) | |
| 79 reported = self._get_reported_errors(filename) | |
| 80 failures = expected ^ reported | |
| 81 | |
| 82 if not failures: | |
| 83 print(filename + ': OK') | |
| 84 continue | |
| 85 | |
| 86 for record in sorted(failures): | |
| 87 lineno, colno, error = record | |
| 88 | |
| 89 print('{}:{}:{}: '.format(filename, lineno, colno), end='') | |
| 90 if record in expected: | |
| 91 print(error + ' expected') | |
| 92 else: | |
| 93 print('unexpected ' + error) | |
| 94 | |
| 95 failed = True | |
| 96 | |
| 97 if failed: | |
| 98 sys.exit(1) | |
| 99 | |
| 100 | |
| 101 setup( | |
| 102 name='flake8-eyeo', | |
| 103 version='0.1', | |
| 104 py_modules=['flake8_eyeo'], | |
| 105 install_requires=[ | |
| 106 'flake8>=3.2.1', | |
| 107 'flake8-docstrings', | |
| 108 'flake8-commas', | |
| 109 'pep8-naming', | |
| 110 ], | |
| 111 entry_points={ | |
| 112 'flake8.extension': [ | |
| 113 '_ = flake8_eyeo:DefaultConfigOverride', | |
| 114 'A = flake8_eyeo:check_ast', | |
| 115 'A1 = flake8_eyeo:check_quotes', | |
| 116 'A111 = flake8_eyeo:check_redundant_parenthesis', | |
| 117 'A303 = flake8_eyeo:check_non_default_encoding', | |
| 118 ], | |
| 119 }, | |
| 120 cmdclass={'test': TestCommand}, | |
| 121 ) | |
| OLD | NEW |