I am writing a python REST API library for Starburst and am trying to figure the best way to structure the code so it's dry but also easy to understand. Below is an example of code that is not dry.
Other methods I've researched is having a config file with the different API calls and having a single function for get/put/delete/post.
Other way is grouping based on domains and passing the method as a variable.
class StarburstAPI(object):
def __init__(self, username=None, password=None, oauth=None, session=None):
self.api_version = 'v1'
self.base_url = 'https://starburst.com/api/' + self.api_version
self.headers = default_headers()
self.params = {}
if session is None:
session = requests.Session()
self._session = session
if username is not None or password is not None:
self._session.auth = (username, password)
self._session.cookies = self._session.head(self.base_url).cookies
self._session.headers.update({'Content-Type': 'application/json'})
# Get list of domains
def list_domains(self):
url = self.base_url + '/dataProduct/domains/'
return self._session.get(url)
# Get domain by id
def get_domain(self, id: str):
url = self.base_url + '/dataProduct/domains/' + id
return self._session.get(url)
# Create domain
def create_domain(self, data=None, **kw):
url = self.base_url + '/dataProduct/domains/'
if data:
kw = add_json_headers(kw)
data = json.dumps(data)
return self._session.post(url, data, **kw)
# Delete domain by id
def delete_domain(self, id: str):
url = self.base_url + '/dataProduct/domains/' + id
return self._session.delete(url)
# Update domain by id
def update_domain(self, id: str, data=None, **kw):
url = self.base_url + '/dataProduct/domains/' + id
if data:
kw = add_json_headers(kw)
data = json.dumps(data)
return self._session.put(url, data, **kw)