Skip to content

FND-3857: pyatlan_v9 creators for the 7 Qlik Sense types - #1099

Open
cmgrote wants to merge 4 commits into
mainfrom
FND-3857
Open

cmgrote wants to merge 4 commits into
mainfrom
FND-3857

Conversation

@cmgrote

@cmgrote cmgrote commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

✨ Description

Adds creator() for the 7 Qlik Sense asset types in pyatlan_v9: QlikSpace, QlikStream, QlikApp, QlikDataset, QlikSheet, QlikChart, QlikColumn. Each one emits the exact qualifiedName atlan-qlik-sense-app emits today (checked against its main 407e9a7).

app = QlikApp.creator(name="Sales", qlik_id="a1b2", space_qualified_name="default/qlik-sense/1712345678/space/sp01")
# app.qualified_name == "default/qlik-sense/1712345678/app/a1b2"
col = QlikColumn.creator(name="Region", parent_qualified_name="default/qlik-sense/1712345678/dataset/ds01")
# col.qualified_name == ".../dataset/ds01/column/8899bf1ab296301e5c10c37600324580"
  • Children take the parent's qualifiedName. The creator derives the connection, app ID and space ID from it and raises ValueError if the parent name has the wrong shape. Sheet takes app_qualified_name. Chart takes sheet_qualified_name and builds {app}/chart/{id}, because chart names hang off the app, not the sheet.
  • Space vs stream: the /space/ or /stream/ segment of the space_qualified_name passed in decides whether qlik_space points at a QlikSpace or a QlikStream. The creator does not guess from a deployment type.
  • QlikColumn qualifiedName: {parent}/column/{md5("{parent path}/column/{name}")}, where the parent path is the parent's qualifiedName without the connection, matching the app's generate_field_id. The FND-3838 census showed md5(field_name), which was wrong. The parent type (sheet / chart / dataset) is read from the parent qualifiedName.
  • Optional space_qualified_name on Sheet, Chart and Column fills the denormalised qlik_space_id / qlik_space_qualified_name.
  • Blank inputs raise (validate_required_fields).
  • Fixes QlikColumn.validate(for_creation=True), which used to reject every chart- or dataset-parented column. It now requires one of qlik_sheet / qlik_chart / qlik_dataset, plus qlik_space_qualified_name.
  • Overlays live in pyatlan_v9/model/assets/_overlays/qlik_*.py. The 7 classes are regenerated from the paired models branch with these overlays (pkl sdkOnly=python + pre-commit, the same steps as sync-python-sdk.yaml).

Linear: FND-3857. The analysis table is in the issue comments.
Paired models PR: https://github.com/atlanhq/models/pull/2095. It adds the qualifiedNameFormulas that drive the regenerated _QUALIFIED_NAME_PATTERN, plus the multi-parent creation-check fix.

Merge order: this PR first, then models#2095. The sync bot (sync-python-sdk.yaml, on push to models master) regenerates using the overlays on atlan-python main. In this order its sync PR is a no-op for the Qlik classes; the other way round it would regenerate them without the creators.


🧩 Type of change

  • 🚀 New feature (non-breaking change that adds functionality)
  • 🐛 Bug fix (non-breaking change that fixes an issue) — QlikColumn.validate(for_creation=True)

