Metadata-Version: 2.4
Name: acryl-datahub-actions
Version: 1.6.0.10rc1
Summary: Event-driven action framework for DataHub — trigger automations and workflows in response to real-time metadata changes
Home-page: https://datahub.com/
License: Apache-2.0
Project-URL: Documentation, https://docs.datahub.com/
Project-URL: Source, https://github.com/datahub-project/datahub
Project-URL: Changelog, https://github.com/acryldata/datahub/releases
Project-URL: Releases, https://github.com/acryldata/datahub/releases
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Information Technology
Classifier: Intended Audience :: System Administrators
Classifier: Operating System :: Unix
Classifier: Operating System :: POSIX :: Linux
Classifier: Environment :: Console
Classifier: Environment :: MacOS X
Classifier: Topic :: Software Development
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: stackprinter
Requires-Dist: azure-identity==1.21.0
Requires-Dist: toml>=0.10.0
Requires-Dist: entrypoints
Requires-Dist: psycopg2-binary<3.0.0
Requires-Dist: tenacity
Requires-Dist: pydantic<3.0.0,>=2.4.0
Requires-Dist: typing-inspect
Requires-Dist: click>=6.0.0
Requires-Dist: h11>=0.16
Requires-Dist: ratelimit
Requires-Dist: click-default-group
Requires-Dist: python-dateutil>=2.8.0
Requires-Dist: aws-msk-iam-sasl-signer-python==1.0.2
Requires-Dist: httpcore>=1.0.9
Requires-Dist: acryl-datahub[datahub-kafka]==1.6.0.10rc1
Requires-Dist: PyYAML
Requires-Dist: progressbar2
Requires-Dist: prometheus-client
Provides-Extra: base
Requires-Dist: click-default-group; extra == "base"
Requires-Dist: stackprinter; extra == "base"
Requires-Dist: python-dateutil>=2.8.0; extra == "base"
Requires-Dist: toml>=0.10.0; extra == "base"
Requires-Dist: entrypoints; extra == "base"
Requires-Dist: tenacity; extra == "base"
Requires-Dist: PyYAML; extra == "base"
Requires-Dist: progressbar2; extra == "base"
Requires-Dist: click>=6.0.0; extra == "base"
Requires-Dist: prometheus-client; extra == "base"
Provides-Extra: kafka
Requires-Dist: click-default-group; extra == "kafka"
Requires-Dist: stackprinter; extra == "kafka"
Requires-Dist: python-dateutil>=2.8.0; extra == "kafka"
Requires-Dist: toml>=0.10.0; extra == "kafka"
Requires-Dist: entrypoints; extra == "kafka"
Requires-Dist: tenacity; extra == "kafka"
Requires-Dist: PyYAML; extra == "kafka"
Requires-Dist: progressbar2; extra == "kafka"
Requires-Dist: click>=6.0.0; extra == "kafka"
Requires-Dist: prometheus-client; extra == "kafka"
Requires-Dist: confluent-kafka[schemaregistry]<2.13.0; extra == "kafka"
Provides-Extra: executor
Requires-Dist: click-default-group; extra == "executor"
Requires-Dist: stackprinter; extra == "executor"
Requires-Dist: python-dateutil>=2.8.0; extra == "executor"
Requires-Dist: toml>=0.10.0; extra == "executor"
Requires-Dist: entrypoints; extra == "executor"
Requires-Dist: tenacity; extra == "executor"
Requires-Dist: PyYAML; extra == "executor"
Requires-Dist: progressbar2; extra == "executor"
Requires-Dist: click>=6.0.0; extra == "executor"
Requires-Dist: acryl-executor<1,>=0.3.11; extra == "executor"
Requires-Dist: prometheus-client; extra == "executor"
Provides-Extra: slack
Requires-Dist: click-default-group; extra == "slack"
Requires-Dist: stackprinter; extra == "slack"
Requires-Dist: python-dateutil>=2.8.0; extra == "slack"
Requires-Dist: toml>=0.10.0; extra == "slack"
Requires-Dist: entrypoints; extra == "slack"
Requires-Dist: tenacity; extra == "slack"
Requires-Dist: slack-bolt>=1.15.5; extra == "slack"
Requires-Dist: PyYAML; extra == "slack"
Requires-Dist: progressbar2; extra == "slack"
Requires-Dist: click>=6.0.0; extra == "slack"
Requires-Dist: prometheus-client; extra == "slack"
Provides-Extra: teams
Requires-Dist: click-default-group; extra == "teams"
Requires-Dist: stackprinter; extra == "teams"
Requires-Dist: python-dateutil>=2.8.0; extra == "teams"
Requires-Dist: toml>=0.10.0; extra == "teams"
Requires-Dist: entrypoints; extra == "teams"
Requires-Dist: tenacity; extra == "teams"
Requires-Dist: PyYAML; extra == "teams"
Requires-Dist: progressbar2; extra == "teams"
Requires-Dist: pymsteams>=0.2.2; extra == "teams"
Requires-Dist: click>=6.0.0; extra == "teams"
Requires-Dist: prometheus-client; extra == "teams"
Provides-Extra: tag-propagation
Requires-Dist: click-default-group; extra == "tag-propagation"
Requires-Dist: stackprinter; extra == "tag-propagation"
Requires-Dist: python-dateutil>=2.8.0; extra == "tag-propagation"
Requires-Dist: toml>=0.10.0; extra == "tag-propagation"
Requires-Dist: entrypoints; extra == "tag-propagation"
Requires-Dist: tenacity; extra == "tag-propagation"
Requires-Dist: PyYAML; extra == "tag-propagation"
Requires-Dist: progressbar2; extra == "tag-propagation"
Requires-Dist: click>=6.0.0; extra == "tag-propagation"
Requires-Dist: prometheus-client; extra == "tag-propagation"
Provides-Extra: term-propagation
Requires-Dist: click-default-group; extra == "term-propagation"
Requires-Dist: stackprinter; extra == "term-propagation"
Requires-Dist: python-dateutil>=2.8.0; extra == "term-propagation"
Requires-Dist: toml>=0.10.0; extra == "term-propagation"
Requires-Dist: entrypoints; extra == "term-propagation"
Requires-Dist: tenacity; extra == "term-propagation"
Requires-Dist: PyYAML; extra == "term-propagation"
Requires-Dist: progressbar2; extra == "term-propagation"
Requires-Dist: click>=6.0.0; extra == "term-propagation"
Requires-Dist: prometheus-client; extra == "term-propagation"
Provides-Extra: snowflake-tag-propagation
Requires-Dist: click-default-group; extra == "snowflake-tag-propagation"
Requires-Dist: stackprinter; extra == "snowflake-tag-propagation"
Requires-Dist: python-dateutil>=2.8.0; extra == "snowflake-tag-propagation"
Requires-Dist: acryl-datahub[snowflake-slim]==1.6.0.10rc1; extra == "snowflake-tag-propagation"
Requires-Dist: toml>=0.10.0; extra == "snowflake-tag-propagation"
Requires-Dist: entrypoints; extra == "snowflake-tag-propagation"
Requires-Dist: tenacity; extra == "snowflake-tag-propagation"
Requires-Dist: PyYAML; extra == "snowflake-tag-propagation"
Requires-Dist: progressbar2; extra == "snowflake-tag-propagation"
Requires-Dist: click>=6.0.0; extra == "snowflake-tag-propagation"
Requires-Dist: prometheus-client; extra == "snowflake-tag-propagation"
Provides-Extra: doc-propagation
Requires-Dist: click-default-group; extra == "doc-propagation"
Requires-Dist: stackprinter; extra == "doc-propagation"
Requires-Dist: python-dateutil>=2.8.0; extra == "doc-propagation"
Requires-Dist: toml>=0.10.0; extra == "doc-propagation"
Requires-Dist: entrypoints; extra == "doc-propagation"
Requires-Dist: tenacity; extra == "doc-propagation"
Requires-Dist: PyYAML; extra == "doc-propagation"
Requires-Dist: progressbar2; extra == "doc-propagation"
Requires-Dist: click>=6.0.0; extra == "doc-propagation"
Requires-Dist: prometheus-client; extra == "doc-propagation"
Provides-Extra: observability
Requires-Dist: click-default-group; extra == "observability"
Requires-Dist: stackprinter; extra == "observability"
Requires-Dist: python-dateutil>=2.8.0; extra == "observability"
Requires-Dist: toml>=0.10.0; extra == "observability"
Requires-Dist: entrypoints; extra == "observability"
Requires-Dist: opentelemetry-sdk>=1.20.0; extra == "observability"
Requires-Dist: opentelemetry-api>=1.20.0; extra == "observability"
Requires-Dist: tenacity; extra == "observability"
Requires-Dist: PyYAML; extra == "observability"
Requires-Dist: progressbar2; extra == "observability"
Requires-Dist: click>=6.0.0; extra == "observability"
Requires-Dist: prometheus-client; extra == "observability"
Provides-Extra: all
Requires-Dist: click-default-group; extra == "all"
Requires-Dist: stackprinter; extra == "all"
Requires-Dist: python-dateutil>=2.8.0; extra == "all"
Requires-Dist: acryl-datahub[snowflake-slim]==1.6.0.10rc1; extra == "all"
Requires-Dist: toml>=0.10.0; extra == "all"
Requires-Dist: entrypoints; extra == "all"
Requires-Dist: opentelemetry-sdk>=1.20.0; extra == "all"
Requires-Dist: opentelemetry-api>=1.20.0; extra == "all"
Requires-Dist: tenacity; extra == "all"
Requires-Dist: slack-bolt>=1.15.5; extra == "all"
Requires-Dist: PyYAML; extra == "all"
Requires-Dist: progressbar2; extra == "all"
Requires-Dist: pymsteams>=0.2.2; extra == "all"
Requires-Dist: click>=6.0.0; extra == "all"
Requires-Dist: acryl-executor<1,>=0.3.11; extra == "all"
Requires-Dist: prometheus-client; extra == "all"
Requires-Dist: confluent-kafka[schemaregistry]<2.13.0; extra == "all"
Provides-Extra: dev
Requires-Dist: types-requests; extra == "dev"
Requires-Dist: stackprinter; extra == "dev"
Requires-Dist: types-six; extra == "dev"
Requires-Dist: entrypoints; extra == "dev"
Requires-Dist: types-pytz; extra == "dev"
Requires-Dist: build; extra == "dev"
Requires-Dist: deepdiff; extra == "dev"
Requires-Dist: psycopg2-binary<3.0.0; extra == "dev"
Requires-Dist: sqlalchemy-stubs; extra == "dev"
Requires-Dist: types-python-dateutil; extra == "dev"
Requires-Dist: types-toml; extra == "dev"
Requires-Dist: python-dateutil>=2.8.0; extra == "dev"
Requires-Dist: aws-msk-iam-sasl-signer-python==1.0.2; extra == "dev"
Requires-Dist: ruff==0.11.7; extra == "dev"
Requires-Dist: httpcore>=1.0.9; extra == "dev"
Requires-Dist: slack-bolt>=1.15.5; extra == "dev"
Requires-Dist: PyYAML; extra == "dev"
Requires-Dist: mypy==1.17.1; extra == "dev"
Requires-Dist: pymsteams>=0.2.2; extra == "dev"
Requires-Dist: types-freezegun; extra == "dev"
Requires-Dist: requests-mock; extra == "dev"
Requires-Dist: tox; extra == "dev"
Requires-Dist: acryl-executor<1,>=0.3.11; extra == "dev"
Requires-Dist: prometheus-client; extra == "dev"
Requires-Dist: azure-identity==1.21.0; extra == "dev"
Requires-Dist: pytest-dependency>=0.5.1; extra == "dev"
Requires-Dist: acryl-datahub[snowflake-slim]==1.6.0.10rc1; extra == "dev"
Requires-Dist: toml>=0.10.0; extra == "dev"
Requires-Dist: types-click==0.1.12; extra == "dev"
Requires-Dist: tenacity; extra == "dev"
Requires-Dist: types-setuptools; extra == "dev"
Requires-Dist: pydantic<3.0.0,>=2.4.0; extra == "dev"
Requires-Dist: pytest-cov>=2.8.1; extra == "dev"
Requires-Dist: types-dataclasses; extra == "dev"
Requires-Dist: jsonpickle; extra == "dev"
Requires-Dist: typing-inspect; extra == "dev"
Requires-Dist: click>=6.0.0; extra == "dev"
Requires-Dist: h11>=0.16; extra == "dev"
Requires-Dist: confluent-kafka[schemaregistry]<2.13.0; extra == "dev"
Requires-Dist: ratelimit; extra == "dev"
Requires-Dist: click-default-group; extra == "dev"
Requires-Dist: coverage>=5.1; extra == "dev"
Requires-Dist: types-PyMySQL; extra == "dev"
Requires-Dist: types-PyYAML; extra == "dev"
Requires-Dist: pytest-docker>=0.10.3; extra == "dev"
Requires-Dist: pytest>=6.2.2; extra == "dev"
Requires-Dist: acryl-datahub[datahub-kafka]==1.6.0.10rc1; extra == "dev"
Requires-Dist: progressbar2; extra == "dev"
Requires-Dist: types-cachetools; extra == "dev"
Requires-Dist: twine; extra == "dev"
Requires-Dist: freezegun; extra == "dev"
Provides-Extra: integration-tests
Requires-Dist: acryl-datahub[snowflake-slim]==1.6.0.10rc1; extra == "integration-tests"
Requires-Dist: slack-bolt>=1.15.5; extra == "integration-tests"
Requires-Dist: pymsteams>=0.2.2; extra == "integration-tests"
Requires-Dist: acryl-executor<1,>=0.3.11; extra == "integration-tests"
Requires-Dist: confluent-kafka[schemaregistry]<2.13.0; extra == "integration-tests"
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license
Dynamic: project-url
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

