diff --git a/.fastflowtransform/cache/dev-duckdb.json b/.fastflowtransform/cache/dev-duckdb.json new file mode 100644 index 0000000..e28ef33 --- /dev/null +++ b/.fastflowtransform/cache/dev-duckdb.json @@ -0,0 +1,6 @@ +{ + "engine": "duckdb", + "entries": {}, + "profile": "dev", + "version": 1 +} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7e3bac2..6e49bd8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,13 +107,13 @@ jobs: env: FF_ENGINE: duckdb FF_DUCKDB_PATH: examples/simple_duckdb/.local/demo.duckdb - run: uv run flowforge seed examples/simple_duckdb --env dev + run: uv run fft seed examples/simple_duckdb --env dev - name: Run models (ephemeral inline + view materialization) env: FF_ENGINE: duckdb FF_DUCKDB_PATH: examples/simple_duckdb/.local/demo.duckdb - run: uv run flowforge run examples/simple_duckdb --env dev + run: uv run fft run examples/simple_duckdb --env dev - name: Smoke assertions (query DuckDB) run: | @@ -136,5 +136,5 @@ jobs: FF_ENGINE: duckdb FF_DUCKDB_PATH: examples/simple_duckdb/.local/demo.duckdb run: | - uv run flowforge dag examples/simple_duckdb --env dev --html + uv run fft dag examples/simple_duckdb --env dev --html test -f examples/simple_duckdb/site/dag/index.html diff --git a/Contributing.md b/Contributing.md index 6f16b9b..0166271 100644 --- a/Contributing.md +++ b/Contributing.md @@ -1,8 +1,8 @@ -# Contributing to FlowForge +# Contributing to FastFlowTransform First off, thanks for taking the time to contribute! 🎉 -The following is a set of guidelines for contributing to FlowForge. +The following is a set of guidelines for contributing to FastFlowTransform. --- @@ -11,7 +11,7 @@ The following is a set of guidelines for contributing to FlowForge. ### Reporting Bugs * Use GitHub Issues. -* Include reproduction steps, expected vs actual behavior, logs and version (`flowforge --version`). +* Include reproduction steps, expected vs actual behavior, logs and version (`fft --version`). ### Suggesting Features @@ -41,7 +41,7 @@ The following is a set of guidelines for contributing to FlowForge. ```bash # 1) clone - git clone https://github.com//.git && cd flowforge + git clone https://github.com//.git && cd fastflowtransform # 2) create venv python -m venv .venv && source .venv/bin/activate diff --git a/Makefile.dev b/Makefile.dev index bba49be..e26d212 100644 --- a/Makefile.dev +++ b/Makefile.dev @@ -19,19 +19,22 @@ ci: pytest -q test-pg-batch: - FLOWFORGE_SQL_DEBUG=1 $(UV) run pytest -q tests/test_smoke_postgres.py::test_pg_batch_tests_green + FFT_SQL_DEBUG=1 $(UV) run pytest -q tests/test_smoke_postgres.py::test_pg_batch_tests_green unittest: - FLOWFORGE_SQL_DEBUG=1 $(UV) run pytest -q tests + FFT_SQL_DEBUG=1 $(UV) run pytest -q tests + +cover: + uv run pytest --cov=src/fastflowtransform --cov-report=term-missing --cov-report=xml --cov-report=html cover: uv run pytest --cov=src/flowforge --cov-report=term-missing --cov-report=xml --cov-report=html utest: - flowforge utest "$(FF_PROJECT)" --env "$(FF_ENV)" + fft utest "$(FF_PROJECT)" --env "$(FF_ENV)" utest-duckdb: - flowforge utest "$(FF_PROJECT)" --env "$(FF_ENV)" --model users_enriched + fft utest "$(FF_PROJECT)" --env "$(FF_ENV)" --model users_enriched # Lint & format helpers fmt: diff --git a/Makefile.pipeline b/Makefile.pipeline index b24eb73..fd0972d 100644 --- a/Makefile.pipeline +++ b/Makefile.pipeline @@ -1,26 +1,26 @@ -# FlowForge pipeline and project lifecycle targets +# FastFlowTransform pipeline and project lifecycle targets .PHONY: seed run dag demo demo-open test clean -FLOWFORGE := FF_ENGINE=duckdb FF_DUCKDB_PATH="$(FF_DB)" flowforge +FFT := FF_ENGINE=duckdb FF_DUCKDB_PATH="$(FF_DB)" fft seed: - $(FLOWFORGE) seed "$(FF_PROJECT)" --env dev + $(FFT) seed "$(FF_PROJECT)" --env dev # Run/DAG/Test reuse the same duckdb path (FF_ENV can switch engine) run: - $(FLOWFORGE) run "$(FF_PROJECT)" --env "$(FF_ENV)" --jobs=1 + $(FFT) run "$(FF_PROJECT)" --env "$(FF_ENV)" --jobs=1 run_parallel: # Two independent staging nodes ("users", "orders") run in parallel - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" flowforge run "$(PROJECT)" --env dev --jobs 4 + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" fft run "$(PROJECT)" --env dev --jobs 4 run-parallel: - $(FLOWFORGE) run "$(FF_PROJECT)" --env "$(FF_ENV)" --jobs=4 --keep-going + $(FFT) run "$(FF_PROJECT)" --env "$(FF_ENV)" --jobs=4 --keep-going dag: - $(FLOWFORGE) dag "$(FF_PROJECT)" --env "$(FF_ENV)" --html + $(FFT) dag "$(FF_PROJECT)" --env "$(FF_ENV)" --html # Opens the generated DAG HTML on macOS/Linux; Windows users open it manually. demo-open: @@ -31,7 +31,7 @@ demo-open: fi test: - $(FLOWFORGE) test "$(FF_PROJECT)" --env "$(FF_ENV)" --select batch + $(FFT) test "$(FF_PROJECT)" --env "$(FF_ENV)" --select batch # End-to-end showcase: Seed → Run → DAG → Open → Tests demo: seed run dag demo-open test @@ -44,17 +44,17 @@ clean: cache_rw_first: # first run writes cache and meta - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" flowforge run "$(PROJECT)" --env dev --cache=rw + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" fft run "$(PROJECT)" --env dev --cache=rw cache_rw_second: # second run: should be a no-op (skips) if nothing changed - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" flowforge run "$(PROJECT)" --env dev --cache=rw + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" fft run "$(PROJECT)" --env dev --cache=rw cache_invalidate_env: # changing an FF_* env var invalidates fingerprints - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" FF_DEMO_TOGGLE=1 flowforge run "$(PROJECT)" --env dev --cache=rw + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" FF_DEMO_TOGGLE=1 fft run "$(PROJECT)" --env dev --cache=rw rebuild_users: # force rebuild of a single model regardless of cache - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" flowforge run "$(PROJECT)" --env dev --cache=rw --rebuild users.ff - \ No newline at end of file + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" fft run "$(PROJECT)" --env dev --cache=rw --rebuild users.ff + diff --git a/README.md b/README.md index a39f699..933e80f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# FlowForge (PoC 0.3) +# FastFlowTransform (PoC 0.3) [![CI](https://github.com///actions/workflows/ci.yml/badge.svg)](https://github.com///actions/workflows/ci.yml) -[![PyPI version](https://img.shields.io/pypi/v/flowforge.svg)](https://pypi.org/project/flowforge/) +[![PyPI version](https://img.shields.io/pypi/v/fastflowtransform.svg)](https://pypi.org/project/fastflowtransform/) > ⚠️ **Project status:** early proof-of-concept. Stable enough for demos and smaller workflows. Public APIs may still change. @@ -22,7 +22,7 @@ ## Overview -FlowForge combines SQL and Python models in a lightweight DAG engine. A project is simply a directory with models, optional seeds, and configuration. The CLI renders SQL, runs Python models, materialises results, generates HTML documentation, and executes data-quality checks against multiple execution backends. +FastFlowTransform combines SQL and Python models in a lightweight DAG engine. A project is simply a directory with models, optional seeds, and configuration. The CLI renders SQL, runs Python models, materialises results, generates HTML documentation, and executes data-quality checks against multiple execution backends. > ℹ️ **Project layout & CLI overview** > Curious about the full folder structure, Makefile targets, or example models? See the *Project Layout* and related sections in the [User Guide](docs/Technical_Overview.md#project-layout). @@ -33,10 +33,10 @@ FlowForge combines SQL and Python models in a lightweight DAG engine. A project - **Polyglot modelling:** build transformation nodes in SQL (`*.ff.sql`) or Python (`*.ff.py`) and wire them together with `ref()`/`source()` and `deps=[...]`. - **Multiple executors:** DuckDB (local default), Postgres, BigQuery (classic + BigFrames), Databricks Spark, and Snowflake Snowpark are supported via pluggable executors. -- **Deterministic DAG:** dependencies are resolved statically; `flowforge dag` renders either Mermaid source or a ready-to-view HTML mini site. +- **Deterministic DAG:** dependencies are resolved statically; `fft dag` renders either Mermaid source or a ready-to-view HTML mini site. - **Data quality built in:** configure checks such as `not_null`, `unique`, `row_count_between`, `greater_equal`, `non_negative_sum`, and `freshness` in `project.yml`. - **Environment-aware configuration:** `profiles.yml` plus environment variables (`FF_*`) drive executor settings; CLI flags can override at runtime. -- **Seeds & docs:** `flowforge seed` loads CSV/Parquet seeds, and `flowforge dag --html` produces browsable documentation for every model. +- **Seeds & docs:** `fft seed` loads CSV/Parquet seeds, and `fft dag --html` produces browsable documentation for every model. --- @@ -60,7 +60,7 @@ pre-commit install You can also bootstrap everything with the provided Makefile: ```bash -make install # upgrades pip + installs FlowForge in editable mode +make install # upgrades pip + installs FastFlowTransform in editable mode ``` --- @@ -86,10 +86,10 @@ xdg-open examples/simple_duckdb/site/dag/index.html # Linux If you prefer manual control: ```bash -flowforge seed examples/simple_duckdb --env dev -flowforge run examples/simple_duckdb --env dev -flowforge dag examples/simple_duckdb --env dev --html -flowforge test examples/simple_duckdb --env dev --select batch +fft seed examples/simple_duckdb --env dev +fft run examples/simple_duckdb --env dev +fft dag examples/simple_duckdb --env dev --html +fft test examples/simple_duckdb --env dev --select batch ``` --- @@ -98,7 +98,7 @@ flowforge test examples/simple_duckdb --env dev --select batch ## Parallelism & Cache (v0.3) -FlowForge 0.3 adds a level-wise parallel scheduler and an opt-in build cache. +FastFlowTransform 0.3 adds a level-wise parallel scheduler and an opt-in build cache. ### Parallel execution - DAG is split into **levels** (all nodes with the same maximum distance from sources). @@ -108,10 +108,10 @@ FlowForge 0.3 adds a level-wise parallel scheduler and an opt-in build cache. **Examples** ```bash # run with 4 workers per level -flowforge run examples/simple_duckdb --env dev --jobs 4 +fft run examples/simple_duckdb --env dev --jobs 4 # keep tasks in the current level running even if one fails -flowforge run examples/simple_duckdb --env dev --jobs 4 --keep-going +fft run examples/simple_duckdb --env dev --jobs 4 --keep-going ``` ### Cache modes @@ -127,7 +127,7 @@ The cache decides whether a node can be **skipped** when nothing relevant change ``` **When is a node skipped?** -FlowForge computes a **fingerprint** from: +FastFlowTransform computes a **fingerprint** from: - SQL/Python source (rendered SQL or function source) - environment context (engine, profile name, selected `FF_*` env vars, normalized `sources.yml`) - **dependency fingerprints** (change upstream ⇒ downstream fingerprint changes) @@ -136,21 +136,21 @@ The node is skipped if the fingerprint matches the on-disk cache **and** the phy **Examples** ```bash # first run (build + cache write) -flowforge run . --env dev --cache=rw +fft run . --env dev --cache=rw # second run (no-op if nothing changed) -flowforge run . --env dev --cache=rw +fft run . --env dev --cache=rw # force rebuild of a specific model -flowforge run . --env dev --cache=rw --rebuild marts_daily.ff +fft run . --env dev --cache=rw --rebuild marts_daily.ff # diagnose a surprising skip: change an FF_* env var to invalidate fingerprints -FF_DEMO_TOGGLE=1 flowforge run . --env dev --cache=rw +FF_DEMO_TOGGLE=1 fft run . --env dev --cache=rw ``` **Troubleshooting** - *“Why did it skip?”* → Compare your last changes: SQL/Python code, `sources.yml`, `FF_*` env vars, profile/engine. Any change alters the fingerprint. -- *“Relation missing but cache says skip”* → FlowForge also checks relation existence; if it was dropped externally, it will **rebuild**. +- *“Relation missing but cache says skip”* → FastFlowTransform also checks relation existence; if it was dropped externally, it will **rebuild**. - *“Parallel tasks interleave logs”* → Logs are serialized via an internal queue to keep lines readable; use `-v`/`-vv` for more detail. --- @@ -163,8 +163,8 @@ Use patterns to run only a subgraph. - `--exclude `: excludes matching targets from the build (deps remain if still required). Examples: - flowforge run . --select marts_daily.ff - flowforge run . --exclude 'mart_*' + fft run . --select marts_daily.ff + fft run . --exclude 'mart_*' --- @@ -177,10 +177,10 @@ These flags compose with `--select/--exclude`. Examples: # Rebuild everything that matches --select - flowforge run . --select marts_daily.ff --rebuild + fft run . --select marts_daily.ff --rebuild # Rebuild only a specific node - flowforge run . --rebuild-only marts_daily.ff + fft run . --rebuild-only marts_daily.ff --- @@ -195,10 +195,10 @@ Examples: ## Contributing -Issues and pull requests are welcome! Please read [`Contributing.md`](./Contributing.md) for guidelines, development setup, and testing instructions. Sharing minimal reproduction steps plus `flowforge --version` output greatly speeds up reviews. +Issues and pull requests are welcome! Please read [`Contributing.md`](./Contributing.md) for guidelines, development setup, and testing instructions. Sharing minimal reproduction steps plus `fft --version` output greatly speeds up reviews. --- ## License -FlowForge is licensed under the [Apache License 2.0](./License). +FastFlowTransform is licensed under the [Apache License 2.0](./License). diff --git a/docker-compose.yml b/docker-compose.yml index d41533e..698a9dd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres - POSTGRES_DB: flowforge + POSTGRES_DB: fastflowtransform ports: - "5432:5432" volumes: diff --git a/docs/Cache_and_Parallelism.md b/docs/Cache_and_Parallelism.md index 7e580bb..d2b1a4b 100644 --- a/docs/Cache_and_Parallelism.md +++ b/docs/Cache_and_Parallelism.md @@ -1,9 +1,9 @@ ### 🆕 `docs/Cache_and_Parallelism.md` ````markdown -# Parallelism & Cache (FlowForge v0.3) +# Parallelism & Cache (FastFlowTransform v0.3) -FlowForge 0.3 introduces a level-wise parallel scheduler and a build cache driven by stable fingerprints. This document explains **how parallel execution works**, **when nodes are skipped**, the exact **fingerprint formula**, and the **meta table** written after successful builds. +FastFlowTransform 0.3 introduces a level-wise parallel scheduler and a build cache driven by stable fingerprints. This document explains **how parallel execution works**, **when nodes are skipped**, the exact **fingerprint formula**, and the **meta table** written after successful builds. --- @@ -21,7 +21,7 @@ FlowForge 0.3 introduces a level-wise parallel scheduler and a build cache drive ## Parallel Scheduler -FlowForge splits the DAG into **levels** (all nodes that can run together without violating dependencies). Within a level, up to `--jobs` nodes execute in **parallel**. +FastFlowTransform splits the DAG into **levels** (all nodes that can run together without violating dependencies). Within a level, up to `--jobs` nodes execute in **parallel**. - Dependencies are **never** violated. - `--keep-going`: tasks already started in a level finish; **subsequent levels won’t start** if any task in the current level fails. @@ -30,10 +30,10 @@ FlowForge splits the DAG into **levels** (all nodes that can run together withou **Quick start** ```bash # Run with 4 workers per level -flowforge run . --env dev --jobs 4 +fft run . --env dev --jobs 4 # Keep tasks in the same level running even if one fails -flowforge run . --env dev --jobs 4 --keep-going +fft run . --env dev --jobs 4 --keep-going ```` --- @@ -58,7 +58,7 @@ A node is skipped iff: 1. The current **fingerprint** matches the on-disk cache value, **and** 2. The **physical relation exists** on the target engine. -If the relation was dropped externally, FlowForge will **rebuild** even if the fingerprint matches. +If the relation was dropped externally, FastFlowTransform will **rebuild** even if the fingerprint matches. --- @@ -92,7 +92,7 @@ Fingerprints are stable hashes that change on any relevant input: ## Meta Table Schema -After a successful build, FlowForge writes a per-node audit row: +After a successful build, FastFlowTransform writes a per-node audit row: ``` _ff_meta ( @@ -118,29 +118,29 @@ Backends: ```bash # First run — builds everything, writes cache and meta -flowforge run . --env dev --cache=rw +fft run . --env dev --cache=rw # No-op run — should skip all nodes (if nothing changed) -flowforge run . --env dev --cache=rw +fft run . --env dev --cache=rw # Force rebuild of a single model (ignores cache for it) -flowforge run . --env dev --cache=rw --rebuild marts_daily.ff +fft run . --env dev --cache=rw --rebuild marts_daily.ff # Read-only cache (skip on match, build on miss, no writes) -flowforge run . --env dev --cache=ro +fft run . --env dev --cache=ro # Always build and write cache -flowforge run . --env dev --cache=wo +fft run . --env dev --cache=wo # Disable cache entirely -flowforge run . --env dev --no-cache +fft run . --env dev --no-cache ``` With parallelism: ```bash -flowforge run . --env dev --jobs 4 -flowforge run . --env dev --jobs 4 --keep-going +fft run . --env dev --jobs 4 +fft run . --env dev --jobs 4 --keep-going ``` --- @@ -159,13 +159,13 @@ A skip requires a fingerprint match and an existing relation. Fingerprints inclu Any change in the above triggers a rebuild downstream. **“Relation missing but cache says skip?”** -We also check relation existence. If the table/view was dropped externally, FlowForge will **rebuild**. +We also check relation existence. If the table/view was dropped externally, FastFlowTransform will **rebuild**. **“My logs interleave under parallelism.”** Logs are serialized via a queue; use `-v` / `-vv` for richer but still stable output. Each node prints start/end and duration; levels summarize. **“Utest cache?”** -`flowforge utest --cache {off|ro|rw}` defaults to `off` for deterministic runs. With `rw`, expensive unit cases can be accelerated. Unit tests do not rely on the meta table by default. +`fft utest --cache {off|ro|rw}` defaults to `off` for deterministic runs. With `rw`, expensive unit cases can be accelerated. Unit tests do not rely on the meta table by default. --- @@ -177,16 +177,16 @@ Makefile targets: ```makefile run_parallel: - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" flowforge run "$(PROJECT)" --env dev --jobs 4 + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" fft run "$(PROJECT)" --env dev --jobs 4 cache_rw_first: - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" flowforge run "$(PROJECT)" --env dev --cache=rw + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" fft run "$(PROJECT)" --env dev --cache=rw cache_rw_second: - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" flowforge run "$(PROJECT)" --env dev --cache=rw + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" fft run "$(PROJECT)" --env dev --cache=rw cache_invalidate_env: - FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" FF_DEMO_TOGGLE=1 flowforge run "$(PROJECT)" --env dev --cache=rw + FF_ENGINE=duckdb FF_DUCKDB_PATH="$(DB)" FF_DEMO_TOGGLE=1 fft run "$(PROJECT)" --env dev --cache=rw ``` --- @@ -197,7 +197,7 @@ Only environment variables with the `FF_` prefix affect fingerprints (keys and v ```bash # Will invalidate fingerprints and rebuild affected nodes -FF_RUN_DATE=2025-01-01 flowforge run . --env dev --cache=rw +FF_RUN_DATE=2025-01-01 fft run . --env dev --cache=rw ``` ```` diff --git a/docs/Config_and_Macros.md b/docs/Config_and_Macros.md index de1001d..c470ab6 100644 --- a/docs/Config_and_Macros.md +++ b/docs/Config_and_Macros.md @@ -1,9 +1,9 @@ -# FlowForge Modeling Reference (v0.1) +# FastFlowTransform Modeling Reference (v0.1) -> Authoritative reference for FlowForge’s modeling layer: SQL/Python models, configuration macros, templating helpers, and testing hooks. -> Works with FlowForge v0.1 (T1–T11). Supported engines: DuckDB, Postgres, BigQuery (pandas & BigFrames), Databricks/Spark, Snowflake/Snowpark. +> Authoritative reference for FastFlowTransform’s modeling layer: SQL/Python models, configuration macros, templating helpers, and testing hooks. +> Works with FastFlowTransform v0.1 (T1–T11). Supported engines: DuckDB, Postgres, BigQuery (pandas & BigFrames), Databricks/Spark, Snowflake/Snowpark. > **Execution & Cache (v0.3) quick notes** -> - Parallelism is level-wise; use `flowforge run --jobs N`. +> - Parallelism is level-wise; use `fft run --jobs N`. > - Use `--cache={off|ro|rw|wo}` to control skipping behavior. > - Fingerprints include rendered SQL / Python function source, selected `FF_*` env vars, `sources.yml` and upstream fingerprints. > - Change any of these → downstream nodes rebuild. @@ -41,12 +41,12 @@ For an operational walkthrough (CLI usage, troubleshooting, pipelines) see the [ ## 1. Model Fundamentals -FlowForge discovers models under `/models/` with two primary flavours: +FastFlowTransform discovers models under `/models/` with two primary flavours: ### 1.1 SQL models (`*.ff.sql`) - File stem defines the logical DAG node (`users.ff.sql` → `users.ff`). -- Jinja template rendered with FlowForge context (helpers like `ref`, `source`, `var`, `config`, `this`). +- Jinja template rendered with FastFlowTransform context (helpers like `ref`, `source`, `var`, `config`, `this`). - Output relation defaults to the stem without `.ff` (configurable via `config(alias=...)` if supported in future releases). ```sql @@ -59,7 +59,7 @@ from {{ source('crm', 'users') }}; ### 1.2 Python models (`*.ff.py`) -Use the `@model` decorator from `flowforge.core` to register a callable. The decorator accepts: +Use the `@model` decorator from `fastflowtransform.core` to register a callable. The decorator accepts: - `name` (optional) → overrides the logical name (defaults to stem). - `deps` → list of dependency nodes (file stems or logical names). @@ -72,7 +72,7 @@ Dependencies determine the call signature: ```python # models/users_enriched.ff.py -from flowforge.core import model +from fastflowtransform.core import model import pandas as pd @model( @@ -90,7 +90,7 @@ def enrich(df: pd.DataFrame) -> pd.DataFrame: - Declare external tables in `sources.yml`; they become available via `source('group','table')`. - Provide reproducible inputs with CSV/Parquet seeds in `/seeds/`. -- FlowForge auto-detects dependencies: +- FastFlowTransform auto-detects dependencies: - SQL models → parse `ref()` / `source()` calls. - Python models → use the decorator’s `deps`. - Additional runtime dependencies can be expressed via `relation_for()`. @@ -122,7 +122,7 @@ Supported keys (v0.1): | Key | Type | Description | |----------------|-----------------|------------------------------------------------------------------------------| -| `materialized` | `"table" \| "view" \| "ephemeral"` | Controls how FlowForge persists the model. See [Materialization semantics](#6-materialization-semantics). | +| `materialized` | `"table" \| "view" \| "ephemeral"` | Controls how FastFlowTransform persists the model. See [Materialization semantics](#6-materialization-semantics). | | `tags` | `list[str]` | Arbitrary labels surfaced in docs / selection tooling. | | (future) | – | Additional metadata is stored under `node.meta[...]` if added later. | @@ -146,7 +146,7 @@ vars: ``` ```bash -flowforge run . --vars snapshot_day='2025-10-01' limit=50 +fft run . --vars snapshot_day='2025-10-01' limit=50 ``` Usage in templates: @@ -219,7 +219,7 @@ from {{ ref('users.ff') }}; - Keep macros idempotent and side-effect free. - Group related macros per file (e.g., string utilities, date helpers). -- Document macros with inline comments; FlowForge’s generated docs list each macro with its path. +- Document macros with inline comments; FastFlowTransform’s generated docs list each macro with its path. --- @@ -233,7 +233,7 @@ from {{ ref('users.ff') }}; | `view` | `CREATE OR REPLACE VIEW … AS