From 7b76d94c5b167e13278c660e647dbd712c4b626f Mon Sep 17 00:00:00 2001 From: Alexandre Edmond <145270396+AlexandreEDMOND@users.noreply.github.com> Date: Tue, 28 Jul 2026 16:25:42 +0200 Subject: [PATCH] Handle resuming empty local datasets (#3859) Co-authored-by: Steven Palma --- src/lerobot/datasets/dataset_metadata.py | 4 ++-- tests/datasets/test_lerobot_dataset.py | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lerobot/datasets/dataset_metadata.py b/src/lerobot/datasets/dataset_metadata.py index ed5e13833..1f0e0add9 100644 --- a/src/lerobot/datasets/dataset_metadata.py +++ b/src/lerobot/datasets/dataset_metadata.py @@ -188,8 +188,8 @@ class LeRobotDatasetMetadata: def _load_metadata(self): self.info = load_info(self.root) check_version_compatibility(self.repo_id, self._version, CODEBASE_VERSION) - self.tasks = load_tasks(self.root) - self.episodes = load_episodes(self.root) + self.tasks = load_tasks(self.root) if self.total_tasks > 0 else None + self.episodes = load_episodes(self.root) if self.total_episodes > 0 else None self.stats = load_stats(self.root) def ensure_readable(self) -> None: diff --git a/tests/datasets/test_lerobot_dataset.py b/tests/datasets/test_lerobot_dataset.py index f1614de52..4d12fc4aa 100644 --- a/tests/datasets/test_lerobot_dataset.py +++ b/tests/datasets/test_lerobot_dataset.py @@ -482,6 +482,20 @@ def test_add_frame_works_in_write_mode(tmp_path): # ── Resume mode ────────────────────────────────────────────────────── +def test_resume_freshly_created_empty_dataset(tmp_path): + """resume() accepts a local dataset created before any episode was recorded.""" + root = tmp_path / "resume_empty_ds" + LeRobotDataset.create(repo_id=DUMMY_REPO_ID, fps=DEFAULT_FPS, features=SIMPLE_FEATURES, root=root) + + resumed = LeRobotDataset.resume(repo_id=DUMMY_REPO_ID, root=root) + + assert isinstance(resumed.writer, DatasetWriter) + assert resumed.meta.total_episodes == 0 + assert resumed.meta.total_frames == 0 + assert resumed.meta.tasks is None + assert resumed.meta.episodes is None + + def test_resume_creates_writer(tmp_path): """After resume(), writer is a DatasetWriter.""" root = tmp_path / "resume_ds"