diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ce3acb4..9ab1cda 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -12,7 +12,7 @@ // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "pip3 install --user -r requirements.txt" + "postCreateCommand": "pip3 install --user -r requirements.txt -r requirements-dev.txt" // Configure tool-specific properties. // "customizations": {}, diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53d1400..412ba54 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,6 @@ jobs: - name: "Install test dependencies" run: | python -m pip install --upgrade pip - pip install -r requirements.txt + pip install -r requirements.txt -r requirements-dev.txt - name: "Run tests" run: python -m pytest \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..8db956a --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,4 @@ +pytest==8.3.3 +mypy==1.13.0 +mypy-extensions==1.0.0 +types-requests==2.32.0.20241016 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 30ce159..af01943 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,2 @@ requests==2.32.3 -ruamel.yaml==0.18.6 -pytest==8.3.3 \ No newline at end of file +ruamel.yaml==0.18.6 \ No newline at end of file diff --git a/tests/test_syntax.py b/tests/test_syntax.py new file mode 100644 index 0000000..76ae99f --- /dev/null +++ b/tests/test_syntax.py @@ -0,0 +1,39 @@ +# based on https://gist.github.com/bbarker/4ddf4a1c58ae8465f3d37b6f2234a421 + +import os +import subprocess +import sys +import unittest +from typing import List + + +class MyPyTest(unittest.TestCase): + + def __call_mypy__(self, args, files): + result: int = subprocess.call(self.base_mypy_call + args + files, env=os.environ, cwd=self.pypath) + self.assertEqual(result, 0, '') + + def test_run_mypy_app(self): + mypy_args: List[str] = [ + "--disable-error-code", "var-annotated" + ] + self.__call_mypy__(mypy_args, ["main.py"]) + + # Run test again, but without disabling any error codes. + # This is expected to fail, but we intentionally keep this test around to + # 1) try not to add any more errors to what's already in the baseline + # 2) as a reminder to try to move the codebase towards having type checking eventually + @unittest.expectedFailure + def test_run_strict_mypy_app(self): + mypy_args: List[str] = [] + self.__call_mypy__(mypy_args, ["main.py"]) + + def __init__(self, *args, **kwargs) -> None: + super(MyPyTest, self).__init__(*args, **kwargs) + my_env = os.environ.copy() + self.pypath: str = my_env.get("PYTHONPATH", os.getcwd()) + self.base_mypy_call: List[str] = [sys.executable, "-m", "mypy", "--ignore-missing-imports"] + + +if __name__ == '__main__': + unittest.main()