Skip to content

Commit

Permalink
V3 (#21)
Browse files Browse the repository at this point in the history
* added support for v3

* added tests; updated readme

* added tests; fixes Dune has updated api to v3 #19
  • Loading branch information
itzmestar authored Dec 16, 2022
1 parent 31a1a6c commit 21490c6
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 4 deletions.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,14 @@ result_id = dune.query_result_id(query_id=5508)
# fetch query result
data = dune.query_result(result_id)
For some queries above might not work specially if using v3. Try to use below in that case:
# for example:
# https://dune.com/queries/1105079
result_id = dune.query_result_id_v3(query_id=1105079)
# fetch execution result
data = dune.get_execution_result(result_id)
```
2 changes: 1 addition & 1 deletion duneanalytics/__version__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
__title__ = 'duneanalytics'
__description__ = 'Unofficial library for Dune Analytics.'
__url__ = 'https://github.com/itzmestar/duneanalytics'
__version__ = '1.2.1'
__version__ = '2.0.0'
__build__ = 0x010001
__author__ = 'Tarique Anwer'
__author_email__ = '[email protected]'
Expand Down
56 changes: 56 additions & 0 deletions duneanalytics/duneanalytics.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

BASE_URL = "https://dune.com"
GRAPH_URL = 'https://core-hsr.dune.com/v1/graphql'
GRAPH_URL_NEW = 'https://app-api.dune.com/v1/graphql'

# --------- Constants --------- #
logging.basicConfig(
Expand All @@ -34,6 +35,7 @@ def __init__(self, username, password):
self.token = None
self.username = username
self.password = password
self.query_id = None
self.session = Session()
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,'
Expand Down Expand Up @@ -122,6 +124,35 @@ def query_result_id(self, query_id):
logger.error(response.text)
return None

def query_result_id_v3(self, query_id):
"""
Fetch the query result id for a query
:param query_id: provide the query_id
:return:
"""
self.query_id = query_id
query_data = {"operationName": "GetResult", "variables": {"query_id": query_id, "parameters": []},
"query": "query GetResult($query_id: Int!, $parameters: [Parameter!]!) "
"{\n get_result_v3(query_id: $query_id, parameters: $parameters) "
"{\n job_id\n result_id\n error_id\n __typename\n }\n}\n"
}

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()
logger.debug(data)
if 'errors' in data:
logger.error(data.get('errors'))
return None
result_id = data.get('data').get('get_result_v3').get('result_id')
return result_id
else:
logger.error(response.text)
return None

def query_result(self, result_id):
"""
Fetch the result for a query
Expand All @@ -148,3 +179,28 @@ def query_result(self, result_id):
else:
logger.error(response.text)
return {}

def get_execution_result(self, execution_id):
query_data = {"operationName": "GetExecution",
"variables": {"execution_id": execution_id, "query_id": self.query_id, "parameters": []},
"query": "query GetExecution($execution_id: String!, $query_id: Int!, $parameters: [Parameter!]!)"
" {\n get_execution(\n execution_id: $execution_id\n query_id: $query_id\n "
"parameters: $parameters\n ) {\n execution_queued {\n execution_id\n "
"execution_user_id\n position\n execution_type\n created_at\n "
"__typename\n }\n execution_running {\n execution_id\n "
"execution_user_id\n execution_type\n started_at\n created_at\n "
"__typename\n }\n execution_succeeded {\n execution_id\n "
"runtime_seconds\n generated_at\n columns\n data\n __typename\n }"
"\n execution_failed {\n execution_id\n type\n message\n metadata"
" {\n line\n column\n hint\n __typename\n }\n "
"runtime_seconds\n generated_at\n __typename\n }\n __typename\n }\n}\n"}
self.session.headers.update({'authorization': f'Bearer {self.token}'})

response = self.session.post(GRAPH_URL_NEW, json=query_data)
if response.status_code == 200:
data = response.json()
logger.debug(data)
return data
else:
logger.error(response.text)
return {}
14 changes: 11 additions & 3 deletions tests/test_duneanalytics.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,22 @@ def test_fetch_auth_token(self, dune):
assert dune.password is not None
assert dune.token is not None

# @pytest.mark.skip(reason='To be implemented')
@pytest.mark.skip(reason='To be implemented')
def test_query_result_id(self, dune):
result_id = dune.query_result_id(query_id=3751)
result_id = dune.query_result_id(query_id=3705)
assert result_id is not None

# @pytest.mark.skip(reason='To be implemented')
@pytest.mark.skip(reason='To be implemented')
def test_query_result(self, dune):
result_id = dune.query_result_id(query_id=3705)
assert result_id is not None
data = dune.query_result(result_id)
assert data is not None

def test_get_execution_result(self, dune):
result_id = dune.query_result_id_v3(query_id=1105079)
assert result_id is not None
data = dune.get_execution_result(result_id)
assert data is not None
assert data.get('data', {}).get('get_execution') is not None
assert data.get('data', {}).get('get_execution', {}).get('execution_succeeded') is not None

0 comments on commit 21490c6

Please sign in to comment.