Skip to content

Commit

Permalink
mypy: Cleans up most overrides. Adds some missing stubs
Browse files Browse the repository at this point in the history
  • Loading branch information
Daverball authored Jul 18, 2024
1 parent 37e4cc0 commit 06a504c
Show file tree
Hide file tree
Showing 57 changed files with 600 additions and 166 deletions.
29 changes: 1 addition & 28 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,44 +45,17 @@ mypy_path = "$MYPY_CONFIG_FILE_DIR/src:$MYPY_CONFIG_FILE_DIR/stubs"
[[tool.mypy.overrides]]
# ignore missing imports for packages that have no stubs available
module = [
"bjoern.*",
"cssutils.*",
"elasticsearch_dsl.*",
"docxtpl.*",
"dill.*",
"dukpy.*",
"genshi.*",
# FIXME: Do we really need this? We have this implemented ourselves
# in OCQMS, so we could just copy that code over... plus the
# standard lib technically supports some ISO-8601 formats as well
"isodate.*",
"kerberos.*",
# TODO: Consider switching to fasttext-langdetect
# langdetect is really, really slow by comparison...
"langdetect.*",
"lazy_object_proxy.*",
"mistletoe.*",
"msal.*",
"pdfdocument.*",
# FIXME: We only use this to convert a PDF to an XObject and then
# embed it as a reportlab Flowable. I think we could implement
# this using just pypdf, having multiple PDF parsers just for
# this one use-case seems bad
"pdfrw.*",
"pdftotext.*",
"pglast.*",
"purl.*",
"svglib.*",
"stdnum.*",
"ua_parser.*",
# FIXME: Remove after https://github.com/lipoja/URLExtract/issues/164
"urlextract.*",
"webassets.*",
"webtest.*",
"xlrd.*",
# FIXME: Do we actually need this or can we just only use openpyxl?
"xlsxwriter.*",
"yubico_client.*",
"zope.*"
]
ignore_missing_imports = true

Expand Down
4 changes: 3 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ install_requires =
rjsmin
sedate
sentry_sdk
# FIXME: 71 breaks something with vendored importlib
setuptools<71
sortedcontainers
sqlalchemy<1.4.0
sqlalchemy-utils
Expand Down Expand Up @@ -222,7 +224,7 @@ mypy =
types-redis
types-reportlab
types-requests
types-setuptools
types-setuptools<71
types-stripe
types-toposort
types-translationstring
Expand Down
7 changes: 6 additions & 1 deletion src/onegov/agency/pdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ def page_fn_footer(canvas: 'Canvas', doc: 'Template') -> None:
"""

assert doc.title is not None
assert hasattr(doc, 'created')
canvas.saveState()
canvas.setFont('Helvetica', 9)
canvas.drawString(
Expand Down Expand Up @@ -254,6 +256,7 @@ def page_fn_footer(canvas: 'Canvas', doc: 'Template') -> None:
"""

