| import flake8.main.application |
| import os |
| import subprocess |
| import tempfile |
| from checkpackagelib.base import _Tool |
| |
| |
| class NotExecutable(_Tool): |
| def ignore(self): |
| return False |
| |
| def run(self): |
| if self.ignore(): |
| return |
| if os.access(self.filename, os.X_OK): |
| return ["{}:0: This file does not need to be executable{}".format(self.filename, self.hint())] |
| |
| |
| class Flake8(_Tool): |
| def run(self): |
| with tempfile.NamedTemporaryFile() as output: |
| app = flake8.main.application.Application() |
| app.run(['--output-file={}'.format(output.name), self.filename]) |
| stdout = output.readlines() |
| processed_output = [str(line.decode().rstrip()) for line in stdout if line] |
| if len(stdout) == 0: |
| return |
| return ["{}:0: run 'flake8' and fix the warnings".format(self.filename), |
| '\n'.join(processed_output)] |
| |
| |
| class Shellcheck(_Tool): |
| def run(self): |
| cmd = ['shellcheck', "--external-sources", self.filename] |
| try: |
| p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| stdout = p.communicate()[0] |
| processed_output = [str(line.decode().rstrip()) for line in stdout.splitlines() if line] |
| if p.returncode == 0: |
| return |
| return ["{}:0: run 'shellcheck' and fix the warnings".format(self.filename), |
| '\n'.join(processed_output)] |
| except FileNotFoundError: |
| return ["{}:0: failed to call 'shellcheck'".format(self.filename)] |