diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a08e08882..f2191f674 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: uses: actions/setup-python@v1 with: # matches compat target in setup.py - python-version: '3.6' + python-version: '3.8' - name: "Main Script" run: | curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/main/prepare-and-run-flake8.sh @@ -35,6 +35,19 @@ jobs: curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-pylint.sh . ./prepare-and-run-pylint.sh "$(basename $GITHUB_REPOSITORY)" examples/*.py test/test_*.py experiments/*.py + mypy: + name: Mypy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: "Main Script" + run: | + curl -L -O https://tiker.net/ci-support-v0 + . ./ci-support-v0 + build_py_project_in_conda_env + python -m pip install mypy + ./run-mypy.sh + pytest3: name: Pytest Conda Py3 runs-on: ubuntu-latest diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 92a42ef6a..03e0f4c4f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -112,6 +112,18 @@ Pylint: except: - tags +Mypy: + script: | + curl -L -O https://tiker.net/ci-support-v0 + . ./ci-support-v0 + build_py_project_in_venv + python -m pip install mypy + ./run-mypy.sh + tags: + - python3 + except: + - tags + Downstream: parallel: matrix: diff --git a/meshmode/mesh/processing.py b/meshmode/mesh/processing.py index 3d533f1a3..a52395974 100644 --- a/meshmode/mesh/processing.py +++ b/meshmode/mesh/processing.py @@ -149,7 +149,8 @@ def _filter_mesh_groups(mesh, selected_elements, vertex_id_dtype): filtered_vertex_indices = [ mesh.groups[i_old_grp].vertex_indices[ filtered_group_elements[i_new_grp], :] - for i_new_grp, i_old_grp in enumerate(new_group_to_old_group)] + for i_new_grp, i_old_grp in enumerate(new_group_to_old_group) + if mesh.groups[i_old_grp].vertex_indices is not None] if n_new_groups > 0: filtered_vertex_indices_flat = np.concatenate([indices.ravel() for indices @@ -1287,14 +1288,14 @@ def map_mesh(mesh, f): # noqa # {{{ affine map def affine_map(mesh, - A: Optional[Union[Real, np.ndarray]] = None, # noqa: N803 - b: Optional[Union[Real, np.ndarray]] = None): + A: Optional[Union[np.generic, np.ndarray]] = None, # noqa: N803 + b: Optional[Union[np.generic, np.ndarray]] = None): """Apply the affine map :math:`f(x) = A x + b` to the geometry of *mesh*.""" - if isinstance(A, Real): + if A is not None and not isinstance(A, np.ndarray): A = np.diag([A] * mesh.ambient_dim) # noqa: N806 - if isinstance(b, Real): + if b is not None and not isinstance(b, np.ndarray): b = np.array([b] * mesh.ambient_dim) if A is None and b is None: diff --git a/run-mypy.sh b/run-mypy.sh new file mode 100755 index 000000000..33562756f --- /dev/null +++ b/run-mypy.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python -m mypy --show-error-codes meshmode # examples test diff --git a/setup.cfg b/setup.cfg index a3c1114de..7bc03a77f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -8,3 +8,68 @@ docstring-quotes = """ multiline-quotes = """ # enable-flake8-bugbear + +[mypy] +python_version = 3.8 +warn_unused_ignores = True + +exclude = (?x)( + meshmode/discretization/.* + | meshmode/mesh/__init__.py + | meshmode/mesh/generation\.py + | meshmode/mesh/visualization\.py + | meshmode/mesh/refinement/.* + | meshmode/interop/.* + | meshmode/dof_array\.py + ) + +[mypy-pyvisfile.*] +ignore_missing_imports = True + +[mypy-matplotlib.*] +ignore_missing_imports = True + +[mypy-mpl_toolkits.*] +ignore_missing_imports = True + +[mypy-firedrake.*] +ignore_missing_imports = True + +[mypy-pyop2.*] +ignore_missing_imports = True + +[mypy-finat.*] +ignore_missing_imports = True + +[mypy-FIAT.*] +ignore_missing_imports = True + +[mypy-loopy.*] +ignore_missing_imports = True + +[mypy-gmsh_interop.*] +ignore_missing_imports = True + +[mypy-scipy.*] +ignore_missing_imports = True + +[mypy-pymetis.*] +ignore_missing_imports = True + +[mypy-pymbolic.*] +ignore_missing_imports = True + +[mypy-recursivenodes.*] +ignore_missing_imports = True + +[mypy-mayavi.*] +ignore_missing_imports = True + +[mypy-h5py.*] +ignore_missing_imports = True + +[mypy-oct2py.*] +ignore_missing_imports = True + +[mypy-pyopencl.*] +ignore_missing_imports = True diff --git a/setup.py b/setup.py index 094fa0c0f..51e6fda4e 100644 --- a/setup.py +++ b/setup.py @@ -27,9 +27,6 @@ def main(): "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Scientific/Engineering :: Mathematics", @@ -39,7 +36,7 @@ def main(): ], packages=find_packages(), - python_requires="~=3.6", + python_requires="~=3.8", install_requires=[ "numpy", "modepy>=2020.2",