From 52ec0bcf8535da3a8507d1cdb39a1ee972fa589a Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Mon, 9 Jun 2025 01:56:28 -0400 Subject: [PATCH] Update type annotations --- src/mwparserfromhell/nodes/_base.py | 2 +- src/mwparserfromhell/nodes/argument.py | 2 +- src/mwparserfromhell/nodes/external_link.py | 2 +- src/mwparserfromhell/nodes/tag.py | 2 +- src/mwparserfromhell/nodes/template.py | 27 +++++++++++++++++++-------- src/mwparserfromhell/wikicode.py | 9 ++++++--- 6 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/mwparserfromhell/nodes/_base.py b/src/mwparserfromhell/nodes/_base.py index f34e78d..2fc24e5 100644 --- a/src/mwparserfromhell/nodes/_base.py +++ b/src/mwparserfromhell/nodes/_base.py @@ -45,7 +45,7 @@ class Node(StringMixIn): def __str__(self) -> str: raise NotImplementedError() - def __children__(self) -> Generator["Wikicode"]: + def __children__(self) -> Generator["Wikicode", None, None]: return # pylint: disable=unreachable yield # pragma: no cover (this is a generator that yields nothing) diff --git a/src/mwparserfromhell/nodes/argument.py b/src/mwparserfromhell/nodes/argument.py index 48e9514..80c9c01 100644 --- a/src/mwparserfromhell/nodes/argument.py +++ b/src/mwparserfromhell/nodes/argument.py @@ -44,7 +44,7 @@ class Argument(Node): return start + "|" + str(self.default) + "}}}" return start + "}}}" - def __children__(self) -> Generator["Wikicode"]: + def __children__(self) -> Generator["Wikicode", None, None]: yield self.name if self.default is not None: yield self.default diff --git a/src/mwparserfromhell/nodes/external_link.py b/src/mwparserfromhell/nodes/external_link.py index 70a23dd..696934e 100644 --- a/src/mwparserfromhell/nodes/external_link.py +++ b/src/mwparserfromhell/nodes/external_link.py @@ -55,7 +55,7 @@ class ExternalLink(Node): return "[" + str(self.url) + "]" return str(self.url) - def __children__(self) -> Generator["Wikicode"]: + def __children__(self) -> Generator["Wikicode", None, None]: yield self.url if self.title is not None: yield self.title diff --git a/src/mwparserfromhell/nodes/tag.py b/src/mwparserfromhell/nodes/tag.py index bf4ad40..2c1e92b 100644 --- a/src/mwparserfromhell/nodes/tag.py +++ b/src/mwparserfromhell/nodes/tag.py @@ -98,7 +98,7 @@ class Tag(Node): result += "" return result - def __children__(self) -> Generator["Wikicode"]: + def __children__(self) -> Generator["Wikicode", None, None]: if not self.wiki_markup: yield self.tag for attr in self.attributes: diff --git a/src/mwparserfromhell/nodes/template.py b/src/mwparserfromhell/nodes/template.py index 50f4193..b58a37b 100644 --- a/src/mwparserfromhell/nodes/template.py +++ b/src/mwparserfromhell/nodes/template.py @@ -17,19 +17,20 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -from collections import defaultdict import re +from collections import defaultdict from typing import ( TYPE_CHECKING, Any, - Optional, - Union, - List, - Dict, Callable, + Dict, Generator, + List, Mapping, - cast, + Optional, + TypeVar, + Union, + overload, ) from ._base import Node @@ -47,6 +48,8 @@ FLAGS = re.DOTALL | re.UNICODE # Used to allow None as a valid fallback value _UNSET = object() +T = TypeVar("T") + class Template(Node): """Represents a template in wikicode, like ``{{foo}}``.""" @@ -62,7 +65,7 @@ class Template(Node): return "{{" + str(self.name) + "|" + params + "}}" return "{{" + str(self.name) + "}}" - def __children__(self) -> Generator["Wikicode"]: + def __children__(self) -> Generator["Wikicode", None, None]: yield self.name for param in self.params: if param.showkey: @@ -235,7 +238,15 @@ class Template(Node): """Alias for :meth:`has`.""" return self.has(name, ignore_empty) - def get(self, name: Union[str, Any], default: Any = _UNSET) -> Union[Parameter, Any]: + @overload + def get(self, name: Union[str, Any]) -> Parameter: + ... + + @overload + def get(self, name: Union[str, Any], default: T) -> Union[Parameter, T]: + ... + + def get(self, name: Union[str, Any], default: T = _UNSET) -> Union[Parameter, T]: """Get the parameter whose name is *name*. The returned object is a :class:`.Parameter` instance. Raises diff --git a/src/mwparserfromhell/wikicode.py b/src/mwparserfromhell/wikicode.py index a9cdce9..0dcbf77 100644 --- a/src/mwparserfromhell/wikicode.py +++ b/src/mwparserfromhell/wikicode.py @@ -312,10 +312,12 @@ class Wikicode(StringMixIn): self._nodes = value @overload - def get(self, index: int) -> Node: ... + def get(self, index: int) -> Node: + ... @overload - def get(self, index: slice) -> list[Node]: ... + def get(self, index: slice) -> list[Node]: + ... def get(self, index): """Return the *index*\\ th node within the list of nodes.""" @@ -556,6 +558,7 @@ class Wikicode(StringMixIn): letter's case is normalized. Typical usage is ``if template.name.matches("stub"): ...``. """ + def normalize(s: str) -> str: return (s[0].upper() + s[1:]).replace("_", " ") if s else s @@ -577,7 +580,7 @@ class Wikicode(StringMixIn): matches: Union[Callable[[Node], bool], re.Pattern, str, None] = None, flags: int = FLAGS, forcetype: Optional[type] = None, - ) -> Generator[Node]: + ) -> Generator[Node, None, None]: """Iterate over nodes in our list matching certain conditions. If *forcetype* is given, only nodes that are instances of this type (or