66"""
77import re
88import traceback
9+ import typing as t
910from collections .abc import Mapping , Sequence
10- from re import Pattern
11- from typing import TYPE_CHECKING , Any , Callable , List , Optional , TypeVar , Union
1211
13- if TYPE_CHECKING :
14- from typing_extensions import Protocol
12+ if t .TYPE_CHECKING :
1513
16- class LookupProtocol (Protocol ):
14+ class LookupProtocol (t . Protocol ):
1715 """Protocol for :class:`QueryList` filtering operators."""
1816
1917 def __call__ (
2018 self ,
21- data : Union [str , List [str ], "Mapping[str, str]" ],
22- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
19+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
20+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
2321 ) -> bool :
2422 """Callback for :class:`QueryList` filtering operators."""
2523 ...
2624
2725
28- T = TypeVar ("T" , Any , Any )
26+ T = t . TypeVar ("T" , t . Any , t . Any )
2927
3028no_arg = object ()
3129
@@ -39,9 +37,9 @@ class ObjectDoesNotExist(Exception):
3937
4038
4139def keygetter (
42- obj : "Mapping[str, Any]" ,
40+ obj : "Mapping[str, t. Any]" ,
4341 path : str ,
44- ) -> Union [None , Any , str , List [str ], "Mapping[str, str]" ]:
42+ ) -> t . Union [None , t . Any , str , t . List [str ], "Mapping[str, str]" ]:
4543 """obj, "foods__breakfast", obj['foods']['breakfast']
4644
4745 >>> keygetter({ "foods": { "breakfast": "cereal" } }, "foods__breakfast")
@@ -67,7 +65,9 @@ def keygetter(
6765 return dct
6866
6967
70- def parse_lookup (obj : "Mapping[str, Any]" , path : str , lookup : str ) -> Optional [Any ]:
68+ def parse_lookup (
69+ obj : "Mapping[str, t.Any]" , path : str , lookup : str
70+ ) -> t .Optional [t .Any ]:
7171 """Check if field lookup key, e.g. "my__path__contains" has comparator, return val.
7272
7373 If comparator not used or value not found, return None.
@@ -88,15 +88,15 @@ def parse_lookup(obj: "Mapping[str, Any]", path: str, lookup: str) -> Optional[A
8888
8989
9090def lookup_exact (
91- data : Union [str , List [str ], "Mapping[str, str]" ],
92- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
91+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
92+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
9393) -> bool :
9494 return rhs == data
9595
9696
9797def lookup_iexact (
98- data : Union [str , List [str ], "Mapping[str, str]" ],
99- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
98+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
99+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
100100) -> bool :
101101 if not isinstance (rhs , str ) or not isinstance (data , str ):
102102 return False
@@ -105,8 +105,8 @@ def lookup_iexact(
105105
106106
107107def lookup_contains (
108- data : Union [str , List [str ], "Mapping[str, str]" ],
109- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
108+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
109+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
110110) -> bool :
111111 if not isinstance (rhs , str ) or not isinstance (data , (str , Mapping , list )):
112112 return False
@@ -115,8 +115,8 @@ def lookup_contains(
115115
116116
117117def lookup_icontains (
118- data : Union [str , List [str ], "Mapping[str, str]" ],
119- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
118+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
119+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
120120) -> bool :
121121 if not isinstance (rhs , str ) or not isinstance (data , (str , Mapping , list )):
122122 return False
@@ -130,8 +130,8 @@ def lookup_icontains(
130130
131131
132132def lookup_startswith (
133- data : Union [str , List [str ], "Mapping[str, str]" ],
134- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
133+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
134+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
135135) -> bool :
136136 if not isinstance (rhs , str ) or not isinstance (data , str ):
137137 return False
@@ -140,8 +140,8 @@ def lookup_startswith(
140140
141141
142142def lookup_istartswith (
143- data : Union [str , List [str ], "Mapping[str, str]" ],
144- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
143+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
144+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
145145) -> bool :
146146 if not isinstance (rhs , str ) or not isinstance (data , str ):
147147 return False
@@ -150,8 +150,8 @@ def lookup_istartswith(
150150
151151
152152def lookup_endswith (
153- data : Union [str , List [str ], "Mapping[str, str]" ],
154- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
153+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
154+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
155155) -> bool :
156156 if not isinstance (rhs , str ) or not isinstance (data , str ):
157157 return False
@@ -160,17 +160,17 @@ def lookup_endswith(
160160
161161
162162def lookup_iendswith (
163- data : Union [str , List [str ], "Mapping[str, str]" ],
164- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
163+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
164+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
165165) -> bool :
166166 if not isinstance (rhs , str ) or not isinstance (data , str ):
167167 return False
168168 return data .lower ().endswith (rhs .lower ())
169169
170170
171171def lookup_in (
172- data : Union [str , List [str ], "Mapping[str, str]" ],
173- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
172+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
173+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
174174) -> bool :
175175 if isinstance (rhs , list ):
176176 return data in rhs
@@ -191,8 +191,8 @@ def lookup_in(
191191
192192
193193def lookup_nin (
194- data : Union [str , List [str ], "Mapping[str, str]" ],
195- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
194+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
195+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
196196) -> bool :
197197 if isinstance (rhs , list ):
198198 return data not in rhs
@@ -213,17 +213,17 @@ def lookup_nin(
213213
214214
215215def lookup_regex (
216- data : Union [str , List [str ], "Mapping[str, str]" ],
217- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
216+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
217+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
218218) -> bool :
219219 if isinstance (data , (str , bytes , re .Pattern )) and isinstance (rhs , (str , bytes )):
220220 return bool (re .search (rhs , data ))
221221 return False
222222
223223
224224def lookup_iregex (
225- data : Union [str , List [str ], "Mapping[str, str]" ],
226- rhs : Union [str , List [str ], "Mapping[str, str]" , "Pattern[str]" ],
225+ data : t . Union [str , t . List [str ], "Mapping[str, str]" ],
226+ rhs : t . Union [str , t . List [str ], "Mapping[str, str]" , "re. Pattern[str]" ],
227227) -> bool :
228228 if isinstance (data , (str , bytes , re .Pattern )) and isinstance (rhs , (str , bytes )):
229229 return bool (re .search (rhs , data , re .IGNORECASE ))
@@ -257,7 +257,7 @@ def __init__(self, op: str, *args: object):
257257 return super ().__init__ (f"{ op } not in LOOKUP_NAME_MAP" )
258258
259259
260- class QueryList (List [T ]):
260+ class QueryList (t . List [T ]):
261261 """Filter list of object/dictionaries. For small, local datasets.
262262
263263 *Experimental, unstable*.
@@ -293,21 +293,21 @@ class QueryList(List[T]):
293293 """
294294
295295 data : "Sequence[T]"
296- pk_key : Optional [str ]
296+ pk_key : t . Optional [str ]
297297
298- def items (self ) -> List [T ]:
298+ def items (self ) -> t . List [T ]:
299299 if self .pk_key is None :
300300 raise PKRequiredException ()
301301 return [(getattr (item , self .pk_key ), item ) for item in self ]
302302
303303 def __eq__ (
304304 self ,
305305 other : object ,
306- # other: Union[
306+ # other: t. Union[
307307 # "QueryList[T]",
308- # List[Mapping[str, str]],
309- # List[Mapping[str, int]],
310- # List[Mapping[str, Union[str, Mapping[str, Union[List[str], str]]]]],
308+ # t. List[Mapping[str, str]],
309+ # t. List[Mapping[str, int]],
310+ # t. List[Mapping[str, t. Union[str, Mapping[str, t. Union[List[str], str]]]]],
311311 # ],
312312 ) -> bool :
313313 data = other
@@ -331,11 +331,13 @@ def __eq__(
331331 return False
332332
333333 def filter (
334- self , matcher : Optional [Union [Callable [[T ], bool ], T ]] = None , ** kwargs : Any
334+ self ,
335+ matcher : t .Optional [t .Union [t .Callable [[T ], bool ], T ]] = None ,
336+ ** kwargs : t .Any ,
335337 ) -> "QueryList[T]" :
336338 """Filter list of objects."""
337339
338- def filter_lookup (obj : Any ) -> bool :
340+ def filter_lookup (obj : t . Any ) -> bool :
339341 for path , v in kwargs .items ():
340342 try :
341343 lhs , op = path .rsplit ("__" , 1 )
@@ -359,7 +361,7 @@ def filter_lookup(obj: Any) -> bool:
359361 _filter = matcher
360362 elif matcher is not None :
361363
362- def val_match (obj : Union [str , List [Any ]]) -> bool :
364+ def val_match (obj : t . Union [str , t . List [t . Any ]]) -> bool :
363365 if isinstance (matcher , list ):
364366 return obj in matcher
365367 else :
@@ -373,10 +375,10 @@ def val_match(obj: Union[str, List[Any]]) -> bool:
373375
374376 def get (
375377 self ,
376- matcher : Optional [Union [Callable [[T ], bool ], T ]] = None ,
377- default : Optional [Any ] = no_arg ,
378- ** kwargs : Any ,
379- ) -> Optional [T ]:
378+ matcher : t . Optional [t . Union [t . Callable [[T ], bool ], T ]] = None ,
379+ default : t . Optional [t . Any ] = no_arg ,
380+ ** kwargs : t . Any ,
381+ ) -> t . Optional [T ]:
380382 """Retrieve one object.
381383
382384 Raises :exc:`MultipleObjectsReturned` if multiple objects found.
0 commit comments