Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

.github: add flake8 cleanliness checking #1297

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .github/workflows/python-cleanliness.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: test Python cleanliness

on: [push, pull_request, workflow_dispatch]

concurrency:
group: ci-${{github.workflow}}-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-22.04

steps:
# git checkout the PR
- uses: actions/checkout@v4
with:
submodules: 'recursive'

- name: Install dependencies
run: |
python -m pip install -U flake8

- name: Check Python with Flake8
run: |
scripts/run_flake8.py MAVProxy
60 changes: 60 additions & 0 deletions scripts/run_flake8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/usr/bin/env python

"""
Runs flake8 over Python files which contain a marker indicating
they are clean, ensures that they actually are

AP_FLAKE8_CLEAN
"""

import os
import subprocess
import sys

import argparse

os.environ['PYTHONUNBUFFERED'] = '1'


class Flake8Checker(object):
def __init__(self, basedirs):
self.retcode = 0
self.files_to_check = []
self.basedirs = basedirs

def progress(self, string):
print("****** %s" % (string,))

def check(self):
if len(self.files_to_check) == 0:
return
for path in self.files_to_check:
self.progress("Checking (%s)" % path)
ret = subprocess.run(["flake8", "--show-source"] + self.files_to_check,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
if ret.returncode != 0:
self.progress("Flake8 check failed: (%s)" % (ret.stdout))
self.retcode = 1

def run(self):
for basedir in self.basedirs:
for (dirpath, dirnames, filenames) in os.walk(basedir):
for filename in filenames:
if os.path.splitext(filename)[1] != ".py":
continue
filepath = os.path.join(dirpath, filename)
content = open(filepath).read()
if "AP_FLAKE8_CLEAN" not in content:
continue
self.files_to_check.append(filepath)
self.check()
return self.retcode


if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Check all Python files for flake8 cleanliness')
parser.add_argument('DIRPATH', nargs="+", default=[], help='directory to recurse into')
args = parser.parse_args()

checker = Flake8Checker(args.DIRPATH)
sys.exit(checker.run())