Skip to content

FND-3849: add pyatlan_v9 creators for the 10 Tableau types - #1094

Merged
cmgrote merged 3 commits into
mainfrom
FND-3849
Oct 19, 2026
Merged

cmgrote merged 3 commits into
mainfrom
FND-3849

Conversation

@cmgrote

@cmgrote cmgrote commented Oct 19, 2026

Copy link
Copy Markdown
Collaborator

✨ Description

Adds creator() for the 10 Tableau asset types in pyatlan_v9: TableauSite, TableauProject, TableauWorkbook, TableauDatasource, TableauDashboard, TableauWorksheet, TableauDatasourceField, TableauCalculatedField, TableauWorksheetField, TableauDashboardField. Follows the Sigma (#1087) and Cognos (#1078) pattern: overlay + parity tests + integration test.

TableauDatasource.creator(
    name="Orders",
    project_qualified_name="default/tableau/1712345678/site-guid/project-guid",
    datasource_id="ds-guid",
    workbook_qualified_name="default/tableau/1712345678/site-guid/project-guid/wb-guid",
)
# embedded: qualified_name == ".../project-guid/wb-guid/ds-guid", is_published=False
  • Exact app parity: each creator emits the qualifiedName atlan-tableau-app emits today (FND-3838 census, FND-3849 analysis). Every census variant collapses to one shape per type.
  • Parent qualifiedName in, ancestors derived: creators take the parent's qualifiedName plus the source id; site / project / workbook / connection qualifiedNames are sliced from it. A parent at the wrong depth raises ValueError; blank inputs raise (validate_required_fields).
  • Projects stay flat ({site}/{project}) even when nested. parent_project_qualified_name sets parent_project, is_top_level_project and top_level_project_qualified_name (defaults to the parent).
  • Embedded vs published datasources: passing workbook_qualified_name gives the embedded shape and sets the workbook relationship; the project relationship is always set. Datasource and calculated fields infer published vs embedded from the datasource qualifiedName depth.
  • Worksheet / dashboard fields set the tableau_-prefixed denormalised attributes and the tableau_worksheet / tableau_dashboard relationship, as the app does.
  • top_level_project_qualified_name defaults to the immediate project (correct when the project hierarchy is empty); callers with deeper nesting pass it. projectHierarchy stays caller-set, since it needs ancestor names.
  • Overlays in pyatlan_v9/model/assets/_overlays/tableau_*.py; only the 10 Tableau classes are taken from the regeneration (pkl sdkOnly=python with these overlays, same flags as sync-python-sdk.yaml).

Linear: FND-3849 (analysis table in the issue comments)
Paired models PR: https://github.com/atlanhq/models/pull/2088 (adds the matching qualifiedNameFormula; only TableauSite's generated pattern changes).

Merge order: this PR first, then models#2088. The sync bot regenerates with overlays from atlan-python main on each models master push, so in this order its sync is a no-op for Tableau; the other way round it regenerates the classes without the creators.


🧩 Type of change

  • 🚀 New feature (non-breaking change that adds functionality)

✅ How has this been tested?

  • tests_v9/unit/model/tableau_<type>_test.py (10 files, 125 tests): literal app qualifiedName per type (published and embedded where applicable), pattern match, validate(for_creation=True), parent relationship and denormalised attrs, missing / blank inputs, malformed parent qualifiedNames, cross-site top-level project, create alias, updater / trim_to_required.
  • tests_v9/integration/tableau_asset_test.py (12 tests): builds site → top-level project → nested project → workbook → published and embedded datasources, dashboard, worksheet and every field type through the creators, retrieves each and asserts qualifiedName, parent link and denormalised attrs, then purges. Passes locally against a dev tenant.
  • Generator fidelity: models#2088 + these overlays reproduces this PR's 10 classes with no diff.
  • pytest tests_v9/unit: 8152 passed, 5 skipped. pre-commit clean.

📋 Checklist

  • My code follows the project’s style guidelines
  • I’ve performed a self-review of my code
  • There are no new warnings from my changes
  • I’ve added tests to cover my changes
  • All new and existing tests pass locally

🤖 Generated with Claude Code

https://claude.ai/code/session_016K2wFCg1G6Hxv8j2TKW7cB

cmgrote and others added 3 commits October 19, 2026 12:48
Overlays for TableauSite, TableauProject, TableauWorkbook,
TableauDatasource, TableauDashboard, TableauWorksheet,
TableauDatasourceField, TableauCalculatedField, TableauWorksheetField
and TableauDashboardField. Each creator emits the qualifiedName
atlan-tableau-app emits today, sets the parent relationship and the
denormalised site / project / top-level project / workbook / datasource
attributes, and raises on blank inputs or a parent qn of the wrong depth.

Project qns stay flat under the site; nesting is carried by
parentProject. Datasources take an optional workbook_qualified_name to
build the embedded shape; datasource and calculated fields infer
published vs embedded from the datasource qn depth.
top_level_project_qualified_name defaults to the immediate (or parent)
project, matching the app when the project hierarchy is empty.

Classes regenerated from atlanhq/models FND-3849.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016K2wFCg1G6Hxv8j2TKW7cB
Builds a site, a top-level and a nested project, a workbook in the
nested project, a published and an embedded datasource, a dashboard,
a worksheet and one of each field type, then checks each saved
qualifiedName, parent relationship and denormalised attribute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016K2wFCg1G6Hxv8j2TKW7cB
Follows the per-type layout used by the QuickSight tests, moves the shared
ids and qualifiedNames into tests_v9/unit/model/constants.py, and adds
updater / trim_to_required coverage for every Tableau type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016K2wFCg1G6Hxv8j2TKW7cB
@cmgrote cmgrote added the run_pyatlan_v9_integration_tests To trigger pyatlan v9 (msgspec-based) integration tests suite (name the workflow checks) label Oct 19, 2026
@linear

linear Bot commented Oct 19, 2026

Copy link
Copy Markdown

FND-3849

@cmgrote cmgrote closed this Oct 19, 2026
@cmgrote cmgrote reopened this Oct 19, 2026
@cmgrote
cmgrote merged commit 7c7e039 into main Oct 19, 2026
143 of 260 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run_pyatlan_v9_integration_tests To trigger pyatlan v9 (msgspec-based) integration tests suite (name the workflow checks)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant