Releases: atlanhq/atlan-python
Release list
v9.10.3
๐ New Features
- Metabase
creator()factories: Addedcreator()factory methods for the Metabase asset family -MetabaseCollection,MetabaseDashboard, andMetabaseQuestion.
Full Changelog: 9.10.2...9.10.3
v9.10.2
๐ New Features
- New
INFORMATICA_POWERCENTERconnector type: AddedINFORMATICA_POWERCENTERto the supported connector types.
๐ฆ Packages
-
Dependencies refreshed while keeping Python 3.9 support: Runtime and dev dependencies were bumped to their current releases using
python_versionmarker splits, so packages that have dropped Python 3.9 stay pinned to their last 3.9-compatible version on 3.9 and move forward on 3.10+. -
msgspeccap lifted on Python 3.10+:msgspecnow resolves to~=0.21.1on Python 3.10+ to avoid a known Python 3.13 concurrent-decode segfault, while Python 3.9 stays on~=0.20.0.
Full Changelog: 9.10.1...9.10.2
v9.10.1
๐ Bug Fixes
- Bulk audit search no longer fails on large result sets: Iterating a bulk audit search (
client.audit.search(..., bulk=True)) over more than 10,000 matching events could fail partway with an Elasticsearch "Result window is too large" error and stop without returning the rest. Pagination now stays within the result-window limit no matter how many events match, so large audit scans complete and return every record.
Full Changelog: 9.10.0...9.10.1
v9.10.0
๐ Bug Fixes
- Clearer error when adding a tag that doesn't exist: Adding an Atlan tag by a name that isn't in your workspace now fails right away with a clear message that names the tag (
Atlan tag with name <name> does not exist.), instead of a confusing server error that made it look like the tag had been deleted. Reading and re-saving assets that already carry a deleted tag continues to work as before. - Much faster imports: Importing asset models (for example,
from pyatlan.model.assets import Column) is now about 3ร faster โ a cold import drops from roughly 8 seconds to under 3. The improvement is largest on Windows, where imports could previously stall. Everything else behaves exactly the same.
๐ฆ Dependencies
- cryptography upgraded to pick up an important security fix. Note: this now requires Python 3.9.1 or newer.
Full Changelog: 9.9.0...9.10.0
v9.9.0
๐ 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 โ
AtlanClientfailed to import withConfigError: 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 topyatlan.model.enums, mirroring the Java SDK and matching the shape of the existingPersonaMetadataAction/DataAction.PersonaAIActioncovers the 18persona-ai-application-*/persona-ai-model-*Ranger slugs;AdminActionandTypeDefActioncover theadmin-*andtype-*/ relationship slugs โ so tooling can convert raw Ranger policy-action slugs to their canonical enum names.
๐ฅ QOL Improvements
- pydantic bumped from
~=2.12.5to~=2.13.4(enables Python3.14support).
Full Changelog: 9.8.0...9.9.0
v9.8.0
๐งช 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, andcreate(...)is idempotent on a duplicate name โ on the server's409it 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
Bug Fixes ๐
Batch/AsyncBatchtracked lists now carry real identity (bothpyatlanandpyatlan_v9): the tracked lists (created/updated/partial_updated/restored) now carry each asset's realguidandqualified_name, so callers can match tracked items back to their inputs by either key. Previously non-glossary assets got a placeholder (negative) guid inpyatlan(or a missing/UNSETguid inpyatlan_v9) viatrim_to_required(), and glossary terms got the guid in place ofqualified_nameinpyatlan(or a missing/UNSETqualified_nameinpyatlan_v9) viaref_by_guid(), making the tracked items impossible to match back by guid or qualified_name. Tracking also now handlesAtlasGlossaryCategory(and types it correctly as a category): previously a category in the tracked path crashed__trackwithValueError("anchor.guid must be available"), because โ likeAtlasGlossaryTermโ itstrim_to_required()requires the parent glossary anchor, which is absent in anAssetMutationResponse.
Full Changelog: 9.7.5...9.7.6
v9.7.5
Bug Fixes ๐
-
Count partial updates in
Batch/AsyncBatch: Successful partial updates โ primitive-only attribute changes (e.g.user_descriptionalone) and any change touching a relationship (e.g. a glossary term'sanchor) โ were never counted: they reportednum_updated: 0and were mislabeled asrestored, causing retry storms for callers that retry on "nothing updated" (notably the common glossary-term path). They are now reconciled from bothmutated_entities.PARTIAL_UPDATEand the top-levelpartial_updated_entities(de-duplicated by GUID) into newpartial_updated/num_partial_updatedtrackers. -
Fix
MutatedEntities.PARTIAL_UPDATEalias collision: the field was mistakenly declared withalias="DELETE", colliding with the realDELETEfield โ so wirePARTIAL_UPDATEpayloads were dropped and deleted assets leaked intoassets_partially_updated(). Corrected toalias="PARTIAL_UPDATE".
Full Changelog: 9.7.4...9.7.5
v9.7.4
v9.7.3
๐ New Features
skillArtifactContentattribute onSkillArtifact: Adds theskill_artifact_content(skillArtifactContent) field toSkillArtifactin bothpyatlanandpyatlan_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.mdbody content viaget_asset/search_assetswithout needing a raw HTTP fallback. (#937)
๐ Bug Fixes
Connection.creatorvalidates connector_type slug (BLDX-1294):Connection.creatorandConnection.creator_async(both pyatlan and pyatlan_v9) now validateconnector_type.valueagainst^[a-z0-9-]+$โ the same pattern the Atlan platform's server-side asset-import (RAB) path enforces. RaisesInvalidRequestError(ATLAN-PYTHON-400-079) on violation. Mirrors the Java SDK constraint. Root cause: a customer-createddev_cmdrconnection (underscore in slug) caused RAB to reject every asset-import referencing it, leaving phantomConnectionrows in Atlas. (#939)
Full Changelog: 9.7.2...9.7.3