diff --git a/.gitignore b/.gitignore --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ version.txt /.hypothesis/ /.tox/ +.mypy_cache/ diff --git a/MANIFEST.in b/MANIFEST.in --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,3 +4,4 @@ include requirements-swh.txt include version.txt recursive-include swh/scheduler/sql *.sql +recursive-include swh py.typed diff --git a/mypy.ini b/mypy.ini new file mode 100644 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,27 @@ +[mypy] +namespace_packages = True +warn_unused_ignores = True + + +# 3rd party libraries without stubs (yet) + +[mypy-arrow.*] +ignore_missing_imports = True + +[mypy-celery.*] +ignore_missing_imports = True + +[mypy-elasticsearch.*] +ignore_missing_imports = True + +[mypy-kombu.*] +ignore_missing_imports = True + +[mypy-pkg_resources.*] +ignore_missing_imports = True + +[mypy-psycopg2.*] +ignore_missing_imports = True + +[mypy-pytest.*] +ignore_missing_imports = True diff --git a/swh/__init__.py b/swh/__init__.py --- a/swh/__init__.py +++ b/swh/__init__.py @@ -1 +1,4 @@ -__path__ = __import__('pkgutil').extend_path(__path__, __name__) +from pkgutil import extend_path +from typing import Iterable + +__path__ = extend_path(__path__, __name__) # type: Iterable[str] diff --git a/swh/scheduler/__init__.py b/swh/scheduler/__init__.py --- a/swh/scheduler/__init__.py +++ b/swh/scheduler/__init__.py @@ -3,6 +3,8 @@ # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information +from typing import Any, Dict + # Percentage of tasks with priority to schedule PRIORITY_SLOT = 0.6 @@ -16,7 +18,7 @@ }) } # current configuration. To be set by the config loading mechanism -CONFIG = {} +CONFIG = {} # type: Dict[str, Any] def compute_nb_tasks_from(num_tasks): diff --git a/swh/scheduler/celery_backend/config.py b/swh/scheduler/celery_backend/config.py --- a/swh/scheduler/celery_backend/config.py +++ b/swh/scheduler/celery_backend/config.py @@ -18,6 +18,8 @@ import requests +from typing import Any, Dict + from swh.scheduler import CONFIG as SWH_CONFIG from swh.core.config import load_named_config, merge_configs @@ -177,7 +179,7 @@ INSTANCE_NAME = os.environ.get(CONFIG_NAME_ENVVAR) CONFIG_NAME = os.environ.get('SWH_CONFIG_FILENAME') -CONFIG = {} +CONFIG = {} # type: Dict[str, Any] if CONFIG_NAME: # load the celery config from the main config file given as @@ -186,7 +188,7 @@ # celery specific configuration. SWH_CONFIG.clear() SWH_CONFIG.update(load_named_config(CONFIG_NAME)) - CONFIG = SWH_CONFIG.get('celery') + CONFIG = SWH_CONFIG.get('celery', default={}) if not CONFIG: # otherwise, back to compat config loading mechanism diff --git a/swh/scheduler/py.typed b/swh/scheduler/py.typed new file mode 100644 --- /dev/null +++ b/swh/scheduler/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561. diff --git a/tox.ini b/tox.ini --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist=flake8,py3 +envlist=flake8,mypy,py3 [testenv:py3] deps = @@ -28,3 +28,11 @@ flake8 commands = {envpython} -m flake8 + +[testenv:mypy] +skip_install = true +deps = + .[testing] + mypy +commands = + mypy swh