Source code for daily_med.request_paginator
# -*- coding: utf-8 -*-
# Copyright 2017-TODAY LasLabs Inc.
# License MIT (https://opensource.org/licenses/MIT).
import requests
[docs]class RequestPaginator(object):
""" RequestPaginator provides an iterator based upon an initial request.
"""
PAGE_SIZE = 'pagesize'
PAGE_NUM = 'page'
PAGE_TOTAL = 'total_pages'
PAGE_CURRENT = 'current_page'
PAGE_DATA = 'data'
PAGE_META = 'metadata'
SSL_VERIFY = True
def __init__(self, endpoint, params=None, page_size=25, page_start=1,
output_type=dict,
):
""" It initializes the RequestPaginator object.
Args:
endpoint (str): URI endpoint to call.
params (dict|bytes): Data to be sent in the query string
for the Request.
page_size (int): Size of pages to iterate.
page_start (int): Page number to start on.
output_type (type): Class type to output. Object will be
instantiated using the current row before output.
"""
self.endpoint = endpoint
self.params = params
self.page_size = page_size
self.page_start = page_start
self.session = requests.Session()
self.output_type = output_type
def __iter__(self, page_num=None):
""" It provides an iterator for the remote request.
The result is returned as an instantiated `self.output_type`.
"""
params = self.params.copy()
page_num = page_num or self.page_start
params.update({
self.PAGE_SIZE: self.page_size,
self.PAGE_NUM: page_num,
})
result = self.call(params)
meta = result[self.PAGE_META]
data = result[self.PAGE_DATA]
for row in data:
yield self.output_type(**row)
if meta[self.PAGE_CURRENT] != meta[self.PAGE_TOTAL]:
for inner_row in self.__iter__(page_num + 1):
yield inner_row
else:
raise StopIteration()
[docs] def call(self, params):
""" It calls the remote endpoint and returns the JSON decoded result.
"""
response = self.session.get(
url=self.endpoint,
params=params,
verify=self.SSL_VERIFY,
)
return response.json()