From 8877c12cdf5d763210fe75cd2bd5b31ad085b281 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Wed, 15 Mar 2023 08:50:16 +0100 Subject: [PATCH] [openpyxl] Update to 3.1, add more annotations (#9875) Closes: #9644 --- stubs/openpyxl/@tests/stubtest_allowlist.txt | 3 + stubs/openpyxl/METADATA.toml | 2 +- stubs/openpyxl/openpyxl/drawing/drawing.pyi | 3 +- .../openpyxl/openpyxl/packaging/workbook.pyi | 2 - stubs/openpyxl/openpyxl/reader/excel.pyi | 44 +++++++++----- stubs/openpyxl/openpyxl/reader/workbook.pyi | 4 +- .../openpyxl/workbook/defined_name.pyi | 25 ++++---- stubs/openpyxl/openpyxl/workbook/workbook.pyi | 5 -- stubs/openpyxl/openpyxl/worksheet/_reader.pyi | 59 ++++++++++++------- stubs/openpyxl/openpyxl/worksheet/formula.pyi | 37 ++++++++++++ .../openpyxl/openpyxl/worksheet/worksheet.pyi | 7 +-- stubs/openpyxl/openpyxl/writer/excel.pyi | 1 - 12 files changed, 121 insertions(+), 71 deletions(-) create mode 100644 stubs/openpyxl/openpyxl/worksheet/formula.pyi diff --git a/stubs/openpyxl/@tests/stubtest_allowlist.txt b/stubs/openpyxl/@tests/stubtest_allowlist.txt index 3592ee371..b5bd2f3b0 100644 --- a/stubs/openpyxl/@tests/stubtest_allowlist.txt +++ b/stubs/openpyxl/@tests/stubtest_allowlist.txt @@ -1,2 +1,5 @@ # "cls" argument has wrong name in implementation. openpyxl.descriptors.slots.AutoSlotProperties.__new__ + +# Requires numpy to be installed +openpyxl.utils.dataframe diff --git a/stubs/openpyxl/METADATA.toml b/stubs/openpyxl/METADATA.toml index 7f11ff387..b34a69a3b 100644 --- a/stubs/openpyxl/METADATA.toml +++ b/stubs/openpyxl/METADATA.toml @@ -1,4 +1,4 @@ -version = "3.0.*" +version = "3.1.*" [tool.stubtest] ignore_missing_stub = true diff --git a/stubs/openpyxl/openpyxl/drawing/drawing.pyi b/stubs/openpyxl/openpyxl/drawing/drawing.pyi index 805c8d2a1..0637334da 100644 --- a/stubs/openpyxl/openpyxl/drawing/drawing.pyi +++ b/stubs/openpyxl/openpyxl/drawing/drawing.pyi @@ -21,7 +21,6 @@ class Drawing: def height(self): ... @height.setter def height(self, h) -> None: ... - def set_dimension(self, w: int = ..., h: int = ...) -> None: ... - def get_emu_dimensions(self): ... + def set_dimension(self, w: int = 0, h: int = 0) -> None: ... @property def anchor(self): ... diff --git a/stubs/openpyxl/openpyxl/packaging/workbook.pyi b/stubs/openpyxl/openpyxl/packaging/workbook.pyi index 37bc20d10..a9b7497d7 100644 --- a/stubs/openpyxl/openpyxl/packaging/workbook.pyi +++ b/stubs/openpyxl/openpyxl/packaging/workbook.pyi @@ -84,5 +84,3 @@ class WorkbookPackage(Serialisable): def to_tree(self): ... @property def active(self): ... - @property - def pivot_caches(self): ... diff --git a/stubs/openpyxl/openpyxl/reader/excel.pyi b/stubs/openpyxl/openpyxl/reader/excel.pyi index 28a99d45b..410ba2223 100644 --- a/stubs/openpyxl/openpyxl/reader/excel.pyi +++ b/stubs/openpyxl/openpyxl/reader/excel.pyi @@ -1,27 +1,38 @@ from _typeshed import Incomplete, StrPath, SupportsRead +from zipfile import ZipFile from openpyxl.chartsheet.chartsheet import Chartsheet +from openpyxl.packaging.manifest import Manifest from openpyxl.packaging.relationship import Relationship -from openpyxl.workbook.workbook import Workbook +from openpyxl.reader.workbook import WorkbookParser +from openpyxl.workbook import Workbook SUPPORTED_FORMATS: Incomplete class ExcelReader: - archive: Incomplete - valid_files: Incomplete - read_only: Incomplete - keep_vba: Incomplete - data_only: Incomplete - keep_links: Incomplete - shared_strings: Incomplete + archive: ZipFile + valid_files: list[str] + read_only: bool + keep_vba: bool + data_only: bool + keep_links: bool + rich_text: bool + shared_strings: list[Incomplete] + package: Manifest # defined after call to read_manifest() + parser: WorkbookParser # defined after call to read_workbook() + wb: Workbook # defined after call to read_workbook() + def __init__( - self, fn: SupportsRead[bytes] | str, read_only: bool = ..., keep_vba=..., data_only: bool = ..., keep_links: bool = ... + self, + fn: SupportsRead[bytes] | str, + read_only: bool = False, + keep_vba: bool = False, + data_only: bool = False, + keep_links: bool = True, + rich_text: bool = False, ) -> None: ... - package: Incomplete def read_manifest(self) -> None: ... def read_strings(self) -> None: ... - parser: Incomplete - wb: Incomplete def read_workbook(self) -> None: ... def read_properties(self) -> None: ... def read_theme(self) -> None: ... @@ -31,8 +42,9 @@ class ExcelReader: def load_workbook( filename: SupportsRead[bytes] | StrPath, - read_only: bool = ..., - keep_vba: bool = ..., - data_only: bool = ..., - keep_links: bool = ..., + read_only: bool = False, + keep_vba: bool = False, + data_only: bool = False, + keep_links: bool = True, + rich_text: bool = False, ) -> Workbook: ... diff --git a/stubs/openpyxl/openpyxl/reader/workbook.pyi b/stubs/openpyxl/openpyxl/reader/workbook.pyi index bec291552..1eef773f2 100644 --- a/stubs/openpyxl/openpyxl/reader/workbook.pyi +++ b/stubs/openpyxl/openpyxl/reader/workbook.pyi @@ -1,10 +1,12 @@ from _typeshed import Incomplete from collections.abc import Generator +from openpyxl.workbook import Workbook + class WorkbookParser: archive: Incomplete workbook_part_name: Incomplete - wb: Incomplete + wb: Workbook keep_links: Incomplete sheets: Incomplete def __init__(self, archive, workbook_part_name, keep_links: bool = ...) -> None: ... diff --git a/stubs/openpyxl/openpyxl/workbook/defined_name.pyi b/stubs/openpyxl/openpyxl/workbook/defined_name.pyi index d58b69807..bc03e3b3f 100644 --- a/stubs/openpyxl/openpyxl/workbook/defined_name.pyi +++ b/stubs/openpyxl/openpyxl/workbook/defined_name.pyi @@ -1,15 +1,13 @@ from _typeshed import Incomplete +from collections import defaultdict from collections.abc import Generator +from re import Pattern +from openpyxl.descriptors import Sequence from openpyxl.descriptors.serialisable import Serialisable -RESERVED: Incomplete -RESERVED_REGEX: Incomplete -COL_RANGE: str -COL_RANGE_RE: Incomplete -ROW_RANGE: str -ROW_RANGE_RE: Incomplete -TITLES_REGEX: Incomplete +RESERVED: frozenset[str] +RESERVED_REGEX: Pattern[str] class DefinedName(Serialisable): tagname: str @@ -59,15 +57,12 @@ class DefinedName(Serialisable): def is_external(self): ... def __iter__(self): ... +class DefinedNameDict(dict[str, DefinedName]): + def add(self, value: DefinedName) -> None: ... + class DefinedNameList(Serialisable): tagname: str - definedName: Incomplete + definedName: Sequence def __init__(self, definedName=...) -> None: ... - def append(self, defn) -> None: ... + def by_sheet(self) -> defaultdict[int, DefinedNameDict]: ... def __len__(self) -> int: ... - def __contains__(self, name): ... - def __getitem__(self, name): ... - def get(self, name, scope: Incomplete | None = ...): ... - def __delitem__(self, name) -> None: ... - def delete(self, name, scope: Incomplete | None = ...): ... - def localnames(self, scope): ... diff --git a/stubs/openpyxl/openpyxl/workbook/workbook.pyi b/stubs/openpyxl/openpyxl/workbook/workbook.pyi index 5b5543e64..f0b673d72 100644 --- a/stubs/openpyxl/openpyxl/workbook/workbook.pyi +++ b/stubs/openpyxl/openpyxl/workbook/workbook.pyi @@ -6,7 +6,6 @@ from typing import IO from openpyxl.chartsheet.chartsheet import Chartsheet from openpyxl.styles.named_styles import NamedStyle from openpyxl.workbook.child import _WorkbookChild -from openpyxl.workbook.defined_name import DefinedName from openpyxl.worksheet._write_only import WriteOnlyWorksheet from openpyxl.worksheet.worksheet import Worksheet @@ -70,10 +69,6 @@ class Workbook: def add_named_style(self, style: NamedStyle) -> None: ... @property def named_styles(self) -> list[str]: ... - def get_named_ranges(self) -> list[DefinedName] | tuple[DefinedName, ...]: ... - def add_named_range(self, named_range: DefinedName) -> None: ... - def get_named_range(self, name: str) -> DefinedName: ... - def remove_named_range(self, named_range: DefinedName) -> None: ... @property def mime_type(self) -> str: ... def save(self, filename: StrPath | IO[bytes]) -> None: ... diff --git a/stubs/openpyxl/openpyxl/worksheet/_reader.pyi b/stubs/openpyxl/openpyxl/worksheet/_reader.pyi index 08286065d..fc1d7028f 100644 --- a/stubs/openpyxl/openpyxl/worksheet/_reader.pyi +++ b/stubs/openpyxl/openpyxl/worksheet/_reader.pyi @@ -1,5 +1,11 @@ +import datetime from _typeshed import Incomplete -from collections.abc import Generator +from collections.abc import Container, Generator + +from .hyperlink import HyperlinkList +from .pagebreak import ColBreak, RowBreak +from .protection import SheetProtection +from .table import TablePartList CELL_TAG: Incomplete VALUE_TAG: Incomplete @@ -31,39 +37,48 @@ DIMENSION_TAG: Incomplete CUSTOM_VIEWS_TAG: Incomplete class WorkSheetParser: - min_row: Incomplete - epoch: Incomplete + min_row: Incomplete | None + min_col: Incomplete | None + epoch: datetime.datetime source: Incomplete shared_strings: Incomplete - data_only: Incomplete - shared_formulae: Incomplete - array_formulae: Incomplete + data_only: bool + shared_formulae: dict[Incomplete, Incomplete] row_counter: int - tables: Incomplete - date_formats: Incomplete - timedelta_formats: Incomplete - row_dimensions: Incomplete - column_dimensions: Incomplete - number_formats: Incomplete + col_counter: int + tables: TablePartList + date_formats: Container[Incomplete] + timedelta_formats: Container[Incomplete] + row_dimensions: dict[Incomplete, Incomplete] + column_dimensions: dict[Incomplete, Incomplete] + number_formats: list[Incomplete] keep_vba: bool - hyperlinks: Incomplete - formatting: Incomplete - legacy_drawing: Incomplete - merged_cells: Incomplete - row_breaks: Incomplete - col_breaks: Incomplete + hyperlinks: HyperlinkList + formatting: list[Incomplete] + legacy_drawing: Incomplete | None + merged_cells: Incomplete | None + row_breaks: RowBreak + col_breaks: ColBreak + rich_text: bool + protection: SheetProtection # initialized after call to parse_sheet_protection() + def __init__( - self, src, shared_strings, data_only: bool = ..., epoch=..., date_formats=..., timedelta_formats=... + self, + src, + shared_strings, + data_only: bool = False, + epoch: datetime.datetime = ..., + date_formats: Container[Incomplete] = ..., + timedelta_formats: Container[Incomplete] = ..., + rich_text: bool = False, ) -> None: ... def parse(self) -> Generator[Incomplete, None, None]: ... def parse_dimensions(self): ... - col_counter: Incomplete def parse_cell(self, element): ... def parse_formula(self, element): ... def parse_column_dimensions(self, col) -> None: ... def parse_row(self, row): ... def parse_formatting(self, element) -> None: ... - protection: Incomplete def parse_sheet_protection(self, element) -> None: ... def parse_extensions(self, element) -> None: ... def parse_legacy(self, element) -> None: ... @@ -75,7 +90,7 @@ class WorksheetReader: ws: Incomplete parser: Incomplete tables: Incomplete - def __init__(self, ws, xml_source, shared_strings, data_only) -> None: ... + def __init__(self, ws, xml_source, shared_strings, data_only, rich_text: bool) -> None: ... def bind_cells(self) -> None: ... def bind_formatting(self) -> None: ... def bind_tables(self) -> None: ... diff --git a/stubs/openpyxl/openpyxl/worksheet/formula.pyi b/stubs/openpyxl/openpyxl/worksheet/formula.pyi new file mode 100644 index 000000000..78b762cf5 --- /dev/null +++ b/stubs/openpyxl/openpyxl/worksheet/formula.pyi @@ -0,0 +1,37 @@ +from _typeshed import Incomplete +from collections.abc import Iterator +from typing import ClassVar + +class DataTableFormula: + t: ClassVar[str] + + ref: Incomplete + ca: bool + dt2D: bool + dtr: bool + r1: Incomplete | None + r2: Incomplete | None + del1: bool + del2: bool + + def __init__( + self, + ref, + ca: bool = False, + dt2D: bool = False, + dtr: bool = False, + r1: Incomplete | None = None, + r2: Incomplete | None = None, + del1: bool = False, + del2: bool = False, + **kw, + ) -> None: ... + def __iter__(self) -> Iterator[tuple[str, str]]: ... + +class ArrayFormula: + t: ClassVar[str] + ref: Incomplete + text: Incomplete | None + + def __init__(self, ref, text: Incomplete | None = None) -> None: ... + def __iter__(self) -> Iterator[tuple[str, str]]: ... diff --git a/stubs/openpyxl/openpyxl/worksheet/worksheet.pyi b/stubs/openpyxl/openpyxl/worksheet/worksheet.pyi index a5e49fe5b..f3402b772 100644 --- a/stubs/openpyxl/openpyxl/worksheet/worksheet.pyi +++ b/stubs/openpyxl/openpyxl/worksheet/worksheet.pyi @@ -9,7 +9,6 @@ from openpyxl.workbook.child import _WorkbookChild from openpyxl.workbook.workbook import Workbook from openpyxl.worksheet.cell_range import CellRange from openpyxl.worksheet.datavalidation import DataValidation -from openpyxl.worksheet.pagebreak import ColBreak, RowBreak from openpyxl.worksheet.table import Table, TableList from openpyxl.worksheet.views import SheetView @@ -42,14 +41,10 @@ class Worksheet(_WorkbookChild): @property def active_cell(self) -> Cell: ... @property - def page_breaks(self) -> tuple[RowBreak, ColBreak]: ... + def array_formulae(self) -> dict[Incomplete, Incomplete]: ... @property def show_gridlines(self) -> bool: ... @property - def show_summary_below(self) -> bool: ... - @property - def show_summary_right(self) -> bool: ... - @property def freeze_panes(self) -> str | None: ... @freeze_panes.setter def freeze_panes(self, topLeftCell: Incomplete | None = ...) -> None: ... diff --git a/stubs/openpyxl/openpyxl/writer/excel.pyi b/stubs/openpyxl/openpyxl/writer/excel.pyi index 3864e2b74..624a3c4c0 100644 --- a/stubs/openpyxl/openpyxl/writer/excel.pyi +++ b/stubs/openpyxl/openpyxl/writer/excel.pyi @@ -10,4 +10,3 @@ class ExcelWriter: def save(self) -> None: ... def save_workbook(workbook, filename): ... -def save_virtual_workbook(workbook): ...