You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug]: curate writes a manifest with a typo'd output scheme to a local directory #721
fromhflow.curationimportcuratecurate(catalog_root, "SELECT episode_id FROM episodes", output="gcs://my-bucket/manifest.parquet")
or hflow curate -o gcs://my-bucket/manifest.parquet "SELECT episode_id FROM episodes".
Expected behavior
A ValueError naming the unsupported scheme, the same as parse_storage_root gives for a data root. Its docstring says a typo'd scheme "is refused loudly rather than treated as a strange directory name".
Actual behavior
The manifest is written to ./gcs:/my-bucket/manifest.parquet and the report says it worked:
The CLI prints manifest: gcs:/my-bucket/manifest.parquet (1 rows, from 1 cataloged episodes) and exits 0. FILE:///abs/manifest.parquet does the same and lands under ./FILE:/abs/.
Additional context
curate() treats output as a bucket only when is_bucket_url() says so, and as a file URL only when it starts with a lowercase file://. Everything else goes to Path(output). The comment above the file:// branch says it matches parse_storage_root's convention, but that function lowercases the scheme and refuses anything outside file and BUCKET_URL_SCHEMES.
Proposed fix: resolve a string output through parse_storage_root and match on the result, so the manifest follows the same scheme rules as a data root. Plain paths and file:///abs keep working, and an unknown scheme fails before the query runs. Tests for the typo'd scheme and the uppercase FILE:// case.
I found this reading curate(). Happy to take it if you want to assign it to me.
Confirmed, thanks. Your proposed fix is right: resolve a string output through parse_storage_root so the manifest follows the same scheme rules as a data root. It's yours.
Activity
kstonekuan commentedon Oct 13, 2026
Confirmed, thanks. Your proposed fix is right: resolve a string
outputthroughparse_storage_rootso the manifest follows the same scheme rules as a data root. It's yours.