diff --git a/.github/workflows/type-checking.yml b/.github/workflows/type-checking.yml new file mode 100644 index 00000000..c0684925 --- /dev/null +++ b/.github/workflows/type-checking.yml @@ -0,0 +1,30 @@ +name: Type Checking + +on: + push: + branches: [ master ] + pull_request: + branches: [ '*' ] + +jobs: + mypy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pip' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install ".[dev]" + + - name: Run mypy + run: | + mypy powerplantmatching diff --git a/.gitignore b/.gitignore index bb9ff7d2..c7e995b3 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,7 @@ doc/_build doc/api .vscode test.ipynb + +# temporary +.devcontainer/ +.repoai/ diff --git a/powerplantmatching/core.py b/powerplantmatching/core.py index b1fed2a1..11f7c251 100644 --- a/powerplantmatching/core.py +++ b/powerplantmatching/core.py @@ -26,8 +26,8 @@ "downloaders": {}, } -makedirs(join(package_config["data_dir"], "data", "in"), exist_ok=True) -makedirs(join(package_config["data_dir"], "data", "out"), exist_ok=True) +makedirs(join(str(package_config["data_dir"]), "data", "in"), exist_ok=True) +makedirs(join(str(package_config["data_dir"]), "data", "out"), exist_ok=True) def _package_data(fn): @@ -35,14 +35,14 @@ def _package_data(fn): def _data_in(fn): - return join(package_config["data_dir"], "data", "in", fn) + return join(str(package_config["data_dir"]), "data", "in", fn) def _data_out(fn, config): if config is None: - directory = join(package_config["data_dir"], "data", "out", "default") + directory = join(str(package_config["data_dir"]), "data", "out", "default") else: - directory = join(package_config["data_dir"], "data", "out", config["hash"]) + directory = join(str(package_config["data_dir"]), "data", "out", config["hash"]) makedirs(directory, exist_ok=True) return join(directory, fn) @@ -60,7 +60,7 @@ def _data_out(fn, config): logFormatter = logging.Formatter( "%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s" ) -fileHandler = logging.FileHandler(join(package_config["data_dir"], "PPM.log")) +fileHandler = logging.FileHandler(join(str(package_config["data_dir"]), "PPM.log")) fileHandler.setFormatter(logFormatter) logger.addHandler(fileHandler) # logger.info('Initialization complete.') diff --git a/powerplantmatching/plot.py b/powerplantmatching/plot.py index d1d77b7e..67b63121 100644 --- a/powerplantmatching/plot.py +++ b/powerplantmatching/plot.py @@ -23,7 +23,8 @@ import numpy as np import pandas as pd import seaborn as sns -from matplotlib import cycler, rcParams +from cycler import cycler +from matplotlib import rcParams from matplotlib.legend_handler import HandlerPatch from matplotlib.lines import Line2D diff --git a/pyproject.toml b/pyproject.toml index eac6c047..333c01e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,22 @@ docs= [ "nbsphinx", "sphinx-automodapi", ] -dev= ["pre-commit", "pytest", "pytest-cov"] +dev= [ + "pre-commit", + "pytest", + "pytest-cov", + "mypy", + "types-requests", + "types-PyYAML", + "pandas-stubs", + "types-tqdm", + "types-six" +] + +# Add optional dependencies for plotting +plotting= [ + "cartopy" +] # setuptools_scm settings @@ -92,3 +107,33 @@ select = [ 'TID', # flake8-tidy-imports 'NPY', # numpy ] + +# Add basic mypy configuration +[tool.mypy] +python_version = "3.9" +warn_unused_configs = true +disallow_untyped_defs = false +disallow_incomplete_defs = false +# Ignore class-level imports in accessor.py +disable_error_code = ["misc"] + +# Ignore missing imports for external libraries +[[tool.mypy.overrides]] +module = [ + "matplotlib.*", + "seaborn.*", + "networkx.*", + "pycountry.*", + "country_converter.*", + "geopy.*", + "unidecode.*", + "entsoe.*", + "yaml.*", + "scipy.*", + "pandas.*", + "tqdm.*", + "deprecation.*", + "cartopy.*", + "six.*", +] +ignore_missing_imports = true