diff --git a/.github/workflows/check-python.yml b/.github/workflows/check-python.yml new file mode 100644 index 00000000..142d544a --- /dev/null +++ b/.github/workflows/check-python.yml @@ -0,0 +1,35 @@ +name: Check Python code + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10"] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r 00_Utilities/python/ci-requirements.txt + - name: Test with pytest + run: | + pytest 01_Acey_Ducey/python 02_Amazing/python + - name: Test with mypy + run: | + mypy . --exclude 79_Slalom --exclude 27_Civil_War --exclude 38_Fur_Trader --exclude 81_Splat --exclude 09_Battle --exclude 40_Gomoko --exclude 36_Flip_Flop --exclude 43_Hammurabi --exclude 04_Awari --exclude 78_Sine_Wave --exclude 77_Salvo --exclude 34_Digits --exclude 17_Bullfight --exclude 16_Bug + - name: Test with flake8 + run: | + flake8 . --ignore E501,W504,W503,E741,F541,E203,W291,E722,E711,E712,F821,F401,E402,F841,E302,E731,E266 diff --git a/.gitignore b/.gitignore index 5d13dc44..26fe23b7 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ out/ *.py[co] .python-version Pipfile +venv/ .DS_Store .vs/ diff --git a/00_Utilities/python/ci-requirements.in b/00_Utilities/python/ci-requirements.in new file mode 100644 index 00000000..baf71ecc --- /dev/null +++ b/00_Utilities/python/ci-requirements.in @@ -0,0 +1,3 @@ +pytest +flake8 +mypy diff --git a/00_Utilities/python/ci-requirements.txt b/00_Utilities/python/ci-requirements.txt new file mode 100644 index 00000000..549785af --- /dev/null +++ b/00_Utilities/python/ci-requirements.txt @@ -0,0 +1,38 @@ +# +# This file is autogenerated by pip-compile with python 3.10 +# To update, run: +# +# pip-compile ci-requirements.in +# +attrs==21.4.0 + # via pytest +flake8==4.0.1 + # via -r ci-requirements.in +iniconfig==1.1.1 + # via pytest +mccabe==0.6.1 + # via flake8 +mypy==0.931 + # via -r ci-requirements.in +mypy-extensions==0.4.3 + # via mypy +packaging==21.3 + # via pytest +pluggy==1.0.0 + # via pytest +py==1.11.0 + # via pytest +pycodestyle==2.8.0 + # via flake8 +pyflakes==2.4.0 + # via flake8 +pyparsing==3.0.7 + # via packaging +pytest==7.0.1 + # via -r ci-requirements.in +tomli==2.0.1 + # via + # mypy + # pytest +typing-extensions==4.1.1 + # via mypy diff --git a/02_Amazing/python/amazing.py b/02_Amazing/python/amazing.py index 638acc57..3e71cf5a 100644 --- a/02_Amazing/python/amazing.py +++ b/02_Amazing/python/amazing.py @@ -40,6 +40,7 @@ def build_maze(width: int, length: int) -> Maze: # Set to 1 if there is an exit down # Set to 2 if there is an exit right # Set to 3 if there are exits down and right + assert width >= 2 and length >= 2 used = [] walls = [] diff --git a/02_Amazing/python/test_amazing.py b/02_Amazing/python/test_amazing.py new file mode 100644 index 00000000..4e860d23 --- /dev/null +++ b/02_Amazing/python/test_amazing.py @@ -0,0 +1,27 @@ +import pytest +from amazing import build_maze, welcome_header + + +def test_welcome_header(capsys): + assert welcome_header() == None + out, err = capsys.readouterr() + assert out == ( + " AMAZING PROGRAM\n" + " CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n\n" + ) + assert err == "" + + +@pytest.mark.parametrize( + ("width", "length"), + [ + (1, 1), + (1, 0), + (1, -1), + (1, 2), + (2, 1), + ], +) +def test_build_maze(width, length): + with pytest.raises(AssertionError): + build_maze(width, length)