Description
Add a Tableau connector (BI / analytics) to semantica/ingest/.
Why: Lets Semantica see which datasets and fields the business actually consumes downstream, not just what exists upstream — closes the loop from source data to reporting semantics.
Scope
Pull workbook/datasource/field metadata via the Tableau REST API (tableauserverclient). Metadata only for phase 1, not full extract data.
Follow the existing connector pattern (see semantica/ingest/sap_ingestor.py, snowflake_ingestor.py, or salesforce_ingestor.py for reference):
semantica/ingest/tableau_ingestor.py — a *Data result dataclass, a *Connector (auth + client), and a *Ingestor exposing export_as_documents so output plugs directly into GraphBuilder.
- Register the three classes as lazy imports in
semantica/ingest/__init__.py (see the existing _LAZY_IMPORTS-style entries for SAP/Snowflake/Salesforce) — importing semantica.ingest must not import this connector's SDK eagerly.
docs/integrations/tableau.md — usage doc, following docs/integrations/salesforce.md / docs/integrations/snowflake.md as a template. Add it to docs/docs.json navigation.
tests/test_tableau_ingestor.py — unit tests with the client/SDK mocked, matching tests/test_sap_ingestor.py / tests/ingest/test_sap_ingestor.py.
- Any outbound HTTP call must go through
request_with_ssrf_guard (see semantica/ingest/sap_ingestor.py) if this connector talks to a user-supplied endpoint.
Keep core lightweight — optional dependency required
This connector's SDK must not be a core dependency. Add it to pyproject.toml under [project.optional-dependencies]:
ingest-tableau = ["tableauserverclient>=0.25"]
and raise a clear ImportError (with the pip install "semantica[ingest-tableau]" hint) if the connector is used without the extra installed — see how db-salesforce / ingest-sap do this today in semantica/ingest/__init__.py.
Acceptance Criteria
help wanted — open to any contributor. Comment here if you'd like to pick it up and a maintainer will assign it.
Description
Add a Tableau connector (BI / analytics) to
semantica/ingest/.Why: Lets Semantica see which datasets and fields the business actually consumes downstream, not just what exists upstream — closes the loop from source data to reporting semantics.
Scope
Pull workbook/datasource/field metadata via the Tableau REST API (
tableauserverclient). Metadata only for phase 1, not full extract data.Follow the existing connector pattern (see
semantica/ingest/sap_ingestor.py,snowflake_ingestor.py, orsalesforce_ingestor.pyfor reference):semantica/ingest/tableau_ingestor.py— a*Dataresult dataclass, a*Connector(auth + client), and a*Ingestorexposingexport_as_documentsso output plugs directly intoGraphBuilder.semantica/ingest/__init__.py(see the existing_LAZY_IMPORTS-style entries for SAP/Snowflake/Salesforce) — importingsemantica.ingestmust not import this connector's SDK eagerly.docs/integrations/tableau.md— usage doc, followingdocs/integrations/salesforce.md/docs/integrations/snowflake.mdas a template. Add it todocs/docs.jsonnavigation.tests/test_tableau_ingestor.py— unit tests with the client/SDK mocked, matchingtests/test_sap_ingestor.py/tests/ingest/test_sap_ingestor.py.request_with_ssrf_guard(seesemantica/ingest/sap_ingestor.py) if this connector talks to a user-supplied endpoint.Keep core lightweight — optional dependency required
This connector's SDK must not be a core dependency. Add it to
pyproject.tomlunder[project.optional-dependencies]:and raise a clear
ImportError(with thepip install "semantica[ingest-tableau]"hint) if the connector is used without the extra installed — see howdb-salesforce/ingest-sapdo this today insemantica/ingest/__init__.py.Acceptance Criteria
pip install semantica(core, no extras) still works and does not pull in tableauserverclientpip install "semantica[ingest-tableau]"installs the connector's dependency*Data/*Connector/*Ingestorshape andexport_as_documentsoutput contract used by existing connectorsdocs/docs.jsonhelp wanted — open to any contributor. Comment here if you'd like to pick it up and a maintainer will assign it.