Skip to content

Commit 74ea509

Browse files
authored
openpyxl: Cell | MergedCell annotations (#13092)
1 parent 0a541ad commit 74ea509

File tree

9 files changed

+53
-45
lines changed

9 files changed

+53
-45
lines changed

stubs/openpyxl/openpyxl/cell/__init__.pyi

+2
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ _CellValue: TypeAlias = ( # noqa: Y047 # Used in other modules
2222
| ArrayFormula
2323
)
2424
_AnyCellValue: TypeAlias = Any # Any of _CellValue # noqa: Y047 # Used in other modules
25+
26+
_CellOrMergedCell: TypeAlias = Cell | MergedCell # noqa: Y047 # Used in other modules
+4-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from _typeshed import Incomplete, Unused
22

3-
def etree_write_cell(xf, worksheet: Unused, cell, styled: Incomplete | None = None) -> None: ...
4-
def lxml_write_cell(xf, worksheet: Unused, cell, styled: bool = False) -> None: ...
3+
from openpyxl.cell import _CellOrMergedCell
4+
5+
def etree_write_cell(xf, worksheet: Unused, cell: _CellOrMergedCell, styled: Incomplete | None = None) -> None: ...
6+
def lxml_write_cell(xf, worksheet: Unused, cell: _CellOrMergedCell, styled: bool = False) -> None: ...
57

68
write_cell = lxml_write_cell
79
write_cell = etree_write_cell

stubs/openpyxl/openpyxl/cell/cell.pyi

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ from datetime import datetime
33
from re import Pattern
44
from typing import Final, Literal, overload
55

6-
from openpyxl.cell import _CellValue, _TimeTypes
6+
from openpyxl.cell import _CellOrMergedCell, _CellValue, _TimeTypes
77
from openpyxl.comments.comments import Comment
88
from openpyxl.compat.numbers import NUMERIC_TYPES as NUMERIC_TYPES # cell numeric types
99
from openpyxl.styles.cell_style import StyleArray
@@ -75,7 +75,7 @@ class Cell(StyleableObject):
7575
def hyperlink(self, val: Hyperlink | str | None) -> None: ...
7676
@property
7777
def is_date(self) -> bool: ...
78-
def offset(self, row: int = 0, column: int = 0) -> Cell: ...
78+
def offset(self, row: int = 0, column: int = 0) -> _CellOrMergedCell: ...
7979
@property
8080
def comment(self) -> Comment | None: ...
8181
@comment.setter

stubs/openpyxl/openpyxl/comments/comment_sheet.pyi

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ from collections.abc import Generator
33
from typing import ClassVar, Literal, overload
44
from typing_extensions import TypeAlias
55

6+
from openpyxl.cell import _CellOrMergedCell
67
from openpyxl.cell.text import Text
78
from openpyxl.comments.author import AuthorList
89
from openpyxl.comments.comments import Comment
@@ -101,7 +102,7 @@ class CommentRecord(Serialisable):
101102
width: int = 144,
102103
) -> None: ...
103104
@classmethod
104-
def from_cell(cls, cell): ...
105+
def from_cell(cls, cell: _CellOrMergedCell): ...
105106
@property
106107
def content(self) -> str: ...
107108

stubs/openpyxl/openpyxl/worksheet/_read_only.pyi

+5-14
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
from _typeshed import SupportsGetItem
2-
from collections.abc import Generator, Iterator
3-
from typing import Any, overload
2+
from collections.abc import Generator
43

