Skip to content

Releases: atlanhq/atlan-python

v9.9.0

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 30 Jun 08:45
8acb239

πŸŽ‰ New Features

  • Python 3.14 support: pyatlan now supports Python 3.14. The model layer's pydantic v1 compatibility shim was incompatible with Python 3.14's deferred-annotation semantics (PEP 649 / PEP 749) on pydantic 2.12.x β€” AtlanClient failed to import with ConfigError: unable to infer type for attribute .... Bumping pydantic to 2.13.x restores the v1 compat layer on 3.14; no API changes. Verified across Python 3.9–3.14.

  • New policy-action enums (PersonaAIAction, AdminAction, TypeDefAction): Added to pyatlan.model.enums, mirroring the Java SDK and matching the shape of the existing PersonaMetadataAction / DataAction. PersonaAIAction covers the 18 persona-ai-application-* / persona-ai-model-* Ranger slugs; AdminAction and TypeDefAction cover the admin-* and type-* / relationship slugs β€” so tooling can convert raw Ranger policy-action slugs to their canonical enum names.

πŸ₯— QOL Improvements

  • pydantic bumped from ~=2.12.5 to ~=2.13.4 (enables Python 3.14 support).

Full Changelog: 9.8.0...9.9.0

v9.8.0

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 26 Jun 13:50
dbe5bff

πŸ§ͺ Experimental:

Native App workflows (client.app)

This release previews a brand-new way to create and manage connector workflows directly from pyatlan β€” no hand-maintained package classes. It targets the native /v1/app* APIs and is experimental: the surface may change in a future release.

https://docs.atlan.com/product/capabilities/build-apps/sdks/python/apps

✨ Highlights

AppClient β€” full app-workflow lifecycle (sync + async). Create, run, schedule, list, update, and delete workflows over the /v1/app* APIs.

  • Resolve by name + idempotent create. get_all(name=...) filters by exact workflow name, and create(...) is idempotent on a duplicate name β€” on the server's 409 it returns the existing workflow instead of erroring, so re-running a migration script is safe (create-or-reuse-by-name).

Typed app builders (pyatlan.model.apps) β€” one per connector. A fluent, UI-equivalent builder (e.g. BigqueryCrawler, SnowflakeCrawler, AtlanTableau, PostgresCrawler, …) that mirrors the "new app" wizard β€” Credential β†’ Connection β†’ Metadata.

from pyatlan.client.atlan import AtlanClient
from pyatlan.model.apps import BigqueryCrawler

client = AtlanClient()

response = (
    BigqueryCrawler(client)
    .service_account(email="...", service_account_json="...", project_id="...")
    .connection(name="bigquery-prod", admin_roles=[client.role_cache.get_id_for_name("$admin")])
    .include({"my_project": ["analytics", "sales"]})
    .run(name="bigquery-prod")
)
print(response.slug, response.run_id)  # persist `slug` for lifecycle ops

⚠️ Deprecations

WorkflowClient (client.workflow) and model.packages.* are deprecated and now emit a DeprecationWarning. They target the legacy workflow surface, which no longer runs on the latest Atlan tenants - use client.app instead.

Full Changelog: 9.7.6...9.8.0

v9.7.6

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 16 Jun 10:35
48ad517

Bug Fixes 🐞

  • Batch/AsyncBatch tracked lists now carry real identity (both pyatlan and pyatlan_v9): the tracked lists (created / updated / partial_updated / restored) now carry each asset's real guid and qualified_name, so callers can match tracked items back to their inputs by either key. Previously non-glossary assets got a placeholder (negative) guid in pyatlan (or a missing/UNSET guid in pyatlan_v9) via trim_to_required(), and glossary terms got the guid in place of qualified_name in pyatlan (or a missing/UNSET qualified_name in pyatlan_v9) via ref_by_guid(), making the tracked items impossible to match back by guid or qualified_name. Tracking also now handles AtlasGlossaryCategory (and types it correctly as a category): previously a category in the tracked path crashed __track with ValueError("anchor.guid must be available"), because β€” like AtlasGlossaryTerm β€” its trim_to_required() requires the parent glossary anchor, which is absent in an AssetMutationResponse.

Full Changelog: 9.7.5...9.7.6

v9.7.5

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 16 Jun 06:49
355332d

