Metadata-Version: 2.4
Name: tabsdata
Version: 1.6.0
Summary: Tabsdata is a publish-subscribe (pub/sub) server for tables.
Home-page: https://tabsdata.com
Author: Tabs Data Inc.
License: Tabsdata License
Project-URL: Source, https://github.com/tabsdata/tabsdata
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.40.73
Requires-Dist: boto3-stubs[glue]==1.40.73
Requires-Dist: click==8.3.0
Requires-Dist: cloudpickle==3.1.2
Requires-Dist: colorama==0.4.6
Requires-Dist: connectorx==0.4.4
Requires-Dist: croniter==6.0.0
Requires-Dist: fastavro==1.12.1
Requires-Dist: fastparquet==2024.11.0
Requires-Dist: filelock==3.20.3
Requires-Dist: grpcio-tools==1.76.0
Requires-Dist: humanize==4.14.0
Requires-Dist: hvac==2.4.0
Requires-Dist: ijson==3.4.0
Requires-Dist: importlib-metadata==8.7.0
Requires-Dist: isodate==0.7.2
Requires-Dist: jsonschema==4.26.0
Requires-Dist: numpy==2.3.4
Requires-Dist: packaging==25.0
Requires-Dist: pandas==2.2.3
Requires-Dist: pillow==12.0.0
Requires-Dist: pip-tools==7.5.2
Requires-Dist: platformdirs==4.5.0
Requires-Dist: polars==1.35.2
Requires-Dist: protobuf==6.33.4
Requires-Dist: pycountries==1.2.1
Requires-Dist: pyyaml==6.0.3
Requires-Dist: pyarrow==22.0.0
Requires-Dist: py-cpuinfo==9.0.0
Requires-Dist: pydantic==2.12.4
Requires-Dist: pyiceberg[glue]==0.10.0
Requires-Dist: pywin32==308; platform_system == "Windows"
Requires-Dist: requests==2.32.5
Requires-Dist: rich<14.0.0
Requires-Dist: rich-click==1.9.4
Requires-Dist: ruamel-yaml==0.18.16
Requires-Dist: sqlalchemy==2.0.44
Requires-Dist: starlette==0.49.3
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.9.9
Requires-Dist: tabsdata-bigquery==1.6.0
Requires-Dist: tabsdata-databricks==1.6.0
Requires-Dist: tabsdata-kafka==1.6.0
Requires-Dist: tabsdata-mongodb==1.6.0
Requires-Dist: tabsdata-mssql==1.6.0
Requires-Dist: tabsdata-salesforce==1.6.0
Requires-Dist: tabsdata-snowflake==1.6.0
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.40.73; extra == "test"
Requires-Dist: boto3-stubs[glue]==1.40.73; extra == "test"
Requires-Dist: click==8.3.0; extra == "test"
Requires-Dist: cloudpickle==3.1.2; extra == "test"
Requires-Dist: colorama==0.4.6; extra == "test"
Requires-Dist: connectorx==0.4.4; extra == "test"
Requires-Dist: croniter==6.0.0; extra == "test"
Requires-Dist: fastavro==1.12.1; extra == "test"
Requires-Dist: fastparquet==2024.11.0; extra == "test"
Requires-Dist: filelock==3.20.3; extra == "test"
Requires-Dist: grpcio-tools==1.76.0; extra == "test"
Requires-Dist: humanize==4.14.0; extra == "test"
Requires-Dist: hvac==2.4.0; extra == "test"
Requires-Dist: ijson==3.4.0; extra == "test"
Requires-Dist: importlib-metadata==8.7.0; extra == "test"
Requires-Dist: isodate==0.7.2; extra == "test"
Requires-Dist: jsonschema==4.26.0; extra == "test"
Requires-Dist: numpy==2.3.4; extra == "test"
Requires-Dist: packaging==25.0; extra == "test"
Requires-Dist: pandas==2.2.3; extra == "test"
Requires-Dist: pillow==12.0.0; extra == "test"
Requires-Dist: pip-tools==7.5.2; extra == "test"
Requires-Dist: platformdirs==4.5.0; extra == "test"
Requires-Dist: polars==1.35.2; extra == "test"
Requires-Dist: protobuf==6.33.4; extra == "test"
Requires-Dist: pycountries==1.2.1; extra == "test"
Requires-Dist: pyyaml==6.0.3; extra == "test"
Requires-Dist: pyarrow==22.0.0; extra == "test"
Requires-Dist: py-cpuinfo==9.0.0; extra == "test"
Requires-Dist: pydantic==2.12.4; extra == "test"
Requires-Dist: pyiceberg[glue]==0.10.0; extra == "test"
Requires-Dist: pywin32==308; platform_system == "Windows" and extra == "test"
Requires-Dist: requests==2.32.5; extra == "test"
Requires-Dist: rich<14.0.0; extra == "test"
Requires-Dist: rich-click==1.9.4; extra == "test"
Requires-Dist: ruamel-yaml==0.18.16; extra == "test"
Requires-Dist: sqlalchemy==2.0.44; extra == "test"
Requires-Dist: starlette==0.49.3; 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.9.9; extra == "test"
Requires-Dist: tabsdata-bigquery==1.6.0; extra == "test"
Requires-Dist: tabsdata-databricks==1.6.0; extra == "test"
Requires-Dist: tabsdata-kafka==1.6.0; extra == "test"
Requires-Dist: tabsdata-mongodb==1.6.0; extra == "test"
Requires-Dist: tabsdata-mssql==1.6.0; extra == "test"
Requires-Dist: tabsdata-salesforce==1.6.0; extra == "test"
Requires-Dist: tabsdata-snowflake==1.6.0; extra == "test"
Requires-Dist: google-cloud-bigquery==3.38.0; extra == "test"
Requires-Dist: databricks-sdk==0.73.0; extra == "test"
Requires-Dist: databricks-sql-connector==4.2.0; extra == "test"
Requires-Dist: confluent-kafka[avro,json,protobuf,schemaregistry]==2.13.0; extra == "test"
Requires-Dist: pymongo==4.15.4; extra == "test"
Requires-Dist: pyodbc==5.3.0; extra == "test"
Requires-Dist: simple-salesforce==1.12.9; extra == "test"
Requires-Dist: opentelemetry-api==1.38.0; extra == "test"
Requires-Dist: opentelemetry-sdk==1.38.0; extra == "test"
Requires-Dist: snowflake-connector-python==4.0.0; extra == "test"
Requires-Dist: mysql-connector-python==9.5.0; extra == "test"
Requires-Dist: oracledb==3.4.1; extra == "test"
Requires-Dist: psycopg2-binary==2.9.11; extra == "test"
Requires-Dist: ansi2html==1.9.2; extra == "test"
Requires-Dist: azure-storage-blob==12.27.1; extra == "test"
Requires-Dist: black==25.11.0; extra == "test"
Requires-Dist: boto3==1.40.73; extra == "test"
Requires-Dist: build; extra == "test"
Requires-Dist: colorlog==6.10.1; extra == "test"
Requires-Dist: cookiecutter==2.6.0; extra == "test"
Requires-Dist: csvkit==2.1.0; extra == "test"
Requires-Dist: devpi-client==7.2.0; extra == "test"
Requires-Dist: devpi-server==6.17.0; extra == "test"
Requires-Dist: devpi-web==5.0.1; extra == "test"
Requires-Dist: docker==7.1.0; extra == "test"
Requires-Dist: fastapi==0.121.2; extra == "test"
Requires-Dist: flake8==7.3.0; extra == "test"
Requires-Dist: gitpython==3.1.45; extra == "test"
Requires-Dist: gita==0.16.8.1; extra == "test"
Requires-Dist: google-cloud-storage==3.5.0; extra == "test"
Requires-Dist: gtts; extra == "test"
Requires-Dist: isort==7.0.0; 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.7; extra == "test"
Requires-Dist: maturin==1.10.1; extra == "test"
Requires-Dist: mimesis==18.0.0; extra == "test"
Requires-Dist: mkdocs==1.6.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.9.0; extra == "test"
Requires-Dist: pip-tools==7.5.2; extra == "test"
Requires-Dist: pip-upgrader==1.4.15; extra == "test"
Requires-Dist: pipdeptree==2.30.0; extra == "test"
Requires-Dist: prompt-toolkit==3.0.52; extra == "test"
Requires-Dist: psutil==7.1.3; extra == "test"
Requires-Dist: pydevd_pycharm; extra == "test"
Requires-Dist: pygame; extra == "test"
Requires-Dist: pysentry-rs==0.3.14; extra == "test"
Requires-Dist: pytest-check==2.6.0; extra == "test"
Requires-Dist: pytest-cov==7.0.0; extra == "test"
Requires-Dist: pytest-env==1.2.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.1; extra == "test"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "test"
Requires-Dist: questionary==2.1.1; extra == "test"
Requires-Dist: setuptools==78.1.1; extra == "test"
Requires-Dist: supervisor==4.2.5; extra == "test"
Requires-Dist: tabulate==0.9.0; extra == "test"
Requires-Dist: tomlkit==0.13.3; extra == "test"
Requires-Dist: tqdm==4.67.1; extra == "test"
Requires-Dist: twine==6.2.0; extra == "test"
Requires-Dist: uvicorn==0.38.0; extra == "test"
Requires-Dist: virtualenv==20.36.1; extra == "test"
Requires-Dist: wheel; extra == "test"
Requires-Dist: wheel-inspect; extra == "test"
Requires-Dist: tabsdata-bigquery[deps]==1.6.0; extra == "test"
Requires-Dist: tabsdata-databricks[deps]==1.6.0; extra == "test"
Requires-Dist: tabsdata-kafka[deps]==1.6.0; extra == "test"
Requires-Dist: tabsdata-mongodb[deps]==1.6.0; extra == "test"
Requires-Dist: tabsdata-mssql[deps]==1.6.0; extra == "test"
Requires-Dist: tabsdata-salesforce[deps]==1.6.0; extra == "test"
Requires-Dist: tabsdata-snowflake[deps]==1.6.0; extra == "test"
Provides-Extra: bigquery
Requires-Dist: tabsdata_bigquery[deps]==1.6.0; extra == "bigquery"
Provides-Extra: databricks
Requires-Dist: tabsdata_databricks[deps]==1.6.0; extra == "databricks"
Provides-Extra: kafka
Requires-Dist: tabsdata_kafka[deps]==1.6.0; extra == "kafka"
Provides-Extra: mongodb
Requires-Dist: tabsdata_mongodb[deps]==1.6.0; extra == "mongodb"
Provides-Extra: mssql
Requires-Dist: tabsdata_mssql[deps]==1.6.0; extra == "mssql"
Provides-Extra: salesforce
Requires-Dist: tabsdata_salesforce[deps]==1.6.0; extra == "salesforce"
Provides-Extra: snowflake
Requires-Dist: tabsdata_snowflake[deps]==1.6.0; extra == "snowflake"
Provides-Extra: all
Requires-Dist: tabsdata_bigquery[deps]==1.6.0; extra == "all"
Requires-Dist: tabsdata_databricks[deps]==1.6.0; extra == "all"
Requires-Dist: tabsdata_kafka[deps]==1.6.0; extra == "all"
Requires-Dist: tabsdata_mongodb[deps]==1.6.0; extra == "all"
Requires-Dist: tabsdata_mssql[deps]==1.6.0; extra == "all"
Requires-Dist: tabsdata_salesforce[deps]==1.6.0; extra == "all"
Requires-Dist: tabsdata_snowflake[deps]==1.6.0; extra == "all"
Dynamic: author
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: project-url
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

<!--
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.6.0/guide/intro.html">User Guide</a> |
    <a href="https://docs.tabsdata.com/1.6.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.6.0) Documentation

* [User Guide](https://docs.tabsdata.com/1.6.0/guide/intro.html)
* [API Reference](https://docs.tabsdata.com/1.6.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.
