Skip to content

fix: quote tag labels containing spaces or commas - #1782

Merged
jacalata merged 3 commits into
developmentfrom
jac/fix-tag-spaces
Jun 19, 2026
Merged

fix: quote tag labels containing spaces or commas#1782
jacalata merged 3 commits into
developmentfrom
jac/fix-tag-spaces

Conversation

@jacalata

@jacalata jacalata commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Summary

Test plan

  • Unit tests: pytest (existing + new tests in test/test_tagging.py)
  • E2e tests: pytest test_e2e/ validated against Tableau Online (see contributing.md)

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Jun 18, 2026

Copy link
Copy Markdown

Coverage

Coverage Report
FileStmtsMissCoverMissing
tableauserverclient
   __init__.py50100% 
   config.py150100% 
   datetime_helpers.py2511 96%
   exponential_backoff.py200100% 
   filesys_helpers.py310100% 
   namespace.py2633 88%
tableauserverclient/bin
   __init__.py20100% 
   _version.py358212212 41%
tableauserverclient/helpers
   __init__.py10100% 
   logging.py20100% 
   strings.py3111 97%
tableauserverclient/models
   __init__.py460100% 
   collection_item.py4177 83%
   column_item.py553232 42%
   connection_credentials.py351111 69%
   connection_item.py851313 85%
   custom_view_item.py1442121 85%
   data_acceleration_report_item.py5411 98%
   data_alert_item.py15844 97%
   data_freshness_policy_item.py1551515 90%
   database_item.py2073636 83%
   datasource_item.py3001212 96%
   dqw_item.py10455 95%
   exceptions.py40100% 
   extensions_item.py13244 97%
   extract_item.py4444 91%
   favorites_item.py6988 88%
   fileupload_item.py190100% 
   flow_item.py1491010 93%
   flow_run_item.py710100% 
   group_item.py8966 93%
   groupset_item.py4977 86%
   interval_item.py1823232 82%
   job_item.py1871010 95%
   linked_tasks_item.py7911 99%
   location_item.py2922 93%
   metric_item.py1291313 90%
   oidc_item.py6333 95%
   pagination_item.py3411 97%
   permissions_item.py1111212 89%
   project_item.py2073131 85%
   property_decorators.py1001818 82%
   reference_item.py2622 92%
   revision_item.py5911 98%
   schedule_item.py20966 97%
   server_info_item.py3744 89%
   site_item.py6361313 98%
   subscription_item.py10122 98%
   table_item.py1191818 85%
   tableau_auth.py612525 59%
   tableau_types.py2711 96%
   tag_item.py150100% 
   target.py60100% 
   task_item.py5622 96%
   user_item.py3101818 94%
   view_item.py2201616 93%
   virtual_connection_item.py6488 88%
   webhook_item.py6522 97%
   workbook_item.py3621616 96%
tableauserverclient/server
   __init__.py90100% 
   exceptions.py40100% 
   filter.py2111 95%
   pager.py3311 97%
   query.py1431818 87%
   request_factory.py1332197197 85%
   request_options.py38555 99%
   server.py1891919 90%
   sort.py60100% 
tableauserverclient/server/endpoint
   __init__.py350100% 
   auth_endpoint.py751010 87%
   custom_views_endpoint.py1521212 92%
   data_acceleration_report_endpoint.py210100% 
   data_alert_endpoint.py942323 76%
   databases_endpoint.py1113030 73%
   datasources_endpoint.py3283434 90%
   default_permissions_endpoint.py4433 93%
   dqw_endpoint.py451616 64%
   endpoint.py1871818 90%
   exceptions.py7066 91%
   extensions_endpoint.py310100% 
   favorites_endpoint.py942222 77%
   fileuploads_endpoint.py510100% 
   flow_runs_endpoint.py6299 85%
   flow_task_endpoint.py2122 90%
   flows_endpoint.py2105454 74%
   groups_endpoint.py12699 93%
   groupsets_endpoint.py7277 90%
   jobs_endpoint.py6799 87%
   linked_tasks_endpoint.py370100% 
   metadata_endpoint.py881414 84%
   metrics_endpoint.py5566 89%
   oidc_endpoint.py4211 98%
   permissions_endpoint.py4433 93%
   projects_endpoint.py1572424 85%
   resource_tagger.py1273535 72%
   schedules_endpoint.py1191111 91%
   server_info_endpoint.py361010 72%
   sites_endpoint.py1302727 79%
   subscriptions_endpoint.py561414 75%
   tables_endpoint.py1103636 67%
   tasks_endpoint.py6366 90%
   users_endpoint.py18399 95%
   views_endpoint.py15099 94%
   virtual_connections_endpoint.py1131010 91%
   webhooks_endpoint.py5499 83%
   workbooks_endpoint.py3492525 93%
TOTAL11951142488% 

@jacalata
jacalata force-pushed the jac/fix-tag-spaces branch from 8c1554e to 04133e7 Compare June 18, 2026 05:30
jacalata and others added 3 commits June 19, 2026 14:55
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 <[email protected]>
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 <[email protected]>
@jacalata
jacalata force-pushed the jac/fix-tag-spaces branch from 04133e7 to a678379 Compare June 19, 2026 22:40
@jacalata
jacalata merged commit 0098271 into development Jun 19, 2026
28 of 29 checks passed
@jacalata
jacalata deleted the jac/fix-tag-spaces branch June 19, 2026 22:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

add_tags() treats spaces in a tag as delimiter resulting in multiple tags Problem with changing tags which contains '.' - 404007: Resource Not Found Delete tag with special characters like '#' does not work

2 participants