From 6256e69c29179c8ba65269bce37495e50e4e772f Mon Sep 17 00:00:00 2001 From: Nicolas Rabault Date: Thu, 25 Jun 2026 17:10:41 +0200 Subject: [PATCH] fix(jobs): hoist ensure_dataset_available to a module-level import Addresses Caroline's review comment on PR #3856: the local import of ensure_dataset_available inside submit_to_hf was vestigial. dataset.py does not import hf.py, so there is no circular-import risk and no extra load cost (its heavy deps stay lazy), so make it a top-level import. --- src/lerobot/jobs/hf.py | 4 ++-- tests/jobs/test_hf.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lerobot/jobs/hf.py b/src/lerobot/jobs/hf.py index da4b826e1..0babd70d5 100644 --- a/src/lerobot/jobs/hf.py +++ b/src/lerobot/jobs/hf.py @@ -42,6 +42,8 @@ from huggingface_hub import ( upload_file, ) +from lerobot.jobs.dataset import ensure_dataset_available + if TYPE_CHECKING: from lerobot.configs.train import TrainPipelineConfig @@ -223,8 +225,6 @@ def submit_to_hf(cfg: TrainPipelineConfig) -> None: the job, then either tails logs until completion or detaches immediately. Ctrl-C detaches without cancelling the remote job. """ - from lerobot.jobs.dataset import ensure_dataset_available - token = get_token() if not token: raise RuntimeError("Not logged in to Hugging Face. Run `hf auth login` first.") diff --git a/tests/jobs/test_hf.py b/tests/jobs/test_hf.py index 798f83264..2b0df00b5 100644 --- a/tests/jobs/test_hf.py +++ b/tests/jobs/test_hf.py @@ -235,8 +235,8 @@ def test_submit_passes_validation_and_submits(monkeypatch): monkeypatch.setattr("lerobot.jobs.hf.HfApi", FakeHfApi) # ensure_dataset_available returns None; patch it out so no Hub access happens - # (imported inside submit_to_hf via `from lerobot.jobs.dataset import ensure_dataset_available`). - monkeypatch.setattr("lerobot.jobs.dataset.ensure_dataset_available", lambda *a, **kw: None) + # (hf.py imports it at module level, so patch it on lerobot.jobs.hf). + monkeypatch.setattr("lerobot.jobs.hf.ensure_dataset_available", lambda *a, **kw: None) # Patch _stage_config_on_hub to skip network monkeypatch.setattr( @@ -323,7 +323,7 @@ def test_submit_returns_when_job_completes(monkeypatch): return {"name": "alice"} monkeypatch.setattr("lerobot.jobs.hf.HfApi", FakeHfApi) - monkeypatch.setattr("lerobot.jobs.dataset.ensure_dataset_available", lambda *a, **kw: None) + monkeypatch.setattr("lerobot.jobs.hf.ensure_dataset_available", lambda *a, **kw: None) monkeypatch.setattr( "lerobot.jobs.hf._stage_config_on_hub", lambda cfg, repo_id, token, tags=None: repo_id ) @@ -362,7 +362,7 @@ def test_submit_returns_on_model_pushed_marker(monkeypatch): return {"name": "alice"} monkeypatch.setattr("lerobot.jobs.hf.HfApi", FakeHfApi) - monkeypatch.setattr("lerobot.jobs.dataset.ensure_dataset_available", lambda *a, **kw: None) + monkeypatch.setattr("lerobot.jobs.hf.ensure_dataset_available", lambda *a, **kw: None) monkeypatch.setattr( "lerobot.jobs.hf._stage_config_on_hub", lambda cfg, repo_id, token, tags=None: repo_id ) @@ -441,7 +441,7 @@ def test_submit_raises_when_job_ends_in_error(monkeypatch): return {"name": "alice"} monkeypatch.setattr("lerobot.jobs.hf.HfApi", FakeHfApi) - monkeypatch.setattr("lerobot.jobs.dataset.ensure_dataset_available", lambda *a, **kw: None) + monkeypatch.setattr("lerobot.jobs.hf.ensure_dataset_available", lambda *a, **kw: None) monkeypatch.setattr( "lerobot.jobs.hf._stage_config_on_hub", lambda cfg, repo_id, token, tags=None: repo_id )