Skip to content

Commit 5f12eeb

Browse files
authored
openpyxl: type to_tree methods (#10967)
1 parent 3a036b6 commit 5f12eeb

29 files changed

+108
-44
lines changed

stubs/openpyxl/@tests/stubtest_allowlist.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ openpyxl.drawing.text.PresetTextShape.__init__
111111
openpyxl.drawing.text.TextField.__init__
112112
openpyxl.drawing.text.TextNormalAutofit.__init__
113113
openpyxl.formatting.rule.DataBar.__init__
114+
openpyxl.packaging.core.QualifiedDateTime.to_tree
114115
openpyxl.packaging.relationship.get_rel
115116
openpyxl.packaging.relationship.Relationship.__init__
116117
openpyxl.packaging.workbook.ChildSheet.__init__

stubs/openpyxl/openpyxl/chart/_chart.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ from openpyxl.chart.shapes import GraphicalProperties
88
from openpyxl.chart.title import TitleDescriptor
99
from openpyxl.descriptors.base import Alias, Bool, Integer, MinMax, Set, Typed
1010
from openpyxl.descriptors.serialisable import Serialisable
11+
from openpyxl.xml.functions import Element
1112

1213
_ChartBaseDisplayBlanks: TypeAlias = Literal["span", "gap", "zero"]
1314

@@ -41,7 +42,8 @@ class ChartBase(Serialisable):
4142
def __init__(self, axId=(), **kw: Unused) -> None: ...
4243
def __hash__(self) -> int: ...
4344
def __iadd__(self, other): ...
44-
def to_tree(self, namespace: str | None = None, tagname: str | None = None, idx: Incomplete | None = None): ... # type: ignore[override]
45+
# namespace is in the wrong order to respect the override. This is an issue in openpyxl itself
46+
def to_tree(self, namespace: Unused = None, tagname: str | None = None, idx: Unused = None) -> Element: ... # type: ignore[override]
4547
def set_categories(self, labels) -> None: ...
4648
def add_data(self, data, from_rows: bool = False, titles_from_data: bool = False) -> None: ...
4749
def append(self, value) -> None: ...

stubs/openpyxl/openpyxl/chart/chartspace.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ from openpyxl.descriptors.excel import ExtensionList
1515
from openpyxl.descriptors.nested import NestedBool, NestedMinMax, NestedNoneSet, NestedString, _NestedNoneSetParam
1616
from openpyxl.descriptors.serialisable import Serialisable
1717
from openpyxl.drawing.colors import ColorMapping
18+
from openpyxl.xml.functions import Element
1819

1920
from ..xml._functions_overloads import _HasTagAndGet
2021

@@ -140,4 +141,4 @@ class ChartSpace(Serialisable):
140141
userShapes: Incomplete | None = None,
141142
extLst: Unused = None,
142143
) -> None: ...
143-
def to_tree(self, tagname: Incomplete | None = None, idx: Incomplete | None = None, namespace: str | None = None): ...
144+
def to_tree(self, tagname: Unused = None, idx: Unused = None, namespace: Unused = None) -> Element: ...

stubs/openpyxl/openpyxl/chart/plotarea.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ from openpyxl.descriptors.base import Alias, Typed, _ConvertibleToBool
99
from openpyxl.descriptors.excel import ExtensionList
1010
from openpyxl.descriptors.nested import NestedBool
1111
from openpyxl.descriptors.serialisable import Serialisable, _ChildSerialisableTreeElement
12+
from openpyxl.xml.functions import Element
1213

1314
from ..xml._functions_overloads import _HasTagAndGet
1415

@@ -71,6 +72,6 @@ class PlotArea(Serialisable):
7172
_axes=(),
7273
extLst: Unused = None,
7374
) -> None: ...
74-
def to_tree(self, tagname: str | None = None, idx: Incomplete | None = None, namespace: str | None = None): ...
75+
def to_tree(self, tagname: str | None = None, idx: Unused = None, namespace: Unused = None) -> Element: ...
7576
@classmethod
7677
def from_tree(cls, node: _ChildSerialisableTreeElement) -> Self: ...

stubs/openpyxl/openpyxl/chart/series.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ from openpyxl.descriptors.base import Alias, Typed, _ConvertibleToBool
1313
from openpyxl.descriptors.excel import ExtensionList
1414
from openpyxl.descriptors.nested import NestedBool, NestedInteger, NestedNoneSet, NestedText, _NestedNoneSetParam
1515
from openpyxl.descriptors.serialisable import Serialisable
16+
from openpyxl.xml.functions import Element
1617

1718
from ..xml._functions_overloads import _HasTagAndGet
1819

@@ -82,7 +83,7 @@ class Series(Serialisable):
8283
explosion: _HasTagAndGet[ConvertibleToInt | None] | ConvertibleToInt | None = None,
8384
extLst: Unused = None,
8485
) -> None: ...
85-
def to_tree(self, tagname: str | None = None, idx: Incomplete | None = None): ... # type: ignore[override]
86+
def to_tree(self, tagname: str | None = None, idx: _HasTagAndGet[ConvertibleToInt] | ConvertibleToInt | None = None) -> Element: ... # type: ignore[override]
8687

8788
class XYSeries(Series):
8889
# Same as parent

stubs/openpyxl/openpyxl/chart/text.pyi

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
from _typeshed import Incomplete
1+
from _typeshed import Incomplete, Unused
22
from typing import ClassVar
33
from typing_extensions import Literal
44

55
from openpyxl.chart.data_source import StrRef
66
from openpyxl.descriptors.base import Alias, Typed
77
from openpyxl.descriptors.serialisable import Serialisable
88
from openpyxl.drawing.text import ListStyle, RichTextProperties
9+
from openpyxl.xml.functions import Element
910

1011
class RichText(Serialisable):
1112
tagname: ClassVar[str]
@@ -25,4 +26,4 @@ class Text(Serialisable):
2526
rich: Typed[RichText, Literal[True]]
2627
__elements__: ClassVar[tuple[str, ...]]
2728
def __init__(self, strRef: StrRef | None = None, rich: RichText | None = None) -> None: ...
28-
def to_tree(self, tagname: str | None = None, idx: Incomplete | None = None, namespace: str | None = None): ...
29+
def to_tree(self, tagname: str | None = None, idx: Unused = None, namespace: str | None = None) -> Element: ...

stubs/openpyxl/openpyxl/chartsheet/chartsheet.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ from openpyxl.workbook.child import _WorkbookChild
1616
from openpyxl.worksheet.drawing import Drawing
1717
from openpyxl.worksheet.header_footer import HeaderFooter as _HeaderFooter
1818
from openpyxl.worksheet.page import PageMargins, PrintPageSetup
19+
from openpyxl.xml.functions import Element
1920

2021
class Chartsheet(_WorkbookChild, Serialisable):
2122
tagname: ClassVar[str]
@@ -55,4 +56,4 @@ class Chartsheet(_WorkbookChild, Serialisable):
5556
sheet_state: _VisibilityType = "visible",
5657
) -> None: ...
5758
def add_chart(self, chart) -> None: ...
58-
def to_tree(self): ...
59+
def to_tree(self) -> Element: ... # type:ignore[override]

stubs/openpyxl/openpyxl/comments/comment_sheet.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ from openpyxl.descriptors.base import Bool, Integer, Set, String, Typed, _Conver
1010
from openpyxl.descriptors.excel import ExtensionList
1111
from openpyxl.descriptors.serialisable import Serialisable
1212
from openpyxl.worksheet.ole import ObjectAnchor
13+
from openpyxl.xml.functions import Element
1314

1415
_PropertiesTextHAlign: TypeAlias = Literal["left", "center", "right", "justify", "distributed"]
1516
_PropertiesTextVAlign: TypeAlias = Literal["top", "center", "bottom", "justify", "distributed"]
@@ -112,7 +113,7 @@ class CommentSheet(Serialisable):
112113
mime_type: str
113114
__elements__: ClassVar[tuple[str, ...]]
114115
def __init__(self, authors: AuthorList, commentList: Incomplete | None = None, extLst: Unused = None) -> None: ...
115-
def to_tree(self): ...
116+
def to_tree(self) -> Element: ... # type: ignore[override]
116117
@property
117118
def comments(self) -> Generator[tuple[str, Comment], None, None]: ...
118119
@classmethod

stubs/openpyxl/openpyxl/compat/strings.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ from typing_extensions import Final
33

44
VER: Final[sys._version_info]
55

6-
def safe_string(value): ...
6+
def safe_string(value: object) -> str: ...
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
def namespaced(obj, tagname, namespace: str | None = None): ...
1+
# 'None' shouldn't be a valid tagname and namespaced should always return str
2+
def namespaced(obj: object, tagname: str, namespace: str | None = None) -> str: ...

stubs/openpyxl/openpyxl/descriptors/nested.pyi

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from _typeshed import ConvertibleToFloat, ConvertibleToInt, Incomplete, Unused
1+
from _typeshed import ConvertibleToFloat, ConvertibleToInt, Unused
22
from collections.abc import Iterable
33
from typing import Any, ClassVar, NoReturn, overload
44
from typing_extensions import Literal, TypeAlias
@@ -36,7 +36,10 @@ class Nested(Descriptor[_T]):
3636
def __get__(self, instance: Serialisable | Strict, cls: type | None) -> _T: ...
3737
def __set__(self, instance: Serialisable | Strict, value: _HasTagAndGet[_T] | _T) -> None: ...
3838
def from_tree(self, node: _HasGet[_T]) -> _T: ...
39-
def to_tree(self, tagname: str | None = None, value: Incomplete | None = None, namespace: str | None = None) -> Element: ...
39+
@overload
40+
def to_tree(self, tagname: Unused = None, value: None = None, namespace: Unused = None) -> None: ... # type: ignore[overload-overlap]
41+
@overload
42+
def to_tree(self, tagname: str, value: object, namespace: str | None = None) -> Element: ...
4043

4144
class NestedValue(Nested[_T], Convertible[_T, _N]): # type: ignore[misc]
4245
@overload
@@ -151,7 +154,10 @@ class NestedText(NestedValue[_T, _N]):
151154
@overload
152155
def __set__(self: NestedText[_T, Literal[True]], instance: Serialisable | Strict, value: _T | int | Any | None) -> None: ...
153156
def from_tree(self, node: _HasText) -> str: ... # type: ignore[override]
154-
def to_tree(self, tagname: str | None = None, value: Incomplete | None = None, namespace: str | None = None) -> Element: ...
157+
@overload
158+
def to_tree(self, tagname: Unused = None, value: None = None, namespace: Unused = None) -> None: ... # type: ignore[overload-overlap]
159+
@overload
160+
def to_tree(self, tagname: str, value: object, namespace: str | None = None) -> Element: ...
155161

156162
class NestedFloat(NestedValue[float, _N], Float[_N]): # type: ignore[misc]
157163
@overload
@@ -264,4 +270,9 @@ class EmptyTag(Nested[bool], Bool[_N]): # type: ignore[misc]
264270
def __get__(self: EmptyTag[Literal[False]], instance: Serialisable | Strict, cls: type | None = None) -> bool: ...
265271
def __set__(self, instance: Serialisable | Strict, value: _HasTagAndGet[_ConvertibleToBool] | _ConvertibleToBool) -> None: ...
266272
def from_tree(self, node: Unused) -> Literal[True]: ...
267-
def to_tree(self, tagname: str | None = None, value: Incomplete | None = None, namespace: str | None = None) -> Element: ...
273+
@overload
274+
def to_tree( # type: ignore[overload-overlap]
275+
self, tagname: Unused = None, value: None = None, namespace: Unused = None
276+
) -> None: ...
277+
@overload
278+
def to_tree(self, tagname: str, value: object, namespace: str | None = None) -> Element: ...

