Skip to content

v0.41 - add SVG image generation#1772

Open
jacalata wants to merge 188 commits into
masterfrom
development
Open

v0.41 - add SVG image generation#1772
jacalata wants to merge 188 commits into
masterfrom
development

Conversation

@jacalata

@jacalata jacalata commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

Changes

  • allow users to download sheet images as SVG as well as by PNG
  • recognize 409 errors and treat them as success, because the job the user wants to create is already created

vitorhonna and others added 30 commits May 15, 2025 16:07
Fix typo in update_datasource_data.py
PersonalAccessTokenAuth repr was malformed. Fixing it to be
more representative and show the actual class name used
in cases where the client user decides to subclass.
Also correct the type hints to clarify that it accepts any
Iterable.
chore: refactor XML payload into RequestFactory
…#1638)

Update multiple connections in a single workbook - Takes multiple connection, authType and credentials as input
Update multiple connections in a single datasource - Takes multiple connection, authType and credentials as input

---------

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
…nections

Minor fixes on update connections
* feat: enable toggling attribute capture for a site

According to https://help.tableau.com/current/api/embedding_api/en-us/docs/embedding_api_user_attributes.html#:~:text=For%20security%20purposes%2C%20user%20attributes,a%20site%20admin%20(on%20Tableau
setting this site setting to `true` is required to enable use of
user attributes with Tableau Server and embedding workflows.

* chore: fix mypy error

---------

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
Closes #1620

Sorting the fields prior to putting them in the query string
assures that '_all_' and '_default_' appear first in the field
list, satisfying the criteria of Tableau Server/Cloud to process
those first. Order of other fields appeared to be irrelevant, so
the test simply ensures their presence.

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
* feat: support OIDC endpoints

Add support for remaining OIDC endpoints, including getting an
OIDC configuration by ID, removing the configuration, creating,
and updating configurations.

* feat: add str and repr to oidc item

---------

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
* feat: SiteAuthConfiguration str and repr

Gives SiteAuthConfiguration methods for str and repr calls
to ensure consistent display of the object.

* style: black

---------

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
Co-authored-by: Jac <jacalata@users.noreply.github.com>
Closes #1626

VirtualConnections leverages the ConnectionItem object to parse
the database connections server response. Most of other endpoints
return "userName" and the VirtualConnections' "Get Database Connections"
endpoint returns "username." Resolves the issue by allowing the
ConnectionItem to read either. Update the test assets to reflect the
actual returned value.

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
According to the .xsd schema file, the tags:batchCreate and
tags:batchDelete need a "contentType" attribute on the "content"
elements. This PR adds the missing attribute and checks in the test that
the string is carried through in the request body.

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
jacalata and others added 11 commits February 3, 2026 11:39
enumerating subpackages doesn't (shouldn't) actually do anything, so we shouldn't do it.
* Revert "refer to single package entrypoint (#1739)"

This reverts commit 043efa1.

* fix: make pyproject.toml more explicity in what is included

* chore: remove commented out config

---------

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
* fix: black ci errors

* chore: pytestify ssl_config

---------

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
…1740)

* Initial plan

* Fix assertion syntax in test_populate_data_quality_warning

Co-authored-by: jacalata <2009720+jacalata@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jacalata <2009720+jacalata@users.noreply.github.com>
Co-authored-by: Jac <jacalata@users.noreply.github.com>
Co-authored-by: jacalata <2009720+jacalata@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* feat: add SVG format support for view and custom view images

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
vchavatapalli and others added 18 commits May 10, 2026 01:36
Update license information in pyproject.toml
- Fixes license specifiers according to https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license-and-license-files
- This allows automatic license inspection tools like pip-licenses to correctly categorize this package.
* Remove deprecated cgi module usage and clean up dead code

Agent-Logs-Url: https://github.com/tableau/server-client-python/sessions/453f920c-7857-4503-ad99-0ccef076d792

Co-authored-by: jacalata <2009720+jacalata@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jacalata <2009720+jacalata@users.noreply.github.com>
Co-authored-by: Brian Cantoni <bcantoni@salesforce.com>
* chore: replace Union with modern syntax

* chore: modernize Optional type hints

* fix: bump required versions

* fix: typing on update_connections methods

* docs: make docstrings match function signature

* fix: clarify max_age can be None

* fix: docstring indent

* style: black

---------

Co-authored-by: Jordan Woods <13803242+jorwoods@users.noreply.github.com>
* chore(deps-dev): bump black from 24.10 to 26.3.1

Bumps [black](https://github.com/psf/black) from 24.10 to 26.3.1.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](psf/black@24.10.0...26.3.1)

---
updated-dependencies:
- dependency-name: black
  dependency-version: 26.3.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* style: apply black 26.3.1 formatting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jac Fitzgerald <jac.fitzgerald@salesforce.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds -n auto to pytest addopts so the test suite uses all available CPU
cores. Reduces local and CI run time from ~6 min to ~2 min.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: quote tag labels containing spaces or commas in XML request

The server's TagUtil.parseTags splits unquoted labels on spaces and
commas, causing tags like "Yearly Sales" to be stored as two separate
tags. Wrapping labels in double quotes prevents the split; the server
strips the quotes before storing.

Fixes #1738

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: quote tag labels containing spaces or commas; add e2e test suite

The Tableau server splits unquoted tag labels on spaces and commas
(via TagUtil.parseTags), so "Yearly Sales" becomes two tags "Yearly"
and "Sales". Wrapping labels in double quotes prevents the split; the
server strips the quotes before storing.

Also adds the first e2e test infrastructure to the repo:
- test_e2e/ directory with a session-scoped server fixture reading
  credentials from env vars (TABLEAU_SERVER, TABLEAU_SITE,
  TABLEAU_TOKEN, TABLEAU_TOKEN_NAME, TABLEAU_PROJECT)
- test_e2e/test_tagging.py validates the tag quoting fix against a
  real Tableau server
- contributing.md documents how to run unit and e2e tests

Fixes #1738

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: encode special characters in tag delete URL path

Fixes #675 #994

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: don't default authSetting to ServerDefault in bulk user add

ServerDefault is wrong for Tableau Cloud. Match the single-user add/update
behaviour and only send authSetting when explicitly set.

Fixes #1777

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: update test to match corrected bulk add authSetting behaviour

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…1781)

* fix: improve timeout error messages and document TSC_CHUNK_SIZE_MB

When a 504 occurs during an async chunked upload, the error message now
hints at reducing TSC_CHUNK_SIZE_MB rather than suggesting async mode
(which the user is already using). Also document the env var in the
publish docstrings for workbooks and datasources.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* style: apply black formatting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test: add tests for async publish 504 timeout error message

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…nd flows (#1785)

Fixes #1090

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes #1571

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…1788)

* fix: use return instead of raise StopIteration in QuerySet.__iter__

Per PEP 479, StopIteration raised inside a generator is converted to
RuntimeError. QuerySet.__iter__ is a generator and was raising
StopIteration to handle 400006 (invalid page number) errors, causing
RuntimeError for callers iterating endpoints that don't support
pagination past the last page.

Fixes #1786

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test: remove bare baseurl statements outside requests_mock context

server.workbooks.baseurl accessed outside a requests_mock context causes
DNS resolution of http://test on Linux, failing with a ConnectionError.
These statements were no-ops — baseurl is pure string formatting.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
feat: document email filter for users endpoint

Fixes #1562

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes #1597

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: include description in workbook publish and update requests

The REST API has supported workbook description since v3.20 (2023.2).
Fixes #899

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: correct version gate and test style for workbook description update

- Restore version threshold to 3.21 (matching Tableau REST API docs)
- Restore parent_srv is None guard to exclude description (original behavior)
- Update tests to reflect 3.21 boundary
- Use re.search on multipart body for publish test, matching existing pattern
- Fix stale sample comment

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
fix: replace no_extract with DeprecationWarning, document include_extract

no_extract was silently accepted but never documented as removed. Now
raises DeprecationWarning and maps to include_extract=False so existing
callers get a clear migration path rather than a silent no-op.

Fixes #1541

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes #1083

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…1795)

* feat: add vizWidth/vizHeight to PDFRequestOptions

Fixes #1102

- PDFRequestOptions already inherited viz_width/viz_height from
  _ImagePDFCommonExportOptions (shared with ImageRequestOptions), which
  serialises them as vizWidth/vizHeight query params
- Added version guard in views.populate_pdf: raises UnsupportedAttributeError
  when viz_height or viz_width are used below API 3.26
- Added tests for the new version guard, the happy path (API 3.26+), unit-
  level query-param serialisation, and the existing XOR validation
- Removed stray bare literal '44' from test_request_option.py

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: remove incorrect version gate on vizWidth/vizHeight for PDF export

The REST API docs claimed vizHeight/vizWidth required API 3.26 and were
Cloud-only, but server-side code shows these params have been accepted
unconditionally since at least 2021.4 with no platform distinction.
Remove the 3.26 guard; the endpoint's own minimum version is sufficient.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants