|
| 1 | +## 8.0.0 (August 20, 2025) |
| 2 | + |
| 3 | +### New Features |
| 4 | + |
| 5 | +#### Full `async/await` support |
| 6 | + |
| 7 | +- Added async/await support to the SDK. All existing `clients` and `caches` now have async variants, plus new models (mainly search result models that require async iteration). Following `aio` directory convention for all async components. |
| 8 | +- Implemented `AsyncAtlanClient` for all async operations (extends `AtlanClient` for reusability). |
| 9 | +- For methods that accept client parameters, we've added corresponding `*_async()` variants: |
| 10 | + |
| 11 | +| Sync Method | Async Method | |
| 12 | +|------------|--------------| |
| 13 | +| `Connection.creator()` | `Connection.creator_async()` | |
| 14 | +| `Badge.creator()` | `Badge.creator_async()` | |
| 15 | +| `FluentSearch.execute()` | `FluentSearch.execute_async()` | |
| 16 | +| `AtlanTag.of()` | `AtlanTag.of_async()` | |
| 17 | +| `SourceTagAttachment.by_name()` | `SourceTagAttachment.by_name_async()` | |
| 18 | +| `CompoundQuery.tagged_with_value()` | `CompoundQuery.tagged_with_value_async()` | |
| 19 | +| `Referenceable.json()` | `Referenceable.json_async()` | |
| 20 | +| `Referenceable.get_custom_metadata()` | `Referenceable.get_custom_metadata_async()` | |
| 21 | +| `Referenceable.set_custom_metadata()` | `Referenceable.set_custom_metadata_async()` | |
| 22 | +| `Referenceable.flush_custom_metadata()` | `Referenceable.flush_custom_metadata_async()` | |
| 23 | + |
| 24 | +#### Shared business logic architecture |
| 25 | +- Extracted common functionality (request preparation and response processing) into a separate `common` sub-package. This enables reuse across both sync and async operations - only the middle layer (API calling with respective clients) differs. |
| 26 | + |
| 27 | +Example: |
| 28 | +```python |
| 29 | +from pyatlan.client.common import FindPurposesByName |
| 30 | + |
| 31 | +@validate_arguments |
| 32 | +async def find_purposes_by_name( |
| 33 | + self, |
| 34 | + name: str, |
| 35 | + attributes: Optional[List[str]] = None, |
| 36 | +) -> List[Purpose]: |
| 37 | + """ |
| 38 | + Async find purposes by name using shared business logic. |
| 39 | + :param name: of the purpose |
| 40 | + :param attributes: (optional) collection of attributes to retrieve for the purpose |
| 41 | + :returns: all purposes with that name, if found |
| 42 | + :raises NotFoundError: if no purpose with the provided name exists |
| 43 | + """ |
| 44 | + search_request = FindPurposesByName.prepare_request(name, attributes) |
| 45 | + search_results = await self.search(search_request) |
| 46 | + return FindPurposesByName.process_response( |
| 47 | + search_results, name, allow_multiple=True |
| 48 | + ) |
| 49 | +``` |
| 50 | + |
| 51 | +### Documentation |
| 52 | + |
| 53 | +- **Asynchronous SDK operations**: https://developer.atlan.com/sdks/python/#asynchronous-sdk-operations |
| 54 | + |
| 55 | +### Breaking Changes |
| 56 | + |
| 57 | +While these aren't direct breaking changes to the SDK API, they may affect your code if you depend on these libraries: |
| 58 | + |
| 59 | +- **Migrated from [`requests`](https://requests.readthedocs.io/en/latest) to [`httpx`](https://www.python-httpx.org)**: Completely removed support for `requests` library and migrated to `httpx`, which provides similar API for `sync` operations plus `async` client support for async operations. |
| 60 | +- **Replaced [`urllib3`](https://urllib3.readthedocs.io/en/stable) with [`httpx-retries`](https://will-ockmore.github.io/httpx-retries)**: Removed support for `urllib3` retry mechanism and implemented retries using `httpx-retries` library (API remains similar). |
| 61 | + |
| 62 | +### QOL Improvements |
| 63 | + |
| 64 | +- Generated latest typedef models. |
| 65 | +- Removed redundant requirements files (no longer needed since migration to `uv` in previous releases). |
| 66 | +- Updated GitHub workflows for Docker image builds to use `uv sync` (without dev dependencies). |
| 67 | +- Added unit and integration tests for `async` SDK. |
| 68 | +- Added `x-atlan-client-type: sync` or `x-atlan-client-type: async` to SDK headers and logging for better observability. |
| 69 | +- Added `async-integration-tests` job to `pyatlan-pr.yaml` workflow. Triggers when there are changes to async SDK code or can be triggered manually via `run-async-tests` label on PR. |
| 70 | +- Async SDK unit tests run by default on every commit push as they have minimal time impact on test suite. |
| 71 | +- Used module-scoped asyncio test fixtures similar to sync integration tests: |
| 72 | + ```toml |
| 73 | + # pyproject.toml |
| 74 | + asyncio_mode = "auto" |
| 75 | + asyncio_default_test_loop_scope = "module" |
| 76 | + asyncio_default_fixture_loop_scope = "module" |
| 77 | + ``` |
| 78 | +- Used `token_client` fixtures when creating/deleting API tokens with `retry=0` to avoid token overpopulation in test tenants. |
| 79 | + |
1 | 80 | ## 7.2.0 (August 13, 2025) |
2 | 81 |
|
3 | 82 | ### New Features |
|
0 commit comments