|
| 1 | +## 7.0.0 (June 12, 2025) |
| 2 | + |
| 3 | +### New Features |
| 4 | + |
| 5 | +- Added `long` as a new primitive type in the `AtlanCustomAttributePrimitiveType` enum. |
| 6 | +- Support for `Unmodeled` Asset types: Introduced `IndistinctAsset` as a fallback model to handle asset types that are not explicitly modeled in the SDK. Previously, such assets would return `None` (e.g: for newly introduced typedefs). With this release, the SDK will now return an `IndistinctAsset` instance containing basic fields such as `guid`, `qualifiedName`, and `typeName`. |
| 7 | + |
| 8 | +### Bug Fixes |
| 9 | + |
| 10 | +- Fixed timestamp-based pagination in search log results when `from + size` exceeds the Elasticsearch window size (10,000 records) due to identical creation times for the first and last records in a retrieved page. |
| 11 | + |
| 12 | +### Breaking Changes |
| 13 | + |
| 14 | +This release includes a **major refactor** that eliminates all usage of `AtlanClient.get_current_client()` and `set_current_client()` (previously implemented using [ContextVar](https://docs.python.org/3/library/contextvars.html) / [thread-local storage](https://docs.python.org/3/library/threading.html#thread-local-data) a.k.a TLS). Although the earlier design was thread-safe, it still required users to explicitly use `PyAtlanThreadPoolExecutor` in multi-threaded environments, resulting in unintuitive patterns and frequent client initialization errors. |
| 15 | + |
| 16 | +The new design simplifies usage by requiring the `client` to be passed explicitly to SDK operations that interact with the Atlan platform. |
| 17 | + |
| 18 | +> [!IMPORTANT] |
| 19 | +> ### Affected Areas |
| 20 | +> All the following methods or constructors now require a `client` argument due to the removal of `AtlanClient.get_current_client()`: |
| 21 | +
|
| 22 | +##### `pyatlan.model.assets`: |
| 23 | + |
| 24 | +- `Referenceable.flush_custom_metadata(client)` |
| 25 | +- `Referenceable.get_custom_metadata(client, name)` |
| 26 | +- `Referenceable.set_custom_metadata(client, custom_metadata)` |
| 27 | +- `CustomMetadataProxy` is no longer initialized in `Referenceable.__init__()` (as it now requires a `client`). |
| 28 | +- `Purpose.create_metadata_policy()` |
| 29 | +- `Purpose.create_data_policy()` |
| 30 | +- `DataProduct.get_assets()` |
| 31 | +- `Badge.creator()` |
| 32 | +- `Connection.creator()` |
| 33 | + |
| 34 | +> [!NOTE] |
| 35 | +> `user_cache.validate_names`, `role_cache.validate_idstrs`, and `group_cache.validate_aliases` are now invoked inside `Connection.creator()` instead of field validators. |
| 36 | +
|
| 37 | +##### `pyatlan.model.custom_metadata`: |
| 38 | + |
| 39 | +- `CustomMetadataDict(client, name)` |
| 40 | +- `CustomMetadataProxy(client, business_attributes)` |
| 41 | + |
| 42 | +##### `pyatlan.model.structs`: |
| 43 | + |
| 44 | +- `SourceTagAttachment.by_name()` |
| 45 | +- `SourceTagAttachment.by_qualified_name()` |
| 46 | +- `SourceTagName()` (constructor) |
| 47 | + |
| 48 | +##### `pyatlan.model.suggestions`: |
| 49 | + |
| 50 | +- `Suggestions.get()` |
| 51 | +- `Suggestions.apply()` |
| 52 | + |
| 53 | +##### `pyatlan.model.fluent_search` |
| 54 | + |
| 55 | +- `FluentSearch.tagged()` |
| 56 | +- `FluentSearch.tagged_with_value()` |
| 57 | + |
| 58 | +##### `pyatlan.client.typedef` |
| 59 | + |
| 60 | +- `EnumDef.update()` |
| 61 | +- `AttributeDef.create()` |
| 62 | + |
| 63 | +##### `pyatlan.model.search` |
| 64 | + |
| 65 | +- `Exists.with_custom_metadata()` |
| 66 | +- `Term.with_custom_metadata()` |
| 67 | + |
| 68 | +##### `pyatlan.client.atlan` |
| 69 | + |
| 70 | +- `client_connection()` |
| 71 | + |
| 72 | +##### `pyatlan.model.open_lineage` |
| 73 | + |
| 74 | +- `OpenLineageEvent.emit()` |
| 75 | + |
| 76 | +##### `pyatlan.model.fields.atlan_fields` |
| 77 | + |
| 78 | +- `CustomMetadataField()` (constructor) |
| 79 | + |
| 80 | +##### `pyatlan.model.packages` |
| 81 | + |
| 82 | +- All crawler class constructors |
| 83 | + |
| 84 | +### Serialization & Deserialization |
| 85 | + |
| 86 | +#### API Serialization: |
| 87 | + |
| 88 | +- Now handled via the `AtlanRequest` wrapper, which takes a Pydantic model instance and a client. |
| 89 | +- It automatically performs translation (e.g: converting human-readable Atlan tag names into hashed IDs using `AtlanTagRetranslator`). |
| 90 | + |
| 91 | +#### API Response Deserialization: |
| 92 | + |
| 93 | +- Responses are processed using the `AtlanResponse` wrapper. |
| 94 | +- It translates raw JSON into readable formats via registered translators like `AtlanTagTranslator` (e.g: converting hashed tag IDs into human-readable names). |
| 95 | + |
| 96 | +### AtlanTag / AtlanTagName Changes |
| 97 | + |
| 98 | +- **Human-readable tag names** are now only available when deserializing through `AtlanResponse` (which requires a valid `client`). If skipped, tag names remain in **hashed ID format** or as plain strings. |
| 99 | +- Deleted tags (e.g `AtlanTagName('(DELETED)')`) will only appear when using `AtlanResponse`, as the lookup requires a client to determine tag validity. |
| 100 | +- The `.id` attribute on `AtlanTagName` has been **deprecated**. Use `AtlanTag.tag_id` to access the hashed ID instead. |
| 101 | +- Fixed typo in `AtlanTag.source_tag_attachments` field name. |
| 102 | + |
| 103 | +### Other Changes |
| 104 | + |
| 105 | +- `AtlanClient._401_has_retried` is now marked as a `PrivateAttr`. |
| 106 | +- `IndexSearchRequest.Metadata` has been moved to a separate class: `IndexSearchRequestMetadata`. |
| 107 | +- Removed deprecated methods: |
| 108 | + |
| 109 | + - `AtlanClient.get_current_client()` |
| 110 | + - `AtlanClient.set_current_client()` |
| 111 | + - `PyAtlanThreadPoolExecutor` (SDK is now fully thread-safe without it) |
| 112 | +- Updated `AssetClient.find_domain_by_name()` and `AssetClient.find_product_by_name()` to return only active `Domain` and `Product` assets. Previously, these methods returned both `active` and `archived` assets, which caused issues when assets with the same `name` existed in both states - the first match (possibly `archived`) was returned. |
| 113 | + |
| 114 | +### QOL Improvements |
| 115 | + |
| 116 | +- Regenerated latest typedef models. |
| 117 | +- Refactored integration and unit tests to eliminate reliance on `AtlanClient.get_current_client()` / `set_current_client()`. |
| 118 | + |
1 | 119 | ## 6.2.1 (May 30, 2025)
|
2 | 120 |
|
3 | 121 | ### Bug Fixes
|
|
0 commit comments