Skip to content

Fix CONTRIBUTORS.md link in README - #1831

Open
ZayanKhan-12 wants to merge 204 commits into
tableau:masterfrom
ZayanKhan-12:fix/readme-contributors-link
Open

Fix CONTRIBUTORS.md link in README#1831
ZayanKhan-12 wants to merge 204 commits into
tableau:masterfrom
ZayanKhan-12:fix/readme-contributors-link

Conversation

@ZayanKhan-12

Copy link
Copy Markdown

The README says "A list of all our contributors to date is in [CONTRIBUTORS.md]." — a reference-style link with no matching definition anywhere in the file, so GitHub renders it as literal bracketed text rather than a link. This makes it an inline link to CONTRIBUTORS.md, which exists at the repository root.

Verification: pip install -e ".[test]" + python -m pytest test pass locally (866 passed, 1 skipped; Python 3.14, macOS arm64).

Prepared with AI assistance (Claude); the missing definition and the target file's existence were both verified.

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
…tableau#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 <[email protected]>
…ate-connections

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 <[email protected]>
Closes tableau#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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
Co-authored-by: Jac <[email protected]>
Closes tableau#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 <[email protected]>
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 <[email protected]>
jacalata and others added 28 commits June 19, 2026 15:40
* 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 tableau#1738

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* 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 tableau#1738

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* fix: encode special characters in tag delete URL path

Fixes tableau#675 tableau#994

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…leau#1779)

* 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 tableau#1777

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

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

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…ableau#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 <[email protected]>

* style: apply black formatting

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

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

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…ableau#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 tableau#1786

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* 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 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
feat: document email filter for users endpoint

Fixes tableau#1562

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
* feat: include description in workbook publish and update requests

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

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* 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 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…1793)

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 tableau#1541

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…ableau#1795)

* feat: add vizWidth/vizHeight to PDFRequestOptions

Fixes tableau#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 <[email protected]>

* 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 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
Fixes tableau#876 and tableau#959 by auto-detecting and use the server's current REST API version *after* signin. This gives cleaner error scenarios when something goes wrong connecting/signing in.
)

fix: use exclude instead of include in packages.find to fix broken wheel

The include=["tableauserverclient*"] glob caused setuptools to strip the
tableauserverclient/ prefix from all subpackages, producing a wheel where
top_level.txt listed bin/helpers/models/server instead of tableauserverclient.

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…ableau#1800)

* fix: use tmp_path fixture in test_download to avoid cwd pollution

* fix: use tmp_path fixture in all download tests to avoid cwd pollution
* Update several actions to the latest stable versions

Note: third-party action versions not updated in this PR

The simonw/actions-latest versions list only tracks actions/* org actions, so these three third-party actions were left untouched but should be revisited separately:

- pypa/gh-action-pypi-publish@release/v1 — pinned to the maintainer's documented floating branch ref (their README explicitly shows this usage). Latest concrete tag is v1.14.0. Per pypa's own "pro tip," pinning to an exact tag/SHA instead
  of the branch is more reproducible — worth considering.
- MishaKav/pytest-coverage-comment@main — currently tracks the main branch directly (not a version tag). Latest release is v1.10.0. Should pin to a tagged version instead of main to avoid unreviewed changes landing silently.
- archive/[email protected] — real version bump available to v3.1.0 (major version jump). Needs a changelog/breaking-change check before upgrading.

* Remove draft package test action I accidentally included here
…to development branch (tableau#1815)

Add dependabot to watch for Python and Actions updates, create PRs for development
…ableau#1819)

Bumps [archive/github-actions-slack](https://github.com/archive/github-actions-slack) from 2.8.0 to 3.1.0.
- [Release notes](https://github.com/archive/github-actions-slack/releases)
- [Commits](archive/github-actions-slack@v2.8.0...v3.1.0)

---
updated-dependencies:
- dependency-name: archive/github-actions-slack
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [black](https://github.com/psf/black) from 26.3.1 to 26.5.1.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](psf/black@26.3.1...26.5.1)

---
updated-dependencies:
- dependency-name: black
  dependency-version: 26.5.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: strengthen QuerysetEndpoint base class hierarchy

* Remove unused io_types_w after DownloadableMixin refactor

After the download logic was extracted into DownloadableMixin._download_content,
the module-level io_types_w tuples in datasources, flows, and workbooks endpoints
became dead code. Also removes the duplicate io_types_r / io_types_w definitions
in flows_endpoint and the unreferenced io_types alias in datasources_endpoint.
All 843 tests pass.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* Add DownloadableMixin to endpoint package __all__

The mixin was imported in __init__.py but omitted from __all__, making
the export implicit. Add it explicitly so the public surface matches the
import statement.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…ableau#1826)

* chore(deps-dev): bump mypy from 1.4 to 2.3.0

Bumps [mypy](https://github.com/python/mypy) from 1.4 to 2.3.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](python/mypy@v1.4.0...v2.3.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-version: 2.3.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

* fix: resolve mypy 2.3 errors in strings.py and test_datasource.py

- strings.py: cast tostring() return value to T since mypy 2.3 no longer
  accepts bytes as compatible with TypeVar T constrained to str|bytes
- test_datasource.py: add explicit `import unittest.mock` since mypy 2.3
  no longer resolves submodule attributes through the parent import

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* fix: correctly resolve mypy 2.3 TypeVar error in strings.py

The bytes overload was passing bytearray to _redact_any_type whose TypeVar T
is constrained to str|bytes. mypy 2.3 correctly rejects bytearray as Sequence[int].
Fix: pass bytes directly and cast the return value for both call sites.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…#1805)

* fix: prevent double-encoding of colons in date filter values

Fixes tableau#1025

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* fix: serialize boolean filter values as lowercase true/false

Tableau REST API requires boolean filter values to be lowercase
('true'/'false'), but Python's str(bool) produces 'True'/'False'.
Add explicit bool handling in Filter.__str__ alongside the existing
datetime fix, and expand test coverage to include bool, int, datetime
(format, timezone conversion, no-encoding), list edge cases, and the
invalid-operator-with-list guard.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* fix: reject naive datetimes and document Filter.__str__ format (tableau#1025)

Naive datetime objects passed to Filter now raise ValueError with a
clear message instead of silently converting using the local system
timezone, which would produce wrong UTC values on any non-UTC machine.
Also adds a docstring to Filter.__str__ documenting the serialization
rules for all supported value types.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…u#1804)

* feat: add get_by_path to projects endpoint

Fixes tableau#1317

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* test: expand get_by_path coverage and sharpen docstring

Add test cases for trailing slash, root-level disambiguation (API
returns same-named projects at different hierarchy levels), duplicate
siblings (first result is used), deep three-level paths, and names
containing spaces. Add three new XML fixture files to support these
scenarios. Improve the get_by_path docstring to document the
client-side root-level parentProjectId filter, the duplicate-name
tie-break, and the empty-component-stripping behavior.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

* docs: add CHANGELOG entry for Projects.get_by_path

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
…u#1830)

Adds `environment: pypi` to the publish-pypi job, wiring it to the
GitHub Environment configured with required reviewers. Without this,
any repo write holder could push a tag or invoke workflow_dispatch
and publish to production PyPI with no human checkpoint.

Co-authored-by: Claude Sonnet 4.6 <[email protected]>
[CONTRIBUTORS.md] has no matching link definition, so it renders as
literal bracketed text instead of a link. Make it an inline link to
the file, which exists at the repository root.

Co-Authored-By: Claude Fable 5 <[email protected]>
@jacalata

Copy link
Copy Markdown
Contributor

Please update this so it will merge just the file you changed, targeting the development branch.

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.