Skip to content

Commit 2e402e4

Browse files
authored
Actually run --check in CI and fix fmt (#167)
1 parent f9abe56 commit 2e402e4

File tree

13 files changed

+173
-40
lines changed

13 files changed

+173
-40
lines changed

.github/workflows/pull-request.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
- name: Install dependencies
2222
run: uv sync --extra dev
2323
- name: Format Check
24-
run: make fmt
24+
run: make fmt-check
2525
- name: Lint
2626
run: make lint
2727
- name: Type Check (mypy)

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ clean:
1515
fmt:
1616
uv run ruff format
1717

18+
fmt-check:
19+
uv run ruff format --check
20+
1821
lint:
1922
uv run ruff check
2023

dune_client/api/execution.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ class ExecutionAPI(BaseRouter):
3232
Query execution and result fetching functions.
3333
"""
3434

35-
def execute_query(
36-
self, query: QueryBase, performance: str | None = None
37-
) -> ExecutionResponse:
35+
def execute_query(self, query: QueryBase, performance: str | None = None) -> ExecutionResponse:
3836
"""Post's to Dune API for execute `query`"""
3937
params = query.request_format()
4038
params["performance"] = performance or self.performance

dune_client/client_async.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,9 @@ async def __aenter__(self) -> Self:
115115
self._session = await self._create_session()
116116
return self
117117

118-
async def __aexit__(self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: object) -> None:
118+
async def __aexit__(
119+
self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: object
120+
) -> None:
119121
await self.disconnect()
120122

121123
async def _handle_response(self, response: ClientResponse) -> Any:

dune_client/models.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ class ResultMetadata:
184184
Representation of Dune's Result Metadata from [Get] Query Results endpoint
185185
"""
186186

187-
188187
column_names: list[str]
189188
column_types: list[str]
190189
row_count: int

dune_client/viz/graphs.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
Functions you can call to make different graphs
33
"""
44

5-
65
# https://github.com/plotly/colorlover/issues/35
76
import colorlover as cl # type: ignore[import-untyped]
87
import pandas as pd

tests/e2e/test_async_client.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,13 @@ async def test_refresh_with_pagination(self):
4545
results = (await cl.refresh(self.multi_rows_query, batch_size=1)).get_rows()
4646

4747
# Assert
48-
assert results == [{"number": 1}, {"number": 2}, {"number": 3}, {"number": 4}, {"number": 5}]
48+
assert results == [
49+
{"number": 1},
50+
{"number": 2},
51+
{"number": 3},
52+
{"number": 4},
53+
{"number": 5},
54+
]
4955

5056
async def test_refresh_with_filters(self):
5157
# Arrange
@@ -63,7 +69,13 @@ async def test_refresh_csv_with_pagination(self):
6369
result_csv = await cl.refresh_csv(self.multi_rows_query, batch_size=1)
6470

6571
# Assert
66-
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [{"number": 1}, {"number": 2}, {"number": 3}, {"number": 4}, {"number": 5}]
72+
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [
73+
{"number": 1},
74+
{"number": 2},
75+
{"number": 3},
76+
{"number": 4},
77+
{"number": 5},
78+
]
6779

6880
async def test_refresh_csv_with_filters(self):
6981
# Arrange
@@ -72,7 +84,10 @@ async def test_refresh_csv_with_filters(self):
7284
result_csv = await cl.refresh_csv(self.multi_rows_query, filters="number < 3")
7385

7486
# Assert
75-
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [{"number": 1}, {"number": 2}]
87+
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [
88+
{"number": 1},
89+
{"number": 2},
90+
]
7691

7792
@unittest.skip("Large performance tier doesn't currently work.")
7893
async def test_refresh_context_manager_performance_large(self):

tests/e2e/test_client.py

Lines changed: 91 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,13 @@ def test_run_query_paginated(self):
8282
results = dune.run_query(self.multi_rows_query, batch_size=1).get_rows()
8383

8484
# Assert
85-
assert results == [{"number": 1}, {"number": 2}, {"number": 3}, {"number": 4}, {"number": 5}]
85+
assert results == [
86+
{"number": 1},
87+
{"number": 2},
88+
{"number": 3},
89+
{"number": 4},
90+
{"number": 5},
91+
]
8692

8793
def test_run_query_with_filters(self):
8894
# Arrange
@@ -108,7 +114,14 @@ def test_parameters_recognized(self):
108114
new_query = self.copy_query_and_change_parameters()
109115
dune = DuneClient(self.valid_api_key)
110116
results = dune.run_query(new_query)
111-
assert results.get_rows() == [{"text_field": "different word", "number_field": 22, "date_field": "1991-01-01 00:00:00", "list_field": "Option 2"}]
117+
assert results.get_rows() == [
118+
{
119+
"text_field": "different word",
120+
"number_field": 22,
121+
"date_field": "1991-01-01 00:00:00",
122+
"list_field": "Option 2",
123+
}
124+
]
112125

113126
def test_endpoints(self):
114127
dune = DuneClient(self.valid_api_key)
@@ -144,7 +157,10 @@ def test_invalid_api_key_error(self):
144157
assert str(err.value) == "Can't build ExecutionResponse from {'error': 'invalid API Key'}"
145158
with pytest.raises(DuneError) as err:
146159
dune.get_execution_status("wonky job_id")
147-
assert str(err.value) == "Can't build ExecutionStatusResponse from {'error': 'invalid API Key'}"
160+
assert (
161+
str(err.value)
162+
== "Can't build ExecutionStatusResponse from {'error': 'invalid API Key'}"
163+
)
148164
with pytest.raises(DuneError) as err:
149165
dune.get_execution_results("wonky job_id")
150166
assert str(err.value) == "Can't build ResultsResponse from {'error': 'invalid API Key'}"
@@ -166,13 +182,19 @@ def test_internal_error(self):
166182

167183
with pytest.raises(DuneError) as err:
168184
dune.execute_query(query)
169-
assert str(err.value) == "Can't build ExecutionResponse from {'error': 'An internal error occured'}"
185+
assert (
186+
str(err.value)
187+
== "Can't build ExecutionResponse from {'error': 'An internal error occured'}"
188+
)
170189

171190
def test_invalid_job_id_error(self):
172191
dune = DuneClient(self.valid_api_key)
173192
with pytest.raises(DuneError) as err:
174193
dune.get_execution_status("Wonky Job ID")
175-
assert str(err.value) == "Can't build ExecutionStatusResponse from " "{'error': 'The requested execution ID (ID: Wonky Job ID) is invalid.'}"
194+
assert (
195+
str(err.value) == "Can't build ExecutionStatusResponse from "
196+
"{'error': 'The requested execution ID (ID: Wonky Job ID) is invalid.'}"
197+
)
176198

177199
def test_get_latest_result_with_query_object(self):
178200
dune = DuneClient(self.valid_api_key)
@@ -187,7 +209,11 @@ def test_get_latest_result_with_query_id(self):
187209
@unittest.skip("Requires custom namespace and table_name input.")
188210
def test_upload_csv_success(self):
189211
client = DuneClient(self.valid_api_key)
190-
assert client.upload_csv(table_name="e2e-test", description="best data", data="column1,column2\nvalue1,value2\nvalue3,value4")
212+
assert client.upload_csv(
213+
table_name="e2e-test",
214+
description="best data",
215+
data="column1,column2\nvalue1,value2\nvalue3,value4",
216+
)
191217

192218
@unittest.skip("Requires custom namespace and table_name input.")
193219
def test_create_table_success(self):
@@ -197,7 +223,21 @@ def test_create_table_success(self):
197223

198224
namespace = "bh2smith"
199225
table_name = "dataset_e2e_test"
200-
assert client.create_table(namespace=namespace, table_name=table_name, description="e2e test table", schema=[{"name": "date", "type": "timestamp"}, {"name": "dgs10", "type": "double"}], is_private=False) == CreateTableResult.from_dict({"namespace": namespace, "table_name": table_name, "full_name": f"dune.{namespace}.{table_name}", "example_query": f"select * from dune.{namespace}.{table_name} limit 10", "message": "Table created successfully"})
226+
assert client.create_table(
227+
namespace=namespace,
228+
table_name=table_name,
229+
description="e2e test table",
230+
schema=[{"name": "date", "type": "timestamp"}, {"name": "dgs10", "type": "double"}],
231+
is_private=False,
232+
) == CreateTableResult.from_dict(
233+
{
234+
"namespace": namespace,
235+
"table_name": table_name,
236+
"full_name": f"dune.{namespace}.{table_name}",
237+
"example_query": f"select * from dune.{namespace}.{table_name} limit 10",
238+
"message": "Table created successfully",
239+
}
240+
)
201241

202242
# @unittest.skip("Requires custom namespace and table_name input.")
203243
def test_create_table_error(self):
@@ -232,22 +272,31 @@ def test_insert_table_csv_success(self):
232272
],
233273
)
234274
with Path("./tests/fixtures/sample_table_insert.csv").open("rb") as data:
235-
assert client.insert_table(namespace, table_name, data=data, content_type="text/csv") == InsertTableResult(rows_written=1, bytes_written=33)
275+
assert client.insert_table(
276+
namespace, table_name, data=data, content_type="text/csv"
277+
) == InsertTableResult(rows_written=1, bytes_written=33)
236278

237279
@unittest.skip("Requires custom namespace and table_name input.")
238280
def test_clear_data(self):
239281
client = DuneClient(self.valid_api_key)
240282
namespace = "bh2smith"
241283
table_name = "dataset_e2e_test"
242-
assert client.clear_data(namespace, table_name) == ClearTableResult(message="Table dune.bh2smith.dataset_e2e_test successfully cleared")
284+
assert client.clear_data(namespace, table_name) == ClearTableResult(
285+
message="Table dune.bh2smith.dataset_e2e_test successfully cleared"
286+
)
243287

244288
@unittest.skip("Requires custom namespace and table_name input.")
245289
def test_insert_table_json_success(self):
246290
# Make sure the table already exists and json matches table schema.
247291
# You will need to change the namespace to your own.
248292
client = DuneClient(self.valid_api_key)
249293
with Path("./tests/fixtures/sample_table_insert.json").open("rb") as data:
250-
assert client.insert_table(namespace="test", table_name="dataset_e2e_test", data=data, content_type="application/x-ndjson") == InsertTableResult(rows_written=1, bytes_written=33)
294+
assert client.insert_table(
295+
namespace="test",
296+
table_name="dataset_e2e_test",
297+
data=data,
298+
content_type="application/x-ndjson",
299+
) == InsertTableResult(rows_written=1, bytes_written=33)
251300

