| OLD | NEW |
| 1 # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org) | 1 # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org) |
| 2 # | 2 # |
| 3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
| 4 # modification, are permitted provided that the following conditions | 4 # modification, are permitted provided that the following conditions |
| 5 # are met: | 5 # are met: |
| 6 # 1. Redistributions of source code must retain the above copyright | 6 # 1. Redistributions of source code must retain the above copyright |
| 7 # notice, this list of conditions and the following disclaimer. | 7 # notice, this list of conditions and the following disclaimer. |
| 8 # 2. Redistributions in binary form must reproduce the above copyright | 8 # 2. Redistributions in binary form must reproduce the above copyright |
| 9 # notice, this list of conditions and the following disclaimer in the | 9 # notice, this list of conditions and the following disclaimer in the |
| 10 # documentation and/or other materials provided with the distribution. | 10 # documentation and/or other materials provided with the distribution. |
| 11 # | 11 # |
| 12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND | 12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND |
| 13 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 13 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 14 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 14 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 15 # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR | 15 # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR |
| 16 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 16 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 17 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 17 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| 18 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 18 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| 19 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 19 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| 20 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 20 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 21 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 21 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 22 | 22 |
| 23 """Supports checking WebKit style in Python files.""" | 23 """Supports checking WebKit style in Python files.""" |
| 24 | 24 |
| 25 import os | 25 import os |
| 26 import re | 26 import re |
| 27 import sys | 27 import sys |
| 28 | 28 |
| 29 | 29 |
| 30 from webkitpy.common.path_finder import PathFinder |
| 30 from webkitpy.common.system.filesystem import FileSystem | 31 from webkitpy.common.system.filesystem import FileSystem |
| 31 from webkitpy.common.system.executive import Executive | 32 from webkitpy.common.system.executive import Executive |
| 32 from webkitpy.common.webkit_finder import WebKitFinder | |
| 33 from webkitpy.thirdparty import pep8 | 33 from webkitpy.thirdparty import pep8 |
| 34 | 34 |
| 35 | 35 |
| 36 class PythonChecker(object): | 36 class PythonChecker(object): |
| 37 """Processes text lines for checking style.""" | 37 """Processes text lines for checking style.""" |
| 38 | 38 |
| 39 def __init__(self, file_path, handle_style_error): | 39 def __init__(self, file_path, handle_style_error): |
| 40 self._file_path = file_path | 40 self._file_path = file_path |
| 41 self._handle_style_error = handle_style_error | 41 self._handle_style_error = handle_style_error |
| 42 | 42 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 65 pep8_checker.report_error = _pep8_handle_error | 65 pep8_checker.report_error = _pep8_handle_error |
| 66 pep8_checker.check_all() | 66 pep8_checker.check_all() |
| 67 | 67 |
| 68 def _check_pylint(self): | 68 def _check_pylint(self): |
| 69 output = self.run_pylint(self._file_path) | 69 output = self.run_pylint(self._file_path) |
| 70 errors = self._parse_pylint_output(output) | 70 errors = self._parse_pylint_output(output) |
| 71 for line_number, category, message in errors: | 71 for line_number, category, message in errors: |
| 72 self._handle_style_error(line_number, category, 5, message) | 72 self._handle_style_error(line_number, category, 5, message) |
| 73 | 73 |
| 74 def run_pylint(self, path): | 74 def run_pylint(self, path): |
| 75 wkf = WebKitFinder(FileSystem()) | 75 finder = PathFinder(FileSystem()) |
| 76 executive = Executive() | 76 executive = Executive() |
| 77 env = os.environ.copy() | 77 env = os.environ.copy() |
| 78 env['PYTHONPATH'] = os.pathsep.join([ | 78 env['PYTHONPATH'] = os.pathsep.join([ |
| 79 wkf.path_from_tools_scripts(), | 79 finder.path_from_tools_scripts(), |
| 80 wkf.path_from_blink_source('build', 'scripts'), | 80 finder.path_from_blink_source('build', 'scripts'), |
| 81 wkf.path_from_tools_scripts('webkitpy', 'thirdparty'), | 81 finder.path_from_tools_scripts('webkitpy', 'thirdparty'), |
| 82 wkf.path_from_blink_source('bindings', 'scripts'), | 82 finder.path_from_blink_source('bindings', 'scripts'), |
| 83 wkf.path_from_chromium_base('build', 'android'), | 83 finder.path_from_chromium_base('build', 'android'), |
| 84 wkf.path_from_chromium_base('third_party', 'catapult', 'devil'), | 84 finder.path_from_chromium_base('third_party', 'catapult', 'devil'), |
| 85 wkf.path_from_chromium_base('third_party', 'pymock'), | 85 finder.path_from_chromium_base('third_party', 'pymock'), |
| 86 ]) | 86 ]) |
| 87 return executive.run_command([ | 87 return executive.run_command([ |
| 88 sys.executable, | 88 sys.executable, |
| 89 wkf.path_from_depot_tools_base('pylint.py'), | 89 finder.path_from_depot_tools_base('pylint.py'), |
| 90 '--output-format=parseable', | 90 '--output-format=parseable', |
| 91 '--rcfile=' + wkf.path_from_tools_scripts('webkitpy', 'pylintrc'), | 91 '--rcfile=' + finder.path_from_tools_scripts('webkitpy', 'pylintrc')
, |
| 92 path, | 92 path, |
| 93 ], env=env, error_handler=executive.ignore_error) | 93 ], env=env, error_handler=executive.ignore_error) |
| 94 | 94 |
| 95 def _parse_pylint_output(self, output): | 95 def _parse_pylint_output(self, output): |
| 96 # We filter out these messages because they are bugs in pylint that prod
uce false positives. | 96 # We filter out these messages because they are bugs in pylint that prod
uce false positives. |
| 97 # FIXME: Does it make sense to combine these rules with the rules in sty
le/checker.py somehow? | 97 # FIXME: Does it make sense to combine these rules with the rules in sty
le/checker.py somehow? |
| 98 FALSE_POSITIVES = [ | 98 FALSE_POSITIVES = [ |
| 99 # possibly http://www.logilab.org/ticket/98613 ? | 99 # possibly http://www.logilab.org/ticket/98613 ? |
| 100 "Instance of 'Popen' has no 'poll' member", | 100 "Instance of 'Popen' has no 'poll' member", |
| 101 "Instance of 'Popen' has no 'returncode' member", | 101 "Instance of 'Popen' has no 'returncode' member", |
| (...skipping 15 matching lines...) Expand all Loading... |
| 117 | 117 |
| 118 line_number = int(match_obj.group(2)) | 118 line_number = int(match_obj.group(2)) |
| 119 category_and_method = match_obj.group(3).split(', ') | 119 category_and_method = match_obj.group(3).split(', ') |
| 120 category = 'pylint/' + (category_and_method[0]) | 120 category = 'pylint/' + (category_and_method[0]) |
| 121 if len(category_and_method) > 1: | 121 if len(category_and_method) > 1: |
| 122 message = '[%s] %s' % (category_and_method[1], match_obj.group(4
)) | 122 message = '[%s] %s' % (category_and_method[1], match_obj.group(4
)) |
| 123 else: | 123 else: |
| 124 message = match_obj.group(4) | 124 message = match_obj.group(4) |
| 125 errors.append((line_number, category, message)) | 125 errors.append((line_number, category, message)) |
| 126 return errors | 126 return errors |
| OLD | NEW |