Skip to content

Add DbtNode.original_file_path & change file_path to property#2469

Merged
tatiana merged 16 commits into
mainfrom
refactor-dbt-node-original-file-path
Mar 18, 2026
Merged

Add DbtNode.original_file_path & change file_path to property#2469
tatiana merged 16 commits into
mainfrom
refactor-dbt-node-original-file-path

Conversation

@tatiana
Copy link
Copy Markdown
Collaborator

@tatiana tatiana commented Mar 17, 2026

This PR is the base for supporting task groups based on dbt project subfolders (as proposed in #1566 and refactored in #2420) by simplifying the file path handling in DbtNode.

This PR introduces a new attribute, DbtNode.original_file_path, which captures the original location of a dbt node file. This attribute is somewhat redundant with the existing file_path, which can now be expressed as:

file_path (existing) = path_base (existing) + original_file_path (new)

The main goal is to streamline DbtNode properties while maintaining compatibility with both:

  • Existing Cosmos workflows
  • New task group support based on dbt project subfolders

Main Changes

  • Introduce DbtNode.original_file_path - stores the original file path of a node
  • Keep DbtNode.path_base - continues to represent the base path
    RefactorDbtNode.file_pathto a property – dynamically computed frompath_base+original_file_path`

These changes simplify path handling and make it easier to manage nodes across dbt subfolders without breaking existing functionality.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors DbtNode path handling to support future task-grouping by dbt subfolders by splitting the former file_path field into path_base + original_file_path, and computing file_path dynamically.

Changes:

  • Add DbtNode.original_file_path and DbtNode.path_base, and convert DbtNode.file_path into a computed property.
  • Update dbt node creation in dbt ls parsing, manifest parsing, and the legacy custom parser to populate the new fields.
  • Update unit tests to construct DbtNode with path_base/original_file_path and to account for the updated context_dict shape.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
cosmos/dbt/graph.py Introduces path_base/original_file_path, makes file_path computed, and updates node-building/parsing logic accordingly.
tests/test_converter.py Updates test fixtures to build DbtNode with the new path fields.
tests/dbt/test_selector.py Updates selector tests’ node fixtures to use path_base + original_file_path.
tests/dbt/test_pruning.py Updates pruning tests’ node fixtures to use the new path fields.
tests/dbt/test_graph.py Updates graph tests for the new DbtNode API and context_dict output; adjusts cache-hash assertions.
tests/airflow/test_graph.py Updates Airflow graph tests’ node fixtures to use the new path fields.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread cosmos/dbt/graph.py Outdated
Comment thread cosmos/dbt/graph.py Outdated
Comment thread cosmos/dbt/graph.py
Copilot AI review requested due to automatic review settings March 17, 2026 11:34
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors DbtNode path handling to support future task-grouping by dbt project subfolders by introducing original_file_path and computing file_path dynamically from path_base / original_file_path.

Changes:

  • Replace stored DbtNode.file_path field with path_base + original_file_path, and add file_path as a computed property.
  • Update dbt parsing paths (dbt ls, manifest parsing, and custom parser) to populate the new fields.
  • Update unit tests to construct DbtNode with path_base / original_file_path and adjust expected values accordingly.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
cosmos/dbt/graph.py Updates DbtNode schema and adjusts node construction in ls/manifest/custom parsing to use path_base + original_file_path.
tests/test_converter.py Updates DbtNode fixtures to the new constructor signature.
tests/dbt/test_selector.py Updates selector test fixtures to use path_base / original_file_path in place of file_path.
tests/dbt/test_pruning.py Updates pruning test fixtures to use the new DbtNode path fields.
tests/dbt/test_graph.py Updates DbtNode tests and dbt-ls parsing expectations for the new path refactor (including cache hash assertions).
tests/airflow/test_graph.py Updates Airflow graph test fixtures to use path_base / original_file_path.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread cosmos/dbt/graph.py
Comment thread cosmos/dbt/graph.py Outdated
Copilot AI review requested due to automatic review settings March 17, 2026 12:06
@tatiana tatiana force-pushed the refactor-dbt-node-original-file-path branch from 14b81aa to 88517b3 Compare March 17, 2026 12:07
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors DbtNode path handling to support dbt subfolder-based task grouping by splitting the node path into a base path plus an “original” relative path, while keeping file_path available via a computed property.

Changes:

  • Introduces DbtNode.path_base + DbtNode.original_file_path and refactors DbtNode.file_path into a computed property.
  • Updates dbt graph loaders (dbt ls, manifest, custom parser) to populate the new path fields.
  • Updates unit tests to construct DbtNode with the new path fields and adjusts expected cached hash values.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
cosmos/dbt/graph.py Refactors DbtNode path fields and updates node construction in loaders/parsers.
tests/test_converter.py Updates DbtNode instantiation to use path_base/original_file_path.
tests/dbt/test_selector.py Updates selector test fixtures to use the new path fields.
tests/dbt/test_pruning.py Updates pruning test fixtures to use the new path fields.
tests/dbt/test_graph.py Updates graph tests for new node path fields and cache-hash expectations.
tests/airflow/test_graph.py Updates Airflow graph tests to use the new node path fields and expected node-context payloads.
Comments suppressed due to low confidence (1)

cosmos/dbt/graph.py:316

  • parse_dbt_ls_output now explicitly rejects project_path=None but still advertises project_path: Path | None in its signature and raises a generic ValueError. To keep the API consistent and improve type-checking, either make project_path a required Path (and drop the runtime None-check) or keep it optional and handle None without raising. If this is a Cosmos-specific load error, consider raising CosmosLoadDbtException instead of ValueError for consistency with other load failures.
def parse_dbt_ls_output(project_path: Path | None, ls_stdout: str) -> dict[str, DbtNode]:
    """Parses the output of `dbt ls` into a dictionary of `DbtNode` instances."""
    nodes = {}
    for line in ls_stdout.split("\n"):

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread cosmos/dbt/graph.py
Comment thread cosmos/dbt/graph.py Outdated
Copilot AI review requested due to automatic review settings March 17, 2026 13:52
Copilot AI review requested due to automatic review settings March 18, 2026 13:00
tatiana and others added 2 commits March 18, 2026 13:01
Co-authored-by: Pankaj Koti <pankajkoti699@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@tatiana tatiana changed the title Refactor DbtNode file paths Refactor DbtNode file paths (introduce original_file_path and change file_path to property) Mar 18, 2026
@tatiana tatiana changed the title Refactor DbtNode file paths (introduce original_file_path and change file_path to property) Refactor: add DbtNode.original_file_path & change file_path to property Mar 18, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors dbt node path handling by splitting DbtNode.file_path into path_base + original_file_path (with file_path computed as a property), as groundwork for grouping tasks by dbt project subfolders while preserving existing behavior.

Changes:

  • Introduces DbtNode.path_base and DbtNode.original_file_path, and makes file_path a computed property.
  • Updates dbt parsing (dbt ls, manifest, and custom parser) to populate the new attributes.
  • Updates unit tests to construct DbtNode instances with the new path attributes and to assert the new context payload.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
cosmos/dbt/graph.py Updates DbtNode structure and adjusts parsing/building of nodes to use path_base + original_file_path.
tests/test_converter.py Updates DbtNode test fixtures to use new path fields.
tests/dbt/test_selector.py Updates selector-related node fixtures to use new path fields.
tests/dbt/test_pruning.py Updates pruning-related node fixtures to use new path fields.
tests/dbt/test_graph.py Updates graph parsing/context tests for new path fields and updated cache hash expectations.
tests/airflow/test_graph.py Updates Airflow graph tests/fixtures to use new path fields and updated context payload assertions.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread cosmos/dbt/graph.py
Comment thread tests/dbt/test_graph.py
Comment thread tests/airflow/test_graph.py
@tatiana tatiana changed the title Refactor: add DbtNode.original_file_path & change file_path to property Add DbtNode.original_file_path & change file_path to property Mar 18, 2026
Comment thread cosmos/dbt/graph.py
Copilot AI review requested due to automatic review settings March 18, 2026 14:25
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors dbt node path handling to support future task group creation by dbt subfolder, by introducing DbtNode.original_file_path and computing DbtNode.file_path dynamically from path_base / original_file_path.

Changes:

  • Add DbtNode.original_file_path and DbtNode.path_base, and convert DbtNode.file_path from a stored field to a computed property.
  • Extend DbtNode.context_dict to include original_file_path while keeping file_path for compatibility.
  • Update unit tests to construct DbtNode instances using path_base + original_file_path.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
cosmos/dbt/graph.py Refactors DbtNode path fields and updates dbt-ls/manifest/custom-parser node construction to use path_base + original_file_path.
tests/test_converter.py Updates DbtNode fixtures to the new constructor fields.
tests/dbt/test_selector.py Updates selector tests to use path_base + original_file_path in node fixtures.
tests/dbt/test_pruning.py Updates pruning tests’ node fixtures to the new path fields.
tests/dbt/test_graph.py Updates graph parsing/context tests for the new DbtNode API and context serialization.
tests/airflow/test_graph.py Updates Airflow graph/task-metadata tests for the new node path handling and context payload.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread cosmos/dbt/graph.py Outdated
Comment thread cosmos/dbt/graph.py
@tatiana tatiana force-pushed the refactor-dbt-node-original-file-path branch from e5e46f5 to 6811ac6 Compare March 18, 2026 14:39
@tatiana tatiana merged commit c137be7 into main Mar 18, 2026
72 checks passed
@tatiana tatiana deleted the refactor-dbt-node-original-file-path branch March 18, 2026 14:43
pankajastro added a commit that referenced this pull request Mar 20, 2026
Since PR #2469, DbtNode no longer accepts file_path as a constructor
argument — it is now a computed property. Replace with path_base and
original_file_path which are the actual dataclass fields.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@pankajastro pankajastro mentioned this pull request Mar 20, 2026
pankajastro added a commit that referenced this pull request Apr 7, 2026
1.14.0 (2026-04-07)
---------------------

Breaking Changes

* Drop support for Airflow versions earlier than **2.9** by
@jedcunningham in #2288
* Fix inclusion of package models and selection/exclusion behavior by
@pankajkoti in #2357
* ``ExecutionMode.WATCHER``: The per-node ``*_status`` XCom value is now
a dict (``{"status": "<status>", "outlet_uris": [...]}``) instead of a
plain string. Any custom code that reads these internal XCom keys
directly will need to be updated by @pankajkoti in #2507

Features

* Add cluster policy support for ``ExecutionMode.WATCHER`` sensor
retries by @astro-anand in #2293
* Add debug mode to track memory utilization by @tatiana in #2327
* Add FQN selection support for ``LoadMode.DBT_MANIFEST`` by
@pankajastro in #2375
* Introduce interceptors for Cosmos tasks by @tatiana in #2419
* Add config to allow disabling dag versioning by @pankajkoti in #2470
* Implement TaskGroups by models folder by @maximilianoarcieri and
@tatiana in #1566, #2469, and #2420
* feat: implement DbtTestWatcherOperator by @michal-mrazek in #2447
* Add source freshness aware execution for ``ExecutionMode.WATCHER`` by
@pankajastro and @tatiana in #2467

* Note: Like ``ExecutionMode.WATCHER``, this feature is experimental and
its interface and implementation can change in the future.
* Add Airflow 3.2 support by @pankajastro and @pankajkoti in #2472

Enhancements

* Add watcher mode support for dbt test node states by @michal-mrazek in
#2318
* Rename watcher-mode sensor retry queue and reuse it for producer tasks
by @pankajastro in #2331
* Fix leaked semaphore warnings in Airflow 3 by resetting dbt adapters
by @pankajkoti in #2335
* Improve dbt Fusion support and related tests by @tatiana in #2356
* Default Snowflake profile mappings to four threads by @tatiana in
#2374
* Attempt to remove Pydantic as a dependency by @tatiana in #2377
* Log dbt-core and adapter versions in watcher consumer tasks by
@pankajastro in #2412
* Log model errors in watcher consumer on dbt node failure by
@pankajastro in #2431
* Reduce XCom read/write for tracking node state and errors in
ConsumerWatcher task by @pankajastro in #2471
* Remove duplicate debug log in watcher subprocess path by @tatiana in
#2494
* Simplify and unify WATCHER implementation regardless of InvocationMode
by @tatiana in #2498
* Switch to lazy imports in cosmos/__init__.py by @pankajkoti in #2531

Bug Fixes

* Handle invalid YAML errors with ``LoadMode.DBT_MANIFEST`` and
``RenderConfig.selector`` by @YourRoyalLinus in #2316
* Populate ``compiled_sql`` for ``InvocationMode.SUBPROCESS`` in
``ExecutionMode.WATCHER`` by @pankajkoti in #2319
* Fix select/exclude type mismatch by @tatiana in #2364
* Set ``emit_datasets=False`` for ``DbtTest*`` operators by @pankajastro
in #2365
* Set correct queue priority for watcher producer tasks by @pankajastro
in #2372
* Preserve ``extra_context`` for watcher consumer task instances by
@pankajkoti in #2381
* Respect ``deferrable=False`` from ``operator_args`` on watcher
consumer sensors by @pankajkoti in #2384
* Fix watcher queue precedence and add documentation by @pankajastro in
#2391
* Do not set ``compiled_sql`` on ``ExecutionMode.WATCHER`` producers by
@pankajkoti in #2440
* Remove const attribute for ``__cosmos_telemetry_metadata__`` dag param
by @pankajkoti in #2466
* Remove timeout override from Cosmos watcher sensors by @tatiana and
@claude in #2478
* Remove forced ``retries=0`` from watcher producer operators by
@tatiana in #2479
* RFC: Add patch for newer versions of amazon provider when running dbt
on EKS by @aoelvp94 in #2481
* Fix ``cosmos_debug_max_memory_mb`` XCom not pushed in Watcher sensor
tasks by @tatiana in #2503
* Fix ``TestBehavior.NONE`` and ``TestBehavior.AFTER_ALL`` exclude
ignored with selectors in ``ExecutionMode.WATCHER`` by @pankajkoti in
#2511
* Move dataset emission for ``ExecutionMode.WATCHER`` from producer to
consumer sensors by @pankajkoti in #2507

Docs

* Document cluster policy configuration for ``ExecutionMode.WATCHER``
sensor tasks by @pankajastro in #2315
* Remove outdated docs for the dbt docs plugin with Airflow 3 by
@pankajastro in #2353
* Make Watcher DBT Execution Queue heading clickable by @pankajastro in
#2354
* Update ``ExecutionMode.WATCHER`` documentation regarding test node
implementation by @jroachgolf84 in #2355
* Fix ``pre_dbt_fusion`` configuration rendering by @pankajastro in
#2369
* Add documentation for including/excluding nodes based on FQN by
@pankajastro in #2371
* Update watcher execution mode documentation by @tatiana in #2380
* Add documentation for ``DbtSeedLocalOperator`` by @jroachgolf84 in
#2383
* Fix miscellaneous Sphinx warnings by @pankajastro in #2395
* Improve contributing documentation by @lzdanski in #2397
* Add **Get Started in 5 Minutes** guide by @lzdanski in #2398
* Add Sphinx redirects package for documentation redirects by @lzdanski
in #2407
* Restructure **Getting Started** and **Guides** sections by @lzdanski
in #2418
* Add open-source quickstart by @lzdanski in #2439
* Fix documentation redirects by @lzdanski in #2442
* Restructure and refactor reference documentation by @lzdanski in #2443
* Add execution modes decision documentation by @lzdanski in #2444
* Add **Core Concepts** page to Getting Started by @lzdanski in #2448
* Add guide: *How Cosmos Works* by @lzdanski in #2449
* Update **Getting Started** overview and index pages by @lzdanski in
#2452
* Add guide: *How Cosmos Runs dbt* by @lzdanski in #2453
* Fix miscellaneous documentation links by @lzdanski in #2454
* Add Mermaid diagrams and execution mode diagrams by @lzdanski and
@tatiana in #2459
* Add documentation for memory optimization options by @pankajastro in
#2340
* Fix typo in watcher execution mode docs by @evanvolgas in #2485
* Fix minor documentation issues by @evanvolgas in #2489
* Add troubleshooting note for dbt debug logs in ExecutionMode.WATCHER
by @tatiana in #2491
* docs: unify RST header styles across documentation by @jigangz in
#2473
* docs: fix env var for rich logging by @vricciardulli in #2514
* docs: update dbt project path example for Airflow 3 Astro
compatibility by @yeoreums in #2512
* Document missing Cosmos Airflow config settings in cosmos-conf.rst by
@tatiana in #2515
* Split security-privacy policy doc and add dependency cooldown by
@pankajkoti in #2519
* Add performance optimization and troubleshooting docs by @pankajkoti
in #2521
* Update copyright year to 2026 by @tayloramurphy in #2527
* docs: Updating "Project Policies" to "Policies" in menu bar by
@jroachgolf84 in #2526

Others

* Fix tests after removing support for Airflow versions earlier than 2.9
by @tatiana in #2321
* Enable listener tests for Airflow 3.1 by @pankajastro in #2348
* Accept ``int`` or ``float`` for ``cosmos_debug_max_memory_mb`` in
integration tests by @pankajkoti in #2352
* Update ``CODEOWNERS`` to prioritize ``oss-integrations`` by @tatiana
in #2359
* Fix automatic reviewer assignment in GitHub by @tatiana and @phanikumv
in #2360
* Improve PyPI tagging by @tatiana in #2363
* Add integration tests for dbt Fusion and ``ExecutionMode.WATCHER`` by
@tatiana in #2373
* Fix Zizmor check by @tatiana in #2376
* Remove ``methodtools`` dependency by @tatiana in #2378
* Improve comments on #2389 by @evanvolgas in #2394
* Refactor ``load_from_dbt_manifest`` to reduce code complexity by
@pankajkoti in #2399
* Refactor ``_handle_no_precursors_or_descendants`` to reduce complexity
by @pankajkoti in #2400
* Improve issue templates by @tatiana in #2401
* Avoid running tests when only docs change by @tatiana in #2402
* Add ``no-reload`` target for serving docs locally by @pankajkoti in
#2405
* Fix test hash checks on macOS by @tatiana in #2406
* Attempt deterministic dbt project copy in test fixtures by @pankajkoti
in #2409
* Pin ``virtualenv <21`` due to hatch incompatibility in CI by
@pankajkoti in #2410
* Revert virtualenv pin for hatch installation in CI by @pankajkoti in
#2426
* Add version comments for commit SHA pinned GitHub Actions by
@pankajkoti in #2436
* Fix ``hatch run docs:build`` issues by @tatiana in #2437
* Minor code improvements by @dnskr in #2446
* Pre-commit autoupdate by @pre-commit-ci in #2367, #2396, #2422, #2451,
#2468, #2495, and #2516
* Add file to support Claude understanding the Cosmos repository by
@tatiana in #2458
* Dependency updates by @dependabot in #2368, #2425, #2435, #2465,
#2475, #2504, #2518, and #2528
* Isolate Scarf telemetry integration test into its own CI job by
@pankajkoti and @claude in #2477
* ci: upgrade Airflow version to 3.1 in MyPy type-check job by @yeoreums
in #2506
* Add commit message guidelines to CLAUDE.md by @pankajkoti in #2509
* Extend skipping tests in CI for more non-code file changes by
@pankajkoti in #2510
* Add Dependabot pre-commit support with 7-day cooldown by @pankajkoti
in #2517
* Enforce zero warnings policy for documentation by @dnskr in #2513

Co-authored-by: Pankaj Koti <pankajkoti699@gmail.com>
Co-authored-by: Tatiana Al-Chueyr <tatiana.alchueyr@gmail.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Pankaj Koti <pankajkoti699@gmail.com>
Co-authored-by: Tatiana Al-Chueyr <tatiana.alchueyr@gmail.com>
@tatiana tatiana added this to the Cosmos 1.14.0 milestone Apr 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants