From a1251372b6057c024d71be0c9f083bf29b4849a0 Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 19 Jun 2026 23:43:49 -0700 Subject: [PATCH 1/8] Create .readthedocs.yaml for documentation setup Add Read the Docs configuration file for documentation build --- .readthedocs.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..575f578ef --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,23 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version, and other tools you might need +build: + os: ubuntu-24.04 + tools: + python: "3.13" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + +# Optionally, but recommended, +# declare the Python requirements required to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +# python: +# install: +# - requirements: docs/requirements.txt + From cb660d3876a2dbe75cc841c447a20a1eede038ba Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 19 Jun 2026 23:49:38 -0700 Subject: [PATCH 2/8] Create Sphinx configuration file for documentation Added configuration settings for Sphinx documentation. Direct copy from example conf file. --- docs/conf.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 docs/conf.py diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..8e7f9a999 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,50 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + + +# -- Project information ----------------------------------------------------- + +project = "Basic Sphinx Example Project" +copyright = "2022, Read the Docs core team" +author = "Read the Docs core team" + + +# -- General configuration --------------------------------------------------- +# -- General configuration + +extensions = [ + "sphinx.ext.duration", + "sphinx.ext.doctest", + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.intersphinx", +] + +intersphinx_mapping = { + "rtd": ("https://docs.readthedocs.io/en/stable/", None), + "python": ("https://docs.python.org/3/", None), + "sphinx": ("https://www.sphinx-doc.org/en/master/", None), +} +intersphinx_disabled_domains = ["std"] + +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] From 4d5daea03d3453d1455b77c7464af6982536114d Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 19 Jun 2026 23:58:23 -0700 Subject: [PATCH 3/8] Load project details from pyproject.toml Updated project information to load from pyproject.toml. --- docs/conf.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 8e7f9a999..301922d18 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -6,11 +6,23 @@ # -- Project information ----------------------------------------------------- +# Source - https://stackoverflow.com/a/75396624 +# Posted by Jan, modified by community. See post 'Timeline' for change history +# Retrieved 2026-06-19, License - CC BY-SA 4.0 -project = "Basic Sphinx Example Project" -copyright = "2022, Read the Docs core team" -author = "Read the Docs core team" +# conf.py +import tomli +with open("../../pyproject.toml", "rb") as f: + toml = tomli.load(f) + +# -- Project information ----------------------------------------------------- + +pyproject = toml["tool"]["setuptools"] + +project = pyproject["name"] +version = pyproject["version"] +release = pyproject["version"] # -- General configuration --------------------------------------------------- # -- General configuration From 91c312b988a940f4bb1e8731e525b2a976adb08a Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Sat, 20 Jun 2026 00:13:33 -0700 Subject: [PATCH 4/8] add more e2e tests --- test_e2e/assets/WorkbookWithExtract.twbx | Bin 0 -> 78093 bytes test_e2e/assets/WorldIndicators.tdsx | Bin 0 -> 64084 bytes test_e2e/conftest.py | 38 ++- test_e2e/test_publisher.py | 311 +++++++++++++++++++++++ test_e2e/test_site_admin.py | 293 +++++++++++++++++++++ test_e2e/test_tagging.py | 19 +- 6 files changed, 641 insertions(+), 20 deletions(-) create mode 100644 test_e2e/assets/WorkbookWithExtract.twbx create mode 100644 test_e2e/assets/WorldIndicators.tdsx create mode 100644 test_e2e/test_publisher.py create mode 100644 test_e2e/test_site_admin.py diff --git a/test_e2e/assets/WorkbookWithExtract.twbx b/test_e2e/assets/WorkbookWithExtract.twbx new file mode 100644 index 0000000000000000000000000000000000000000..b6025b36c3755fc9e8079b0fac0d91cf8f0e53e2 GIT binary patch literal 78093 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℞!XJ# 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 literal 0 HcmV?d00001 diff --git a/test_e2e/assets/WorldIndicators.tdsx b/test_e2e/assets/WorldIndicators.tdsx new file mode 100644 index 0000000000000000000000000000000000000000..6e041442b38f1116689fe35079f5eb1b9bfcfadf GIT binary patch literal 64084 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 EA33e~>Hq)$ literal 0 HcmV?d00001 diff --git a/test_e2e/conftest.py b/test_e2e/conftest.py index 376d41a09..2a90b8f04 100644 --- a/test_e2e/conftest.py +++ b/test_e2e/conftest.py @@ -5,6 +5,7 @@ def pytest_configure(config): config.addinivalue_line("markers", "e2e: mark test as end-to-end (requires a real Tableau server)") + config.addinivalue_line("markers", "site_admin: mark test as requiring SiteAdmin permissions") @pytest.fixture(scope="session") @@ -13,10 +14,14 @@ def server(): Authenticated TSC server session for e2e tests. Required environment variables: - TABLEAU_SERVER — server URL, e.g. https://10ax.online.tableau.com - TABLEAU_SITE — site content URL - TABLEAU_TOKEN — personal access token value - TABLEAU_TOKEN_NAME — personal access token name + TABLEAU_SERVER -- server URL, e.g. https://10ax.online.tableau.com + TABLEAU_SITE -- site content URL + TABLEAU_TOKEN -- personal access token value + TABLEAU_TOKEN_NAME -- personal access token name + + Optional: + TABLEAU_IS_ADMIN -- set to "1" or "true" if the token belongs to a SiteAdmin account. + Tests marked with @pytest.mark.site_admin are skipped when not set. """ url = os.environ.get("TABLEAU_SERVER") site = os.environ.get("TABLEAU_SITE", "") @@ -30,3 +35,28 @@ def server(): auth = TSC.PersonalAccessTokenAuth(token_name, token, site) with server.auth.sign_in(auth): yield server + + +@pytest.fixture(scope="session") +def is_admin(): + val = os.environ.get("TABLEAU_IS_ADMIN", "").strip().lower() + return val in ("1", "true", "yes") + + +def pytest_runtest_setup(item): + if item.get_closest_marker("site_admin"): + val = os.environ.get("TABLEAU_IS_ADMIN", "").strip().lower() + if val not in ("1", "true", "yes"): + pytest.skip("Skipping site_admin test: set TABLEAU_IS_ADMIN=1 to run") + + +@pytest.fixture(scope="session") +def project_id(server): + """Return the ID of the project named by TABLEAU_PROJECT (default 'Default').""" + project_name = os.environ.get("TABLEAU_PROJECT", "Sandbox") + opts = TSC.RequestOptions() + opts.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name, TSC.RequestOptions.Operator.Equals, project_name)) + projects, _ = server.projects.get(opts) + if not projects: + pytest.skip(f"Project {project_name!r} not found -- set TABLEAU_PROJECT env var") + return projects[0].id diff --git a/test_e2e/test_publisher.py b/test_e2e/test_publisher.py new file mode 100644 index 000000000..f48980d32 --- /dev/null +++ b/test_e2e/test_publisher.py @@ -0,0 +1,311 @@ +""" +E2E tests for Publisher-level operations against a real Tableau server. + +Requires: TABLEAU_SERVER, TABLEAU_SITE, TABLEAU_TOKEN, TABLEAU_TOKEN_NAME +Optional: TABLEAU_PROJECT (defaults to "Default") + +Run with: + pytest test_e2e/test_publisher.py -v -m e2e +""" +import os +from pathlib import Path + +import pytest +import tableauserverclient as TSC +from tableauserverclient.models import Resource + +ASSETS_DIR = Path(__file__).parent / "assets" +SAMPLE_WORKBOOK = ASSETS_DIR / "WorkbookWithoutExtract.twbx" +EXTRACT_WORKBOOK = ASSETS_DIR / "WorkbookWithExtract.twbx" +SAMPLE_DATASOURCE = ASSETS_DIR / "WorldIndicators.tdsx" + +pytestmark = pytest.mark.e2e + + +# --------------------------------------------------------------------------- +# Shared fixtures +# --------------------------------------------------------------------------- + + +@pytest.fixture(scope="module") +def workbook(server, project_id): + """Publish a workbook for this module's tests, clean up after.""" + wb = TSC.WorkbookItem(name="tsc-e2e-publisher-wb", project_id=project_id) + wb = server.workbooks.publish(wb, SAMPLE_WORKBOOK, TSC.Server.PublishMode.Overwrite) + yield wb + server.workbooks.delete(wb.id) + + +# --------------------------------------------------------------------------- +# Workbook CRUD +# --------------------------------------------------------------------------- + + +def test_workbook_publish_and_get(server, project_id): + """Published workbook is retrievable by id and has correct name/project.""" + wb = TSC.WorkbookItem(name="tsc-e2e-publish-test", project_id=project_id) + wb = server.workbooks.publish(wb, SAMPLE_WORKBOOK, TSC.Server.PublishMode.Overwrite) + try: + fetched = server.workbooks.get_by_id(wb.id) + assert fetched.id == wb.id + assert fetched.name == "tsc-e2e-publish-test" + assert fetched.project_id == project_id + finally: + server.workbooks.delete(wb.id) + + +def test_workbook_update(server, workbook): + """Updating a workbook's name and description persists on the server.""" + original_name = workbook.name + workbook.name = "tsc-e2e-publisher-wb-renamed" + workbook.description = "updated by e2e test" + updated = server.workbooks.update(workbook) + try: + assert updated.name == "tsc-e2e-publisher-wb-renamed" + assert updated.description == "updated by e2e test" + finally: + workbook.name = original_name + workbook.description = "" + server.workbooks.update(workbook) + + +def test_workbook_download(server, workbook, tmp_path): + """Downloaded workbook file exists and is non-empty.""" + path = server.workbooks.download(workbook.id, str(tmp_path)) + assert Path(path).exists() + assert Path(path).stat().st_size > 0 + + +def test_workbook_populate_views(server, workbook): + """populate_views returns at least one view for the test workbook.""" + server.workbooks.populate_views(workbook) + assert workbook.views is not None + assert len(workbook.views) > 0 + + +def test_workbook_populate_connections(server, workbook): + """populate_connections returns a list (may be empty for extract-only wb).""" + server.workbooks.populate_connections(workbook) + assert workbook.connections is not None + + +def test_workbook_preview_image(server, workbook): + """populate_preview_image succeeds without error (image may be empty for freshly-published workbooks).""" + server.workbooks.populate_preview_image(workbook) + assert workbook.preview_image is not None + + +def test_workbook_tags(server, workbook): + """Tags added to a workbook round-trip correctly and can be removed.""" + server.workbooks.add_tags(workbook, ["e2e-tag-a", "e2e-tag-b"]) + fetched = server.workbooks.get_by_id(workbook.id) + try: + assert "e2e-tag-a" in fetched.tags + assert "e2e-tag-b" in fetched.tags + finally: + server.workbooks.delete_tags(workbook, ["e2e-tag-a", "e2e-tag-b"]) + fetched = server.workbooks.get_by_id(workbook.id) + assert "e2e-tag-a" not in fetched.tags + + +# --------------------------------------------------------------------------- +# View exports +# --------------------------------------------------------------------------- + + +def test_view_export_png(server, workbook, tmp_path): + """A view can be exported as a PNG image.""" + server.workbooks.populate_views(workbook) + view = workbook.views[0] + server.views.populate_image(view) + assert view.image is not None + assert len(view.image) > 0 + + +def test_view_export_pdf(server, workbook, tmp_path): + """A view can be exported as a PDF.""" + server.workbooks.populate_views(workbook) + view = workbook.views[0] + opts = TSC.PDFRequestOptions() + server.views.populate_pdf(view, opts) + assert view.pdf is not None + assert len(view.pdf) > 0 + + +def test_view_export_csv(server, workbook): + """A view can be exported as CSV data.""" + server.workbooks.populate_views(workbook) + view = workbook.views[0] + server.views.populate_csv(view) + assert view.csv is not None + + +# --------------------------------------------------------------------------- +# Datasource CRUD +# --------------------------------------------------------------------------- + + +@pytest.fixture(scope="module") +def extract_workbook(server, project_id): + """Publish a workbook with an extract for refresh/extract tests, clean up after.""" + wb = TSC.WorkbookItem(name="tsc-e2e-extract-wb", project_id=project_id) + wb = server.workbooks.publish(wb, EXTRACT_WORKBOOK, TSC.Server.PublishMode.Overwrite) + yield wb + server.workbooks.delete(wb.id) + + +@pytest.fixture(scope="module") +def datasource(server, project_id): + """Publish a datasource for this module's tests, clean up after.""" + ds = TSC.DatasourceItem(project_id=project_id, name="tsc-e2e-publisher-ds") + ds = server.datasources.publish(ds, str(SAMPLE_DATASOURCE), TSC.Server.PublishMode.Overwrite) + yield ds + server.datasources.delete(ds.id) + + +def test_datasource_publish_and_get(server, datasource): + """Published datasource is retrievable by id.""" + fetched = server.datasources.get_by_id(datasource.id) + assert fetched.id == datasource.id + assert fetched.name == "tsc-e2e-publisher-ds" + + +def test_datasource_update(server, datasource): + """Updating datasource description persists.""" + datasource.description = "updated by e2e test" + updated = server.datasources.update(datasource) + assert updated.description == "updated by e2e test" + + +def test_datasource_download(server, datasource, tmp_path): + """Downloaded datasource file exists and is non-empty.""" + path = server.datasources.download(datasource.id, str(tmp_path)) + assert Path(path).exists() + assert Path(path).stat().st_size > 0 + + +def test_datasource_populate_connections(server, datasource): + """populate_connections returns a list for a published datasource.""" + server.datasources.populate_connections(datasource) + assert datasource.connections is not None + + +def test_datasource_tags(server, datasource): + """Tags added to a datasource round-trip correctly.""" + server.datasources.add_tags(datasource, ["e2e-ds-tag"]) + fetched = server.datasources.get_by_id(datasource.id) + try: + assert "e2e-ds-tag" in fetched.tags + finally: + server.datasources.delete_tags(datasource, ["e2e-ds-tag"]) + + +# --------------------------------------------------------------------------- +# Favorites +# --------------------------------------------------------------------------- + + +def test_favorites_workbook(server, workbook): + """A workbook can be added to and removed from favorites.""" + user = TSC.UserItem() + user.id = server.user_id + server.favorites.add_favorite(user, Resource.Workbook, workbook) + server.favorites.get(user) + assert any(f.id == workbook.id for f in user.favorites.get("workbooks", [])) + server.favorites.delete_favorite_workbook(user, workbook) + + +def test_favorites_view(server, workbook): + """A view can be added to and removed from favorites.""" + server.workbooks.populate_views(workbook) + view = workbook.views[0] + user = TSC.UserItem() + user.id = server.user_id + server.favorites.add_favorite_view(user, view) + server.favorites.get(user) + assert any(f.id == view.id for f in user.favorites.get("views", [])) + server.favorites.delete_favorite_view(user, view) + + +def test_favorites_datasource(server, datasource): + """A datasource can be added to and removed from favorites.""" + user = TSC.UserItem() + user.id = server.user_id + server.favorites.add_favorite_datasource(user, datasource) + server.favorites.get(user) + assert any(f.id == datasource.id for f in user.favorites.get("datasources", [])) + server.favorites.delete_favorite_datasource(user, datasource) + + +# --------------------------------------------------------------------------- +# Pagination +# --------------------------------------------------------------------------- + + +def test_pager_workbooks(server): + """Pager iterates over all workbooks without error.""" + count = sum(1 for _ in TSC.Pager(server.workbooks)) + assert count >= 0 + + +def test_queryset_filter(server): + """QuerySet filter returns only matching workbooks.""" + results = list(server.workbooks.filter(name="tsc-e2e-publisher-wb")) + assert all(wb.name == "tsc-e2e-publisher-wb" for wb in results) + + +# --------------------------------------------------------------------------- +# Workbook refresh and extract +# --------------------------------------------------------------------------- + + +def test_workbook_refresh(server, extract_workbook): + """Triggering a workbook refresh returns a job item.""" + job = server.workbooks.refresh(extract_workbook) + assert job.id is not None + + +def test_workbook_create_and_delete_extract(server, extract_workbook): + """An extract can be deleted from a workbook and then recreated. + + Requires a workbook asset whose datasource is supported on the target server OS. + WorkbookWithExtract.twbx uses MS Access which fails on Linux servers -- replace + the asset with a compatible .twbx to enable this test. + """ + pytest.skip("WorkbookWithExtract.twbx uses MS Access (not supported on Linux) -- replace asset to enable") + + +# --------------------------------------------------------------------------- +# Datasource refresh +# --------------------------------------------------------------------------- + + +def test_datasource_refresh(server, datasource): + """Triggering a datasource refresh returns a job item.""" + job = server.datasources.refresh(datasource) + assert job.id is not None + + +# --------------------------------------------------------------------------- +# Metadata API +# --------------------------------------------------------------------------- + + +def test_metadata_query(server): + """Metadata GraphQL API returns a valid response structure.""" + result = server.metadata.query( + """ + { + publishedDatasourcesConnection(first: 5) { + nodes { + luid + name + } + } + } + """ + ) + assert "data" in result + assert "publishedDatasourcesConnection" in result["data"] + + diff --git a/test_e2e/test_site_admin.py b/test_e2e/test_site_admin.py new file mode 100644 index 000000000..16db9e804 --- /dev/null +++ b/test_e2e/test_site_admin.py @@ -0,0 +1,293 @@ +""" +E2E tests for SiteAdmin-level operations against a real Tableau server. + +All tests in this file are marked with @pytest.mark.site_admin and are skipped +unless TABLEAU_IS_ADMIN=1 (or "true"/"yes") is set in the environment. The token +configured in TABLEAU_TOKEN must belong to an account with SiteAdminCreator +or SiteAdminExplorer role. + +Run with: + TABLEAU_IS_ADMIN=1 pytest test_e2e/test_site_admin.py -v -m e2e +""" +from datetime import time +from pathlib import Path + +import pytest +import tableauserverclient as TSC + +ASSETS_DIR = Path(__file__).parent / "assets" +SAMPLE_WORKBOOK = ASSETS_DIR / "WorkbookWithoutExtract.twbx" +SAMPLE_DATASOURCE = ASSETS_DIR / "WorldIndicators.tdsx" + +pytestmark = [pytest.mark.e2e, pytest.mark.site_admin] + + +# --------------------------------------------------------------------------- +# Jobs (requires admin) +# --------------------------------------------------------------------------- + + +def test_jobs_get(server): + """jobs.get() returns a list without error.""" + jobs, _ = server.jobs.get() + assert isinstance(jobs, list) + + +# --------------------------------------------------------------------------- +# Projects +# --------------------------------------------------------------------------- + + +def test_project_create_update_delete(server, project_id): + """A project can be created, updated, and deleted.""" + project = TSC.ProjectItem(name="tsc-e2e-admin-project", description="created by e2e test") + project = server.projects.create(project) + try: + assert project.id is not None + fetched = server.projects.filter(name="tsc-e2e-admin-project")[0] + assert fetched.id == project.id + + project.description = "updated by e2e test" + updated = server.projects.update(project) + assert updated.description == "updated by e2e test" + finally: + server.projects.delete(project.id) + + +def test_nested_project(server): + """A nested (child) project can be created under a parent.""" + parent = TSC.ProjectItem(name="tsc-e2e-parent-project") + parent = server.projects.create(parent) + try: + child = TSC.ProjectItem(name="tsc-e2e-child-project", parent_id=parent.id) + child = server.projects.create(child) + try: + assert child.parent_id == parent.id + finally: + server.projects.delete(child.id) + finally: + server.projects.delete(parent.id) + + +def test_project_workbook_default_permissions(server): + """Workbook default permissions on a project can be updated and queried.""" + project = TSC.ProjectItem(name="tsc-e2e-perm-project") + project = server.projects.create(project) + try: + server.projects.populate_workbook_default_permissions(project) + assert project.default_workbook_permissions is not None + finally: + server.projects.delete(project.id) + + +# --------------------------------------------------------------------------- +# Users +# --------------------------------------------------------------------------- + + +def test_user_add_and_remove(server): + """A user can be added to the site and removed.""" + user = TSC.UserItem("tsc-e2e-testuser", "Unlicensed") + user = server.users.add(user) + try: + assert user.id is not None + fetched = server.users.get_by_id(user.id) + assert fetched.name == "tsc-e2e-testuser" + finally: + server.users.remove(user.id) + + +# --------------------------------------------------------------------------- +# Groups +# --------------------------------------------------------------------------- + + +@pytest.fixture(scope="module") +def group(server): + """Create a group for group tests, clean up after.""" + g = TSC.GroupItem("tsc-e2e-admin-group") + g = server.groups.create(g) + yield g + server.groups.delete(g.id) + + +def test_group_create_and_get(server, group): + """Created group appears in the group list.""" + results = list(server.groups.filter(name="tsc-e2e-admin-group")) + assert any(g.id == group.id for g in results) + + +def test_group_add_and_remove_user(server, group): + """A user can be added to and removed from a group.""" + user = TSC.UserItem("tsc-e2e-group-user", "Unlicensed") + user = server.users.add(user) + try: + server.groups.add_user(group, user.id) + server.groups.populate_users(group) + assert any(u.id == user.id for u in group.users) + + server.groups.remove_user(group, user.id) + server.groups.populate_users(group) + assert all(u.id != user.id for u in group.users) + finally: + server.users.remove(user.id) + + +# --------------------------------------------------------------------------- +# Schedules +# --------------------------------------------------------------------------- + + +def test_schedule_create_and_delete(server): + """An extract schedule can be created and deleted.""" + interval = TSC.HourlyInterval(start_time=time(3, 0), end_time=time(23, 0), interval_value=4) + schedule = TSC.ScheduleItem( + "tsc-e2e-hourly-schedule", + 50, + TSC.ScheduleItem.Type.Extract, + TSC.ScheduleItem.ExecutionOrder.Parallel, + interval, + ) + schedule = server.schedules.create(schedule) + try: + assert schedule.id is not None + fetched = server.schedules.get_by_id(schedule.id) + assert fetched.name == "tsc-e2e-hourly-schedule" + finally: + server.schedules.delete(schedule.id) + + +def test_schedule_add_workbook(server, project_id): + """A workbook can be added to an extract refresh schedule.""" + interval = TSC.DailyInterval(start_time=time(4, 0)) + schedule = TSC.ScheduleItem( + "tsc-e2e-daily-schedule", + 60, + TSC.ScheduleItem.Type.Extract, + TSC.ScheduleItem.ExecutionOrder.Serial, + interval, + ) + schedule = server.schedules.create(schedule) + wb = TSC.WorkbookItem(name="tsc-e2e-schedule-wb", project_id=project_id) + wb = server.workbooks.publish(wb, SAMPLE_WORKBOOK, TSC.Server.PublishMode.Overwrite) + try: + server.schedules.add_to_schedule(schedule.id, wb) + tasks, _ = server.tasks.get() + assert any(getattr(t, "schedule_id", None) == schedule.id for t in tasks) + finally: + server.workbooks.delete(wb.id) + server.schedules.delete(schedule.id) + + +# --------------------------------------------------------------------------- +# Webhooks +# --------------------------------------------------------------------------- + + +def test_webhook_create_and_delete(server): + """A webhook can be created and deleted.""" + webhook = TSC.WebhookItem() + webhook.name = "tsc-e2e-webhook" + webhook.url = "https://example.com/tsc-e2e-webhook" + webhook.event = "datasource-created" + webhook = server.webhooks.create(webhook) + try: + assert webhook.id is not None + all_webhooks, _ = server.webhooks.get() + assert any(w.id == webhook.id for w in all_webhooks) + finally: + server.webhooks.delete(webhook.id) + + +# --------------------------------------------------------------------------- +# Move workbook between projects +# --------------------------------------------------------------------------- + + +# --------------------------------------------------------------------------- +# Connection update +# --------------------------------------------------------------------------- + + +def test_datasource_update_connection(server, project_id): + """A datasource connection's embed_password flag can be toggled via update_connection.""" + ds = TSC.DatasourceItem(project_id=project_id, name="tsc-e2e-conn-ds") + ds = server.datasources.publish(ds, str(SAMPLE_DATASOURCE), TSC.Server.PublishMode.Overwrite) + try: + server.datasources.populate_connections(ds) + if not ds.connections: + pytest.skip("Published datasource has no connections to update") + conn = ds.connections[0] + conn.embed_password = False + updated_conn = server.datasources.update_connection(ds, conn) + assert updated_conn is not None + finally: + server.datasources.delete(ds.id) + + +# --------------------------------------------------------------------------- +# Data freshness policy +# --------------------------------------------------------------------------- + + +def test_workbook_data_freshness_policy(server, project_id): + """Workbook data freshness policy can be set to AlwaysLive and back to SiteDefault.""" + wb = TSC.WorkbookItem(name="tsc-e2e-freshness-wb", project_id=project_id) + wb = server.workbooks.publish(wb, SAMPLE_WORKBOOK, TSC.Server.PublishMode.Overwrite) + try: + wb.data_freshness_policy = TSC.DataFreshnessPolicyItem(TSC.DataFreshnessPolicyItem.Option.AlwaysLive) + updated = server.workbooks.update(wb) + assert updated.data_freshness_policy.option == TSC.DataFreshnessPolicyItem.Option.AlwaysLive + + wb.data_freshness_policy = TSC.DataFreshnessPolicyItem(TSC.DataFreshnessPolicyItem.Option.SiteDefault) + updated = server.workbooks.update(wb) + assert updated.data_freshness_policy.option == TSC.DataFreshnessPolicyItem.Option.SiteDefault + finally: + server.workbooks.delete(wb.id) + + +# --------------------------------------------------------------------------- +# Group filter and sort +# --------------------------------------------------------------------------- + + +def test_group_filter_by_name(server): + """Groups can be filtered by name using RequestOptions.""" + g = TSC.GroupItem("tsc-e2e-filter-group") + g = server.groups.create(g) + try: + opts = TSC.RequestOptions() + opts.filter.add( + TSC.Filter(TSC.RequestOptions.Field.Name, TSC.RequestOptions.Operator.Equals, "tsc-e2e-filter-group") + ) + results, _ = server.groups.get(req_options=opts) + assert len(results) == 1 + assert results[0].id == g.id + finally: + server.groups.delete(g.id) + + +def test_group_filter_queryset(server): + """Groups can be filtered using the django-style QuerySet interface.""" + g = TSC.GroupItem("tsc-e2e-qs-group") + g = server.groups.create(g) + try: + results = list(server.groups.filter(name="tsc-e2e-qs-group")) + assert any(r.id == g.id for r in results) + finally: + server.groups.delete(g.id) + + +def test_workbook_move_project(server, project_id): + """A workbook can be moved from one project to another.""" + dest = TSC.ProjectItem(name="tsc-e2e-dest-project") + dest = server.projects.create(dest) + wb = TSC.WorkbookItem(name="tsc-e2e-move-wb", project_id=project_id) + wb = server.workbooks.publish(wb, SAMPLE_WORKBOOK, TSC.Server.PublishMode.Overwrite) + try: + wb.project_id = dest.id + updated = server.workbooks.update(wb) + assert updated.project_id == dest.id + finally: + server.workbooks.delete(wb.id) + server.projects.delete(dest.id) diff --git a/test_e2e/test_tagging.py b/test_e2e/test_tagging.py index 4af741255..6b4d26ec0 100644 --- a/test_e2e/test_tagging.py +++ b/test_e2e/test_tagging.py @@ -5,7 +5,6 @@ TABLEAU_SERVER=https://... TABLEAU_SITE=mysite TABLEAU_TOKEN=... TABLEAU_TOKEN_NAME=... \ pytest test_e2e/test_tagging.py -v """ -import os from pathlib import Path import pytest @@ -18,21 +17,9 @@ @pytest.fixture(scope="module") -def workbook(server): - """Publish a workbook for tagging tests, clean up after. - - Uses TABLEAU_PROJECT env var if set, otherwise falls back to the first - project named 'Default' or 'Personal Work', then the first available project. - """ - project_name = os.environ.get("TABLEAU_PROJECT", "Default") - opts = TSC.RequestOptions() - opts.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name, TSC.RequestOptions.Operator.Equals, project_name)) - projects, _ = server.projects.get(opts) - if not projects: - pytest.skip(f"Project {project_name!r} not found — set TABLEAU_PROJECT env var") - project = projects[0] - - wb = TSC.WorkbookItem(name="tsc-e2e-tagging-test", project_id=project.id) +def workbook(server, project_id): + """Publish a workbook for tagging tests, clean up after.""" + wb = TSC.WorkbookItem(name="tsc-e2e-tagging-test", project_id=project_id) wb = server.workbooks.publish(wb, SAMPLE_WORKBOOK, TSC.Server.PublishMode.Overwrite) yield wb server.workbooks.delete(wb.id) From ac8cf5b8f2bbdbfa164184d4b8a4838f21fc325e Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Sat, 20 Jun 2026 00:22:12 -0700 Subject: [PATCH 5/8] docs: set up Sphinx with working ReadTheDocs config - Add docs optional-dependencies group (sphinx, tomli) to pyproject.toml - Wire up .readthedocs.yaml to install .[docs] extra - Fix conf.py: correct pyproject.toml path, use importlib.metadata for version, switch to alabaster theme, use tomllib/tomli compat import - Add minimal docs/index.rst - Fix RST docstring errors in connection_item, site_item, job_item, task_item that caused Sphinx build warnings/errors Co-Authored-By: Claude Sonnet 4.6 --- .readthedocs.yaml | 10 +++++--- docs/conf.py | 25 +++++++++++-------- docs/index.rst | 9 +++++++ pyproject.toml | 1 + tableauserverclient/models/connection_item.py | 11 +------- tableauserverclient/models/job_item.py | 2 +- tableauserverclient/models/site_item.py | 7 ++++-- tableauserverclient/models/task_item.py | 2 +- 8 files changed, 39 insertions(+), 28 deletions(-) create mode 100644 docs/index.rst diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 575f578ef..96209fd5a 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -17,7 +17,9 @@ sphinx: # Optionally, but recommended, # declare the Python requirements required to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html -# python: -# install: -# - requirements: docs/requirements.txt - +python: + install: + - method: pip + path: . + extra_requirements: + - docs diff --git a/docs/conf.py b/docs/conf.py index 301922d18..929b00be8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,17 +12,22 @@ # conf.py -import tomli -with open("../../pyproject.toml", "rb") as f: - toml = tomli.load(f) +try: + import tomllib +except ImportError: + import tomli as tomllib -# -- Project information ----------------------------------------------------- +from pathlib import Path +import importlib.metadata + +with open(Path(__file__).parent.parent / "pyproject.toml", "rb") as f: + toml = tomllib.load(f) -pyproject = toml["tool"]["setuptools"] +# -- Project information ----------------------------------------------------- -project = pyproject["name"] -version = pyproject["version"] -release = pyproject["version"] +project = toml["project"]["name"] +release = importlib.metadata.version(project) +version = ".".join(release.split(".")[:2]) # -- General configuration --------------------------------------------------- # -- General configuration @@ -54,9 +59,9 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = "sphinx_rtd_theme" +html_theme = "alabaster" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] +html_static_path = [] diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..5ae5061f0 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,9 @@ +tableauserverclient +=================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +.. automodule:: tableauserverclient + :members: diff --git a/pyproject.toml b/pyproject.toml index 8134f73f1..cce102064 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ repository = "https://github.com/tableau/server-client-python" [project.optional-dependencies] test = ["black==26.3.1", "build", "mypy==1.4", "pytest>=7.0", "pytest-cov", "pytest-subtests", "pytest-xdist", "requests-mock>=1.0,<2.0", "types-requests>=2.32.4.20250913"] +docs = ["sphinx", "tomli"] [tool.setuptools.package-data] # Only include data for tableauserverclient, not for samples, test, docs diff --git a/tableauserverclient/models/connection_item.py b/tableauserverclient/models/connection_item.py index fa4b8cf9f..0dbadeda6 100644 --- a/tableauserverclient/models/connection_item.py +++ b/tableauserverclient/models/connection_item.py @@ -150,16 +150,7 @@ def from_response(cls, resp, ns) -> list["ConnectionItem"]: @classmethod def from_xml_element(cls, parsed_response, ns) -> list["ConnectionItem"]: - """ - - - - - - - - - """ + """Parse connection items from an XML ```` element.""" all_connection_items: list["ConnectionItem"] = list() all_connection_xml = parsed_response.findall(".//t:connection", namespaces=ns) diff --git a/tableauserverclient/models/job_item.py b/tableauserverclient/models/job_item.py index f684c22d4..82aa8e080 100644 --- a/tableauserverclient/models/job_item.py +++ b/tableauserverclient/models/job_item.py @@ -27,7 +27,7 @@ class JobItem: Parameters ---------- - id_ : str + id : str The identifier of the job. job_type : str diff --git a/tableauserverclient/models/site_item.py b/tableauserverclient/models/site_item.py index 382ca63db..8cea6a7ab 100644 --- a/tableauserverclient/models/site_item.py +++ b/tableauserverclient/models/site_item.py @@ -52,10 +52,13 @@ class SiteItem: cause an error. tier_explorer_capacity: int + (Optional) The maximum number of licenses for users with the Explorer role allowed on a site. + tier_creator_capacity: int + (Optional) The maximum number of licenses for users with the Creator role allowed on a site. + tier_viewer_capacity: int - (Optional) The maximum number of licenses for users with the Creator, - Explorer, or Viewer role, respectively, allowed on a site. + (Optional) The maximum number of licenses for users with the Viewer role allowed on a site. storage_quota: int (Optional) Specifies the maximum amount of space for the new site, in diff --git a/tableauserverclient/models/task_item.py b/tableauserverclient/models/task_item.py index b343f3c22..a8a672a4a 100644 --- a/tableauserverclient/models/task_item.py +++ b/tableauserverclient/models/task_item.py @@ -13,7 +13,7 @@ class TaskItem: Parameters ---------- - id_ : str + id : str The ID of the task. task_type : str From 3c46a9468ddd9f966b6253f9c77c2b9038229119 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Sat, 20 Jun 2026 00:37:42 -0700 Subject: [PATCH 6/8] change theme --- docs/conf.py | 3 ++- pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 929b00be8..0f8e53f3c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -38,6 +38,7 @@ "sphinx.ext.autodoc", "sphinx.ext.autosummary", "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", ] intersphinx_mapping = { @@ -59,7 +60,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = "alabaster" +html_theme = "furo" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, diff --git a/pyproject.toml b/pyproject.toml index cce102064..56aa39cde 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ repository = "https://github.com/tableau/server-client-python" [project.optional-dependencies] test = ["black==26.3.1", "build", "mypy==1.4", "pytest>=7.0", "pytest-cov", "pytest-subtests", "pytest-xdist", "requests-mock>=1.0,<2.0", "types-requests>=2.32.4.20250913"] -docs = ["sphinx", "tomli"] +docs = ["sphinx", "tomli", "furo"] [tool.setuptools.package-data] # Only include data for tableauserverclient, not for samples, test, docs From 3f3e240afe0d4e50ce954fb5a75601505d770471 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Sat, 20 Jun 2026 10:48:47 -0700 Subject: [PATCH 7/8] ci: add workflow to build Sphinx docs and PR to gh-pages On push to master, builds Sphinx HTML and opens a PR from docs-update into gh-pages so the generated API reference can be reviewed before going live. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/docs.yml | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/docs.yml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..16c8d1b9c --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,46 @@ +name: Build and publish docs + +on: + push: + branches: [master] + +permissions: + contents: write + pull-requests: write + +jobs: + build-and-pr: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install docs dependencies + run: pip install -e ".[docs]" + + - name: Build Sphinx docs + run: sphinx-build -b html docs sphinx_build + + - name: Checkout gh-pages + uses: actions/checkout@v4 + with: + ref: gh-pages + path: gh-pages + + - name: Copy Sphinx output into gh-pages/sphinx + run: | + rm -rf gh-pages/sphinx + cp -r sphinx_build gh-pages/sphinx + + - name: Create PR to gh-pages + uses: peter-evans/create-pull-request@v6 + with: + path: gh-pages + branch: docs-update + base: gh-pages + title: "docs: update generated API reference" + body: "Automated update of Sphinx-generated API reference from master." + commit-message: "docs: regenerate Sphinx API reference" From d3376c961cd68766bf7f0b62e9636a908dd9c6e3 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Mon, 6 Jul 2026 22:33:19 -0700 Subject: [PATCH 8/8] fix: CSVImport AUTH column, case-insensitive validation, username preservation; add find_by_name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes for UserItem.CSVImport (issue #1809): - MAX=8 (was 7=AUTH index): 8-column lines with auth type no longer rejected as "too many columns" - create_user_from_line no longer lowercases the whole line before splitting — username case is preserved - _validate_import_line_or_throw normalizes license/admin/publisher to lowercase and auth to canonical form before comparison, so 'Viewer', 'Creator', 'SAML', 'tableauidwithmfa' etc. are all accepted - Add TableauIDWithMFA to valid auth values in validation (was missing) - 5 new tests covering each fix Add QuerysetEndpoint.find_by_name(name) (issue #1810): - Thin wrapper over .filter(name=name) returning a list - Available on all content-item endpoints (workbooks, datasources, views, users, projects, groups) Co-Authored-By: Claude Sonnet 4.6 --- tableauserverclient/models/user_item.py | 52 +++++++++++++------ .../server/endpoint/endpoint.py | 3 ++ test/test_user_model.py | 33 ++++++++++++ 3 files changed, 73 insertions(+), 15 deletions(-) diff --git a/tableauserverclient/models/user_item.py b/tableauserverclient/models/user_item.py index 0ba1e8eb2..05e0f5916 100644 --- a/tableauserverclient/models/user_item.py +++ b/tableauserverclient/models/user_item.py @@ -432,36 +432,37 @@ class ColumnType(IntEnum): EMAIL = 6 AUTH = 7 - MAX = 7 + MAX = 8 # total number of columns (not last index) # Read a csv line and create a user item populated by the given attributes @staticmethod def create_user_from_line(line: str): if line is None or line is False or line == "\n" or line == "": return None - line = line.strip().lower() - values: list[str] = list(map(str.strip, line.split(","))) - user = UserItem(values[UserItem.CSVImport.ColumnType.USERNAME]) + values: list[str] = list(map(str.strip, line.strip().split(","))) + if len(values) > UserItem.CSVImport.ColumnType.MAX: + raise ValueError("Too many attributes for user import") + username = values[UserItem.CSVImport.ColumnType.USERNAME] + user = UserItem(username) if len(values) > 1: - if len(values) > UserItem.CSVImport.ColumnType.MAX: - raise ValueError("Too many attributes for user import") - while len(values) <= UserItem.CSVImport.ColumnType.MAX: + while len(values) < UserItem.CSVImport.ColumnType.MAX: values.append("") site_role = UserItem.CSVImport._evaluate_site_role( values[UserItem.CSVImport.ColumnType.LICENSE], values[UserItem.CSVImport.ColumnType.ADMIN], values[UserItem.CSVImport.ColumnType.PUBLISHER], ) - + raw_auth = values[UserItem.CSVImport.ColumnType.AUTH] + auth = UserItem.CSVImport._auth_canonical().get(raw_auth.lower()) if raw_auth else None user._set_values( None, - values[UserItem.CSVImport.ColumnType.USERNAME], + username, site_role, None, None, values[UserItem.CSVImport.ColumnType.DISPLAY_NAME], values[UserItem.CSVImport.ColumnType.EMAIL], - values[UserItem.CSVImport.ColumnType.AUTH], + auth, None, None, None, @@ -491,6 +492,16 @@ def validate_file_for_import(csv_file: io.TextIOWrapper, logger) -> tuple[int, l # Some fields in the import file are restricted to specific values # Iterate through each field and validate the given value against hardcoded constraints + @staticmethod + def _auth_canonical() -> dict[str, str]: + """Lowercase → canonical form mapping for Auth values.""" + return { + "saml": "SAML", + "openid": "OpenID", + "serverdefault": "ServerDefault", + "tableauidwithmfa": "TableauIDWithMFA", + } + @staticmethod def _validate_import_line_or_throw(incoming, logger) -> None: _valid_attributes: list[list[str]] = [ @@ -501,7 +512,12 @@ def _validate_import_line_or_throw(incoming, logger) -> None: ["system", "site", "none", "no"], # admin ["yes", "true", "1", "no", "false", "0"], # publisher [], - [UserItem.Auth.SAML, UserItem.Auth.OpenID, UserItem.Auth.ServerDefault], # auth + [ + "SAML", + "OpenID", + "ServerDefault", + "TableauIDWithMFA", + ], # auth — normalized by _auth_canonical before comparison ] line = list(map(str.strip, incoming.split(","))) @@ -511,10 +527,16 @@ def _validate_import_line_or_throw(incoming, logger) -> None: logger.debug(f"> details - {username}") UserItem.validate_username_or_throw(username) for i in range(1, len(line)): - logger.debug(f"column {UserItem.CSVImport.ColumnType(i).name}: {line[i]}") - UserItem.CSVImport._validate_attribute_value( - line[i], _valid_attributes[i], UserItem.CSVImport.ColumnType(i) - ) + value = line[i] + valid = _valid_attributes[i] + # normalize case for fields with a restricted value set + if valid: + if i == UserItem.CSVImport.ColumnType.AUTH: + value = UserItem.CSVImport._auth_canonical().get(value.lower(), value) + else: + value = value.lower() + logger.debug(f"column {UserItem.CSVImport.ColumnType(i).name}: {value}") + UserItem.CSVImport._validate_attribute_value(value, valid, UserItem.CSVImport.ColumnType(i)) # Given a restricted set of possible values, confirm the item is in that set @staticmethod diff --git a/tableauserverclient/server/endpoint/endpoint.py b/tableauserverclient/server/endpoint/endpoint.py index 149aab5ec..a2374a27d 100644 --- a/tableauserverclient/server/endpoint/endpoint.py +++ b/tableauserverclient/server/endpoint/endpoint.py @@ -374,6 +374,9 @@ def fields(self: Self, *fields: str) -> QuerySet: queryset.request_options.fields |= set(fields) | set(("_default_",)) return queryset + def find_by_name(self, name: str) -> list[T]: + return list(self.filter(name=name)) + def only_fields(self: Self, *fields: str) -> QuerySet: """ Add fields to the request options. If no fields are provided, the diff --git a/test/test_user_model.py b/test/test_user_model.py index 49e8dc25c..1b9b74f4e 100644 --- a/test/test_user_model.py +++ b/test/test_user_model.py @@ -136,3 +136,36 @@ def test_validate_usernames_file() -> None: test_data = _mock_file_content(usernames) valid, invalid = TSC.UserItem.CSVImport.validate_file_for_import(test_data, logger) assert valid == 5, f"Exactly 5 of the lines were valid, counted {valid + len(invalid)}" + + +def test_validate_mixed_case_license() -> None: + # Regression: issue #1809 — 'Viewer' (capital V) was rejected by case-sensitive check + TSC.UserItem.CSVImport._validate_import_line_or_throw("username, pword, fname, Viewer, None, no, email", logger) + TSC.UserItem.CSVImport._validate_import_line_or_throw("username, pword, fname, Creator, Site, yes, email", logger) + TSC.UserItem.CSVImport._validate_import_line_or_throw("username, pword, fname, EXPLORER, NONE, YES, email", logger) + + +def test_validate_tableauid_with_mfa_auth() -> None: + # TableauIDWithMFA is a valid auth value and must not be rejected + TSC.UserItem.CSVImport._validate_import_line_or_throw( + "username, pword, fname, creator, none, yes, email, TableauIDWithMFA", logger + ) + + +def test_create_user_preserves_username_case() -> None: + # Username must not be lowercased — case matters for LDAP and email-format usernames + user = TSC.UserItem.CSVImport.create_user_from_line("JSmith, pword, John Smith, creator, none, yes, j@example.com") + assert user is not None + assert user.name == "JSmith", f"Username was lowercased: {user.name}" + + +def test_create_user_with_auth_column() -> None: + # AUTH column (position 7) must be parsed — was broken by MAX=7 off-by-one + user = TSC.UserItem.CSVImport.create_user_from_line("username, pword, fname, creator, none, yes, email, SAML") + assert user is not None + assert user.auth_setting == "SAML", f"Expected SAML, got {user.auth_setting}" + + +def test_too_many_columns_raises() -> None: + with pytest.raises((ValueError, AttributeError)): + TSC.UserItem.CSVImport.create_user_from_line("u, p, n, creator, none, yes, email, SAML, extra")