Skip to content

fix: quote tag labels containing spaces or commas#1782

Open
jacalata wants to merge 3 commits into
developmentfrom
jac/fix-tag-spaces
Open

fix: quote tag labels containing spaces or commas#1782
jacalata wants to merge 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 and others added 3 commits June 17, 2026 22:28
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>
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>
Fixes #675 #994

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@jacalata jacalata force-pushed the jac/fix-tag-spaces branch from 8c1554e to 04133e7 Compare June 18, 2026 05:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant