Metadata-Version: 2.4
Name: tabsdata
Version: 1.4.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: base32hex==1.0.2
Requires-Dist: click==8.2.1
Requires-Dist: cloudpickle==3.1.1
Requires-Dist: colorama==0.4.6
Requires-Dist: connectorx==0.4.4
Requires-Dist: fastavro==1.12.0
Requires-Dist: fastparquet==2024.11.0
Requires-Dist: filelock==3.19.1
Requires-Dist: humanize==4.13.0
Requires-Dist: hvac==2.3.0
Requires-Dist: ijson==3.4.0
Requires-Dist: importlib_metadata==8.7.0
Requires-Dist: numpy==2.3.3
Requires-Dist: packaging==25.0
Requires-Dist: pandas==2.2.3
Requires-Dist: pillow==11.3.0
Requires-Dist: pip-tools==7.5.0
Requires-Dist: platformdirs==4.4.0
Requires-Dist: polars==1.33.1
Requires-Dist: PyYAML==6.0.2
Requires-Dist: ruamel.yaml==0.18.15
Requires-Dist: pyarrow==21.0.0
Requires-Dist: pydantic==2.11.10
Requires-Dist: pyiceberg[glue]==0.9.1
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.0
Requires-Dist: sqlalchemy==2.0.43
Requires-Dist: typing_extensions==4.15.0
Requires-Dist: uuid6==2025.0.1
Requires-Dist: uuid-v7==1.0.0
Requires-Dist: uv==0.8.17
Requires-Dist: tabsdata_databricks==1.4.0
Requires-Dist: tabsdata_mongodb==1.4.0
Requires-Dist: tabsdata_mssql==1.4.0
Requires-Dist: tabsdata_salesforce==1.4.0
Requires-Dist: tabsdata_snowflake==1.4.0
Provides-Extra: test
Requires-Dist: accessify==0.3.1; extra == "test"
Requires-Dist: base32hex==1.0.2; extra == "test"
Requires-Dist: click==8.2.1; extra == "test"
Requires-Dist: cloudpickle==3.1.1; extra == "test"
Requires-Dist: colorama==0.4.6; extra == "test"
Requires-Dist: connectorx==0.4.4; extra == "test"
Requires-Dist: fastavro==1.12.0; extra == "test"
Requires-Dist: fastparquet==2024.11.0; extra == "test"
Requires-Dist: filelock==3.19.1; extra == "test"
Requires-Dist: humanize==4.13.0; extra == "test"
Requires-Dist: hvac==2.3.0; extra == "test"
Requires-Dist: ijson==3.4.0; extra == "test"
Requires-Dist: importlib_metadata==8.7.0; extra == "test"
Requires-Dist: numpy==2.3.3; extra == "test"
Requires-Dist: packaging==25.0; extra == "test"
Requires-Dist: pandas==2.2.3; extra == "test"
Requires-Dist: pillow==11.3.0; extra == "test"
Requires-Dist: pip-tools==7.5.0; extra == "test"
Requires-Dist: platformdirs==4.4.0; extra == "test"
Requires-Dist: polars==1.33.1; extra == "test"
Requires-Dist: PyYAML==6.0.2; extra == "test"
Requires-Dist: ruamel.yaml==0.18.15; extra == "test"
Requires-Dist: pyarrow==21.0.0; extra == "test"
Requires-Dist: pydantic==2.11.10; extra == "test"
Requires-Dist: pyiceberg[glue]==0.9.1; 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.0; extra == "test"
Requires-Dist: sqlalchemy==2.0.43; extra == "test"
Requires-Dist: typing_extensions==4.15.0; extra == "test"
Requires-Dist: uuid6==2025.0.1; extra == "test"
Requires-Dist: uuid-v7==1.0.0; extra == "test"
Requires-Dist: uv==0.8.17; extra == "test"
Requires-Dist: tabsdata_databricks==1.4.0; extra == "test"
Requires-Dist: tabsdata_mongodb==1.4.0; extra == "test"
Requires-Dist: tabsdata_mssql==1.4.0; extra == "test"
Requires-Dist: tabsdata_salesforce==1.4.0; extra == "test"
Requires-Dist: tabsdata_snowflake==1.4.0; extra == "test"
Requires-Dist: databricks-sdk==0.65.0; extra == "test"
Requires-Dist: databricks-sql-connector==4.1.2; extra == "test"
Requires-Dist: pymongo==4.15.1; extra == "test"
Requires-Dist: pyodbc==5.2.0; extra == "test"
Requires-Dist: simple-salesforce==1.12.9; extra == "test"
Requires-Dist: opentelemetry-api==1.37.0; extra == "test"
Requires-Dist: opentelemetry-sdk==1.37.0; extra == "test"
Requires-Dist: snowflake-connector-python==3.17.3; extra == "test"
Requires-Dist: azure-storage-blob==12.26.0; extra == "test"
Requires-Dist: mysql-connector-python==9.4.0; extra == "test"
Requires-Dist: oracledb==3.3.0; extra == "test"
Requires-Dist: psycopg2-binary==2.9.10; extra == "test"
Requires-Dist: ansi2html==1.9.2; extra == "test"
Requires-Dist: black==25.1.0; extra == "test"
Requires-Dist: boto3==1.40.31; extra == "test"
Requires-Dist: build; extra == "test"
Requires-Dist: colorlog==6.9.0; 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.117.1; extra == "test"
Requires-Dist: flake8==7.3.0; extra == "test"
Requires-Dist: GitPython==3.1.45; extra == "test"
Requires-Dist: gita==0.16.7.3; extra == "test"
Requires-Dist: google-cloud-storage==3.4.0; extra == "test"
Requires-Dist: gTTS; extra == "test"
Requires-Dist: isort==6.0.1; extra == "test"
Requires-Dist: liccheck==0.9.2; extra == "test"
Requires-Dist: licensecheck==2025.1.0; extra == "test"
Requires-Dist: matplotlib==3.10.6; extra == "test"
Requires-Dist: maturin==1.9.4; 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==15.0.4; extra == "test"
Requires-Dist: pip-audit==2.9.0; extra == "test"
Requires-Dist: pip-tools==7.5.0; extra == "test"
Requires-Dist: pip-upgrader==1.4.15; extra == "test"
Requires-Dist: pipdeptree==2.28.0; extra == "test"
Requires-Dist: prompt_toolkit==3.0.52; extra == "test"
Requires-Dist: psutil==7.1.0; extra == "test"
Requires-Dist: pydevd; extra == "test"
Requires-Dist: pydevd_pycharm; extra == "test"
Requires-Dist: pygame; extra == "test"
Requires-Dist: pysentry-rs==0.3.11; extra == "test"
Requires-Dist: pytest-check==2.5.4; extra == "test"
Requires-Dist: pytest-cov==7.0.0; extra == "test"
Requires-Dist: pytest-reporter-html1==0.9.3; extra == "test"
Requires-Dist: pytest-timeout==2.4.0; extra == "test"
Requires-Dist: pytest-xdist==3.8.0; extra == "test"
Requires-Dist: pytest==8.4.2; extra == "test"
Requires-Dist: python-dateutil==2.9.0.post0; 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.37.0; extra == "test"
Requires-Dist: virtualenv==20.34.0; extra == "test"
Requires-Dist: wheel; extra == "test"
Requires-Dist: wheel-inspect; extra == "test"
Requires-Dist: tabsdata_databricks[deps]==1.4.0; extra == "test"
Requires-Dist: tabsdata_mongodb[deps]==1.4.0; extra == "test"
Requires-Dist: tabsdata_mssql[deps]==1.4.0; extra == "test"
Requires-Dist: tabsdata_salesforce[deps]==1.4.0; extra == "test"
Requires-Dist: tabsdata_snowflake[deps]==1.4.0; extra == "test"
Provides-Extra: mongodb
Requires-Dist: tabsdata_mongodb[deps]==1.4.0; extra == "mongodb"
Provides-Extra: salesforce
Requires-Dist: tabsdata_salesforce[deps]==1.4.0; extra == "salesforce"
Provides-Extra: snowflake
Requires-Dist: tabsdata_snowflake[deps]==1.4.0; extra == "snowflake"
Provides-Extra: mssql
Requires-Dist: tabsdata_mssql[deps]==1.4.0; extra == "mssql"
Provides-Extra: databricks
Requires-Dist: tabsdata_databricks[deps]==1.4.0; extra == "databricks"
Provides-Extra: all
Requires-Dist: tabsdata_databricks[deps]==1.4.0; extra == "all"
Requires-Dist: tabsdata_mongodb[deps]==1.4.0; extra == "all"
Requires-Dist: tabsdata_mssql[deps]==1.4.0; extra == "all"
Requires-Dist: tabsdata_salesforce[deps]==1.4.0; extra == "all"
Requires-Dist: tabsdata_snowflake[deps]==1.4.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.4.0/guide/intro.html">User Guide</a> |
    <a href="https://docs.tabsdata.com/1.4.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.4.0) Documentation

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