6
6
"""
7
7
import re
8
8
import traceback
9
+ import typing as t
9
10
from collections .abc import Mapping , Sequence
10
- from re import Pattern
11
- from typing import TYPE_CHECKING , Any , Callable , List , Optional , TypeVar , Union
12
11
13
- if TYPE_CHECKING :
14
- from typing_extensions import Protocol
12
+ if t .TYPE_CHECKING :
15
13
16
- class LookupProtocol (Protocol ):
14
+ class LookupProtocol (t . Protocol ):
17
15
"""Protocol for :class:`QueryList` filtering operators."""
18
16
19
17
def __call__ (
20
18
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]" ],
23
21
) -> bool :
24
22
"""Callback for :class:`QueryList` filtering operators."""
25
23
...
26
24
27
25
28
- T = TypeVar ("T" , Any , Any )
26
+ T = t . TypeVar ("T" , t . Any , t . Any )
29
27
30
28
no_arg = object ()
31
29
@@ -39,9 +37,9 @@ class ObjectDoesNotExist(Exception):
39
37
40
38
41
39
def keygetter (
42
- obj : "Mapping[str, Any]" ,
40
+ obj : "Mapping[str, t. Any]" ,
43
41
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]" ]:
45
43
"""obj, "foods__breakfast", obj['foods']['breakfast']
46
44
47
45
>>> keygetter({ "foods": { "breakfast": "cereal" } }, "foods__breakfast")
@@ -67,7 +65,9 @@ def keygetter(
67
65
return dct
68
66
69
67
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 ]:
71
71
"""Check if field lookup key, e.g. "my__path__contains" has comparator, return val.
72
72
73
73
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
88
88
89
89
90
90
def 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]" ],
93
93
) -> bool :
94
94
return rhs == data
95
95
96
96
97
97
def 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]" ],
100
100
) -> bool :
101
101
if not isinstance (rhs , str ) or not isinstance (data , str ):
102
102
return False
@@ -105,8 +105,8 @@ def lookup_iexact(
105
105
106
106
107
107
def 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]" ],
110
110
) -> bool :
111
111
if not isinstance (rhs , str ) or not isinstance (data , (str , Mapping , list )):
112
112
return False
@@ -115,8 +115,8 @@ def lookup_contains(
115
115
116
116
117
117
def 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]" ],
120
120
) -> bool :
121
121
if not isinstance (rhs , str ) or not isinstance (data , (str , Mapping , list )):
122
122
return False
@@ -130,8 +130,8 @@ def lookup_icontains(
130
130
131
131
132
132
def 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]" ],
135
135
) -> bool :
136
136
if not isinstance (rhs , str ) or not isinstance (data , str ):
137
137
return False
@@ -140,8 +140,8 @@ def lookup_startswith(
140
140
141
141
142
142
def 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]" ],
145
145
) -> bool :
146
146
if not isinstance (rhs , str ) or not isinstance (data , str ):
147
147
return False
@@ -150,8 +150,8 @@ def lookup_istartswith(
150
150
151
151
152
152
def 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]" ],
155
155
) -> bool :
156
156
if not isinstance (rhs , str ) or not isinstance (data , str ):
157
157
return False
@@ -160,17 +160,17 @@ def lookup_endswith(
160
160
161
161
162
162
def 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]" ],
165
165
) -> bool :
166
166
if not isinstance (rhs , str ) or not isinstance (data , str ):
167
167
return False
168
168
return data .lower ().endswith (rhs .lower ())
169
169
170
170
171
171
def 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]" ],
174
174
) -> bool :
175
175
if isinstance (rhs , list ):
176
176
return data in rhs
@@ -191,8 +191,8 @@ def lookup_in(
191
191
192
192
193
193
def 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]" ],
196
196
) -> bool :
197
197
if isinstance (rhs , list ):
198
198
return data not in rhs
@@ -213,17 +213,17 @@ def lookup_nin(
213
213
214
214
215
215
def 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]" ],
218
218
) -> bool :
219
219
if isinstance (data , (str , bytes , re .Pattern )) and isinstance (rhs , (str , bytes )):
220
220
return bool (re .search (rhs , data ))
221
221
return False
222
222
223
223
224
224
def 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]" ],
227
227
) -> bool :
228
228
if isinstance (data , (str , bytes , re .Pattern )) and isinstance (rhs , (str , bytes )):
229
229
return bool (re .search (rhs , data , re .IGNORECASE ))
@@ -257,7 +257,7 @@ def __init__(self, op: str, *args: object):
257
257
return super ().__init__ (f"{ op } not in LOOKUP_NAME_MAP" )
258
258
259
259
260
- class QueryList (List [T ]):
260
+ class QueryList (t . List [T ]):
261
261
"""Filter list of object/dictionaries. For small, local datasets.
262
262
263
263
*Experimental, unstable*.
@@ -293,21 +293,21 @@ class QueryList(List[T]):
293
293
"""
294
294
295
295
data : "Sequence[T]"
296
- pk_key : Optional [str ]
296
+ pk_key : t . Optional [str ]
297
297
298
- def items (self ) -> List [T ]:
298
+ def items (self ) -> t . List [T ]:
299
299
if self .pk_key is None :
300
300
raise PKRequiredException ()
301
301
return [(getattr (item , self .pk_key ), item ) for item in self ]
302
302
303
303
def __eq__ (
304
304
self ,
305
305
other : object ,
306
- # other: Union[
306
+ # other: t. Union[
307
307
# "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]]]]],
311
311
# ],
312
312
) -> bool :
313
313
data = other
@@ -331,11 +331,13 @@ def __eq__(
331
331
return False
332
332
333
333
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 ,
335
337
) -> "QueryList[T]" :
336
338
"""Filter list of objects."""
337
339
338
- def filter_lookup (obj : Any ) -> bool :
340
+ def filter_lookup (obj : t . Any ) -> bool :
339
341
for path , v in kwargs .items ():
340
342
try :
341
343
lhs , op = path .rsplit ("__" , 1 )
@@ -359,7 +361,7 @@ def filter_lookup(obj: Any) -> bool:
359
361
_filter = matcher
360
362
elif matcher is not None :
361
363
362
- def val_match (obj : Union [str , List [Any ]]) -> bool :
364
+ def val_match (obj : t . Union [str , t . List [t . Any ]]) -> bool :
363
365
if isinstance (matcher , list ):
364
366
return obj in matcher
365
367
else :
@@ -373,10 +375,10 @@ def val_match(obj: Union[str, List[Any]]) -> bool:
373
375
374
376
def get (
375
377
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 ]:
380
382
"""Retrieve one object.
381
383
382
384
Raises :exc:`MultipleObjectsReturned` if multiple objects found.
0 commit comments