Skip to content

Commit 06d3730

Browse files
committed
fix(stub): extend the list of unusable content-only elem methods
1 parent c72868f commit 06d3730

1 file changed

Lines changed: 40 additions & 21 deletions

File tree

src/lxml-stubs/etree/_element.pyi

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ from collections.abc import (
33
Callable,
44
Iterable,
55
Iterator,
6-
Mapping,
76
)
87
from typing import (
98
Any,
@@ -1058,44 +1057,63 @@ class _Attrib:
10581057
# from _Element, even though their interfaces are vastly different
10591058
# from _Element. The notion of or'ing different kind of elements
10601059
# throughout all element methods would cause great inconvenience
1061-
# for me and all users alike -- using some _AnyHtmlElement alias
1062-
# to represent union of all elements was a failure for users.
1060+
# for maintenance and usage.
10631061
# We opt for convenience and ease of use in the future.
1062+
#
1063+
# TODO (low priority) The list of methods that don't work for content-only
1064+
# elements could be incomplete
10641065
class __ContentOnlyElement(_Element):
10651066
#
1066-
# Useful properties
1067-
# .text and .tag are overridden in each concrete class below
1067+
# - .text and .tag are overridden in each concrete subclass
1068+
# - attrib() returns some sort of immutable empty-dict-like
1069+
# object. Don't intend to waste time and effort on it.
1070+
# - __getitem__() source code returns empty list upon slice
1071+
# input, stub bans whole method altogether
10681072
#
1073+
@deprecated("Some properties of content-only elements are fake values")
10691074
@property
1070-
# pyrefly: ignore[bad-override]
1071-
def attrib(self) -> Mapping[_t.Unused, _t.Unused]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
1075+
def attrib(self) -> _Attrib: ...
1076+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
10721077
# pyrefly: ignore[bad-override]
10731078
def get(self, key: _t.Unused, default: _t.Unused = None) -> None: ... # type: ignore[override]
1079+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
1080+
def __len__(self) -> Literal[0]: ...
1081+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
10741082
# pyrefly: ignore[bad-override]
10751083
def set(self, key: Never, value: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1084+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
10761085
# pyrefly: ignore[bad-override]
10771086
def append(self, element: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1087+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
10781088
# pyrefly: ignore[bad-override]
10791089
def insert(self, index: Never, value: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1090+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
10801091
# pyrefly: ignore[bad-override]
10811092
def __setitem__(self, __k: Never, __v: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1082-
# The intention is to discourage elem.__getitem__, allowing slice
1083-
# argument in runtime doesn't make any sense
1093+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
10841094
# pyrefly: ignore[bad-override]
10851095
def __getitem__(self, __k: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1096+
#
10861097
# Methods above are explicitly defined in source, while those below aren't
1098+
#
1099+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
10871100
# pyrefly: ignore[bad-override]
1088-
def __delitem__(self, __k: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1089-
def __iter__(self) -> Never: ...
1090-
1091-
# TODO (low priority) There are many, many more methods that
1092-
# don't work for content only elements, such as most
1093-
# ElementTree / ElementPath ones, and all inherited
1094-
# HTML element methods. None of those are handled in
1095-
# source code -- users are left to bump into wall themselves.
1096-
# For example, append(elem) explicitly raises exception, yet
1097-
# one can use extend([elem]) to circumvent restriction.
1098-
# Go figure.
1101+
def extend(self, elements: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1102+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
1103+
# pyrefly: ignore[bad-override]
1104+
def remove(self, element: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1105+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
1106+
# pyrefly: ignore[bad-override]
1107+
def index(self, child: Never, start: Never, stop: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
1108+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
1109+
def keys(self) -> list[_t.Unused]: ...
1110+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
1111+
def values(self) -> list[_t.Unused]: ...
1112+
@deprecated("Most accessor methods of content-only elements are dummies or cause undesirable effect")
1113+
def items(self) -> list[_t.Unused]: ...
1114+
@deprecated("cssselect method not usable on content-only elements")
1115+
# pyrefly: ignore[bad-override]
1116+
def cssselect(self, expr: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # ty: ignore[invalid-method-override]
10991117

11001118
class _Comment(__ContentOnlyElement):
11011119
@property # type: ignore[misc]
@@ -1126,7 +1144,8 @@ class _ProcessingInstruction(__ContentOnlyElement):
11261144
@target.setter
11271145
def target(self, value: _t._TextArg) -> None: ...
11281146
@property
1129-
def attrib(self) -> dict[str, str]: ... # type: ignore[override]
1147+
# pyrefly: ignore[bad-override]
1148+
def attrib(self) -> dict[str, str]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
11301149

11311150
class _Entity(__ContentOnlyElement):
11321151
@property # type: ignore[misc]

0 commit comments

Comments
 (0)