From fb8f5a44bd3e828ce87f646ea82f4ce0dfe0c989 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Thu, 27 Jul 2017 12:41:34 -0500 Subject: [PATCH] Use mypy to do static type checking python3 includes support for optional type annotations which can be used by static analysis tools to perform type checking. The mypy tool is a static type checking tool that can also infer type information in many cases, but which will use explicit type information if it is present. Add mypy to test-requirements and to the pep8 job so that our pep8 job can do more analysis work and less with the code style. To support this, there were a few places in the current codebase that needed an explicit type hint. For variables/attributes in 3.5 this is done via comments. There is a conditional import that was confusion that just got marked with an 'ignore'. Our ansible action and lookup plugins confuse mypi with the way they import the ansible base classes. That's ok - they confuse us with that too. The .pyi files are 'typeshed' files, which are a way that one can provide static type annotations without putting the information into the file itself. mypy will always prefer a .pyi file over a .py file (since the point of them is to be external annotion/interface description) So in order to get mypy to not barf on the ansible import weirdness, just add a corresponding empty .pyi file. We could potentially actually put interface descriptions in them - but I don't think there is very much value in that. It should be amusing to at least someone that we have to flake8: noqa an import from typing that was done to provide a type hint in a comment. Change-Id: I6c4ac3dcfc6fd990e6c6886749de147ad28389d1 --- test-requirements.txt | 1 + tox.ini | 8 ++++++-- zuul/ansible/action/add_host.pyi | 0 zuul/ansible/action/asa_config.pyi | 0 zuul/ansible/action/asa_template.pyi | 0 zuul/ansible/action/assemble.pyi | 0 zuul/ansible/action/copy.pyi | 0 zuul/ansible/action/dellos10_config.pyi | 0 zuul/ansible/action/dellos6_config.pyi | 0 zuul/ansible/action/dellos9_config.pyi | 0 zuul/ansible/action/eos_config.pyi | 0 zuul/ansible/action/eos_template.pyi | 0 zuul/ansible/action/fetch.pyi | 0 zuul/ansible/action/include_vars.pyi | 0 zuul/ansible/action/ios_config.pyi | 0 zuul/ansible/action/ios_template.pyi | 0 zuul/ansible/action/iosxr_config.pyi | 0 zuul/ansible/action/iosxr_template.pyi | 0 zuul/ansible/action/junos_config.pyi | 0 zuul/ansible/action/junos_template.pyi | 0 zuul/ansible/action/net_config.pyi | 0 zuul/ansible/action/net_template.pyi | 0 zuul/ansible/action/network.pyi | 0 zuul/ansible/action/normal.pyi | 0 zuul/ansible/action/nxos_config.pyi | 0 zuul/ansible/action/nxos_template.pyi | 0 zuul/ansible/action/ops_config.pyi | 0 zuul/ansible/action/ops_template.pyi | 0 zuul/ansible/action/patch.pyi | 0 zuul/ansible/action/script.pyi | 0 zuul/ansible/action/sros_config.pyi | 0 zuul/ansible/action/synchronize.pyi | 0 zuul/ansible/action/template.pyi | 0 zuul/ansible/action/unarchive.pyi | 0 zuul/ansible/action/vyos_config.pyi | 0 zuul/ansible/action/win_copy.pyi | 0 zuul/ansible/action/win_template.pyi | 0 zuul/ansible/lookup/_banned.pyi | 0 zuul/ansible/lookup/consul_kv.pyi | 0 zuul/ansible/lookup/credstash.pyi | 0 zuul/ansible/lookup/csvfile.pyi | 0 zuul/ansible/lookup/dig.pyi | 0 zuul/ansible/lookup/dnstxt.pyi | 0 zuul/ansible/lookup/env.pyi | 0 zuul/ansible/lookup/etcd.pyi | 0 zuul/ansible/lookup/file.pyi | 0 zuul/ansible/lookup/fileglob.pyi | 0 zuul/ansible/lookup/filetree.pyi | 0 zuul/ansible/lookup/first_found.pyi | 0 zuul/ansible/lookup/hashi_valut.pyi | 0 zuul/ansible/lookup/ini.pyi | 0 zuul/ansible/lookup/keyring.pyi | 0 zuul/ansible/lookup/lastpass.pyi | 0 zuul/ansible/lookup/lines.pyi | 0 zuul/ansible/lookup/mongodb.pyi | 0 zuul/ansible/lookup/password.pyi | 0 zuul/ansible/lookup/passwordstore.pyi | 0 zuul/ansible/lookup/pipe.pyi | 0 zuul/ansible/lookup/redis_kv.pyi | 0 zuul/ansible/lookup/shelvefile.pyi | 0 zuul/ansible/lookup/template.pyi | 0 zuul/ansible/lookup/url.pyi | 0 zuul/driver/__init__.py | 2 +- zuul/driver/bubblewrap/__init__.py | 4 +++- zuul/lib/yamlutil.py | 3 ++- 65 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 zuul/ansible/action/add_host.pyi create mode 100644 zuul/ansible/action/asa_config.pyi create mode 100644 zuul/ansible/action/asa_template.pyi create mode 100644 zuul/ansible/action/assemble.pyi create mode 100644 zuul/ansible/action/copy.pyi create mode 100644 zuul/ansible/action/dellos10_config.pyi create mode 100644 zuul/ansible/action/dellos6_config.pyi create mode 100644 zuul/ansible/action/dellos9_config.pyi create mode 100644 zuul/ansible/action/eos_config.pyi create mode 100644 zuul/ansible/action/eos_template.pyi create mode 100644 zuul/ansible/action/fetch.pyi create mode 100644 zuul/ansible/action/include_vars.pyi create mode 100644 zuul/ansible/action/ios_config.pyi create mode 100644 zuul/ansible/action/ios_template.pyi create mode 100644 zuul/ansible/action/iosxr_config.pyi create mode 100644 zuul/ansible/action/iosxr_template.pyi create mode 100644 zuul/ansible/action/junos_config.pyi create mode 100644 zuul/ansible/action/junos_template.pyi create mode 100644 zuul/ansible/action/net_config.pyi create mode 100644 zuul/ansible/action/net_template.pyi create mode 100644 zuul/ansible/action/network.pyi create mode 100644 zuul/ansible/action/normal.pyi create mode 100644 zuul/ansible/action/nxos_config.pyi create mode 100644 zuul/ansible/action/nxos_template.pyi create mode 100644 zuul/ansible/action/ops_config.pyi create mode 100644 zuul/ansible/action/ops_template.pyi create mode 100644 zuul/ansible/action/patch.pyi create mode 100644 zuul/ansible/action/script.pyi create mode 100644 zuul/ansible/action/sros_config.pyi create mode 100644 zuul/ansible/action/synchronize.pyi create mode 100644 zuul/ansible/action/template.pyi create mode 100644 zuul/ansible/action/unarchive.pyi create mode 100644 zuul/ansible/action/vyos_config.pyi create mode 100644 zuul/ansible/action/win_copy.pyi create mode 100644 zuul/ansible/action/win_template.pyi create mode 100644 zuul/ansible/lookup/_banned.pyi create mode 100644 zuul/ansible/lookup/consul_kv.pyi create mode 100644 zuul/ansible/lookup/credstash.pyi create mode 100644 zuul/ansible/lookup/csvfile.pyi create mode 100644 zuul/ansible/lookup/dig.pyi create mode 100644 zuul/ansible/lookup/dnstxt.pyi create mode 100644 zuul/ansible/lookup/env.pyi create mode 100644 zuul/ansible/lookup/etcd.pyi create mode 100644 zuul/ansible/lookup/file.pyi create mode 100644 zuul/ansible/lookup/fileglob.pyi create mode 100644 zuul/ansible/lookup/filetree.pyi create mode 100644 zuul/ansible/lookup/first_found.pyi create mode 100644 zuul/ansible/lookup/hashi_valut.pyi create mode 100644 zuul/ansible/lookup/ini.pyi create mode 100644 zuul/ansible/lookup/keyring.pyi create mode 100644 zuul/ansible/lookup/lastpass.pyi create mode 100644 zuul/ansible/lookup/lines.pyi create mode 100644 zuul/ansible/lookup/mongodb.pyi create mode 100644 zuul/ansible/lookup/password.pyi create mode 100644 zuul/ansible/lookup/passwordstore.pyi create mode 100644 zuul/ansible/lookup/pipe.pyi create mode 100644 zuul/ansible/lookup/redis_kv.pyi create mode 100644 zuul/ansible/lookup/shelvefile.pyi create mode 100644 zuul/ansible/lookup/template.pyi create mode 100644 zuul/ansible/lookup/url.pyi diff --git a/test-requirements.txt b/test-requirements.txt index eea1d691ef..914dcf0198 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -14,3 +14,4 @@ sphinxcontrib-programoutput oslosphinx mock PyMySQL +mypy diff --git a/tox.ini b/tox.ini index a3f018f97a..cc5ea58518 100644 --- a/tox.ini +++ b/tox.ini @@ -27,8 +27,12 @@ deps = bindep commands = bindep test [testenv:pep8] -# streamer is python3 only, so we need to run flake8 in python3 -commands = flake8 {posargs} +# --ignore-missing-imports tells mypy to not try to follow imported modules +# out of the current tree. As you might expect, we don't want to run static +# type checking on the world - just on ourselves. +commands = + flake8 {posargs} + mypy --ignore-missing-imports zuul [testenv:cover] commands = diff --git a/zuul/ansible/action/add_host.pyi b/zuul/ansible/action/add_host.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/asa_config.pyi b/zuul/ansible/action/asa_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/asa_template.pyi b/zuul/ansible/action/asa_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/assemble.pyi b/zuul/ansible/action/assemble.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/copy.pyi b/zuul/ansible/action/copy.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/dellos10_config.pyi b/zuul/ansible/action/dellos10_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/dellos6_config.pyi b/zuul/ansible/action/dellos6_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/dellos9_config.pyi b/zuul/ansible/action/dellos9_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/eos_config.pyi b/zuul/ansible/action/eos_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/eos_template.pyi b/zuul/ansible/action/eos_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/fetch.pyi b/zuul/ansible/action/fetch.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/include_vars.pyi b/zuul/ansible/action/include_vars.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/ios_config.pyi b/zuul/ansible/action/ios_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/ios_template.pyi b/zuul/ansible/action/ios_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/iosxr_config.pyi b/zuul/ansible/action/iosxr_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/iosxr_template.pyi b/zuul/ansible/action/iosxr_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/junos_config.pyi b/zuul/ansible/action/junos_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/junos_template.pyi b/zuul/ansible/action/junos_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/net_config.pyi b/zuul/ansible/action/net_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/net_template.pyi b/zuul/ansible/action/net_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/network.pyi b/zuul/ansible/action/network.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/normal.pyi b/zuul/ansible/action/normal.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/nxos_config.pyi b/zuul/ansible/action/nxos_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/nxos_template.pyi b/zuul/ansible/action/nxos_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/ops_config.pyi b/zuul/ansible/action/ops_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/ops_template.pyi b/zuul/ansible/action/ops_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/patch.pyi b/zuul/ansible/action/patch.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/script.pyi b/zuul/ansible/action/script.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/sros_config.pyi b/zuul/ansible/action/sros_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/synchronize.pyi b/zuul/ansible/action/synchronize.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/template.pyi b/zuul/ansible/action/template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/unarchive.pyi b/zuul/ansible/action/unarchive.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/vyos_config.pyi b/zuul/ansible/action/vyos_config.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/win_copy.pyi b/zuul/ansible/action/win_copy.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/action/win_template.pyi b/zuul/ansible/action/win_template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/_banned.pyi b/zuul/ansible/lookup/_banned.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/consul_kv.pyi b/zuul/ansible/lookup/consul_kv.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/credstash.pyi b/zuul/ansible/lookup/credstash.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/csvfile.pyi b/zuul/ansible/lookup/csvfile.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/dig.pyi b/zuul/ansible/lookup/dig.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/dnstxt.pyi b/zuul/ansible/lookup/dnstxt.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/env.pyi b/zuul/ansible/lookup/env.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/etcd.pyi b/zuul/ansible/lookup/etcd.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/file.pyi b/zuul/ansible/lookup/file.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/fileglob.pyi b/zuul/ansible/lookup/fileglob.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/filetree.pyi b/zuul/ansible/lookup/filetree.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/first_found.pyi b/zuul/ansible/lookup/first_found.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/hashi_valut.pyi b/zuul/ansible/lookup/hashi_valut.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/ini.pyi b/zuul/ansible/lookup/ini.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/keyring.pyi b/zuul/ansible/lookup/keyring.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/lastpass.pyi b/zuul/ansible/lookup/lastpass.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/lines.pyi b/zuul/ansible/lookup/lines.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/mongodb.pyi b/zuul/ansible/lookup/mongodb.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/password.pyi b/zuul/ansible/lookup/password.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/passwordstore.pyi b/zuul/ansible/lookup/passwordstore.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/pipe.pyi b/zuul/ansible/lookup/pipe.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/redis_kv.pyi b/zuul/ansible/lookup/redis_kv.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/shelvefile.pyi b/zuul/ansible/lookup/shelvefile.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/template.pyi b/zuul/ansible/lookup/template.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/ansible/lookup/url.pyi b/zuul/ansible/lookup/url.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zuul/driver/__init__.py b/zuul/driver/__init__.py index c78283d211..5193fe6090 100644 --- a/zuul/driver/__init__.py +++ b/zuul/driver/__init__.py @@ -33,7 +33,7 @@ class Driver(object, metaclass=abc.ABCMeta): The class or instance attribute **name** must be provided as a string. """ - name = None + name = None # type: str def reconfigure(self, tenant): """Called when a tenant is reconfigured. diff --git a/zuul/driver/bubblewrap/__init__.py b/zuul/driver/bubblewrap/__init__.py index 3609a7172d..83cac2e4fa 100644 --- a/zuul/driver/bubblewrap/__init__.py +++ b/zuul/driver/bubblewrap/__init__.py @@ -23,6 +23,8 @@ import shlex import subprocess import sys +from typing import Dict, List # flake8: noqa + from zuul.driver import (Driver, WrapperInterface) @@ -70,7 +72,7 @@ class BubblewrapDriver(Driver, WrapperInterface): name = 'bubblewrap' log = logging.getLogger("zuul.BubblewrapDriver") - mounts_map = {'rw': [], 'ro': []} + mounts_map = {'rw': [], 'ro': []} # type: Dict[str, List] def __init__(self): self.bwrap_command = self._bwrap_command() diff --git a/zuul/lib/yamlutil.py b/zuul/lib/yamlutil.py index 2419906cdc..2c84b06ae5 100644 --- a/zuul/lib/yamlutil.py +++ b/zuul/lib/yamlutil.py @@ -13,7 +13,8 @@ import yaml from yaml import YAMLObject, YAMLError # noqa: F401 try: - from yaml import cyaml + # Explicit type ignore to deal with provisional import failure + from yaml import cyaml # type: ignore import _yaml SafeLoader = cyaml.CSafeLoader SafeDumper = cyaml.CSafeDumper