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 (
12
- TYPE_CHECKING ,
13
- Any ,
14
- Callable ,
15
- List ,
16
- Optional ,
17
- Protocol ,
18
- TypeVar ,
19
- Union ,
20
- )
21
-
22
- if TYPE_CHECKING :
23
-
24
- class LookupProtocol (Protocol ):
11
+
12
+ if t .TYPE_CHECKING :
13
+
14
+ class LookupProtocol (t .Protocol ):
25
15
"""Protocol for :class:`QueryList` filtering operators."""
26
16
27
17
def __call__ (
28
18
self ,
29
- data : Union [str , List [str ], "Mapping[str, str]" ],
30
- 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]" ],
31
21
) -> bool :
32
22
"""Callback for :class:`QueryList` filtering operators."""
33
23
...
34
24
35
25
36
- T = TypeVar ("T" , Any , Any )
26
+ T = t . TypeVar ("T" , t . Any , t . Any )
37
27
38
28
no_arg = object ()
39
29
@@ -47,9 +37,9 @@ class ObjectDoesNotExist(Exception):
47
37
48
38
49
39
def keygetter (
50
- obj : "Mapping[str, Any]" ,
40
+ obj : "Mapping[str, t. Any]" ,
51
41
path : str ,
52
- ) -> Union [None , Any , str , List [str ], "Mapping[str, str]" ]:
42
+ ) -> t . Union [None , t . Any , str , t . List [str ], "Mapping[str, str]" ]:
53
43
"""obj, "foods__breakfast", obj['foods']['breakfast']
54
44
55
45
>>> keygetter({ "foods": { "breakfast": "cereal" } }, "foods__breakfast")
@@ -75,7 +65,9 @@ def keygetter(
75
65
return dct
76
66
77
67
78
- 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 ]:
79
71
"""Check if field lookup key, e.g. "my__path__contains" has comparator, return val.
80
72
81
73
If comparator not used or value not found, return None.
@@ -96,15 +88,15 @@ def parse_lookup(obj: "Mapping[str, Any]", path: str, lookup: str) -> Optional[A
96
88
97
89
98
90
def lookup_exact (
99
- data : Union [str , List [str ], "Mapping[str, str]" ],
100
- 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]" ],
101
93
) -> bool :
102
94
return rhs == data
103
95
104
96
105
97
def lookup_iexact (
106
- data : Union [str , List [str ], "Mapping[str, str]" ],
107
- 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]" ],
108
100
) -> bool :
109
101
if not isinstance (rhs , str ) or not isinstance (data , str ):
110
102
return False
@@ -113,8 +105,8 @@ def lookup_iexact(
113
105
114
106
115
107
def lookup_contains (
116
- data : Union [str , List [str ], "Mapping[str, str]" ],
117
- 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]" ],
118
110
) -> bool :
119
111
if not isinstance (rhs , str ) or not isinstance (data , (str , Mapping , list )):
120
112
return False
@@ -123,8 +115,8 @@ def lookup_contains(
123
115
124
116
125
117
def lookup_icontains (
126
- data : Union [str , List [str ], "Mapping[str, str]" ],
127
- 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]" ],
128
120
) -> bool :
129
121
if not isinstance (rhs , str ) or not isinstance (data , (str , Mapping , list )):
130
122
return False
@@ -138,8 +130,8 @@ def lookup_icontains(
138
130
139
131
140
132
def lookup_startswith (
141
- data : Union [str , List [str ], "Mapping[str, str]" ],
142
- 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]" ],
143
135
) -> bool :
144
136
if not isinstance (rhs , str ) or not isinstance (data , str ):
145
137
return False
@@ -148,8 +140,8 @@ def lookup_startswith(
148
140
149
141
150
142
def lookup_istartswith (
151
- data : Union [str , List [str ], "Mapping[str, str]" ],
152
- 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]" ],
153
145
) -> bool :
154
146
if not isinstance (rhs , str ) or not isinstance (data , str ):
155
147
return False
@@ -158,8 +150,8 @@ def lookup_istartswith(
158
150
159
151
160
152
def lookup_endswith (
161
- data : Union [str , List [str ], "Mapping[str, str]" ],
162
- 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]" ],
163
155
) -> bool :
164
156
if not isinstance (rhs , str ) or not isinstance (data , str ):
165
157
return False
@@ -168,17 +160,17 @@ def lookup_endswith(
168
160
169
161
170
162
def lookup_iendswith (
171
- data : Union [str , List [str ], "Mapping[str, str]" ],
172
- 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]" ],
173
165
) -> bool :
174
166
if not isinstance (rhs , str ) or not isinstance (data , str ):
175
167
return False
176
168
return data .lower ().endswith (rhs .lower ())
177
169
178
170
179
171
def lookup_in (
180
- data : Union [str , List [str ], "Mapping[str, str]" ],
181
- 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]" ],
182
174
) -> bool :
183
175
if isinstance (rhs , list ):
184
176
return data in rhs
@@ -199,8 +191,8 @@ def lookup_in(
199
191
200
192
201
193
def lookup_nin (
202
- data : Union [str , List [str ], "Mapping[str, str]" ],
203
- 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]" ],
204
196
) -> bool :
205
197
if isinstance (rhs , list ):
206
198
return data not in rhs
@@ -221,17 +213,17 @@ def lookup_nin(
221
213
222
214
223
215
def lookup_regex (
224
- data : Union [str , List [str ], "Mapping[str, str]" ],
225
- 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]" ],
226
218
) -> bool :
227
219
if isinstance (data , (str , bytes , re .Pattern )) and isinstance (rhs , (str , bytes )):
228
220
return bool (re .search (rhs , data ))
229
221
return False
230
222
231
223
232
224
def lookup_iregex (
233
- data : Union [str , List [str ], "Mapping[str, str]" ],
234
- 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]" ],
235
227
) -> bool :
236
228
if isinstance (data , (str , bytes , re .Pattern )) and isinstance (rhs , (str , bytes )):
237
229
return bool (re .search (rhs , data , re .IGNORECASE ))
@@ -265,7 +257,7 @@ def __init__(self, op: str, *args: object):
265
257
return super ().__init__ (f"{ op } not in LOOKUP_NAME_MAP" )
266
258
267
259
268
- class QueryList (List [T ]):
260
+ class QueryList (t . List [T ]):
269
261
"""Filter list of object/dictionaries. For small, local datasets.
270
262
271
263
*Experimental, unstable*.
@@ -301,21 +293,21 @@ class QueryList(List[T]):
301
293
"""
302
294
303
295
data : "Sequence[T]"
304
- pk_key : Optional [str ]
296
+ pk_key : t . Optional [str ]
305
297
306
- def items (self ) -> List [T ]:
298
+ def items (self ) -> t . List [T ]:
307
299
if self .pk_key is None :
308
300
raise PKRequiredException ()
309
301
return [(getattr (item , self .pk_key ), item ) for item in self ]
310
302
311
303
def __eq__ (
312
304
self ,
313
305
other : object ,
314
- # other: Union[
306
+ # other: t. Union[
315
307
# "QueryList[T]",
316
- # List[Mapping[str, str]],
317
- # List[Mapping[str, int]],
318
- # 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]]]]],
319
311
# ],
320
312
) -> bool :
321
313
data = other
@@ -339,11 +331,13 @@ def __eq__(
339
331
return False
340
332
341
333
def filter (
342
- 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 ,
343
337
) -> "QueryList[T]" :
344
338
"""Filter list of objects."""
345
339
346
- def filter_lookup (obj : Any ) -> bool :
340
+ def filter_lookup (obj : t . Any ) -> bool :
347
341
for path , v in kwargs .items ():
348
342
try :
349
343
lhs , op = path .rsplit ("__" , 1 )
@@ -367,7 +361,7 @@ def filter_lookup(obj: Any) -> bool:
367
361
_filter = matcher
368
362
elif matcher is not None :
369
363
370
- def val_match (obj : Union [str , List [Any ]]) -> bool :
364
+ def val_match (obj : t . Union [str , t . List [t . Any ]]) -> bool :
371
365
if isinstance (matcher , list ):
372
366
return obj in matcher
373
367
else :
@@ -381,10 +375,10 @@ def val_match(obj: Union[str, List[Any]]) -> bool:
381
375
382
376
def get (
383
377
self ,
384
- matcher : Optional [Union [Callable [[T ], bool ], T ]] = None ,
385
- default : Optional [Any ] = no_arg ,
386
- ** kwargs : Any ,
387
- ) -> 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 ]:
388
382
"""Retrieve one object.
389
383
390
384
Raises :exc:`MultipleObjectsReturned` if multiple objects found.
0 commit comments