Skip to content

Releases: atlanhq/atlan-python

v7.1.8

25 Sep 13:32

Choose a tag to compare

🥗 QOL Improvements

  • Updated Meaning model fields to be optional.

Full Changelog: 7.1.6...7.1.7

v8.1.1

23 Sep 08:03
7476ba9

Choose a tag to compare

🎉 New Features

  • Added support for Databricks system tables in the DatabricksCrawler.
  • Added support for rule conditions and incremental updates for DQ rules.

📝 Documentation

Full Changelog: 8.1.0...8.1.1

v8.1.0

15 Sep 16:01
3ca5560

Choose a tag to compare

🎉 New Features

  • Added support for sending OpenLineage raw events via OpenLineageEvent.emit_raw().

⛑️ Breaking Changes

  • Relationship removal is now idempotent, i.e removing a relationship that does not already exist using SaveSemantic.REMOVE will now simply succeed and do nothing, whereas it previously threw a NotFoundError.

📝 Documentation

🥗 QOL Improvements

  • Added update policy test to persona_test.
  • Fixed glossary_test.test_remove_unrelated_relationship.
  • Updated Atlas endpoint to enforce rate limiting within apps.

Full Changelog: 8.0.2...8.1.0

v8.0.2

01 Sep 06:17
a89da85

Choose a tag to compare

🐞 Bug Fixes

  • Fixed AsyncWorkflowSearchResponse async iterator.

🥗 QOL Improvements

  • pyatlan-wolfi-base.yml: Fixed transient network issues that cause download corruption.

Full Changelog: 8.0.1...8.0.2

v8.0.1

26 Aug 06:35
589c4c7

Choose a tag to compare

🎉 New Features

  • Added get_client_async() for initializing AsyncAtlanClient when using packages.
  • Added optional parameter set_pkg_headers() to set package headers on the client (defaults to False).

🐞 Bug Fixes

  • Fixed httpcore.LocalProtocolError exception in get_client() that occurred when ATLAN_API_KEY environment variable was not configured (commonly encountered during package impersonation with empty API key strings).

🥗 QOL Improvements

  • Added pyatlan-wolfi-base Docker image workflow with enhanced capabilities:
    • Automatic release builds: Workflow now triggers automatically on GitHub releases using latest Python (3.13) and SDK versions
    • Git branch support: Added ability to install SDK from any git branch for development/testing purposes via pyatlan_branch parameter
    • Smart installation logic: Automatically chooses between PyPI (stable) or git (development) installation methods
    • Enhanced tagging: Branch builds tagged as branch-{branchname}-{python}-{commit} for easy identification
    • Build metadata: Images include labels tracking installation source, version/branch, and Python version
    • Conditional PyPI checks: Skips PyPI availability checks when installing from git branches
    • Improved logging: Shows installation method, branch info, and trigger source in build outputs

Full Changelog: 8.0.0...8.0.1

v8.0.0

20 Aug 20:20
adcaef3

Choose a tag to compare

🎉 New Features

  • Added optional parameters (base_url, client_id and client_secret) to AtlanClient.from_token_guid().
  • 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.
  • Implemented AsyncAtlanClient for all async operations (extends AtlanClient for reusability).
  • For methods that accept client parameters, we've added corresponding *_async() variants:
sync async
Connection.creator() Connection.creator_async()
Badge.creator() Badge.creator_async()
FluentSearch.execute() FluentSearch.execute_async()
AtlanTag.of() AtlanTag.of_async()
SourceTagAttachment.by_name() SourceTagAttachment.by_name_async()
CompoundQuery.tagged_with_value() CompoundQuery.tagged_with_value_async()
Referenceable.json() Referenceable.json_async()
Referenceable.get_custom_metadata() Referenceable.get_custom_metadata_async()
Referenceable.set_custom_metadata() Referenceable.set_custom_metadata_async()
Referenceable.flush_custom_metadata() Referenceable.flush_custom_metadata_async()

New shared business logic architecture

  • 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.

Example:

from pyatlan.client.common import GetLineageList

async def get_lineage_list(self, lineage_request) -> AsyncLineageListResults:
      """
      Async lineage retrieval using shared business logic.

      :param lineage_request: detailing the lineage query, parameters, and so on to run
      :returns: the results of the lineage request
      :raises InvalidRequestError: if the requested lineage direction is 'BOTH' (unsupported for this operation)
        :raises AtlanError: on any API communication issue
      """
      api_endpoint, request_obj = GetLineageList.prepare_request(lineage_request)
      raw_json = await self._client._call_api(
          api_endpoint, None, request_obj=request_obj
      )
      response = GetLineageList.process_response(raw_json, lineage_request)

      return AsyncLineageListResults(
          client=self._client,
          criteria=lineage_request,
          start=lineage_request.offset or 0,
          size=lineage_request.size or 10,
          has_more=response["has_more"],
          assets=response["assets"],
      )


