From 16cb91b99a3741248038c486e957a3fb3945bbf3 Mon Sep 17 00:00:00 2001 From: Avasam Date: Sat, 14 Jan 2023 13:39:09 -0500 Subject: [PATCH 1/3] Fix Any subclassing in fpdf2 --- stubs/fpdf2/fpdf/_fonttools_shims.pyi | 46 +++++++++++++++++++++++++++ stubs/fpdf2/fpdf/svg.pyi | 13 ++++---- 2 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 stubs/fpdf2/fpdf/_fonttools_shims.pyi diff --git a/stubs/fpdf2/fpdf/_fonttools_shims.pyi b/stubs/fpdf2/fpdf/_fonttools_shims.pyi new file mode 100644 index 000000000000..ea13999b5e76 --- /dev/null +++ b/stubs/fpdf2/fpdf/_fonttools_shims.pyi @@ -0,0 +1,46 @@ +# from fontTools.misc.loggingTools +from collections.abc import Mapping +from logging import Logger +from typing import Protocol +from typing_extensions import TypeAlias + +# from fonttools.ttLib.ttGlyphSet +class _TTGlyph(Protocol): + def __init__(self, glyphSet: _TTGlyphSet, glyphName: str) -> None: ... + def draw(self, pen) -> None: ... + def drawPoints(self, pen) -> None: ... + +_TTGlyphSet: TypeAlias = Mapping[str, _TTGlyph] # Simplified for our needs + +# from fontTools.misc.loggingTools + +class LogMixin: + @property + def log(self) -> Logger: ... + +# from fontTools.pens.basePen +class AbstractPen: + def moveTo(self, pt: tuple[float, float]) -> None: ... + def lineTo(self, pt: tuple[float, float]) -> None: ... + def curveTo(self, *points: tuple[float, float]) -> None: ... + def qCurveTo(self, *points: tuple[float, float]) -> None: ... + def closePath(self) -> None: ... + def endPath(self) -> None: ... + def addComponent(self, glyphName: str, transformation: tuple[float, float, float, float, float, float]) -> None: ... + +class LoggingPen(LogMixin, AbstractPen): ... + +class DecomposingPen(LoggingPen): + skipMissingComponents: bool + glyphSet: _TTGlyphSet | None + def __init__(self, glyphSet: _TTGlyphSet | None) -> None: ... + def addComponent(self, glyphName: str, transformation: tuple[float, float, float, float, float, float]) -> None: ... + +class BasePen(DecomposingPen): + def __init__(self, glyphSet: _TTGlyphSet | None = ...) -> None: ... + def closePath(self) -> None: ... + def endPath(self) -> None: ... + def moveTo(self, pt: tuple[float, float]) -> None: ... + def lineTo(self, pt: tuple[float, float]) -> None: ... + def curveTo(self, *points: tuple[float, float]) -> None: ... + def qCurveTo(self, *points: tuple[float, float]) -> None: ... diff --git a/stubs/fpdf2/fpdf/svg.pyi b/stubs/fpdf2/fpdf/svg.pyi index 3d8838c79827..0d4c9cb432a0 100644 --- a/stubs/fpdf2/fpdf/svg.pyi +++ b/stubs/fpdf2/fpdf/svg.pyi @@ -1,9 +1,10 @@ from _typeshed import Incomplete from collections.abc import Callable from re import Pattern -from typing_extensions import TypeAlias -_BasePen: TypeAlias = Incomplete # actually fontTools.pens.basePen.BasePen +from fpdf.drawing import PaintedPath + +from ._fonttools_shims import BasePen, _TTGlyphSet __pdoc__: dict[str, bool] @@ -56,14 +57,14 @@ class ShapeBuilder: def convert_transforms(tfstr): ... -class PathPen(_BasePen): - pdf_path: Incomplete +class PathPen(BasePen): + pdf_path: PaintedPath last_was_line_to: bool first_is_move: bool | None - def __init__(self, pdf_path, *args, **kwargs): ... + def __init__(self, pdf_path: PaintedPath, glyphSet: _TTGlyphSet | None = ...): ... def arcTo(self, rx, ry, rotation, arc, sweep, end) -> None: ... -def svg_path_converter(pdf_path, svg_path) -> None: ... +def svg_path_converter(pdf_path: PaintedPath, svg_path: str) -> None: ... class SVGObject: @classmethod From d03ab35582e7660ea279b9574eea7e74d068b2a9 Mon Sep 17 00:00:00 2001 From: Avasam Date: Sat, 14 Jan 2023 13:47:36 -0500 Subject: [PATCH 2/3] add shim to allowlist --- stubs/fpdf2/@tests/stubtest_allowlist.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stubs/fpdf2/@tests/stubtest_allowlist.txt b/stubs/fpdf2/@tests/stubtest_allowlist.txt index 45c179096727..33e177c95331 100644 --- a/stubs/fpdf2/@tests/stubtest_allowlist.txt +++ b/stubs/fpdf2/@tests/stubtest_allowlist.txt @@ -12,3 +12,6 @@ fpdf.output.signer # Argument has default at runtime, but using it raises a TypeError. fpdf.FPDF.set_creation_date fpdf.fpdf.FPDF.set_creation_date + +# fonttools shims since we can't import it +fpdf._fonttools_shims From 32a8aac9898b5ab1c810ce754f7306fc9c14a2ed Mon Sep 17 00:00:00 2001 From: Avasam Date: Mon, 6 Feb 2023 19:29:36 -0500 Subject: [PATCH 3/3] Add abstractmethod --- stubs/fpdf2/fpdf/_fonttools_shims.pyi | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/stubs/fpdf2/fpdf/_fonttools_shims.pyi b/stubs/fpdf2/fpdf/_fonttools_shims.pyi index ea13999b5e76..95c6c6d339da 100644 --- a/stubs/fpdf2/fpdf/_fonttools_shims.pyi +++ b/stubs/fpdf2/fpdf/_fonttools_shims.pyi @@ -1,4 +1,5 @@ # from fontTools.misc.loggingTools +from abc import ABCMeta, abstractmethod from collections.abc import Mapping from logging import Logger from typing import Protocol @@ -20,17 +21,22 @@ class LogMixin: # from fontTools.pens.basePen class AbstractPen: + @abstractmethod def moveTo(self, pt: tuple[float, float]) -> None: ... + @abstractmethod def lineTo(self, pt: tuple[float, float]) -> None: ... + @abstractmethod def curveTo(self, *points: tuple[float, float]) -> None: ... + @abstractmethod def qCurveTo(self, *points: tuple[float, float]) -> None: ... def closePath(self) -> None: ... def endPath(self) -> None: ... + @abstractmethod def addComponent(self, glyphName: str, transformation: tuple[float, float, float, float, float, float]) -> None: ... -class LoggingPen(LogMixin, AbstractPen): ... +class LoggingPen(LogMixin, AbstractPen, metaclass=ABCMeta): ... -class DecomposingPen(LoggingPen): +class DecomposingPen(LoggingPen, metaclass=ABCMeta): skipMissingComponents: bool glyphSet: _TTGlyphSet | None def __init__(self, glyphSet: _TTGlyphSet | None) -> None: ...