Repository navigation
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 aProjectItem(orNone), walking the project tree level by level via the REST APInamefilter - Parse
<statusNotes>intoJobItem.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 legacynoteslist - Expose
JobFailedException/JobCancelledException/FlowRun*exceptions at the top-levelTSCnamespace (PR #1870) — callers can now catchTSC.JobFailedExceptiondirectly instead of reaching into the internaltableauserverclient.server.endpoint.exceptionsmodule - Make
Serverthread-safe with per-thread sessions (PR #1871) — each thread now gets its ownrequests.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
Filterserialization for datetimes and booleans (PR #1805) — datetime filter values were serialized with a space instead of ISO-8601T/Z, and booleans serialized as Python'sTrue/Falseinstead of lowercasetrue/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) —
requestswas converting POST to GET and dropping the body on 301/302/303 redirects, causing 405 errors onusers.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
customSubscriptionEmailandcustomSubscriptionFooter(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
castissue inhelpers/strings.pyand a missing import in a test - Normalize CRLF line endings to LF in six Python files (PR #1816) — cleans up
^Mnoise 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_pathfixture 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 acrossWorkbooks,Datasources, andFlowsinto a single shared helper - Extract
CSVImport._decompose_site_role(PR #1812) — moves the inverse of_evaluate_site_roleintoCSVImportand 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-optyping_extensionsindirection 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 viaConnectionItem - 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), expandedupdate_connection_authsample 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