stubs/openpyxl/openpyxl/descriptors/sequence.pyi

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from _typeshed import Incomplete, Unused
2-
from collections.abc import Generator, Iterable
2+
from collections.abc import Generator, Iterable, Sized
33
from typing import Any, Protocol, TypeVar
44
from typing_extensions import Self
55

66
from openpyxl.descriptors import Strict
77
from openpyxl.descriptors.serialisable import Serialisable, _SerialisableTreeElement
88
from openpyxl.xml._functions_overloads import _HasGet
9+
from openpyxl.xml.functions import Element
910

1011
from .base import Alias, Descriptor
1112

@@ -15,35 +16,48 @@ class _SupportsFromTree(Protocol):
1516
@classmethod
1617
def from_tree(cls, node: _SerialisableTreeElement) -> Any: ...
1718

19+
class _SupportsToTree(Protocol):
20+
def to_tree(self) -> Element: ...
21+
1822
class Sequence(Descriptor[Incomplete]):
1923
expected_type: type[Incomplete]
2024
seq_types: tuple[type, ...]
2125
idx_base: int
2226
unique: bool
2327
container: type
2428
def __set__(self, instance: Serialisable | Strict, seq) -> None: ...
25-
def to_tree(self, tagname, obj, namespace: str | None = None) -> Generator[Incomplete, None, None]: ...
29+
def to_tree(
30+
self, tagname: str | None, obj: Iterable[object], namespace: str | None = None
31+
) -> Generator[Element, None, None]: ...
2632

2733
class UniqueSequence(Sequence):
2834
seq_types: tuple[type, ...]
2935
container: type
3036

3137
class ValueSequence(Sequence):
3238
attribute: str
33-
def to_tree(self, tagname, obj, namespace: str | None = None) -> Generator[Incomplete, None, None]: ...
39+
def to_tree(
40+
self, tagname: str, obj: Iterable[object], namespace: str | None = None # type: ignore[override]
41+
) -> Generator[Element, None, None]: ...
3442
def from_tree(self, node: _HasGet[_T]) -> _T: ...
3543

44+
class _NestedSequenceToTreeObj(Sized, Iterable[_SupportsToTree], Protocol): ...
45+
3646
class NestedSequence(Sequence):
3747
count: bool
3848
expected_type: type[_SupportsFromTree]
39-
def to_tree(self, tagname, obj, namespace: str | None = None): ...
49+
def to_tree( # type: ignore[override]
50+
self, tagname: str, obj: _NestedSequenceToTreeObj, namespace: str | None = None
51+
) -> Element: ...
4052
# returned list generic type should be same as the return type of expected_type.from_tree(node)
4153
# Which can really be anything given the wildly different, and sometimes generic, from_tree return types
4254
def from_tree(self, node: Iterable[_SerialisableTreeElement]) -> list[Any]: ...
4355

4456
class MultiSequence(Sequence):
4557
def __set__(self, instance: Serialisable | Strict, seq) -> None: ...
46-
def to_tree(self, tagname, obj, namespace: str | None = None) -> Generator[Incomplete, None, None]: ...
58+
def to_tree(
59+
self, tagname: Unused, obj: Iterable[_SupportsToTree], namespace: str | None = None # type: ignore[override]
60+
) -> Generator[Element, None, None]: ...
4761

4862
class MultiSequencePart(Alias):
4963
expected_type: type[Incomplete]

stubs/openpyxl/openpyxl/descriptors/serialisable.pyi

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
from _typeshed import Incomplete, SupportsIter
1+
from _typeshed import ConvertibleToInt, Incomplete, SupportsIter
22
from collections.abc import Iterator
33
from typing import Any, ClassVar, Protocol
44
from typing_extensions import Final, Self
55

66
from openpyxl.descriptors import MetaSerialisable
7+
from openpyxl.xml.functions import Element
78

8-
from ..xml._functions_overloads import _HasAttrib, _HasGet, _HasText, _SupportsFindChartLines
9+
from ..xml._functions_overloads import _HasAttrib, _HasGet, _HasTagAndGet, _HasText, _SupportsFindChartLines
910

