Skip to content

Commit 21490c6

Browse files
authored
V3 (#21)
* added support for v3 * added tests; updated readme * added tests; fixes Dune has updated api to v3 #19
1 parent 31a1a6c commit 21490c6

File tree

4 files changed

+78
-4
lines changed

4 files changed

+78
-4
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,14 @@ result_id = dune.query_result_id(query_id=5508)
8282
8383
# fetch query result
8484
data = dune.query_result(result_id)
85+
86+
For some queries above might not work specially if using v3. Try to use below in that case:
87+
# for example:
88+
# https://dune.com/queries/1105079
89+
90+
result_id = dune.query_result_id_v3(query_id=1105079)
91+
92+
# fetch execution result
93+
data = dune.get_execution_result(result_id)
94+
8595
```

duneanalytics/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
__title__ = 'duneanalytics'
33
__description__ = 'Unofficial library for Dune Analytics.'
44
__url__ = 'https://github.com/itzmestar/duneanalytics'
5-
__version__ = '1.2.1'
5+
__version__ = '2.0.0'
66
__build__ = 0x010001
77
__author__ = 'Tarique Anwer'
88
__author_email__ = '[email protected]'

duneanalytics/duneanalytics.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
BASE_URL = "https://dune.com"
1010
GRAPH_URL = 'https://core-hsr.dune.com/v1/graphql'
11+
GRAPH_URL_NEW = 'https://app-api.dune.com/v1/graphql'
1112

1213
# --------- Constants --------- #
1314
logging.basicConfig(
@@ -34,6 +35,7 @@ def __init__(self, username, password):
3435
self.token = None
3536
self.username = username
3637
self.password = password
38+
self.query_id = None
3739
self.session = Session()
3840
headers = {
3941
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,'
@@ -122,6 +124,35 @@ def query_result_id(self, query_id):
122124
logger.error(response.text)
123125
return None
124126

127+
def query_result_id_v3(self, query_id):
128+
"""
129+
Fetch the query result id for a query
130+
131+
:param query_id: provide the query_id
132+
:return:
133+
"""
134+
self.query_id = query_id
135+
query_data = {"operationName": "GetResult", "variables": {"query_id": query_id, "parameters": []},
136+
"query": "query GetResult($query_id: Int!, $parameters: [Parameter!]!) "
137+
"{\n get_result_v3(query_id: $query_id, parameters: $parameters) "
138+
"{\n job_id\n result_id\n error_id\n __typename\n }\n}\n"
139+
}
140+
141+
self.session.headers.update({'authorization': f'Bearer {self.token}'})
142+
143+
response = self.session.post(GRAPH_URL, json=query_data)
144+
if response.status_code == 200:
145+
data = response.json()
146+
logger.debug(data)
147+
if 'errors' in data:
148+
logger.error(data.get('errors'))
149+
return None
150+
result_id = data.get('data').get('get_result_v3').get('result_id')
151+
return result_id
152+
else:
153+
logger.error(response.text)
154+
return None
155+
125156
def query_result(self, result_id):
126157
"""
127158
Fetch the result for a query
@@ -148,3 +179,28 @@ def query_result(self, result_id):
148179
else:
149180
logger.error(response.text)
150181
return {}
182+
183+
def get_execution_result(self, execution_id):
184+
query_data = {"operationName": "GetExecution",
185+
"variables": {"execution_id": execution_id, "query_id": self.query_id, "parameters": []},
186+
"query": "query GetExecution($execution_id: String!, $query_id: Int!, $parameters: [Parameter!]!)"
187+
" {\n get_execution(\n execution_id: $execution_id\n query_id: $query_id\n "
188+
"parameters: $parameters\n ) {\n execution_queued {\n execution_id\n "
189+
"execution_user_id\n position\n execution_type\n created_at\n "
190+
"__typename\n }\n execution_running {\n execution_id\n "
191+
"execution_user_id\n execution_type\n started_at\n created_at\n "
192+
"__typename\n }\n execution_succeeded {\n execution_id\n "
193+
"runtime_seconds\n generated_at\n columns\n data\n __typename\n }"
194+
"\n execution_failed {\n execution_id\n type\n message\n metadata"
195+
" {\n line\n column\n hint\n __typename\n }\n "
196+
"runtime_seconds\n generated_at\n __typename\n }\n __typename\n }\n}\n"}
197+
self.session.headers.update({'authorization': f'Bearer {self.token}'})
198+
199+
response = self.session.post(GRAPH_URL_NEW, json=query_data)
200+
if response.status_code == 200:
201+
data = response.json()
202+
logger.debug(data)
203+
return data
204+
else:
205+
logger.error(response.text)
206+
return {}

tests/test_duneanalytics.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,22 @@ def test_fetch_auth_token(self, dune):
2323
assert dune.password is not None
2424
assert dune.token is not None
2525

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

31-
# @pytest.mark.skip(reason='To be implemented')
31+
@pytest.mark.skip(reason='To be implemented')
3232
def test_query_result(self, dune):
3333
result_id = dune.query_result_id(query_id=3705)
3434
assert result_id is not None
3535
data = dune.query_result(result_id)
3636
assert data is not None
37+
38+
def test_get_execution_result(self, dune):
39+
result_id = dune.query_result_id_v3(query_id=1105079)
40+
assert result_id is not None
41+
data = dune.get_execution_result(result_id)
42+
assert data is not None
43+
assert data.get('data', {}).get('get_execution') is not None
44+
assert data.get('data', {}).get('get_execution', {}).get('execution_succeeded') is not None

0 commit comments

Comments
 (0)