def get_lineage_list(
      self, lineage_request: LineageListRequest
  ) -> LineageListResults:
        """
        Retrieve lineage using the higher-performance "list" API.

        :param lineage_request: detailing the lineage query, parameters, and so on to run
        :returns: the results of the lineage request
        :raises InvalidRequestError: if the requested lineage direction is 'BOTH' (unsupported for this operation)
        :raises AtlanError: on any API communication issue
        """
        endpoint, request_obj = GetLineageList.prepare_request(lineage_request)
        raw_json = self._client._call_api(endpoint, request_obj=request_obj)
        response = GetLineageList.process_response(raw_json, lineage_request)
        return LineageListResults(
            client=self._client,
            criteria=lineage_request,
            start=lineage_request.offset or 0,
            size=lineage_request.size or 10,
            has_more=response["has_more"],
            assets=response["assets"],
        )

📝 Documentation

⛑️ Breaking Changes

While these aren't direct breaking changes to the SDK API, they may affect your code if you depend on these libraries:

  • Migrated from requests to httpx: Completely removed support for requests library and migrated to httpx, which provides similar API for sync operations plus async client support for async operations.
  • Replaced urllib3 with httpx-retries: Removed support for urllib3 retry mechanism and implemented retries using httpx-retries library (API remains similar).

🥗 QOL Improvements

  • Added unit and integration tests for async SDK.
  • Added x-atlan-client-type: sync or x-atlan-client-type: async to SDK headers and logging for better observability.
  • 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.
  • Async SDK unit tests run by default on every commit push as they have minimal time impact on test suite.
  • Used module-scoped asyncio test fixtures similar to sync integration tests:
    # pyproject.toml
    asyncio_mode = "auto"
    asyncio_default_test_loop_scope = "module"
    asyncio_default_fixture_loop_scope = "module"
  • Used token_client fixtures when creating/deleting API tokens with retry=0 to avoid token overpopulation in test tenants.
  • Fixed conda packages publish GitHub workflow.
  • Updated GitHub workflows for Docker image builds to use uv sync (without dev dependencies).

Full Changelog: 7.2.0...8.0.0

v7.2.0

13 Aug 12:17
97b017b

Choose a tag to compare

🎉 New Features

  • Added Python version info to SDK headers and API logger.

⛑️ Breaking Changes

  • Dropped support for Python 3.8.

🥗 QOL Improvements

  • Bumped various core and dev dependencies to latest versions.
  • Fixed conda publish and pyatlan publish GitHub workflows.
  • Fixed integration test failures due to Elasticsearch eventual consistency using custom retries (glossary_test, test_client, persona/purpose_test)

Full Changelog: 7.1.6...7.2.0

v7.1.6

07 Aug 11:33
3f7d250

Choose a tag to compare

🥗 QOL Improvements

  • Added support for adding DQ rules schedule to an asset (i.e: AssetClient.add_dq_rule_schedule()).

Documentation: https://developer.atlan.com/patterns/create/dq_rules/#schedule-data-quality-rules

Full Changelog: 7.1.5...7.1.6

v7.1.5

01 Aug 17:23
c2fc76e

Choose a tag to compare

🧪 Experimental

  • Added creator() and updater() methods for alpha_DQRule (data quality rule) asset.

🥗 QOL Improvements

  • Generated latest typedef models.

Full Changelog: 7.1.4...7.1.5

v7.1.4

30 Jul 05:36
7a03f61

Choose a tag to compare

🎉 New Features

  • Added new connector types: AI, SAP_ECC.
  • Added new connector categories: AI, ERP.
  • Added creator() methods for AI-based assets.
  • Added support for applicable_ai_asset_types to custom metadata AttributeDef.Options.

🧪 Experimental

  • Added support for AtlanClient initialization via API token guid.

🐞 Bug Fixes

  • Fixed handling of source_tag when no attributes present.

🥗 QOL Improvements

  • Generated latest typedef models.
  • Updated Dockerfile to use python:3.13.5-slim-bookworm.
  • Removed unused requirements files (now using pyproject.toml).

Full Changelog: 7.1.3...7.1.4