Metadata-Version: 2.4
Name: tabsdata
Version: 1.8.0
Summary: Tabsdata is a publish-subscribe (pub/sub) server for tables.
Author: Tabs Data Inc.
License: Tabsdata License
Project-URL: Homepage, https://tabsdata.com
Project-URL: Documentation, https://docs.tabsdata.com
Project-URL: Source, https://github.com/tabsdata/tabsdata
Keywords: tabsdata,data,tables,pub/sub,publish/subscribe
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Information Technology
Classifier: Programming Language :: JavaScript
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Programming Language :: Rust
Classifier: Operating System :: OS Independent
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: variant/assets/manifest/LICENSE
Requires-Dist: accessify==0.3.1
Requires-Dist: archspec==0.2.5
Requires-Dist: base32hex==1.0.2
Requires-Dist: boto3==1.42.55
Requires-Dist: boto3-stubs[glue]==1.42.55
Requires-Dist: click==8.3.1
Requires-Dist: clickhouse-connect==0.13.0
Requires-Dist: cloudpickle==3.1.2
Requires-Dist: colorama==0.4.6
Requires-Dist: connectorx==0.4.5
Requires-Dist: croniter==6.0.0
Requires-Dist: fastavro==1.12.1
Requires-Dist: fastparquet==2025.12.0
Requires-Dist: filelock==3.24.3
Requires-Dist: google-cloud-storage==3.9.0
Requires-Dist: google-cloud-storage-control==1.10.0
Requires-Dist: grpcio-tools==1.78.0
Requires-Dist: humanize==4.15.0
Requires-Dist: hvac==2.4.0
Requires-Dist: ibm_db==3.2.8
Requires-Dist: ibm_db_sa==0.4.3
Requires-Dist: ijson==3.5.0
Requires-Dist: importlib-metadata==8.7.1
Requires-Dist: isodate==0.7.2
Requires-Dist: jsonschema==4.26.0
Requires-Dist: numpy==2.4.2
Requires-Dist: orjson==3.11.7
Requires-Dist: packaging==26.0
Requires-Dist: pandas==2.3.3
Requires-Dist: pillow==12.1.1
Requires-Dist: pip-tools==7.5.3
Requires-Dist: platformdirs==4.9.2
Requires-Dist: polars==1.38.1
Requires-Dist: protobuf==6.33.5
Requires-Dist: pycountries==1.2.1
Requires-Dist: pyyaml==6.0.3
Requires-Dist: pyarrow==23.0.1
Requires-Dist: py-cpuinfo==9.0.0
Requires-Dist: pydantic==2.12.5
Requires-Dist: pyiceberg[glue]==0.11.0
Requires-Dist: pywin32==311; platform_system == "Windows"
Requires-Dist: requests==2.32.5
Requires-Dist: rich==14.3.3
Requires-Dist: rich-click==1.9.7
Requires-Dist: ruamel-yaml==0.19.1
Requires-Dist: sqlalchemy==2.0.46
Requires-Dist: starlette==0.52.1
Requires-Dist: tenacity==9.1.4
Requires-Dist: typing-extensions==4.15.0
Requires-Dist: tzlocal==5.3.1
Requires-Dist: uuid6==2025.0.1
Requires-Dist: uuid-v7==1.0.0
Requires-Dist: uv==0.10.5
Provides-Extra: test
Requires-Dist: accessify==0.3.1; extra == "test"
Requires-Dist: archspec==0.2.5; extra == "test"
Requires-Dist: base32hex==1.0.2; extra == "test"
Requires-Dist: boto3==1.42.55; extra == "test"
Requires-Dist: boto3-stubs[glue]==1.42.55; extra == "test"
Requires-Dist: click==8.3.1; extra == "test"
Requires-Dist: clickhouse-connect==0.13.0; extra == "test"
Requires-Dist: cloudpickle==3.1.2; extra == "test"
Requires-Dist: colorama==0.4.6; extra == "test"
Requires-Dist: connectorx==0.4.5; extra == "test"
Requires-Dist: croniter==6.0.0; extra == "test"
Requires-Dist: fastavro==1.12.1; extra == "test"
Requires-Dist: fastparquet==2025.12.0; extra == "test"
Requires-Dist: filelock==3.24.3; extra == "test"
Requires-Dist: google-cloud-storage==3.9.0; extra == "test"
Requires-Dist: google-cloud-storage-control==1.10.0; extra == "test"
Requires-Dist: grpcio-tools==1.78.0; extra == "test"
Requires-Dist: humanize==4.15.0; extra == "test"
Requires-Dist: hvac==2.4.0; extra == "test"
Requires-Dist: ibm_db==3.2.8; extra == "test"
Requires-Dist: ibm_db_sa==0.4.3; extra == "test"
Requires-Dist: ijson==3.5.0; extra == "test"
Requires-Dist: importlib-metadata==8.7.1; extra == "test"
Requires-Dist: isodate==0.7.2; extra == "test"
Requires-Dist: jsonschema==4.26.0; extra == "test"
Requires-Dist: numpy==2.4.2; extra == "test"
Requires-Dist: orjson==3.11.7; extra == "test"
Requires-Dist: packaging==26.0; extra == "test"
Requires-Dist: pandas==2.3.3; extra == "test"
Requires-Dist: pillow==12.1.1; extra == "test"
Requires-Dist: pip-tools==7.5.3; extra == "test"
Requires-Dist: platformdirs==4.9.2; extra == "test"
Requires-Dist: polars==1.38.1; extra == "test"
Requires-Dist: protobuf==6.33.5; extra == "test"
Requires-Dist: pycountries==1.2.1; extra == "test"
Requires-Dist: pyyaml==6.0.3; extra == "test"
Requires-Dist: pyarrow==23.0.1; extra == "test"
Requires-Dist: py-cpuinfo==9.0.0; extra == "test"
Requires-Dist: pydantic==2.12.5; extra == "test"
Requires-Dist: pyiceberg[glue]==0.11.0; extra == "test"
Requires-Dist: pywin32==311; platform_system == "Windows" and extra == "test"
Requires-Dist: requests==2.32.5; extra == "test"
Requires-Dist: rich==14.3.3; extra == "test"
Requires-Dist: rich-click==1.9.7; extra == "test"
Requires-Dist: ruamel-yaml==0.19.1; extra == "test"
Requires-Dist: sqlalchemy==2.0.46; extra == "test"
Requires-Dist: starlette==0.52.1; extra == "test"
Requires-Dist: tenacity==9.1.4; extra == "test"
Requires-Dist: typing-extensions==4.15.0; extra == "test"
Requires-Dist: tzlocal==5.3.1; extra == "test"
Requires-Dist: uuid6==2025.0.1; extra == "test"
Requires-Dist: uuid-v7==1.0.0; extra == "test"
Requires-Dist: uv==0.10.5; extra == "test"
Requires-Dist: google-cloud-bigquery==3.40.1; extra == "test"
Requires-Dist: mysql-replication==1.0.15; extra == "test"
Requires-Dist: databricks-sdk==0.92.0; extra == "test"
Requires-Dist: databricks-sql-connector==4.2.5; extra == "test"
Requires-Dist: confluent-kafka[avro,json,protobuf,schemaregistry]==2.13.0; extra == "test"
Requires-Dist: pymongo==4.16.0; extra == "test"
Requires-Dist: pyodbc==5.3.0; extra == "test"
Requires-Dist: simple-salesforce==1.12.9; extra == "test"
Requires-Dist: opentelemetry-api==1.39.1; extra == "test"
Requires-Dist: opentelemetry-sdk==1.39.1; extra == "test"
Requires-Dist: snowflake-connector-python==4.3.0; extra == "test"
Requires-Dist: mysql-connector-python==9.6.0; extra == "test"
Requires-Dist: oracledb==3.4.2; extra == "test"
Requires-Dist: psycopg2-binary==2.9.11; extra == "test"
Requires-Dist: ansi2html==1.9.2; extra == "test"
Requires-Dist: archspec==0.2.5; extra == "test"
Requires-Dist: azure-storage-blob==12.28.0; extra == "test"
Requires-Dist: boto3==1.42.55; extra == "test"
Requires-Dist: build==1.4.0; extra == "test"
Requires-Dist: colorama==0.4.6; extra == "test"
Requires-Dist: colorlog==6.10.1; extra == "test"
Requires-Dist: csvkit==2.2.0; extra == "test"
Requires-Dist: devpi-client==7.2.0; extra == "test"
Requires-Dist: devpi-server==6.19.0; extra == "test"
Requires-Dist: devpi-web==5.0.1; extra == "test"
Requires-Dist: docker==7.1.0; extra == "test"
Requires-Dist: fastapi==0.133.0; extra == "test"
Requires-Dist: gita==0.16.8.2; extra == "test"
Requires-Dist: gitpython==3.1.46; extra == "test"
Requires-Dist: google-cloud-storage==3.9.0; extra == "test"
Requires-Dist: gtts==2.2.4; extra == "test"
Requires-Dist: kafka-python==2.3.0; extra == "test"
Requires-Dist: liccheck==0.9.2; extra == "test"
Requires-Dist: licensecheck==2025.1.0; extra == "test"
Requires-Dist: matplotlib==3.10.8; extra == "test"
Requires-Dist: maturin==1.12.4; extra == "test"
Requires-Dist: mimesis==19.1.0; extra == "test"
Requires-Dist: mkdocs==1.6.1; extra == "test"
Requires-Dist: mypy==1.19.1; extra == "test"
Requires-Dist: parquet-tools==0.2.16; extra == "test"
Requires-Dist: pdoc==16.0.0; extra == "test"
Requires-Dist: pip-audit==2.10.0; extra == "test"
Requires-Dist: pip-tools==7.5.3; extra == "test"
Requires-Dist: pip-upgrader==1.4.15; extra == "test"
Requires-Dist: pipdeptree==2.31.0; extra == "test"
Requires-Dist: prompt-toolkit==3.0.52; extra == "test"
Requires-Dist: psutil==7.2.2; extra == "test"
Requires-Dist: py-cpuinfo==9.0.0; extra == "test"
Requires-Dist: py-spy==0.4.1; extra == "test"
Requires-Dist: pydevd_pycharm==261.21525.48; extra == "test"
Requires-Dist: pygame==2.6.1; extra == "test"
Requires-Dist: pysentry-rs==0.4.2; extra == "test"
Requires-Dist: pytest-check==2.6.2; extra == "test"
Requires-Dist: pytest-cov==7.0.0; extra == "test"
Requires-Dist: pytest-env==1.5.0; extra == "test"
Requires-Dist: pytest-instafail==0.5.0; extra == "test"
Requires-Dist: pytest-reporter-html1==0.9.5; extra == "test"
Requires-Dist: pytest-timeout==2.4.0; extra == "test"
Requires-Dist: pytest-xdist==3.8.0; extra == "test"
Requires-Dist: pytest==9.0.2; extra == "test"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "test"
Requires-Dist: PyYAML==6.0.3; extra == "test"
Requires-Dist: questionary==2.1.1; extra == "test"
Requires-Dist: ruff==0.15.2; extra == "test"
Requires-Dist: setuptools==82.0.0; extra == "test"
Requires-Dist: supervisor==4.3.0; extra == "test"
Requires-Dist: tabulate==0.9.0; extra == "test"
Requires-Dist: tomlkit==0.14.0; extra == "test"
Requires-Dist: tqdm==4.67.3; extra == "test"
Requires-Dist: twine==6.2.0; extra == "test"
Requires-Dist: tzlocal==5.3.1; extra == "test"
Requires-Dist: uvicorn==0.41.0; extra == "test"
Requires-Dist: virtualenv==20.39.0; extra == "test"
Requires-Dist: wheel-inspect==1.8.0; extra == "test"
Requires-Dist: wheel==0.46.3; extra == "test"
Provides-Extra: bigquery
Requires-Dist: tabsdata-bigquery[deps]==1.8.0; extra == "bigquery"
Provides-Extra: cdc-common
Requires-Dist: tabsdata-cdc-common[deps]==1.8.0; extra == "cdc-common"
Provides-Extra: cdc-db2
Requires-Dist: tabsdata-cdc-db2[deps]==1.8.0; extra == "cdc-db2"
Provides-Extra: cdc-mysql
Requires-Dist: tabsdata-cdc-mysql[deps]==1.8.0; extra == "cdc-mysql"
Provides-Extra: cdc-postgres
Requires-Dist: tabsdata-cdc-postgres[deps]==1.8.0; extra == "cdc-postgres"
Provides-Extra: databricks
Requires-Dist: tabsdata-databricks[deps]==1.8.0; extra == "databricks"
Provides-Extra: kafka
Requires-Dist: tabsdata-kafka[deps]==1.8.0; extra == "kafka"
Provides-Extra: mongodb
Requires-Dist: tabsdata-mongodb[deps]==1.8.0; extra == "mongodb"
Provides-Extra: mssql
Requires-Dist: tabsdata-mssql[deps]==1.8.0; extra == "mssql"
Provides-Extra: salesforce
Requires-Dist: tabsdata-salesforce[deps]==1.8.0; extra == "salesforce"
Provides-Extra: snowflake
Requires-Dist: tabsdata-snowflake[deps]==1.8.0; extra == "snowflake"
Provides-Extra: sql-common
Requires-Dist: tabsdata-sql-common[deps]==1.8.0; extra == "sql-common"
Provides-Extra: all
Requires-Dist: tabsdata-bigquery[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-cdc-common[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-cdc-db2[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-cdc-mysql[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-cdc-postgres[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-databricks[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-kafka[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-mongodb[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-mssql[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-salesforce[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-snowflake[deps]==1.8.0; extra == "all"
Requires-Dist: tabsdata-sql-common[deps]==1.8.0; extra == "all"
Dynamic: description
Dynamic: description-content-type
Dynamic: license
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python

<!--
Copyright 2025 Tabs Data Inc.
-->

![Tabsdata](https://docs.tabsdata.com/tabsdata.png)

<div align="center">
    <a href="https://tabsdata.com">Tabsdata</a> |
    <a href="https://docs.tabsdata.com/1.8.0/guide/intro.html">User Guide</a> |
    <a href="https://docs.tabsdata.com/1.8.0/api_ref/index.html">API Reference</a>
</div>

# License

Your use of this product is subject to the terms of use available at https://tabsdata.com/license.

# Tabsdata Pub/Sub for Tables

[Tabsdata](https://tabsdata.com) is a publish-subscribe (pub/sub) server for tables.

Tabsdata has connectors to publish and subscribe tables from local files, S3, Azure Storage,
MySQL/MariaDB, Oracle, PostgreSQL. It also provides a Connector Plugin API to write custom
connectors.

Tables can populated with external data or using data from other tables already existing
in the Tabsdata server.

Tables can be manipulated using a [TableFrame API](https://docs.tabsdata.com/latest/api_ref/index.html)
(internally Tabsdata uses [Polars](https://github.com/pola-rs/polars)) that enables selection,
filtering, aggregation and joins operations.

For more details refer
to [Tabsdata Getting Started](https://docs.tabsdata.com/latest/guide/02_getting_started/main.html)
(latest) or the [Tabsdata User Guide](https://docs.tabsdata.com/latest/guide/intro.html) (latest).

## Installation

Supported platforms:

* Windows (x86 - latest)
* macOS (Apple silicon/x86 - latest)
* Ubuntu, Debian & RedHat - (x86 - latest)

```
pip install tabsdata
```

## This version (1.8.0) Documentation

* [User Guide](https://docs.tabsdata.com/1.8.0/guide/intro.html)
* [API Reference](https://docs.tabsdata.com/1.8.0/api_ref/index.html)

## How Does Tabsdata Work?

The following snippets show how to publish and subscribe to tables in Tabsdata.

### Publishing data from a MySQL Database

```
@td.publisher(
    td.MySQLSource(
        "mysql://127.0.0.1:3306/testing",
        ["select * from CUSTOMERS"],
        td.UserPasswordCredentials("admin", td.EnvironmentSecret("DB_PASWORD"))
    ),
    tables=["customers"]
)
def customers_publisher(customers: td.TableFrame) -> td.TableFrame:
    return customers
```

### Subscribing, transforming and publishing data within Tabsdata

```
@td.transformer(
    input_tables=["persons"],
    output_tables=["spanish"]
)
def tfr(persons: td.TableFrame):
    return persons.filter(td.col("nationality").eq("spanish")).select(
        ["identifier", "name", "surname", "language"]
    )
```

### Subscribing to data in an S3 Bucket

```
@td.subscriber(
    "spanish",
    td.S3Destination(
        "s3://my_bucket/spanish.parquet",
        td.S3AccessKeyCredentials(
            td.EnvironmentSecret("AWS_ACCESS_KEY_ID"),
            td.EnvironmentSecret("AWS_SECRET_KEY")
        )
    ),
)
def sub(spanish: td.TableFrame):
    return spanish
```

### Executing the Publisher

To publish data to Tabsdata run the following command:

```
$ td fn trigger --coll examples --name pub
```

Every time the `pub` publisher is executed, the `tfr` transformer and the `sub` subscriber will also be
executed.
