Metadata-Version: 2.2
Name: tabsdata
Version: 0.9.3
Summary: Tabsdata is a publish-subscribe (pub/sub) server for tables.
Author: Tabs Data Inc.
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: variant\assets\manifest\LICENSE
Requires-Dist: tabsdata_salesforce==0.9.3
Requires-Dist: accessify==0.3.1
Requires-Dist: base32hex==1.0.2
Requires-Dist: click==8.1.8
Requires-Dist: cloudpickle==3.1.1
Requires-Dist: connectorx==0.4.2
Requires-Dist: filelock==3.17.0
Requires-Dist: humanize==4.12.1
Requires-Dist: hvac==2.3.0
Requires-Dist: importlib_metadata==8.6.1
Requires-Dist: numpy==2.2.3
Requires-Dist: packaging==24.2
Requires-Dist: pandas==2.2.3
Requires-Dist: pillow==11.1.0
Requires-Dist: pip-tools==7.4.1
Requires-Dist: platformdirs==4.3.6
Requires-Dist: polars==1.23.0
Requires-Dist: PyYAML==6.0.2
Requires-Dist: pyarrow==19.0.1
Requires-Dist: pyiceberg==0.8.1
Requires-Dist: pywin32==308; platform_system == "Windows"
Requires-Dist: requests==2.32.3
Requires-Dist: rich==13.9.4
Requires-Dist: rich-click==1.8.6
Requires-Dist: sqlalchemy==2.0.38
Requires-Dist: typing_extensions==4.12.2
Requires-Dist: uuid-v7==1.0.0
Requires-Dist: uv==0.6.3
Provides-Extra: salesforce
Requires-Dist: tabsdata_salesforce[deps]==0.9.3; extra == "salesforce"
Provides-Extra: test
Requires-Dist: tabsdata_salesforce==0.9.3; extra == "test"
Requires-Dist: accessify==0.3.1; extra == "test"
Requires-Dist: base32hex==1.0.2; extra == "test"
Requires-Dist: click==8.1.8; extra == "test"
Requires-Dist: cloudpickle==3.1.1; extra == "test"
Requires-Dist: connectorx==0.4.2; extra == "test"
Requires-Dist: filelock==3.17.0; extra == "test"
Requires-Dist: humanize==4.12.1; extra == "test"
Requires-Dist: hvac==2.3.0; extra == "test"
Requires-Dist: importlib_metadata==8.6.1; extra == "test"
Requires-Dist: numpy==2.2.3; extra == "test"
Requires-Dist: packaging==24.2; extra == "test"
Requires-Dist: pandas==2.2.3; extra == "test"
Requires-Dist: pillow==11.1.0; extra == "test"
Requires-Dist: pip-tools==7.4.1; extra == "test"
Requires-Dist: platformdirs==4.3.6; extra == "test"
Requires-Dist: polars==1.23.0; extra == "test"
Requires-Dist: PyYAML==6.0.2; extra == "test"
Requires-Dist: pyarrow==19.0.1; extra == "test"
Requires-Dist: pyiceberg==0.8.1; extra == "test"
Requires-Dist: pywin32==308; platform_system == "Windows" and extra == "test"
Requires-Dist: requests==2.32.3; extra == "test"
Requires-Dist: rich==13.9.4; extra == "test"
Requires-Dist: rich-click==1.8.6; extra == "test"
Requires-Dist: sqlalchemy==2.0.38; extra == "test"
Requires-Dist: typing_extensions==4.12.2; extra == "test"
Requires-Dist: uuid-v7==1.0.0; extra == "test"
Requires-Dist: uv==0.6.3; extra == "test"
Requires-Dist: simple-salesforce==1.12.6; extra == "test"
Requires-Dist: azure-storage-blob==12.24.1; extra == "test"
Requires-Dist: black==25.1.0; extra == "test"
Requires-Dist: boto3==1.37.2; extra == "test"
Requires-Dist: build; extra == "test"
Requires-Dist: colorlog==6.9.0; extra == "test"
Requires-Dist: csvkit==2.0.1; extra == "test"
Requires-Dist: cx_Oracle==8.3.0; extra == "test"
Requires-Dist: docker==7.1.0; extra == "test"
Requires-Dist: fastapi==0.115.11; extra == "test"
Requires-Dist: flake8==7.1.2; extra == "test"
Requires-Dist: GitPython==3.1.44; extra == "test"
Requires-Dist: isort==6.0.1; extra == "test"
Requires-Dist: liccheck==0.9.2; extra == "test"
Requires-Dist: licensecheck==2024.3; extra == "test"
Requires-Dist: matplotlib==3.10.0; extra == "test"
Requires-Dist: mkdocs==1.6.1; extra == "test"
Requires-Dist: mimesis==18.0.0; extra == "test"
Requires-Dist: mysql-connector-python==9.2.0; extra == "test"
Requires-Dist: oracledb==2.5.1; extra == "test"
Requires-Dist: pdoc==15.0.1; extra == "test"
Requires-Dist: pipdeptree==2.25.0; extra == "test"
Requires-Dist: pip-tools==7.4.1; extra == "test"
Requires-Dist: psutil==5.9.0; extra == "test"
Requires-Dist: psycopg2-binary==2.9.10; extra == "test"
Requires-Dist: pytest==8.3.4; extra == "test"
Requires-Dist: pytest-check==2.5.0; extra == "test"
Requires-Dist: pytest-cov==6.0.0; extra == "test"
Requires-Dist: pytest-xdist==3.6.1; extra == "test"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "test"
Requires-Dist: setuptools; extra == "test"
Requires-Dist: tabulate==0.9.0; extra == "test"
Requires-Dist: uvicorn==0.34.0; extra == "test"
Requires-Dist: wheel; extra == "test"
Requires-Dist: tabsdata_salesforce[deps]==0.9.3; extra == "test"
Dynamic: author
Dynamic: description
Dynamic: description-content-type
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/0.9.3/guide/intro.html">User Guide</a> |
    <a href="https://docs.tabsdata.com/0.9.3/api_ref/index.html">API Reference</a>
</div>

# 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)
* OSX (Apple silicon/x86 - latest)
* Ubuntu, Debian & RedHat - (x86/ARM - latest)

```
pip install tabsdata
```

## This version (0.9.3) Documentation

* [User Guide](https://docs.tabsdata.com/0.9.3/guide/intro.html)
* [API Reference](https://docs.tabsdata.com/0.9.3/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 --collection examples --name pub
```

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