1011
# For any override directly re-using Serialisable.from_tree
1112
class _ChildSerialisableTreeElement(_HasAttrib, _HasText, SupportsIter[Incomplete], Protocol): ...
@@ -34,7 +35,14 @@ class Serialisable(metaclass=MetaSerialisable):
3435
# Use _ChildSerialisableTreeElement instead for child classes that reuse Serialisable.from_tree directly.
3536
@classmethod
3637
def from_tree(cls, node: _SerialisableTreeElement) -> Self | None: ...
37-
def to_tree(self, tagname: str | None = None, idx: Incomplete | None = None, namespace: str | None = None): ...
38+
# Note: To respect the Liskov substitution principle, idx is a type union of all child class requirements.
39+
# Use Unused instead for child classes that reuse Serialisable.to_tree directly.
40+
def to_tree(
41+
self,
42+
tagname: str | None = None,
43+
idx: _HasTagAndGet[ConvertibleToInt] | ConvertibleToInt | None = None,
44+
namespace: str | None = None,
45+
) -> Element: ...
3846
def __iter__(self) -> Iterator[tuple[str, str]]: ...
3947
def __eq__(self, other: object) -> bool: ...
4048
def __ne__(self, other: object) -> bool: ...

stubs/openpyxl/openpyxl/packaging/core.pyi

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
from _typeshed import Incomplete
2-
from typing import ClassVar
2+
from datetime import datetime
3+
from typing import ClassVar, overload
34
from typing_extensions import Literal
45

56
from openpyxl.descriptors import DateTime
67
from openpyxl.descriptors.base import Alias
78
from openpyxl.descriptors.nested import NestedText
89
from openpyxl.descriptors.serialisable import Serialisable
10+
from openpyxl.xml.functions import Element
911

1012
# Does not reimplement the relevant methods, so runtime also has incompatible supertypes
1113
class NestedDateTime(DateTime[Incomplete], NestedText[Incomplete, Incomplete]): # type: ignore[misc]
1214
expected_type: type[Incomplete]
13-
def to_tree(self, tagname: str | None = None, value: Incomplete | None = None, namespace: str | None = None): ...
15+
@overload # type: ignore[override]
16+
def to_tree(self, tagname: str | None = None, value: None = None, namespace: str | None = None) -> None: ...
17+
@overload
18+
def to_tree(self, tagname: str, value: datetime, namespace: str | None = None) -> Element: ...
1419

1520
class QualifiedDateTime(NestedDateTime):
16-
def to_tree(self, tagname: str | None = None, value: Incomplete | None = None, namespace: str | None = None): ...
21+
# value cannot be None or it'll raise
22+
def to_tree(self, tagname: str, value: datetime, namespace: str | None = None) -> Element: ... # type: ignore[override]
1723

1824
class DocumentProperties(Serialisable):
1925
tagname: ClassVar[str]

stubs/openpyxl/openpyxl/packaging/custom.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ from openpyxl.descriptors import Sequence, Strict
88
from openpyxl.descriptors.base import Bool, DateTime, Float, Integer, String, _ConvertibleToBool
99
from openpyxl.descriptors.nested import NestedText
1010
from openpyxl.descriptors.serialisable import _ChildSerialisableTreeElement
11+
from openpyxl.xml.functions import Element
1112

1213
_T = TypeVar("_T")
1314

@@ -51,7 +52,7 @@ class CustomPropertyList(Strict, Generic[_T]):
5152
@classmethod
5253
def from_tree(cls, tree: _ChildSerialisableTreeElement) -> Self: ...
5354
def append(self, prop) -> None: ...
54-
def to_tree(self): ...
55+
def to_tree(self) -> Element: ...
5556
def __len__(self) -> int: ...
5657
@property
5758
def names(self) -> list[str]: ...

stubs/openpyxl/openpyxl/packaging/extended.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ from typing_extensions import Literal
55
from openpyxl.descriptors.base import Typed
66
from openpyxl.descriptors.nested import NestedText
77
from openpyxl.descriptors.serialisable import Serialisable
8+
from openpyxl.xml.functions import Element
89

