aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2023-06-02 07:52:31 -0700
committerGitHub <noreply@github.com>2023-06-02 07:52:31 -0700
commit60e7eb97e65947a83fa290010f3dde71be8fed84 (patch)
tree79524dbe06e2957178b12f8c7beb8c6f2c1871ab
parent910ffffbcc991f5bc38345bb7134844700504db5 (diff)
parent04d7d4dae151b7ad44e7ae99a3c2aca79bab6abc (diff)
downloadmarkupsafe-60e7eb97e65947a83fa290010f3dde71be8fed84.tar.gz
improve typing for `_simple_escaping_wrapper` (#376)
-rw-r--r--CHANGES.rst2
-rw-r--r--src/markupsafe/__init__.py53
2 files changed, 26 insertions, 29 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index e25c156..90476f7 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -3,6 +3,8 @@ Version 2.1.3
Unreleased
+- Fix static typing for basic ``str`` methods on ``Markup``. :issue:`358`
+
Version 2.1.2
-------------
diff --git a/src/markupsafe/__init__.py b/src/markupsafe/__init__.py
index b2faa46..c593a13 100644
--- a/src/markupsafe/__init__.py
+++ b/src/markupsafe/__init__.py
@@ -10,6 +10,8 @@ if t.TYPE_CHECKING:
def __html__(self) -> str:
pass
+ _P = te.ParamSpec("_P")
+
__version__ = "2.1.3.dev"
@@ -17,16 +19,14 @@ _strip_comments_re = re.compile(r"<!--.*?-->", re.DOTALL)
_strip_tags_re = re.compile(r"<.*?>", re.DOTALL)
-def _simple_escaping_wrapper(name: str) -> t.Callable[..., "Markup"]:
- orig = getattr(str, name)
-
- @functools.wraps(orig)
- def wrapped(self: "Markup", *args: t.Any, **kwargs: t.Any) -> "Markup":
- args = _escape_argspec(list(args), enumerate(args), self.escape) # type: ignore
+def _simple_escaping_wrapper(func: "t.Callable[_P, str]") -> "t.Callable[_P, Markup]":
+ @functools.wraps(func)
+ def wrapped(self: "Markup", *args: "_P.args", **kwargs: "_P.kwargs") -> "Markup":
+ arg_list = _escape_argspec(list(args), enumerate(args), self.escape)
_escape_argspec(kwargs, kwargs.items(), self.escape)
- return self.__class__(orig(self, *args, **kwargs))
+ return self.__class__(func(self, *arg_list, **kwargs)) # type: ignore[arg-type]
- return wrapped
+ return wrapped # type: ignore[return-value]
class Markup(str):
@@ -177,27 +177,22 @@ class Markup(str):
return rv
- for method in (
- "__getitem__",
- "capitalize",
- "title",
- "lower",
- "upper",
- "replace",
- "ljust",
- "rjust",
- "lstrip",
- "rstrip",
- "center",
- "strip",
- "translate",
- "expandtabs",
- "swapcase",
- "zfill",
- ):
- locals()[method] = _simple_escaping_wrapper(method)
-
- del method
+ __getitem__ = _simple_escaping_wrapper(str.__getitem__)
+ capitalize = _simple_escaping_wrapper(str.capitalize)
+ title = _simple_escaping_wrapper(str.title)
+ lower = _simple_escaping_wrapper(str.lower)
+ upper = _simple_escaping_wrapper(str.upper)
+ replace = _simple_escaping_wrapper(str.replace)
+ ljust = _simple_escaping_wrapper(str.ljust)
+ rjust = _simple_escaping_wrapper(str.rjust)
+ lstrip = _simple_escaping_wrapper(str.lstrip)
+ rstrip = _simple_escaping_wrapper(str.rstrip)
+ center = _simple_escaping_wrapper(str.center)
+ strip = _simple_escaping_wrapper(str.strip)
+ translate = _simple_escaping_wrapper(str.translate)
+ expandtabs = _simple_escaping_wrapper(str.expandtabs)
+ swapcase = _simple_escaping_wrapper(str.swapcase)
+ zfill = _simple_escaping_wrapper(str.zfill)
def partition(self, sep: str) -> t.Tuple["Markup", "Markup", "Markup"]:
l, s, r = super().partition(self.escape(sep))