<!-- PyPI long description. Keep concise, feature-discovery-first. -->

# DataHub Actions

**Event-driven automation for DataHub** — react to metadata changes in real time and trigger workflows, notifications, or custom logic.

## What you can do

- **Listen to metadata change events** as they happen (entity updates, tag additions, ownership changes, etc.)
- **Filter events** to only act on what matters to you
- **Chain transformers** to enrich or reshape events before they reach your action
- **Build custom actions** — call APIs, send Slack alerts, trigger pipelines, sync to external systems
- **Run multiple pipelines** in a single process

## Installation

```bash
pip install acryl-datahub acryl-datahub-actions
datahub actions version
```

## Quickstart

Define an action pipeline in YAML and run it:

```yaml
# my_action.yml
name: tag_watcher

source:
  type: kafka
  config:
    connection:
      bootstrap: localhost:9092
      schema_registry_url: http://localhost:8081

filter:
  event_type: EntityChangeEvent_v1
  event:
    category: TAG
    operation: ADD

action:
  type: hello_world
```

```bash
datahub actions -c my_action.yml
```

## Key concepts

| Concept         | Description                                        |
| --------------- | -------------------------------------------------- |
| **Source**      | Where events come from (currently: Kafka)          |
| **Filter**      | Narrow down which events trigger the action        |
| **Transformer** | Optionally reshape or enrich events                |
| **Action**      | What to do — call an API, send a message, run code |

## Supported events

- `EntityChangeEvent_v1` — fired when an entity's metadata changes (tags, owners, terms, etc.)
- `MetadataChangeLogEvent_v1` — low-level log of every aspect write

## Links

- [Documentation](https://docs.datahub.com/)
- [Actions concepts](https://docs.datahub.com/docs/actions/concepts)
- [Quickstart guide](https://docs.datahub.com/docs/actions/quickstart)
- [Developing a custom action](https://docs.datahub.com/docs/actions/guides/developing-an-action)
- [GitHub](https://github.com/datahub-project/datahub)
- [Slack community](https://datahub.com/slack)
