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

Enforce flake8 cleanliness on AP_FLAKE8_CLEAN-marked files #1293

Merged
merged 2 commits into from
Jan 2, 2024
Merged
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
12 changes: 10 additions & 2 deletions MAVProxy/modules/mavproxy_fieldcheck/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
- ensure parameters are correct
- add check that battery is within tolerances (chemistry issues...)
- autodetect numcells being incorrect

AP_FLAKE8_CLEAN

'''

import math
Expand All @@ -31,6 +34,7 @@
from MAVProxy.modules.lib.mp_menu import MPMenuItem
from MAVProxy.modules.lib.mp_menu import MPMenuSubMenu


class FieldCheck(object):
def __init__(self):
self.is_armed = False
Expand Down Expand Up @@ -370,7 +374,7 @@ def idle_task(self):
self.check_map_menu()

def FC_MPSetting(self, name, atype, default, description):
xname = "fc_%s_%s" % (self.lc_name, name)
# xname = "fc_%s_%s" % (self.lc_name, name)
return MPSetting(name, atype, default, description)

def select(self):
Expand Down Expand Up @@ -443,18 +447,22 @@ def cmd_fieldcheck(self, args):
print(usage)
return


class FieldCMAC(FieldCheck):
lc_name = "cmac"
location = mavutil.location(-35.363261, 149.165230, 584, 353)


class FieldSpringValley(FieldCheck):
location = mavutil.location(-35.281315, 149.005329, 581, 280)
lc_name = "springvalley"


class FieldSpringValleyBottom(FieldCheck):
location = mavutil.location(-35.2824450, 149.0053668, 593, 0)
lc_name = "springvalleybottom"


class FieldCheckModule(mp_module.MPModule):
def __init__(self, mpstate):

Expand Down Expand Up @@ -489,7 +497,6 @@ def try_select_field(self, loc):
self.whinge("Selecting field (%s)" % field.lc_name)
self.select_field(field)


def idle_task(self):
'''run periodic tasks'''
if self.field is not None:
Expand All @@ -510,6 +517,7 @@ def mavlink_packet(self, m):
return
self.field.mavlink_packet(m)


def init(mpstate):
'''initialise module'''
return FieldCheckModule(mpstate)
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())