✅ How has this been tested?

  • Unit: one file per type, tests_v9/unit/model/qlik_{space,stream,app,dataset,sheet,chart,column}_test.py (117 tests). They cover:
    • the literal app qualifiedName for every type, including the column md5 for all three parent types (computed with the app's own generate_field_id)
    • the space vs stream relationship type, including the serialized typeName, and the personal pseudo-space
    • validate(for_creation=True) for every type and every column parent, plus a column with no parent
    • create alias, None / "" / " " for every required input, wrong-shape parents, updater and trim_to_required
  • Integration: tests_v9/integration/qlik_asset_test.py creates a Qlik Sense connection, then through the creators a space and a stream, an app in each, a sheet and a chart, a dataset, and a column under each of the sheet, chart and dataset. It retrieves each by guid, asserts the exact qualifiedName and parent link, and purges. 10/10 passed locally against a tenant. The PR carries run_pyatlan_v9_integration_tests.
  • CI (run 39280047209): qlik_asset_test.py passed 10/10. All v9 unit/QA jobs (3.9–3.14) and the vulnerability scans passed.
  • Pre-existing failures, not caused by this PR: 60 integration jobs failed or were cancelled on the shared tenant, for example s3_asset_test, glossary_test, lineage_test, the aio/* jobs and legacy tests/integration/*. The same jobs also fail on other PRs from today (FND-3856 run: 64, FND-3850 run: 57). The one exception, legacy tests/integration/adls_asset_test.py, was cancelled by matrix fail-fast rather than failing. This PR doesn't touch pyatlan/ or tests/.
  • Full v9 unit suite: 8898 passed, 0 failed.
  • Generator fidelity: generating from the models branch (merged with master) with these overlays, on top of main, is a no-op for the committed Qlik classes. pre-commit leaves them unchanged.

📋 Checklist

  • My code follows the project’s style guidelines
  • I’ve performed a self-review of my code
  • I’ve added comments in tricky or complex areas
  • I’ve updated the documentation as needed
  • 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_01WG31Pc155G4jqZUzC2FEet

cmgrote and others added 2 commits October 14, 2026 16:09
Adds hand-written creator overlays for QlikSpace, QlikStream, QlikApp,
QlikDataset, QlikSheet, QlikChart and QlikColumn, and regenerates those
classes from the paired atlanhq/models change that adds a
qualifiedNameFormula per Qlik type.

Each creator emits the exact qualifiedName atlan-qlik-sense-app emits
today. Child creators take the parent's qualifiedName and derive the
connection, app id and space id from it:
- App / Dataset take space_qualified_name. Its /space/ or /stream/
  segment decides whether qlik_space points at a QlikSpace or a
  QlikStream, so the creator does not guess from a deployment type.
- Sheet takes app_qualified_name; Chart takes sheet_qualified_name and
  builds {app}/chart/{id} (the chart qn hangs off the app, not the sheet).
  Both take an optional space_qualified_name for the denormalised space.
- Column takes parent_qualified_name (sheet, chart or dataset) and builds
  {parent}/column/{md5("{parent path}/column/{name}")}, matching the app's
  generate_field_id. The parent type is read from the qualifiedName.

Blank inputs and parent qualifiedNames of the wrong shape raise ValueError.
tests_v9/unit/model/qlik_test.py asserts each literal app qualifiedName.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WG31Pc155G4jqZUzC2FEet
…rents

The generated QlikColumn.validate(for_creation=True) always required
qlik_sheet and qlik_app_qualified_name, so it rejected every chart- or
dataset-parented column. Regenerated from the paired models change
(sdk.parentTypes on Qlik Column + renderer common-ancestor fix), it now
requires one of qlik_sheet / qlik_chart / qlik_dataset plus
qlik_space_qualified_name, the one ancestor all three parents share.

QlikColumn.creator gains an optional space_qualified_name, like the sheet
and chart creators, to fill that denormalised space.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WG31Pc155G4jqZUzC2FEet
@linear

linear Bot commented Oct 19, 2026

Copy link
Copy Markdown

FND-3857

cmgrote and others added 2 commits October 19, 2026 16:34
Splits tests_v9/unit/model/qlik_test.py into one file per type, in the
layout the merged Fabric creators use: literal app qualifiedName, create
alias, None / "" / "  " for every required input, wrong-shape parents,
updater and trim_to_required. Adds a personal-space dataset case and a
check that the same field under a sheet and a chart hashes differently.

tests_v9/integration/qlik_asset_test.py creates a Qlik Sense connection,
a space and a stream, an app in each, a sheet and a chart under the
space's app, a dataset, and a column under each of the sheet, chart and
dataset, all through the creators. It retrieves each by guid and asserts
the exact qualifiedName and parent relationship, then purges. 10 passed
against a tenant.

Also merges origin/main; regenerating the Qlik classes from the models
branch on top of it is a no-op.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WG31Pc155G4jqZUzC2FEet
@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
@cmgrote cmgrote closed this Oct 19, 2026
@cmgrote cmgrote reopened this Oct 19, 2026

This branch has not been deployed

No deployments
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