From 0dfa274be3eaddb270b2bcee197f7d34acbc1363 Mon Sep 17 00:00:00 2001 From: Atsushi Sakai Date: Thu, 6 Jan 2022 20:26:24 +0900 Subject: [PATCH] add diff style check test (#617) * add diff style check test * add diff style check test * add diff style check test * add diff style check test * add license * add license --- .github/workflows/Linux_CI.yml | 6 -- .github/workflows/MacOS_CI.yml | 13 +--- docs/how_to_contribute_main.rst | 3 + requirements.txt | 1 + tests/test_diff_codestyle.py | 115 ++++++++++++++++++++++++++++++++ 5 files changed, 120 insertions(+), 18 deletions(-) create mode 100644 tests/test_diff_codestyle.py diff --git a/.github/workflows/Linux_CI.yml b/.github/workflows/Linux_CI.yml index ef773ff7..d8cad211 100644 --- a/.github/workflows/Linux_CI.yml +++ b/.github/workflows/Linux_CI.yml @@ -32,10 +32,6 @@ jobs: run: pip install coverage - name: install mypy run: pip install mypy - - name: install pycodestyle - run: pip install pycodestyle - - name: install pytest-xdist - run: pip install pytest-xdist - name: mypy check run: | mypy -p AerialNavigation @@ -47,8 +43,6 @@ jobs: mypy -p PathPlanning mypy -p PathTracking mypy -p SLAM - - name: do diff style check - run: bash rundiffstylecheck.sh - name: do all unit tests run: bash runtests.sh diff --git a/.github/workflows/MacOS_CI.yml b/.github/workflows/MacOS_CI.yml index f01d85e6..19217991 100644 --- a/.github/workflows/MacOS_CI.yml +++ b/.github/workflows/MacOS_CI.yml @@ -39,10 +39,6 @@ jobs: run: pip install coverage - name: install mypy run: pip install mypy - - name: install pycodestyle - run: pip install pycodestyle - - name: install pytest-xdist - run: pip install pytest-xdist - name: mypy check run: | mypy -p AerialNavigation @@ -54,12 +50,5 @@ jobs: mypy -p PathPlanning mypy -p PathTracking mypy -p SLAM - - name: do diff style check - run: bash rundiffstylecheck.sh - - name: do all unit tests - run: bash runtests.sh - - - - + run: bash runtests.sh \ No newline at end of file diff --git a/docs/how_to_contribute_main.rst b/docs/how_to_contribute_main.rst index 703143f6..4b39089e 100644 --- a/docs/how_to_contribute_main.rst +++ b/docs/how_to_contribute_main.rst @@ -50,6 +50,8 @@ At the least, try to run the example code without animation in the unit test. If you want to run the test suites locally, you can use the `runtests.sh` script by just executing it. +The `test_diff_codestyle.py`_ check code style for your PR's codes. + .. _`how to write doc`: @@ -153,6 +155,7 @@ Sponsors .. _`reStructuredText`: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html .. _`doc modules dir`: https://github.com/AtsushiSakai/PythonRobotics/tree/master/docs/modules .. _`doc README`: https://github.com/AtsushiSakai/PythonRobotics/blob/master/docs/README.md +.. _`test_diff_codestyle.py`: https://github.com/AtsushiSakai/PythonRobotics/blob/master/tests/test_diff_codestyle.py .. _`JetBrains`: https://www.jetbrains.com/ .. _`Sponsor @AtsushiSakai on GitHub Sponsors`: https://github.com/sponsors/AtsushiSakai .. _`Become a backer or sponsor on Patreon`: https://www.patreon.com/myenigma diff --git a/requirements.txt b/requirements.txt index 396a80e9..c0de8f22 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ matplotlib == 3.5.1 cvxpy == 1.1.18 pytest == 6.2.5 # For unit test pytest-xdist == 2.5.0 # For unit test +flake8 == 4.0.1 # For unit test sphinx == 4.3.2 # For sphinx documentation sphinx_rtd_theme == 1.0.0 IPython == 7.30.1 # For sphinx documentation diff --git a/tests/test_diff_codestyle.py b/tests/test_diff_codestyle.py new file mode 100644 index 00000000..3dbe11a1 --- /dev/null +++ b/tests/test_diff_codestyle.py @@ -0,0 +1,115 @@ +""" +Diff based code style checker with flake8 + +This code come from: +https://github.com/scipy/scipy/blob/main/tools/lint_diff.py + +Scipy's licence: https://github.com/scipy/scipy/blob/main/LICENSE.txt +Copyright (c) 2001-2002 Enthought, Inc. 2003-2022, SciPy Developers. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" +import conftest +import subprocess + + +def rev_list(branch, num_commits): + """List commits in reverse chronological order. + Only the first `num_commits` are shown. + """ + res = subprocess.run( + [ + 'git', + 'rev-list', + '--max-count', + f'{num_commits}', + '--first-parent', + branch + ], + stdout=subprocess.PIPE, + encoding='utf-8', + ) + res.check_returncode() + return res.stdout.rstrip('\n').split('\n') + + +def find_branch_point(branch): + """Find when the current branch split off from the given branch. + It is based off of this Stackoverflow post: + https://stackoverflow.com/questions/1527234/finding-a-branch-point-with-git#4991675 + """ + branch_commits = rev_list('HEAD', 1000) + main_commits = set(rev_list(branch, 1000)) + for branch_commit in branch_commits: + if branch_commit in main_commits: + return branch_commit + + # If a branch split off over 1000 commits ago we will fail to find + # the ancestor. + raise RuntimeError( + 'Failed to find a common ancestor in the last 1000 commits') + + +def find_diff(sha): + """Find the diff since the given sha.""" + files = ['*.py'] + res = subprocess.run( + ['git', 'diff', '--unified=0', sha, '--'] + files, + stdout=subprocess.PIPE, + encoding='utf-8' + ) + res.check_returncode() + return res.stdout + + +def run_flake8(diff): + """Run flake8 on the given diff.""" + res = subprocess.run( + ['flake8', '--diff'], + input=diff, + stdout=subprocess.PIPE, + encoding='utf-8', + ) + return res.returncode, res.stdout + + +def test(): + branch_commit = find_branch_point("origin/master") + diff = find_diff(branch_commit) + rc, errors = run_flake8(diff) + if errors: + print(errors) + else: + print("No lint errors found.") + assert rc == 0 + + +if __name__ == '__main__': + conftest.run_this_test(__file__)