Skip to content

v0.42

Latest

Choose a tag to compare

@bcantoni bcantoni released this 15 Oct 21:20
· 2 commits to development since this release
Immutable release. Only release title and notes can be modified.
b7c5866

v0.42 Release Summary

New Features

  • Add Projects.get_by_path() for hierarchy-aware project lookup (PR #1804) — resolves a slash-separated path like "Marketing/Q1 Reports" to a ProjectItem (or None), walking the project tree level by level via the REST API name filter
  • Parse <statusNotes> into JobItem.status_notes (PR #1852) — exposes the structured per-row status notes (type/value/text) returned by the Query Job endpoint for jobs like UserImport, alongside the existing legacy notes list
  • Expose JobFailedException/JobCancelledException/FlowRun* exceptions at the top-level TSC namespace (PR #1870) — callers can now catch TSC.JobFailedException directly instead of reaching into the internal tableauserverclient.server.endpoint.exceptions module
  • Make Server thread-safe with per-thread sessions (PR #1871) — each thread now gets its own requests.Session, closing a gap where concurrent callers shared one session and its connection pool/cookies

Bug Fixes

  • Correct wheel packaging and add release safety checks (PR #1798) — fixes a broken wheel structure (subpackages duplicated as bare top-level entries) caused by an include-based setuptools config on newer setuptools; adds a packaging structure test to catch regressions
  • Correct Filter serialization for datetimes and booleans (PR #1805) — datetime filter values were serialized with a space instead of ISO-8601 T/Z, and booleans serialized as Python's True/False instead of lowercase true/false, both of which caused server 400 errors
  • Bump urllib3 floor to 2.6.3 for CVE-2026-21441 (PR #1869) — closes a gap where urllib3's streaming decompression safeguards could be bypassed when HTTP redirects were followed
  • Preserve POST body across 3xx redirects (PR #1848) — requests was converting POST to GET and dropping the body on 301/302/303 redirects, causing 405 errors on users.add, workbooks.publish, and other writes behind a redirect; TSC now walks the redirect chain manually and refuses HTTPS→HTTP downgrades
  • Fix CSVImport bugs: AUTH column, case-insensitive validation, username case (PR #1811) — fixes six bugs in UserItem.CSVImport, including an off-by-one that rejected valid 8-column lines and destructive lowercasing of usernames/display names/emails
  • Preserve case of customSubscriptionEmail and customSubscriptionFooter (PR #1851) — subscription footer text is shown verbatim in outgoing emails, so lowercasing it on serialization mangled company names and sentence casing
  • Resolve mypy 2.3 type errors (PR #1826) — unblocks the dependabot mypy upgrade by fixing a cast issue in helpers/strings.py and a missing import in a test
  • Normalize CRLF line endings to LF in six Python files (PR #1816) — cleans up ^M noise introduced accidentally by an earlier Black version bump
  • Fix three latent bugs in samples/explore_workbook.py (PR #1881) — fixes a bare type annotation that left a variable unbound, plus two other pre-existing sample bugs surfaced by a fresh-eyes review
  • Use tmp_path fixture in download tests to avoid cwd pollution (PR #1800) — download tests wrote to the current working directory, causing conflicts when run in parallel (-n auto); now use a worker-isolated temp directory

Other

  • Extract download streaming logic into DownloadableMixin (PR #1803) — de-duplicates three identical streaming blocks across Workbooks, Datasources, and Flows into a single shared helper
  • Extract CSVImport._decompose_site_role (PR #1812) — moves the inverse of _evaluate_site_role into CSVImport and fixes three pre-existing bugs found along the way
  • Add environment gate to production PyPI publish job (PR #1830) — requires a human reviewer checkpoint before any tag/release can trigger a production PyPI publish
  • Use stdlib typing for Concatenate/ParamSpec/overload; align Black target-version (PR #1839) — removes no-op typing_extensions indirection now that the minimum supported Python is 3.10, and aligns Black's target versions with the supported/CI matrix
  • Samples: credential helper, pagination fixes, and new jobs/subscriptions samples (PR #1843) — adds resolve_credentials() for env-var-based sign-in, fixes samples that used .get() where pagination was intended, and adds new background-jobs/subscriptions sample scripts
  • Samples: sample for reading connector-specific connection attrs (PR #1880) — adds samples/inspect_connection_details.py, demonstrating how to read connector-specific attributes (Oracle service, Snowflake schema, etc.) that aren't exposed via ConnectionItem
  • Docs: numpy-style docstrings on the Favorites endpoint (PR #1855), expanded RequestOptions.vf() wire-format rules (PR #1840), clarified username formats, ProjectLeader-as-group, and filter special-char behavior (PR #1854), one-line docstrings on root-level helper modules (PR #1859), expanded update_connection_auth sample header for Snowflake keypair auth (PR #1844) — documentation-only improvements, no behavior change
  • CI/chore: various dependency bumps (Black, mypy, GitHub Actions) and stale-bot/workflow tuning (PRs #1814, #1815, #1819, #1820, #1822, #1827, #1833, #1853, #1856, #1864, #1841, #1867, #1878, #1889)

Full Changelog: v0.41...v0.42