54
from openpyxl import _VisibilityType
6-
from openpyxl.cell import _CellValue
7-
from openpyxl.cell.cell import Cell
5+
from openpyxl.cell import _CellOrMergedCell, _CellValue
86
from openpyxl.utils.cell import _RangeBoundariesTuple
97
from openpyxl.workbook.workbook import Workbook
108
from openpyxl.worksheet.worksheet import Worksheet
@@ -21,16 +19,9 @@ class ReadOnlyWorksheet:
2119
# Same as Worksheet.rows
2220
# https://github.com/python/mypy/issues/6700
2321
@property
24-
def rows(self) -> Generator[tuple[Cell, ...], None, None]: ...
25-
# From Worksheet.__getitem__
26-
@overload
27-
def __getitem__(self, key: int) -> tuple[Cell, ...]: ...
28-
@overload
29-
def __getitem__(self, key: slice) -> tuple[Any, ...]: ... # tuple[AnyOf[Cell, tuple[Cell, ...]]]
30-
@overload
31-
def __getitem__(self, key: str) -> Any: ... # AnyOf[Cell, tuple[Cell, ...], tuple[tuple[Cell, ...], ...]]
32-
# From Worksheet.__iter__
33-
def __iter__(self) -> Iterator[tuple[Cell, ...]]: ...
22+
def rows(self) -> Generator[tuple[_CellOrMergedCell, ...], None, None]: ...
23+
__getitem__ = Worksheet.__getitem__
24+
__iter__ = Worksheet.__iter__
3425
parent: Workbook
3526
title: str
3627
sheet_state: _VisibilityType

stubs/openpyxl/openpyxl/worksheet/_reader.pyi

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ from datetime import datetime
44
from typing import Final
55
from xml.etree.ElementTree import _FileRead
66

7-
from openpyxl.cell import _AnyCellValue
8-
from openpyxl.cell.cell import Cell
7+
from openpyxl.cell import _AnyCellValue, _CellOrMergedCell
98
from openpyxl.cell.rich_text import CellRichText
109
from openpyxl.descriptors.serialisable import _ChildSerialisableTreeElement, _SerialisableTreeElement
1110
from openpyxl.formula.translate import Translator
@@ -111,7 +110,7 @@ class WorksheetReader:
111110
def bind_tables(self) -> None: ...
112111
def bind_merged_cells(self) -> None: ...
113112
def bind_hyperlinks(self) -> None: ...
114-
def normalize_merged_cell_link(self, coord: str) -> Cell | None: ...
113+
def normalize_merged_cell_link(self, coord: str) -> _CellOrMergedCell | None: ...
115114
def bind_col_dimensions(self) -> None: ...
116115
def bind_row_dimensions(self) -> None: ...
117116
def bind_properties(self) -> None: ...

stubs/openpyxl/openpyxl/worksheet/_writer.pyi

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from _typeshed import Incomplete, ReadableBuffer, StrPath, Unused
2-
from collections.abc import Generator
2+
from collections.abc import Generator, Iterable
33
from typing import Protocol
44
from typing_extensions import TypeAlias
55

6+
from openpyxl.cell import _CellOrMergedCell
67
from openpyxl.worksheet._write_only import WriteOnlyWorksheet
78
from openpyxl.worksheet.worksheet import Worksheet
89

@@ -30,9 +31,9 @@ class WorksheetWriter:
3031
def write_views(self) -> None: ...
3132
def write_cols(self) -> None: ...
3233
def write_top(self) -> None: ...
33-
def rows(self) -> list[tuple[int, list[Incomplete]]]: ...
34+
def rows(self) -> list[tuple[int, list[_CellOrMergedCell]]]: ...
3435
def write_rows(self) -> None: ...
35-
def write_row(self, xf, row, row_idx) -> None: ...
36+
def write_row(self, xf, row: Iterable[_CellOrMergedCell], row_idx) -> None: ...
3637
def write_protection(self) -> None: ...
3738
def write_scenarios(self) -> None: ...
3839
def write_filter(self) -> None: ...

stubs/openpyxl/openpyxl/worksheet/merge.pyi

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from _typeshed import Incomplete, Unused
22
from typing import ClassVar
33

4+
from openpyxl.cell import _CellOrMergedCell
45
from openpyxl.descriptors.serialisable import Serialisable
56
from openpyxl.worksheet.worksheet import Worksheet
67