252301
@unittest.skip("Requires custom namespace and table_name input.")
253302
def test_delete_table_success(self):
@@ -258,7 +307,11 @@ def test_delete_table_success(self):
258307
namespace = "test"
259308
table_name = "dataset_e2e_test"
260309

261-
assert client.delete_table(namespace=namespace, table_name=table_name) == DeleteTableResult.from_dict({"message": f"Table {namespace}.{table_name} successfully deleted"})
310+
assert client.delete_table(
311+
namespace=namespace, table_name=table_name
312+
) == DeleteTableResult.from_dict(
313+
{"message": f"Table {namespace}.{table_name} successfully deleted"}
314+
)
262315

263316
def test_download_csv_with_pagination(self):
264317
# Arrange
@@ -269,7 +322,13 @@ def test_download_csv_with_pagination(self):
269322
result_csv = client.download_csv(self.multi_rows_query.query_id, batch_size=1)
270323

271324
# Assert
272-
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [{"number": 1}, {"number": 2}, {"number": 3}, {"number": 4}, {"number": 5}]
325+
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [
326+
{"number": 1},
327+
{"number": 2},
328+
{"number": 3},
329+
{"number": 4},
330+
{"number": 5},
331+
]
273332

274333
def test_download_csv_with_filters(self):
275334
# Arrange
@@ -283,7 +342,10 @@ def test_download_csv_with_filters(self):
283342
)
284343

285344
# Assert
286-
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [{"number": 1}, {"number": 2}]
345+
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [
346+
{"number": 1},
347+
{"number": 2},
348+
]
287349

288350
def test_download_csv_success_by_id(self):
289351
client = DuneClient(self.valid_api_key)
@@ -293,7 +355,14 @@ def test_download_csv_success_by_id(self):
293355
# Download CSV by query_id
294356
result_csv = client.download_csv(self.query.query_id)
295357
# Expect that the csv returns the latest execution results (i.e. those that were just run)
296-
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [{"text_field": "different word", "number_field": 22, "date_field": "1991-01-01 00:00:00", "list_field": "Option 2"}]
358+
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [
359+
{
360+
"text_field": "different word",
361+
"number_field": 22,
362+
"date_field": "1991-01-01 00:00:00",
363+
"list_field": "Option 2",
364+
}
365+
]
297366

