Require complete function annotations by default.

Except for test modules.
Mark files, which lack some annotations, but are otherwise mypy clean, with "mypy: loose".
looper
Ben Niemann 5 years ago
parent 6e1d70d1ba
commit 00ae27747f

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
from noisicaa import node_db

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
# Important: This module must not import any other noisicaa modules.
import os

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import asyncio
import enum
import logging

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
import uuid
import threading

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import json
import hashlib
import email.message

@ -20,6 +20,7 @@
#
# @end:license
# mypy: loose
# TODO: pylint-unclean
import asyncio

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
# pylint/mypy doesn't know about the capnp import magic.

@ -20,6 +20,7 @@
#
# @end:license
# mypy: loose
# TODO: pylint-unclean
import logging

@ -20,6 +20,7 @@
#
# @end:license
# mypy: loose
# TODO: pylint-unclean
import asyncio

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
import hashlib
import re

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import asyncio
import functools
import io

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
from . import timeseries

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
from . import stats

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
import threading
import time

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
logger = logging.getLogger(__name__)

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import collections
import logging

@ -20,6 +20,7 @@
#
# @end:license
# mypy: loose
# TODO: pylint-unclean
import collections

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import asyncio
import concurrent.futures
import logging

@ -20,6 +20,7 @@
#
# @end:license
# mypy: loose
# TODO: pylint-unclean
class MidiEvent(object):

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import os.path
import glob

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import argparse
import logging
import pprint

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import os.path
import io
import logging

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
import struct
from typing import List, Set, Tuple, IO # pylint: disable=unused-import

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
import struct
from typing import Set, List, IO # pylint: disable=unused-import

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import asyncio
import logging

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import enum
from .pitch import Pitch

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
class KeySignature(object):
_signatures = {
'C major': [],

@ -20,6 +20,7 @@
#
# @end:license
# mypy: loose
# TODO: pylint-unclean
class Pos2F(object):

@ -20,6 +20,7 @@
#
# @end:license
# mypy: loose
# TODO: pylint-unclean
import fractions

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
class TimeSignature(object):
def __init__(self, upper=4, lower=4):
if upper < 1 or upper > 99:

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
class Mutation(object):
pass

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import io
import logging
from xml.etree import ElementTree

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
from noisicaa import node_db

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
import os
import os.path

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
from typing import Dict # pylint: disable=unused-import

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
import os
import os.path

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
from noisicaa import node_db

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
import os
import os.path

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import logging
from typing import cast, Set, Dict, List # pylint: disable=unused-import

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
from noisicaa import core

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
from . import node_description_pb2

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import asyncio
import asyncio.streams
import logging

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
class RuntimeSettings(object):
def __init__(self):

@ -20,6 +20,7 @@
#
# @end:license
# mypy: loose
# TODO: pylint-unclean
import logging

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import os.path
import glob

@ -20,6 +20,8 @@
#
# @end:license
# mypy: loose
import functools
import asyncio
import logging

@ -228,24 +228,41 @@ class BuiltinPyTests(unittest.TestCase):
src = open(src_path, 'r').read()
is_unclean = False
be_strict = not self.__modname.endswith('_test')
unclean_lineno = -1
for lineno, line in enumerate(src.splitlines(), 1):
if re.match(r'^#\s*mypy:\s*skip-file\s*$', line):
self.skipTest('mypy disabled for this file')
m = re.match(r'^#\s*mypy:\s*([a-z\-]+)\s*$', line)
if m is not None:
if m.group(1) == 'skip-file':
self.skipTest('mypy disabled for this file')
elif m.group(1) == 'strict':
be_strict = True
elif m.group(1) == 'loose':
be_strict = False
else:
self.fail("Invalid mypy directive '%s'" % m.group(1))
if re.match(r'^#\s*TODO:\s*mypy-unclean\s*$', line):
is_unclean = True
unclean_lineno = lineno
be_pedantic = self.__pedantic or not is_unclean
be_strict = self.__pedantic or be_strict
mypy_ini_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'mypy.ini'))
mypy_argv = [
os.path.join(os.environ['VIRTUAL_ENV'], 'bin', 'mypy'),
'--config-file', mypy_ini_path,
'--cache-dir=%s' % os.path.join(LIBDIR, 'mypy-cache'),
'--show-traceback',
'-m', self.__modname,
]
if be_strict:
mypy_argv.append('--disallow-untyped-defs')
proc = subprocess.run(
[os.path.join(os.environ['VIRTUAL_ENV'], 'bin', 'mypy'),
'--config-file', mypy_ini_path,
'--cache-dir=%s' % os.path.join(LIBDIR, 'mypy-cache'),
'--show-traceback',
'-m', self.__modname,
],
mypy_argv,
cwd=LIBDIR,
env={
'MYPYPATH': SITE_PACKAGES_DIR,

Loading…
Cancel
Save