77
88class Pagination (object ):
99
10- def __init__ (self , config = None , skip_key = None , limit_key = None , total_key = None , next_page_key = None ):
10+ def __init__ (self ):
1111 self .next_page_key = None
1212 self .next_page_url_base = None
1313 self .skip_key = None
14- self .limit_key = None
15- self .total_key = None
16- self .total = None
1714 self .next_page_url = None
18- self .remaining_records = None
1915 self .records_to_skip = None
2016 self .pagination_type = ""
2117 self .counting_key = None
@@ -26,10 +22,11 @@ def __init__(self, config=None, skip_key=None, limit_key=None, total_key=None, n
2622 self .next_page_number = None
2723 self .params_must_be_blanked = False
2824 self .data_is_list = None
25+ self .update_next_page = self .update_next_page_default
2926
30- def configure_paging (self , config = None , skip_key = None , limit_key = None , total_key = None , next_page_key = None , next_page_url_base = None , url = None , pagination_type = "na" ):
27+ def configure_paging (self , config = None , skip_key = None ,
28+ next_page_key = None , next_page_url_base = None , pagination_type = "na" ):
3129 config = {} if config is None else config
32- self .limit_key = config .get ("limit_key" , limit_key )
3330 self .pagination_type = config .get ("pagination_type" , pagination_type )
3431 if self .pagination_type == "next_page" :
3532 self .next_page_key = config .get ("next_page_key" , next_page_key )
@@ -39,12 +36,19 @@ def configure_paging(self, config=None, skip_key=None, limit_key=None, total_key
3936 self .next_page_url_base = next_page_url_base
4037 elif self .pagination_type in ["offset" , "page" ]:
4138 self .skip_key = config .get ("skip_key" , skip_key )
42- logger .info ("configure_paging: self.limit_key='{}', self. pagination_type='{}', self.next_page_key='{}', self.next_page_url_base='{}', self.skip_key='{}'" .format (
43- self . limit_key , self .pagination_type , self .next_page_key , self .next_page_url_base , self .skip_key
39+ logger .info ("configure_paging: self.pagination_type='{}', self.next_page_key='{}', self.next_page_url_base='{}', self.skip_key='{}'" .format (
40+ self .pagination_type , self .next_page_key , self .next_page_url_base , self .skip_key
4441 ))
42+ if self .pagination_type == "next_page" :
43+ self .update_next_page = self .update_next_page_link
44+ elif self .pagination_type == "offset" :
45+ self .update_next_page = self .update_next_page_offset
46+ elif self .pagination_type == "page" :
47+ self .update_next_page = self .update_next_page_per_page
48+ else :
49+ self .update_next_page = self .update_next_page_default
4550
4651 def reset_paging (self , counting_key = None , url = None ):
47- self .remaining_records = 0
4852 self .records_to_skip = 0
4953 self .counting_key = counting_key
5054 self .counter = 0
@@ -62,65 +66,70 @@ def set_counting_key(self, counting_key):
6266 self .counting_key = counting_key
6367 logger .info ("set_counting_key: counting_key set to {}" .format (self .counting_key ))
6468
65- def update_next_page (self , data , response_links = None ):
66- response_links = response_links or {}
67- next_link = response_links .get ('next' , {})
68- next_page_url = next_link .get ("url" )
69- self .is_first_batch = False
70- self .counter += 1
71- self .next_page_number = self .next_page_number + 1
72- if next_page_url :
73- self .next_page_url = next_page_url
74- self .params_must_be_blanked = True
75- logger .info ("update_next_page:next_link={}, next_page_url={}, params_must_be_blanked={}, next_page_number={}, counter={}" .format (
76- next_link , self .next_page_url , self .params_must_be_blanked , self .next_page_number , self .counter
77- ))
69+ def compute_batch_size (self , data ):
7870 self .data_is_list = False
7971 if isinstance (data , list ):
8072 self .data_is_list = True
8173 batch_size = len (data )
82- self .records_to_skip = self .records_to_skip + batch_size
83- if batch_size == 0 :
84- self .is_last_batch_empty = True
85- logger .info ("update_next_page:update_next_page:data is list:batch_size={}, records_to_skip={}, is_last_batch_empty={}" .format (
86- batch_size , self .records_to_skip , self .is_last_batch_empty
87- ))
88- return
8974 elif self .counting_key :
9075 extracted_data = get_value_from_path (data , self .counting_key .split ("." ), can_raise = False )
9176 if extracted_data :
9277 batch_size = len (extracted_data )
9378 else :
9479 batch_size = 0
95- self .is_last_batch_empty = True
9680 else :
9781 batch_size = 1
82+ if batch_size == 0 :
83+ self .is_last_batch_empty = True
84+ return batch_size
85+
86+ def update_next_page_offset (self , data , response_links = None ):
87+ self .is_first_batch = False
88+ self .counter += 1
89+ batch_size = self .compute_batch_size (data )
90+ self .records_to_skip = self .records_to_skip + batch_size
91+ logger .info ("update_next_page_offset:data_is_list={}, records_to_skip={}, batch_size={}, is_last_batch_empty={}" .format (
92+ self .data_is_list , self .records_to_skip , batch_size , self .is_last_batch_empty
93+ ))
94+
95+ def update_next_page_per_page (self , data , response_links = None ):
96+ self .is_first_batch = False
97+ self .counter += 1
98+ self .next_page_number = self .next_page_number + 1
99+ batch_size = self .compute_batch_size (data )
100+ logger .info ("update_next_page_per_page:data_is_list={}, next_page_number={}, batch_size={}, is_last_batch_empty={}" .format (
101+ self .data_is_list , self .next_page_number , batch_size , self .is_last_batch_empty
102+ ))
103+
104+ def update_next_page_link (self , data , response_links = None ):
105+ self .is_first_batch = False
106+ self .counter += 1
107+ self .next_page_url = None
108+ self .data_is_list = False
109+
98110 if self .next_page_key :
99111 next_page_path = extract_key_using_json_path (data , self .next_page_key )
100112 if self .next_page_url_base and next_page_path :
101113 self .next_page_url = "/" .join ([self .next_page_url_base , next_page_path ])
102114 else :
103115 self .next_page_url = next_page_path
104- logger .info ("update_next_page :next_page_url_base={}, next_page_path={}, next_page_url={}" .format (
116+ logger .info ("update_next_page_link :next_page_url_base={}, next_page_path={}, next_page_url={}" .format (
105117 self .next_page_url_base , next_page_path , self .next_page_url
106118 ))
107- if self .skip_key :
108- self .skip = data .get (self .skip_key )
109- logger .info ("update_next_page:skip=data[{}]={}" .format (self .skip_key , self .skip ))
110- if self .limit_key :
111- self .limit = data .get (self .limit_key )
112- logger .info ("update_next_page:limit=data[{}]={}" .format (self .limit_key , self .limit ))
113- if self .total_key :
114- self .total = data .get (self .total_key )
115- logger .info ("update_next_page:total=data[{}]={}" .format (self .total_key , self .total ))
116- self .records_to_skip = self .records_to_skip + batch_size
117- logger .info ("update_next_page:records_to_skip={}, batch_size={}" .format (self .records_to_skip , batch_size ))
118- if self .total :
119- self .remaining_records = self .total - self .records_to_skip
120- logger .info ("update_next_page:remaining_records={}, total={}, records_to_skip={}" .format (
121- self .remaining_records , self .total , self .records_to_skip
119+ else :
120+ response_links = response_links or {}
121+ next_link = response_links .get ('next' , {})
122+ next_page_url = next_link .get ("url" )
123+ if next_page_url :
124+ self .next_page_url = next_page_url
125+ self .params_must_be_blanked = True
126+ logger .info ("update_next_page_link:next_link={}, next_page_url={}, params_must_be_blanked={}, next_page_number={}, counter={}" .format (
127+ next_link , self .next_page_url , self .params_must_be_blanked , self .next_page_number , self .counter
122128 ))
123129
130+ def update_next_page_default (self , data , response_links = None ):
131+ self .is_first_batch = False
132+
124133 def has_next_page (self ):
125134 if self .is_last_batch_empty :
126135 logger .info ("has_next_page:last was batch empty -> False" )
0 commit comments