Bug Fixes 🐞

  • Count partial updates in Batch/AsyncBatch: Successful partial updates β€” primitive-only attribute changes (e.g. user_description alone) and any change touching a relationship (e.g. a glossary term's anchor) β€” were never counted: they reported num_updated: 0 and were mislabeled as restored, causing retry storms for callers that retry on "nothing updated" (notably the common glossary-term path). They are now reconciled from both mutated_entities.PARTIAL_UPDATE and the top-level partial_updated_entities (de-duplicated by GUID) into new partial_updated / num_partial_updated trackers.

  • Fix MutatedEntities.PARTIAL_UPDATE alias collision: the field was mistakenly declared with alias="DELETE", colliding with the real DELETE field β€” so wire PARTIAL_UPDATE payloads were dropped and deleted assets leaked into assets_partially_updated(). Corrected to alias="PARTIAL_UPDATE".

Full Changelog: 9.7.4...9.7.5

v9.7.4

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 02 Jun 08:12
3c621ab

Experimental: pyatlan_v9 πŸ§ͺ

  • Generated latest typedef models.

Full Changelog: 9.7.3...9.7.4

v9.7.3

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 25 May 10:56
77b86e7

πŸŽ‰ New Features

  • skillArtifactContent attribute on SkillArtifact: Adds the skill_artifact_content (skillArtifactContent) field to SkillArtifact in both pyatlan and pyatlan_v9. The Atlas API returns this attribute on SkillArtifact entities but PyAtlan was silently dropping it (Config.extra = ignore). This unblocks the Atlan MCP server from surfacing skill .md body content via get_asset / search_assets without needing a raw HTTP fallback. (#937)

🐞 Bug Fixes

  • Connection.creator validates connector_type slug (BLDX-1294): Connection.creator and Connection.creator_async (both pyatlan and pyatlan_v9) now validate connector_type.value against ^[a-z0-9-]+$ β€” the same pattern the Atlan platform's server-side asset-import (RAB) path enforces. Raises InvalidRequestError (ATLAN-PYTHON-400-079) on violation. Mirrors the Java SDK constraint. Root cause: a customer-created dev_cmdr connection (underscore in slug) caused RAB to reject every asset-import referencing it, leaving phantom Connection rows in Atlas. (#939)

Full Changelog: 9.7.2...9.7.3

v9.7.2

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 18 May 09:51
2d33c6a

πŸŽ‰ New Features

  • Add AMAZON_MSK to AtlanConnectorType: New AMAZON_MSK = ("amazon-msk", AtlanConnectionCategory.EVENT_BUS) enum entry, matching the Java SDK. Removes the need for the extend_enum workaround.

🐞 Bug Fixes

  • DataProduct.creator now defaults daap_visibility to PRIVATE: Mirrors the Atlan UI default. Fixes the marketplace Overview Assets tile rendering blank for products created via the SDK because the UI required both daapStatus and daapVisibility to be non-null. The earlier partial fix only set daap_status. New optional overrides also exposed on creator() / create(): daap_visibility, daap_visibility_users, daap_visibility_groups, owner_users, owner_groups.
  • DataProduct.creator defaults owner_users to the calling user: When a client is passed, the creating user's username is used as the default owner, matching UI behavior.

Full Changelog: 9.7.1...9.7.2

v9.7.1

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 01 May 09:41
8056510

🐞 Bug Fixes

  • DbtProcess and DbtColumnProcess now extend the correct process parent: Atlas typedefs list Dbt first in superTypes, causing the class generator to pick Dbt over Process/ColumnProcess as the Python superclass. This made issubclass(cls, Process) return False, causing atlan-publish-app to place dbt-process types in Batch 1 alongside their upstream entities and producing ATLAS-404 errors on every inputs/outputs lookup.

Full Changelog: 9.7.0...9.7.1

v9.7.0

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 30 Apr 18:18
06a63db

New Features πŸŽ‰

  • GENERIC_OPENLINEAGE connector type: Added AtlanConnectorType.GENERIC_OPENLINEAGE = ("generic-openlineage", AtlanConnectionCategory.ELT) so the SDK can target the marketplace generic-openlineage (GOLC) ingestion endpoint at /events/openlineage/generic-openlineage/api/v1/lineage. Mirrored in pyatlan_v9.
  • OpenLineageEvent.emit() accepts connector_type: emit() and emit_async() now take an optional connector_type kwarg (defaulting to SPARK), matching the pattern already used by emit_raw() / emit_raw_async(). Removes the previous hardcoded SPARK assumption so callers can route events to any OpenLineage-compatible connector.

Bug Fixes 🐞

  • DbtMeasure extends SemanticMeasure, not Dbt: The Atlas type hierarchy is DbtMeasure β†’ SemanticMeasure β†’ Semantic, but the generator picked Dbt as the Python parent because the typedef lists superTypes=["Dbt", "SemanticMeasure"] (Dbt first). This broke atlan-publish-app's ordering graph β€” DbtSemanticModel β†’ DbtMeasure edges were never created via the semantic_measures relationship, causing publish to fail with ATLAS-404 on semanticModel lookup.

Experimental: pyatlan_v9 πŸ§ͺ

  • Generated latest typedef models.

Full Changelog: 9.6.0...9.7.0

v9.6.0

Choose a tag to compare

@Aryamanz29 Aryamanz29 released this 27 Apr 08:43
2c08e90

New Features πŸŽ‰

  • Deprecated Phosphor icon enum values: Added 11 deprecated Phosphor icon names (PhActivity, PhCircleWavy*, PhFileDotted, PhFileSearch, PhFolderDotted, PhFolderSimpleDotted, PhPedestrian, PhTextBolder) to AtlanIcon so the SDK can deserialize tag definitions that reference old icon names without failing.

Bug Fixes 🐞

  • httpcore connection pool deadlock fix: Fixed a production deadlock where concurrent replace_custom_metadata calls could hang indefinitely. Root cause: httpcore's connection pool filled with CLOSE_WAIT zombie sockets (nginx closed idle connections at 75s, httpcore didn't detect this) and pool=None timeout meant threads waited forever. Fix adds pool=30.0 timeout, keepalive_expiry=30.0 (< nginx 75s), and response.close() before retry sleep to release connection slots. Includes reset_http_session() for recovering degraded pools in long-running workflows.

QOL Improvements πŸ₯—

  • Connection pool config extracted to constants: _DEFAULT_POOL_LIMITS and _DEFAULT_POOL_TIMEOUT_SECONDS defined once at module level instead of repeated 4 times across init, reset, max_retries, and timeout.
  • Trivy CI fix: Bumped Trivy from v0.69.0 (broken download) to v0.70.0.

Full Changelog: 9.5.0...9.6.0