910
def get_version(): ...
1011

@@ -80,4 +81,4 @@ class ExtendedProperties(Serialisable):
8081
AppVersion: object = None,
8182
DocSecurity: ConvertibleToInt | None = None,
8283
) -> None: ...
83-
def to_tree(self): ...
84+
def to_tree(self) -> Element: ... # type: ignore[override]

stubs/openpyxl/openpyxl/packaging/manifest.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ from typing_extensions import Final, Literal
55

66
from openpyxl.descriptors.base import String
77
from openpyxl.descriptors.serialisable import Serialisable
8+
from openpyxl.xml.functions import Element
89

910
mimetypes: Incomplete
1011

@@ -34,7 +35,7 @@ class Manifest(Serialisable):
3435
def filenames(self) -> list[str]: ...
3536
@property
3637
def extensions(self) -> list[tuple[str, str]]: ...
37-
def to_tree(self): ...
38+
def to_tree(self) -> Element: ... # type: ignore[override]
3839
def __contains__(self, content_type: str) -> bool: ...
3940
def find(self, content_type): ...
4041
def findall(self, content_type) -> Generator[Incomplete, None, None]: ...

stubs/openpyxl/openpyxl/packaging/relationship.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ from openpyxl.descriptors.serialisable import Serialisable
99
from openpyxl.pivot.cache import CacheDefinition
1010
from openpyxl.pivot.record import RecordList
1111
from openpyxl.pivot.table import TableDefinition
12+
from openpyxl.xml.functions import Element
1213

1314
_SerialisableT = TypeVar("_SerialisableT", bound=Serialisable)
1415
_SerialisableRelTypeT = TypeVar("_SerialisableRelTypeT", bound=CacheDefinition | RecordList | TableDefinition)
@@ -41,7 +42,7 @@ class RelationshipList(Serialisable):
4142
def __bool__(self) -> bool: ...
4243
def find(self, content_type) -> Generator[Incomplete, None, None]: ...
4344
def __getitem__(self, key): ...
44-
def to_tree(self): ...
45+
def to_tree(self) -> Element: ... # type: ignore[override]
4546

4647
def get_rels_path(path): ...
4748
def get_dependents(archive: ZipFile, filename: str) -> RelationshipList: ...

stubs/openpyxl/openpyxl/packaging/workbook.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ from openpyxl.workbook.properties import CalcProperties, FileVersion, WorkbookPr
1313
from openpyxl.workbook.protection import FileSharing, WorkbookProtection
1414
from openpyxl.workbook.smart_tags import SmartTagList, SmartTagProperties
1515
from openpyxl.workbook.web import WebPublishing, WebPublishObjectList
16+
from openpyxl.xml.functions import Element
1617

1718
_WorkbookPackageConformance: TypeAlias = Literal["strict", "transitional"]
1819

@@ -99,6 +100,6 @@ class WorkbookPackage(Serialisable):
99100
extLst: Unused = None,
100101
Ignorable: Unused = None,
101102
) -> None: ...
102-
def to_tree(self): ...
103+
def to_tree(self) -> Element: ... # type: ignore[override]
103104
@property
104105
def active(self) -> int: ...

stubs/openpyxl/openpyxl/pivot/cache.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ from openpyxl.descriptors.nested import NestedInteger
99
from openpyxl.descriptors.serialisable import Serialisable
1010
from openpyxl.pivot.fields import Error, Missing, Number, Text, TupleList
1111
from openpyxl.pivot.table import PivotArea
12+
from openpyxl.xml.functions import Element
1213

1314
from ..xml._functions_overloads import _HasTagAndGet
1415

@@ -710,6 +711,6 @@ class CacheDefinition(Serialisable):
710711
extLst: ExtensionList | None = None,
711712
id: Incomplete | None = None,
712713
) -> None: ...
713-
def to_tree(self): ...
714+
def to_tree(self) -> Element: ... # type: ignore[override]
714715
@property
715716
def path(self) -> str: ...

0 commit comments

Comments
 (0)