298367
def test_download_csv_success_with_params(self):
299368
client = DuneClient(self.valid_api_key)
@@ -305,7 +374,14 @@ def test_download_csv_success_with_params(self):
305374
# but there seems to be a discrepancy with the date string values.
306375
# Specifically 1991-01-01 00:00:00 vs 1991-01-01 00:00:00
307376
#################################################################
308-
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [{"date_field": "2022-05-04 00:00:00", "list_field": "Option 1", "number_field": 3.1415926535, "text_field": "Plain Text"}]
377+
assert pd.read_csv(result_csv.data).to_dict(orient="records") == [
378+
{
379+
"date_field": "2022-05-04 00:00:00",
380+
"list_field": "Option 1",
381+
"number_field": 3.1415926535,
382+
"text_field": "Plain Text",
383+
}
384+
]
309385

310386

311387
@unittest.skip("This is an enterprise only endpoint that can no longer be tested.")

tests/unit/test_file.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,6 @@ def test_idempotent_write(self):
133133
for writer in self.file_writers:
134134
self.file_manager._write(self.dune_records, writer, True)
135135
self.file_manager._write(self.dune_records, writer, True)
136-
assert self.dune_records == self.file_manager._load(writer), f"idempotent write failed on {writer}"
136+
assert self.dune_records == self.file_manager._load(writer), (
137+
f"idempotent write failed on {writer}"
138+
)

tests/unit/test_models.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,15 @@ def test_parse_known_status_response(self):
150150
self.fail(f"Unexpected error {err}")
151151

152152
def test_parse_status_response_completed(self):
153-
assert ExecutionStatusResponse(execution_id="01GBM4W2N0NMCGPZYW8AYK4YF1", query_id=980708, state=ExecutionState.COMPLETED, times=TimeData.from_dict(self.status_response_data), result_metadata=ResultMetadata.from_dict(self.result_metadata_data), queue_position=None, error=None) == ExecutionStatusResponse.from_dict(self.status_response_data_completed)
153+
assert ExecutionStatusResponse(
154+
execution_id="01GBM4W2N0NMCGPZYW8AYK4YF1",
155+
query_id=980708,
156+
state=ExecutionState.COMPLETED,
157+
times=TimeData.from_dict(self.status_response_data),
158+
result_metadata=ResultMetadata.from_dict(self.result_metadata_data),
159+
queue_position=None,
160+
error=None,
161+
) == ExecutionStatusResponse.from_dict(self.status_response_data_completed)
154162

155163
def test_parse_result_metadata(self):
156164
expected = ResultMetadata(
@@ -164,8 +172,12 @@ def test_parse_result_metadata(self):
164172
pending_time_millis=54,
165173
execution_time_millis=900,
166174
)
167-
assert expected == ResultMetadata.from_dict(self.results_response_data["result"]["metadata"])
168-
assert expected == ResultMetadata.from_dict(self.status_response_data_completed["result_metadata"])
175+
assert expected == ResultMetadata.from_dict(
176+
self.results_response_data["result"]["metadata"]
177+
)
178+
assert expected == ResultMetadata.from_dict(
179+
self.status_response_data_completed["result_metadata"]
180+
)
169181

170182
def test_parse_execution_result(self):
171183
expected = ExecutionResult(
@@ -199,7 +211,11 @@ def test_execution_result_csv(self):
199211
csv_response = ExecutionResultCSV(data=self.execution_result_csv_data)
200212
result = csv.reader(TextIOWrapper(csv_response.data))
201213
# note that CSV is non-typed, up to the reader to do type inference
202-
assert list(result) == [["TableName", "ct"], ["eth_blocks", "6296"], ["eth_traces", "4474223"]]
214+
assert list(result) == [
215+
["TableName", "ct"],
216+
["eth_blocks", "6296"],
217+
["eth_traces", "4474223"],
218+
]
203219

204220
def test_dune_query_from_dict(self):
205221
example_response = """{

0 commit comments

Comments
 (0)