@@ -29,7 +30,7 @@ class MergeCells(Serialisable):
2930

3031
class MergedCellRange(CellRange):
3132
ws: Worksheet
32-
start_cell: Incomplete
33+
start_cell: _CellOrMergedCell
3334
def __init__(self, worksheet: Worksheet, coord) -> None: ...
3435
def format(self) -> None: ...
3536
def __contains__(self, coord: str) -> bool: ...

stubs/openpyxl/openpyxl/worksheet/worksheet.pyi

+30-19
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ from typing import Any, Final, Literal, NoReturn, overload
66
from typing_extensions import deprecated
77

88
from openpyxl import _Decodable, _VisibilityType
9-
from openpyxl.cell import _CellValue
9+
from openpyxl.cell import _CellOrMergedCell, _CellValue
1010
from openpyxl.cell.cell import Cell
1111
from openpyxl.chart._chart import ChartBase
1212
from openpyxl.drawing.image import Image
@@ -51,6 +51,7 @@ class Worksheet(_WorkbookChild):
5151
ORIENTATION_PORTRAIT: Final = "portrait"
5252
ORIENTATION_LANDSCAPE: Final = "landscape"
5353

54+
_cells: dict[tuple[int, int], _CellOrMergedCell] # private but very useful to understand typing
5455
row_dimensions: DimensionHolder[int, RowDimension]
5556
column_dimensions: DimensionHolder[str, ColumnDimension]
5657
row_breaks: RowBreak
@@ -85,19 +86,21 @@ class Worksheet(_WorkbookChild):
8586
@property
8687
def freeze_panes(self) -> str | None: ...
8788
@freeze_panes.setter
88-
def freeze_panes(self, topLeftCell: str | Cell | None = ...) -> None: ...
89-
def cell(self, row: int, column: int, value: _CellValue | None = None) -> Cell: ...
89+
def freeze_panes(self, topLeftCell: str | Cell | None = None) -> None: ...
90+
def cell(self, row: int, column: int, value: _CellValue | None = None) -> _CellOrMergedCell: ...
9091
# An int is necessarily a row selection
9192
@overload
92-
def __getitem__(self, key: int) -> tuple[Cell, ...]: ...
93+
def __getitem__(self, key: int) -> tuple[_CellOrMergedCell, ...]: ...
9394
# A slice is necessarily a row or rows, even if targetting a single cell
9495
@overload
95-
def __getitem__(self, key: slice) -> tuple[Any, ...]: ... # tuple[AnyOf[Cell, tuple[Cell, ...]]]
96+
def __getitem__(self, key: slice) -> tuple[Any, ...]: ... # tuple[AnyOf[_CellOrMergedCell, tuple[_CellOrMergedCell, ...]]]
9697
# A str could be an individual cell, row, column or full range
9798
@overload
98-
def __getitem__(self, key: str) -> Any: ... # AnyOf[Cell, tuple[Cell, ...], tuple[tuple[Cell, ...], ...]]
99+
def __getitem__(
100+
self, key: str
101+
) -> Any: ... # AnyOf[_CellOrMergedCell, tuple[_CellOrMergedCell, ...], tuple[tuple[_CellOrMergedCell, ...], ...]]
99102
def __setitem__(self, key: str, value: _CellValue) -> None: ...
100-
def __iter__(self) -> Iterator[tuple[Cell, ...]]: ...
103+
def __iter__(self) -> Iterator[tuple[_CellOrMergedCell, ...]]: ...
101104
def __delitem__(self, key: str) -> None: ...
102105
@property
103106
def min_row(self) -> int: ...
@@ -132,11 +135,13 @@ class Worksheet(_WorkbookChild):
132135
min_col: int | None = None,
133136
max_col: int | None = None,
134137
values_only: Literal[False] = False,
135-
) -> Generator[tuple[Cell, ...], None, None]: ...
138+
) -> Generator[tuple[_CellOrMergedCell, ...], None, None]: ...
136139
@overload
137140
def iter_rows(
138141
self, min_row: int | None, max_row: int | None, min_col: int | None, max_col: int | None, values_only: bool
139-
) -> Generator[tuple[Cell, ...], None, None] | Generator[tuple[str | float | datetime | None, ...], None, None]: ...
142+
) -> (
143+
Generator[tuple[_CellOrMergedCell, ...], None, None] | Generator[tuple[str | float | datetime | None, ...], None, None]
144+
): ...
140145
@overload
141146
def iter_rows(
142147
self,
@@ -146,9 +151,11 @@ class Worksheet(_WorkbookChild):
146151
max_col: int | None = None,
147152
*,
148153
values_only: bool,
149-
) -> Generator[tuple[Cell, ...], None, None] | Generator[tuple[str | float | datetime | None, ...], None, None]: ...
154+
) -> (
155+
Generator[tuple[_CellOrMergedCell, ...], None, None] | Generator[tuple[str | float | datetime | None, ...], None, None]
156+
): ...
150157
@property
151-
def rows(self) -> Generator[tuple[Cell, ...], None, None]: ...
158+
def rows(self) -> Generator[tuple[_CellOrMergedCell, ...], None, None]: ...
152159
@property
153160
def values(self) -> Generator[tuple[_CellValue | None, ...]]: ...
154161
@overload
@@ -173,11 +180,13 @@ class Worksheet(_WorkbookChild):
173180
min_row: int | None = None,
174181
max_row: int | None = None,
175182
values_only: Literal[False] = False,
176-
) -> Generator[tuple[Cell, ...], None, None]: ...
183+
) -> Generator[tuple[_CellOrMergedCell, ...], None, None]: ...
177184
@overload
178185
def iter_cols(
179186
self, min_col: int | None, max_col: int | None, min_row: int | None, max_row: int | None, values_only: bool
180-
) -> Generator[tuple[Cell, ...], None, None] | Generator[tuple[str | float | datetime | None, ...], None, None]: ...
187+
) -> (
188+
Generator[tuple[_CellOrMergedCell, ...], None, None] | Generator[tuple[str | float | datetime | None, ...], None, None]
189+
): ...
181190
@overload
182191
def iter_cols(
183192
self,
@@ -187,9 +196,11 @@ class Worksheet(_WorkbookChild):
187196
max_row: int | None = None,
188197
*,
189198
values_only: bool,
190-
) -> Generator[tuple[Cell, ...], None, None] | Generator[tuple[str | float | datetime | None, ...], None, None]: ...
199+
) -> (
200+
Generator[tuple[_CellOrMergedCell, ...], None, None] | Generator[tuple[str | float | datetime | None, ...], None, None]
201+
): ...
191202
@property
192-
def columns(self) -> Generator[tuple[Cell, ...], None, None]: ...
203+
def columns(self) -> Generator[tuple[_CellOrMergedCell, ...], None, None]: ...
193204
@property
194205
def column_groups(self) -> list[str]: ...
195206
def set_printer_settings(
@@ -241,11 +252,11 @@ class Worksheet(_WorkbookChild):
241252
def append(
242253
self,
243254
iterable: (
244-
list[Incomplete]
245-
| tuple[Incomplete, ...]
255+
list[Any] # lists are invariant, but any subtype or union will do
256+
| tuple[_CellOrMergedCell | str | float | datetime | None, ...]
246257
| range
247-
| GeneratorType[Incomplete, object, object]
248-
| dict[int | str, Incomplete]
258+
| GeneratorType[_CellOrMergedCell | str | float | datetime | None, object, object]
259+
| dict[int | str, str | float | datetime | None]
249260
),
250261
) -> None: ...
251262
def insert_rows(self, idx: int, amount: int = 1) -> None: ...

0 commit comments

Comments
 (0)