assert hasattr(doc, 'created')
canvas.saveState()
canvas.setFont('Helvetica', 9)
canvas.drawString(
Expand All @@ -280,6 +283,7 @@ def page_fn_header_logo_and_footer(
height = .81 * cm
width = height * 5.72

assert hasattr(doc, 'logo')
canvas.saveState()
canvas.drawImage(
doc.logo,
Expand Down Expand Up @@ -357,6 +361,7 @@ def page_fn_header(canvas: 'Canvas', doc: 'Template') -> None:
numbers.
"""
assert hasattr(doc, 'logo')
height = 1.85 * cm
width = height * 2.77

Expand All @@ -374,7 +379,7 @@ def page_fn_header(canvas: 'Canvas', doc: 'Template') -> None:

@staticmethod
def page_fn_footer(canvas: 'Canvas', doc: 'Template') -> None:

assert hasattr(doc, 'created')
canvas.saveState()
canvas.setFont('Helvetica', 9)
canvas.drawString(
Expand Down
2 changes: 1 addition & 1 deletion src/onegov/core/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def my_view():
"""

import dill
import dill # type:ignore[import-untyped]

from dogpile.cache import CacheRegion
from dogpile.cache.api import NO_VALUE
Expand Down
2 changes: 1 addition & 1 deletion src/onegov/core/cli/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ def my_click_command():
from sqlalchemy.pool import NullPool
from sqlalchemy import create_engine
from uuid import uuid4
from webtest import TestApp as Client
from webtest import TestApp as Client # type:ignore[import-untyped]


from typing import Any, NoReturn, TYPE_CHECKING
Expand Down
2 changes: 1 addition & 1 deletion src/onegov/core/csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import re
import sys
import tempfile
import xlrd
import xlrd # type:ignore[import-untyped]

from collections import namedtuple, OrderedDict
from csv import DictWriter, Sniffer, QUOTE_ALL
Expand Down
9 changes: 5 additions & 4 deletions src/onegov/core/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
import os
import rcssmin # type:ignore[import-untyped]

from webassets.filter import Filter, register_filter
from webassets.filter.datauri import CSSDataUri, CSSUrlRewriter
from dukpy.webassets import BabelJSX
from dukpy import jsx_compile
from webassets.filter import Filter, register_filter # type:ignore
from webassets.filter.datauri import ( # type:ignore[import-untyped]
CSSDataUri, CSSUrlRewriter)
from dukpy.webassets import BabelJSX # type:ignore[import-untyped]
from dukpy import jsx_compile # type:ignore[import-untyped]


from typing import Any, IO
Expand Down
3 changes: 0 additions & 3 deletions src/onegov/core/framework.py
Original file line number Diff line number Diff line change
Expand Up @@ -731,9 +731,6 @@ def object_by_path(
"""

# strip host and scheme
path = URL(path).path()

request = self.request_class(environ={
'PATH_INFO': URL(path).path(),
'SERVER_NAME': '',
Expand Down
4 changes: 2 additions & 2 deletions src/onegov/core/html_diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
from itertools import chain, zip_longest

import html5lib
from genshi.core import Stream, QName, Attrs, START, END, TEXT
from genshi.input import ET
from genshi.core import Stream, QName, Attrs, START, END, TEXT # type:ignore
from genshi.input import ET # type:ignore[import-untyped]
from markupsafe import Markup


Expand Down
4 changes: 2 additions & 2 deletions src/onegov/core/markdown.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import html

from mistletoe import Document, HtmlRenderer
from mistletoe import Document, HtmlRenderer # type:ignore[import-untyped]
from onegov.core.html import sanitize_html


from typing import TYPE_CHECKING
if TYPE_CHECKING:
from markupsafe import Markup
from mistletoe.span_token import HTMLBlock, HTMLSpan
from mistletoe.span_token import HTMLBlock, HTMLSpan # type:ignore


RENDERER_INSTANCES = {}
Expand Down
2 changes: 1 addition & 1 deletion src/onegov/core/orm/abstract/adjacency_list.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from enum import Enum
from itertools import chain
from lazy_object_proxy import Proxy
from lazy_object_proxy import Proxy # type:ignore[import-untyped]
from onegov.core.orm import Base, observes
from onegov.core.utils import normalize_for_url, increment_name, is_sorted
from sqlalchemy import Column, ForeignKey, Integer, Text
Expand Down
4 changes: 2 additions & 2 deletions src/onegov/core/orm/sql.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import os
import pglast
import pglast # type:ignore[import-untyped]
import re

from onegov.core.cache import lru_cache
Expand All @@ -12,7 +12,7 @@
from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Iterator
from pglast.ast import RawStmt
from pglast.ast import RawStmt # type:ignore[import-untyped]
from sqlalchemy.sql.selectable import Alias
from sqlalchemy.types import TypeEngine

Expand Down
2 changes: 1 addition & 1 deletion src/onegov/core/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from morepath.request import SAME_APP
from onegov.core import utils
from onegov.core.crypto import random_token
from ua_parser import user_agent_parser
from ua_parser import user_agent_parser # type:ignore[import-untyped]
from webob.exc import HTTPForbidden
from wtforms.csrf.session import SessionCSRF

Expand Down
6 changes: 3 additions & 3 deletions src/onegov/core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@
from unidecode import unidecode
from uuid import UUID, uuid4
from webob import static
from yubico_client import Yubico
from yubico_client.yubico_exceptions import SignatureVerificationError
from yubico_client.yubico_exceptions import StatusCodeError
from yubico_client import Yubico # type:ignore[import-untyped]
from yubico_client.yubico_exceptions import ( # type:ignore[import-untyped]
SignatureVerificationError, StatusCodeError)


from typing import overload, Any, TypeVar, TYPE_CHECKING
Expand Down
10 changes: 5 additions & 5 deletions src/onegov/election_day/pdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from datetime import date
from datetime import datetime
from gettext import GNUTranslations
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.styles import PropertySet


class Pdf(PdfBase):
Expand Down Expand Up @@ -86,25 +86,25 @@ def translate(self, text: str) -> str:
translated = translator.gettext(text)
return text.interpolate(translated)

def h1(self, title: str, style: 'ParagraphStyle | None' = None) -> None:
def h1(self, title: str, style: 'PropertySet | None' = None) -> None:
""" Translated H1. """

super().h1(self.translate(title), style=style)

def h2(self, title: str, style: 'ParagraphStyle | None' = None) -> None:
def h2(self, title: str, style: 'PropertySet | None' = None) -> None:
""" Translated H2. """

super().h2(self.translate(title), style=style)

def h3(self, title: str, style: 'ParagraphStyle | None' = None) -> None:
def h3(self, title: str, style: 'PropertySet | None' = None) -> None:
""" Translated H3. """

super().h3(self.translate(title), style=style)

def figcaption(
self,
text: str,
style: 'ParagraphStyle | None' = None
style: 'PropertySet | None' = None
) -> None:
""" Translated Figcaption. """

Expand Down
3 changes: 2 additions & 1 deletion src/onegov/election_day/utils/pdf_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
from onegov.election_day.models import Municipality
from onegov.election_day.models.vote.ballot import ResultsByDistrictRow
from onegov.election_day.request import ElectionDayRequest
from reportlab.platypus import Paragraph


class PdfGenerator:
Expand Down Expand Up @@ -276,7 +277,7 @@ def format_name(item: 'ElectionResult') -> str:

connections = get_connection_results(election, self.session)
spacers = []
table = [[
table: list[list[Paragraph | str]] = [[
'{} / {} / {}'.format(
pdf.translate(_('List connection')),
pdf.translate(_('Sublist connection')),
Expand Down
2 changes: 1 addition & 1 deletion src/onegov/feriennet/qrbill.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from onegov.feriennet import log
from onegov.feriennet.utils import NAME_SEPARATOR
from qrbill.bill import QRBill, IBAN_ALLOWED_COUNTRIES, QR_IID
from stdnum import iban
from stdnum import iban # type:ignore[import-untyped]


from typing import Literal, TYPE_CHECKING
Expand Down
20 changes: 9 additions & 11 deletions src/onegov/feriennet/views/booking.py
Original file line number Diff line number Diff line change
Expand Up @@ -664,19 +664,17 @@ def signup_url(attendee: Attendee | None = None) -> str:

# preselect the attendee when booking the occasion, and join this group
if attendee:
url = (URL(url)
.query_param('attendee_id', attendee.id)
.as_string())
url_obj = URL(url).query_param('attendee_id', attendee.id.hex)
else:
url = (URL(url)
.query_param('attendee_id', 'other')
.as_string())
url_obj = URL(url).query_param('attendee_id', 'other')

# preselect the group code and the username
url = (URL(url)
.query_param('group_code', self.group_code)
.query_param('username', self.username)
.as_string())
url_obj = url_obj.query_param('group_code', self.group_code)

if self.username is not None:
url_obj = url_obj.query_param('username', self.username)

url = url_obj.as_string()

# return to the current URL
url = request.return_here(url)
Expand Down Expand Up @@ -710,7 +708,7 @@ def group_action(
booking = actionable_bookings[attendee.id]

url = (URL(request.link(self, action))
.query_param('booking_id', booking.id)
.query_param('booking_id', booking.id.hex)
.as_string())
else:
url = signup_url(attendee)
Expand Down
2 changes: 1 addition & 1 deletion src/onegov/feriennet/views/invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from sqlalchemy.orm import contains_eager
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.sql.expression import case
from stdnum import iban
from stdnum import iban # type:ignore[import-untyped]
from uuid import UUID


Expand Down
2 changes: 1 addition & 1 deletion src/onegov/feriennet/views/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from onegov.org.forms.fields import HtmlField
from onegov.org.models import Organisation
from onegov.org.views.settings import handle_generic_settings
from stdnum import iban
from stdnum import iban # type:ignore[import-untyped]
from wtforms.fields import BooleanField
from wtforms.fields import RadioField
from wtforms.fields import StringField
Expand Down
2 changes: 1 addition & 1 deletion src/onegov/file/attachments.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import pdftotext
import pdftotext # type:ignore

from depot.fields.upload import UploadedFile
from depot.io import utils
Expand Down
2 changes: 1 addition & 1 deletion src/onegov/form/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import phonenumbers
import sedate

from cssutils.css import CSSStyleSheet
from cssutils.css import CSSStyleSheet # type:ignore[import-untyped]
from itertools import zip_longest
from email_validator import validate_email, EmailNotValidError
from markupsafe import escape, Markup
Expand Down
3 changes: 2 additions & 1 deletion src/onegov/form/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
from onegov.form.errors import FieldCompileError
from onegov.form.errors import InvalidFormSyntax
from onegov.form.errors import MixedTypeError
from stdnum.exceptions import ValidationError as StdnumValidationError
from stdnum.exceptions import ( # type:ignore[import-untyped]
ValidationError as StdnumValidationError)
from wtforms import DateField, DateTimeLocalField, RadioField, TimeField
from wtforms.fields import SelectField
from wtforms.validators import DataRequired
Expand Down
3 changes: 2 additions & 1 deletion src/onegov/gazette/models/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,8 @@ def publish(self, request: 'GazetteRequest') -> None:
notice.publish(request)

from onegov.gazette.pdf import IssuePdf # circular
self.pdf = IssuePdf.from_issue(
# FIXME: asymmetric property
self.pdf = IssuePdf.from_issue( # type:ignore[assignment]
issue=self,
request=request,
first_publication_number=self.first_publication_number,
Expand Down
Loading

0 comments on commit 06a504c

Please sign in to comment.