From 39a2504ba9844b7b59fb33a23b3e7aa60c602288 Mon Sep 17 00:00:00 2001 From: klokt-valg <20753260+klokt-valg@users.noreply.github.com> Date: Mon, 13 Dec 2021 13:44:42 -0500 Subject: [PATCH 1/8] enhanced error handling --- duneanalytics/duneanalytics.py | 39 +++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/duneanalytics/duneanalytics.py b/duneanalytics/duneanalytics.py index defc9cae..ce84848c 100644 --- a/duneanalytics/duneanalytics.py +++ b/duneanalytics/duneanalytics.py @@ -10,6 +10,18 @@ # --------- Constants --------- # +class DuneAnalyticsException(Exception): + """Exception raised for errors during communication with Dune Analytics. + + Attributes: + response -- response object received the last time before exception occurs + message -- explanation of the error + """ + def __init__(self, message="", response=None): + self.response = response + self.message = message + super().__init__(self.message) + class DuneAnalytics: """ @@ -17,7 +29,7 @@ class DuneAnalytics: All requests to be made through this class. """ - def __init__(self, username, password): + def __init__(self, username, password, raise_exception=False): """ Initialize the object :param username: username for duneanalytics.com @@ -28,6 +40,7 @@ def __init__(self, username, password): self.token = None self.username = username self.password = password + self.raise_exception = raise_exception self.session = Session() headers = { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,' @@ -43,7 +56,14 @@ def __init__(self, username, password): } self.session.headers.update(headers) - def login(self): + def _should_raise_exception(self, override_raise_exception): + return (override_raise_exception is True or (override_raise_exception is None and self.raise_exception)) + + def _try_raise_exception(raise_exception, description): + if (raise_exception is True or (raise_exception is None and self.raise_exception)): + raise Exception(description) + + def login(self, raise_exception=None): """ Try to login to duneanalytics.com & get the token :return: @@ -59,6 +79,9 @@ def login(self): self.session.post(csrf_url) self.csrf = self.session.cookies.get('csrf') + if (not self.csrf and self._should_raise_exception(raise_exception)): + raise DuneAnalyticsException("Could not fetch CSRF token!", None) + # try to login form_data = { 'action': 'login', @@ -71,7 +94,7 @@ def login(self): self.session.post(auth_url, data=form_data) self.auth_refresh = self.session.cookies.get('auth-refresh') - def fetch_auth_token(self): + def fetch_auth_token(self, raise_exception=None): """ Fetch authorization token for the user :return: @@ -82,9 +105,11 @@ def fetch_auth_token(self): if response.status_code == 200: self.token = response.json().get('token') else: + if (self._should_raise_exception(raise_exception)): + raise DuneAnalyticsException("Could not get auth token!", response=response) print(response.text) - def query_result_id(self, query_id): + def query_result_id(self, query_id, raise_exception=None): """ Fetch the query result id for a query @@ -108,10 +133,12 @@ def query_result_id(self, query_id): result_id = data.get('data').get('get_result').get('result_id') return result_id else: + if (self._should_raise_exception(raise_exception)): + raise DuneAnalyticsException("Could not get query result id!", response=response) print(response.text) return None - def query_result(self, result_id): + def query_result(self, result_id, raise_exception=None): """ Fetch the result for a query :param result_id: result id of the query @@ -133,5 +160,7 @@ def query_result(self, result_id): print(data) return data else: + if (self._should_raise_exception(raise_exception)): + raise DuneAnalyticsException("Could not get query result data!", response=response) print(response.text) return {} From 865f5af7f856c8bb281a8cceed3a2cd988221231 Mon Sep 17 00:00:00 2001 From: klokt-valg <20753260+klokt-valg@users.noreply.github.com> Date: Mon, 13 Dec 2021 13:52:18 -0500 Subject: [PATCH 2/8] export custom Exception Class --- duneanalytics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/duneanalytics/__init__.py b/duneanalytics/__init__.py index 8a70be8c..c3d025ee 100644 --- a/duneanalytics/__init__.py +++ b/duneanalytics/__init__.py @@ -2,4 +2,4 @@ from .__version__ import __version__, __build__, __author_email__ from .__version__ import __author__, __license__, __copyright__ -from .duneanalytics import DuneAnalytics +from .duneanalytics import DuneAnalytics, DuneAnalyticsException From 8c01d8885c76853d086b69acaf809f053a7ffc1c Mon Sep 17 00:00:00 2001 From: klokt-valg <20753260+klokt-valg@users.noreply.github.com> Date: Mon, 13 Dec 2021 14:03:23 -0500 Subject: [PATCH 3/8] - removed prints when success - raising exception when failed to fetch query_id --- duneanalytics/duneanalytics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/duneanalytics/duneanalytics.py b/duneanalytics/duneanalytics.py index ce84848c..42f9b163 100644 --- a/duneanalytics/duneanalytics.py +++ b/duneanalytics/duneanalytics.py @@ -127,8 +127,9 @@ def query_result_id(self, query_id, raise_exception=None): response = self.session.post(GRAPH_URL, json=query_data) if response.status_code == 200: data = response.json() - print(data) - if 'errors' in data: + if 'errors' in data + if(self._should_raise_exception(raise_exception)): + raise DuneAnalyticsException("Could not get query result id!", response=response) return None result_id = data.get('data').get('get_result').get('result_id') return result_id @@ -157,7 +158,6 @@ def query_result(self, result_id, raise_exception=None): response = self.session.post(GRAPH_URL, json=query_data) if response.status_code == 200: data = response.json() - print(data) return data else: if (self._should_raise_exception(raise_exception)): From 87961830020a6f6d1ed83fe9b1534e8f56aade49 Mon Sep 17 00:00:00 2001 From: klokt-valg <20753260+klokt-valg@users.noreply.github.com> Date: Mon, 13 Dec 2021 14:16:59 -0500 Subject: [PATCH 4/8] typo errror --- duneanalytics/duneanalytics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/duneanalytics/duneanalytics.py b/duneanalytics/duneanalytics.py index 42f9b163..858bb890 100644 --- a/duneanalytics/duneanalytics.py +++ b/duneanalytics/duneanalytics.py @@ -127,7 +127,7 @@ def query_result_id(self, query_id, raise_exception=None): response = self.session.post(GRAPH_URL, json=query_data) if response.status_code == 200: data = response.json() - if 'errors' in data + if 'errors' in data: if(self._should_raise_exception(raise_exception)): raise DuneAnalyticsException("Could not get query result id!", response=response) return None From 81d947852699b76891200fb2520d2990f1aca825 Mon Sep 17 00:00:00 2001 From: md-prog <26860200+md-prog@users.noreply.github.com> Date: Sun, 13 Mar 2022 14:50:13 -0400 Subject: [PATCH 5/8] added parameter to dune query --- duneanalytics/duneanalytics.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/duneanalytics/duneanalytics.py b/duneanalytics/duneanalytics.py index 852a1f09..40781ab0 100644 --- a/duneanalytics/duneanalytics.py +++ b/duneanalytics/duneanalytics.py @@ -109,11 +109,12 @@ def fetch_auth_token(self, raise_exception=None): raise DuneAnalyticsException("Could not get auth token!", response=response) print(response.text) - def query_result_id(self, query_id, raise_exception=None): + def query_result_id(self, query_id, parameters=None, raise_exception=None): """ Fetch the query result id for a query :param query_id: provide the query_id + :param parameters: Array of {key, type, value}. For example, {key: "NFT Contract", type: "text", value: "0xBD4455dA5929D5639EE098ABFaa3241e9ae111Af"} :return: """ query_data = {"operationName": "GetResult", "variables": {"query_id": query_id}, @@ -121,6 +122,8 @@ def query_result_id(self, query_id, raise_exception=None): "{\n get_result(query_id: $query_id, parameters: $parameters) " "{\n job_id\n result_id\n __typename\n }\n}\n" } + if parameters is not None: + query_data["variables"].update({ "parameters": parameters }) self.session.headers.update({'authorization': f'Bearer {self.token}'}) From 00109077ed5160f93d3391a38cc1b6092eb64253 Mon Sep 17 00:00:00 2001 From: md-prog <26860200+md-prog@users.noreply.github.com> Date: Sun, 13 Mar 2022 14:52:05 -0400 Subject: [PATCH 6/8] added parameters to getResult API call --- duneanalytics/duneanalytics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/duneanalytics/duneanalytics.py b/duneanalytics/duneanalytics.py index 40781ab0..92d37e27 100644 --- a/duneanalytics/duneanalytics.py +++ b/duneanalytics/duneanalytics.py @@ -122,7 +122,7 @@ def query_result_id(self, query_id, parameters=None, raise_exception=None): "{\n get_result(query_id: $query_id, parameters: $parameters) " "{\n job_id\n result_id\n __typename\n }\n}\n" } - if parameters is not None: + if parameters is not None and len(parameters) > 0: query_data["variables"].update({ "parameters": parameters }) self.session.headers.update({'authorization': f'Bearer {self.token}'}) From 86beb2321c1a592dd78e1cfa21139012ca6ef972 Mon Sep 17 00:00:00 2001 From: klokt-valg <20753260+klokt-valg@users.noreply.github.com> Date: Wed, 1 Jun 2022 17:50:47 -0400 Subject: [PATCH 7/8] add get_result_id_v2 query --- duneanalytics/duneanalytics.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/duneanalytics/duneanalytics.py b/duneanalytics/duneanalytics.py index 92d37e27..5c07ac97 100644 --- a/duneanalytics/duneanalytics.py +++ b/duneanalytics/duneanalytics.py @@ -143,6 +143,40 @@ def query_result_id(self, query_id, parameters=None, raise_exception=None): print(response.text) return None + def query_result_id_v2(self, query_id, parameters=None, raise_exception=None): + """ + Fetch the query result id for a query + + :param query_id: provide the query_id + :param parameters: Array of {key, type, value}. For example, {key: "NFT Contract", type: "text", value: "0xBD4455dA5929D5639EE098ABFaa3241e9ae111Af"} + :return: + """ + query_data = {"operationName": "GetResult", "variables": {"query_id": query_id}, + "query": "query GetResult($query_id: Int!, $parameters: [Parameter!]) " + "{\n get_result_v2(query_id: $query_id, parameters: $parameters) " + "{\n job_id\n result_id\n error_id\n __typename\n }\n}\n" + } + if parameters is not None and len(parameters) > 0: + query_data["variables"].update({ "parameters": parameters }) + + self.session.headers.update({'authorization': f'Bearer {self.token}'}) + + response = self.session.post(GRAPH_URL, json=query_data) + if response.status_code == 200: + data = response.json() + # print(data) + if 'errors' in data: + if(self._should_raise_exception(raise_exception)): + raise DuneAnalyticsException("Could not get query result id!", response=response) + return None + result_id = data.get('data').get('get_result').get('result_id') + return result_id + else: + if (self._should_raise_exception(raise_exception)): + raise DuneAnalyticsException("Could not get query result id!", response=response) + print(response.text) + return None + def query_result(self, result_id, raise_exception=None): """ Fetch the result for a query From 2606238159b1b5e9a412df7809749aad2907c1ef Mon Sep 17 00:00:00 2001 From: klokt-valg <20753260+klokt-valg@users.noreply.github.com> Date: Wed, 1 Jun 2022 17:53:52 -0400 Subject: [PATCH 8/8] bugfix get_result_id_v2() - getting result_id --- duneanalytics/duneanalytics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/duneanalytics/duneanalytics.py b/duneanalytics/duneanalytics.py index 5c07ac97..b7499d59 100644 --- a/duneanalytics/duneanalytics.py +++ b/duneanalytics/duneanalytics.py @@ -169,7 +169,7 @@ def query_result_id_v2(self, query_id, parameters=None, raise_exception=None): if(self._should_raise_exception(raise_exception)): raise DuneAnalyticsException("Could not get query result id!", response=response) return None - result_id = data.get('data').get('get_result').get('result_id') + result_id = data.get('data').get('get_result_v2').get('result_id') return result_id else: if (self._should_raise_exception(raise_exception)):