- Require Python 3.15 in project metadata, runtime pin, and Docker stages. - Use lazy imports for database backends and type-only dependencies. - Defer benchmark dependencies until their code paths are used. - Rely on deferred annotations and use Path.info for file discovery. - Accept BattlesnakeArena alongside BattlesnakeEngine on game endpoints. - Advance quart_common for Python 3.15 and multi-agent validation. - Add pytest development dependencies and refresh the uv lockfile. - Test lazy backend loading, import order, and fresh file discovery. - Document the runtime requirements and locked uv workflow. BREAKING CHANGE: Python 3.15 or newer is required; earlier runtimes cannot parse the lazy import syntax.
58 lines
2.1 KiB
Python
58 lines
2.1 KiB
Python
import unittest
|
|
|
|
import tempfile, gzip, json
|
|
from pathlib import Path
|
|
|
|
from server.dataset.DatasetIO import DatasetIO
|
|
|
|
class TestDatasetIO(unittest.TestCase):
|
|
def test_resolve_input_files_includes_jsonl_and_gz(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
base = Path(tmp)
|
|
(base / "a.jsonl").write_text('{"x":1}\n', encoding="utf-8")
|
|
with gzip.open(base / "b.jsonl.gz", "wt", encoding="utf-8") as handle:
|
|
handle.write('{"x":2}\n')
|
|
|
|
paths = DatasetIO.resolve_input_files([str(base)])
|
|
names = {path.name for path in paths}
|
|
self.assertIn("a.jsonl", names)
|
|
self.assertIn("b.jsonl.gz", names)
|
|
|
|
def test_resolve_input_files_uses_fresh_metadata_on_each_scan(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
base = Path(tmp)
|
|
path = base / "rows.jsonl"
|
|
path.write_text('{}\n', encoding="utf-8")
|
|
self.assertEqual(DatasetIO.resolve_input_files([str(base)]), [path])
|
|
path.unlink()
|
|
self.assertEqual(DatasetIO.resolve_input_files([str(base)]), [])
|
|
path.write_text('{}\n', encoding="utf-8")
|
|
self.assertEqual(DatasetIO.resolve_input_files([str(path)]), [path])
|
|
|
|
def test_iter_jsonl_rows_reads_gz_file(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
path = Path(tmp) / "rows.jsonl.gz"
|
|
with gzip.open(path, "wt", encoding="utf-8") as handle:
|
|
handle.write('{"turn":1}\n')
|
|
handle.write("\n")
|
|
handle.write('{"turn":2}\n')
|
|
|
|
rows = list(DatasetIO.iter_jsonl_rows(path))
|
|
self.assertEqual(len(rows), 2)
|
|
self.assertEqual(rows[0]["turn"], 1)
|
|
self.assertEqual(rows[1]["turn"], 2)
|
|
|
|
def test_append_jsonl_row_supports_gz_output(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
path = Path(tmp) / "append.jsonl.gz"
|
|
DatasetIO.append_jsonl_row(path, {"move": "up"})
|
|
DatasetIO.append_jsonl_row(path, {"move": "left"})
|
|
|
|
with gzip.open(path, "rt", encoding="utf-8") as handle:
|
|
lines = handle.read().strip().splitlines()
|
|
self.assertEqual(len(lines), 2)
|
|
self.assertEqual(json.loads(lines[0])["move"], "up")
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|