Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/yarl/_quoters.py: 67%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""Quoting and unquoting utilities for URL parts."""
3from typing import Union
4from urllib.parse import quote
6from ._quoting import _Quoter, _Unquoter
8QUOTER = _Quoter(requote=False)
9REQUOTER = _Quoter()
10PATH_QUOTER = _Quoter(safe="@:", protected="/+", requote=False)
11PATH_REQUOTER = _Quoter(safe="@:", protected="/+")
12QUERY_QUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True, requote=False)
13QUERY_REQUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True)
14QUERY_PART_QUOTER = _Quoter(safe="?/:@", qs=True, requote=False)
15FRAGMENT_QUOTER = _Quoter(safe="?/:@", requote=False)
16FRAGMENT_REQUOTER = _Quoter(safe="?/:@")
18UNQUOTER = _Unquoter()
19PATH_UNQUOTER = _Unquoter(unsafe="+")
20PATH_SAFE_UNQUOTER = _Unquoter(ignore="/%", unsafe="+")
21QS_UNQUOTER = _Unquoter(qs=True)
22UNQUOTER_PLUS = _Unquoter(plus=True) # to match urllib.parse.unquote_plus
25def human_quote(s: Union[str, None], unsafe: str) -> Union[str, None]:
26 if not s:
27 return s
28 for c in "%" + unsafe:
29 if c in s:
30 s = s.replace(c, f"%{ord(c):02X}")
31 if s.isprintable():
32 return s
33 return "".join(c if c.isprintable() else quote(c) for c in s)