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

27 statements  

1"""Quoting and unquoting utilities for URL parts.""" 

2 

3from typing import Union 

4from urllib.parse import quote 

5 

6from ._quoting import _Quoter, _Unquoter 

7 

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="?/:@") 

17 

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 

23 

24 

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)