11from .filter import Filter
22from .request_options import RequestOptions
33from .sort import Sort
4+ import math
45
56
67def to_camel_case (word ):
@@ -15,11 +16,54 @@ def __init__(self, model):
1516 self ._pagination_item = None
1617
1718 def __iter__ (self ):
18- self ._fetch_all ()
19- return iter (self ._result_cache )
19+ self .request_options .pagenumber = 1
20+ self ._result_cache = None
21+ total = self .total_available
22+ size = self .page_size
23+ yield from self ._result_cache
24+ for page in range (1 , math .ceil (total / size )):
25+ self .request_options .pagenumber = page + 1
26+ self ._result_cache = None
27+ self ._fetch_all ()
28+ yield from self ._result_cache
2029
2130 def __getitem__ (self , k ):
22- return list (self )[k ]
31+ page = self .page_number
32+ size = self .page_size
33+
34+ page_range = range ((page - 1 ) * size , page * size )
35+
36+ if isinstance (k , slice ):
37+ step = k .step if k .step is not None else 1
38+ start = k .start if k .start is not None else 0
39+ stop = k .stop if k .stop is not None else self .total_available
40+ if start < 0 :
41+ start += self .total_available
42+ if stop < 0 :
43+ stop += self .total_available
44+ if start < stop and step < 0 :
45+ # Since slicing is left inclusive and right exclusive, shift
46+ # the start and stop values by 1 to keep that behavior
47+ start , stop = stop - 1 , start - 1
48+ slice_stop = stop if stop > 0 else None
49+ k = slice (start , slice_stop , step )
50+
51+ k_range = range (start , stop , step )
52+ if all (i in page_range for i in k_range ):
53+ return self ._result_cache [k ]
54+ return [self [i ] for i in k_range ]
55+
56+ if k < 0 :
57+ k += self .total_available
58+
59+ if k in page_range :
60+ return self ._result_cache [k % size ]
61+ elif k in range (self .total_available ):
62+ self ._result_cache = None
63+ self .request_options .pagenumber = max (1 , math .ceil (k / size ))
64+ return self [k ]
65+ else :
66+ raise IndexError
2367
2468 def _fetch_all (self ):
2569 """
@@ -43,7 +87,9 @@ def page_size(self):
4387 self ._fetch_all ()
4488 return self ._pagination_item .page_size
4589
46- def filter (self , ** kwargs ):
90+ def filter (self , * invalid , ** kwargs ):
91+ if invalid :
92+ raise RuntimeError (f"Only accepts keyword arguments." )
4793 for kwarg_key , value in kwargs .items ():
4894 field_name , operator = self ._parse_shorthand_filter (kwarg_key )
4995 self .request_options .filter .add (Filter (field_name , operator , value ))
0 commit comments