Repository navigation
v0.5.0
v0.5.0 (2026-03-29)
This release is published under the MIT License.
Build System
- Simplify dependencies and add project metadata (
946e2ba)
Remove dbt-core, pydantic, jinja2, pyyaml dependencies. Add MIT license, project URLs, and authors to pyproject.toml. Move zensical from docs dependency group to dev.
Chores
- Remove fdl_common dbt macros package (
605a3d4)
Continuous Integration
Documentation
-
Add concept pages and global install instructions (
35180ad) -
Add "Why fdl" page explaining the Frozen DuckLake pattern and motivation
-
Add Roadmap page with vision toward a package manager for Frozen DuckLake
-
Add global install instructions (uv tool / pipx) to quickstart
-
Migrate from mkdocs to zensical (
5b8359c)
Replace mkdocs-material with zensical as the documentation engine. Replace changelog symlink with pymdownx.snippets include.
- Rewrite documentation for target-based architecture (
e48b8e3)
Restructure docs to match new target-based config model. Migrate from mkdocs to zensical. Add guide, reference, and resources sections with new content.
-
Update CLAUDE.md and add CONTRIBUTING.md (
28d12f1) -
Update README, CLAUDE.md, and CONTRIBUTING.md (
0c48dff)
Features
-
Add --version flag, improve gc output (
2046a11) -
Add push conflict detection and --force flag (
3db0216) -
Track pushed_at timestamp in .fdl/meta.json (local + remote)
-
Push rejects when remote was updated since last pull
-
--force overrides conflict detection
-
Pull syncs meta.json from remote for next push check
-
Rewrite to target-based architecture (
a17d8ec)
Replace 3-layer config (env → workspace → user) with single fdl.toml and ${VAR} environment variable expansion.
BREAKING CHANGE:
remoterenamed totargetacross all commandsFDL_ATTACH_PATHrenamed toFDL_CATALOGgccommand renamed toprunefdl runnow requires TARGET argumentmetadatacommand removedcreate_destination()removed from ducklake module- User/workspace config files (~/.fdl/config, .fdl/config) no longer read
New features:
fdl sql TARGET QUERY— execute SQL against the catalogfdl initprompts interactively for target config- S3Config dataclass for typed credential handling
Refactoring
-
Make load_toml strict and remove datasource_name fallback (
63ca8ed) -
load_toml → _load_toml: internal function, raises FileNotFoundError
-
set_value: catch FileNotFoundError for new file creation
-
datasource_name: require name in fdl.toml, no directory name fallback
-
Replace print with rich console output (
3958b6b) -
Replace prune with checkpoint command (
6433bcd) -
Use DuckLake CHECKPOINT statement via connect() context manager
-
Remove S3-only restriction, works on any target
-
Extract is_stale pure function and read_remote_pushed_at to meta.py
-
Add stale catalog check before maintenance (reuses push conflict detection)
-
Unify branding to Frozen DuckLake (
cd148ca) -
Rename "Frozen Data Lake" to "Frozen DuckLake" across all files
-
Normalize casing: FDL → fdl
-
Remove "Git-like" messaging
-
Update site_name to "fdl — Frozen DuckLake CLI"
Testing
- Add FDL_DATA_PATH injection test (
2644ae9)
Verify fdl run injects FDL_DATA_PATH ending with ducklake.duckdb.files/
- Add integration and unit tests (89 tests) (
1d01ffe)
Integration tests (tests/integration/): - test_init: default catalog, invalid name, existing toml, double init, rollback, sqlite - test_config: get, set, list-all, env var reference, s3 credentials, missing key, without init - test_sql: data persistence, invalid sql - test_run: env injection, no-overwrite, separator, exit code propagation - test_push: catalog copy, sqlite conversion, meta.json, conflict detection, force push - test_pull: catalog restore, meta.json sync, pull-then-push, empty target - test_prune: local target rejection, orphan deletion, dry-run - test_serve: CORS, range request, HEAD, OPTIONS, 404
Unit tests (tests/): - test_config: set_value, get_all, datasource_name, storage/data_path/ catalog_path, resolve_target, target_s3_config, ducklake_url, fdl_env_dict - test_init_module: ducklake_data_path, default_target_url - test_s3: S3Config endpoint_host - test_serve: CORSRangeHandler
-
Add Phase 1 pure function tests (
a118610) -
test_init_module.py: ducklake_data_path, default_target_url
-
test_s3.py: S3Config endpoint_host
-
Add S3 target integration tests for push and pull (
c6caf1d) -
push uploads catalog to S3
-
push conflict detection on S3
-
pull restores catalog from S3
Detailed Changes: v0.4.0...v0.5.0