Skip to content

docs: set up Sphinx + ReadTheDocs pipeline for auto-generated API reference - #1832

Open
jacalata wants to merge 8 commits into
developmentfrom
jac/docs-sphinx-readthedocs
Open

docs: set up Sphinx + ReadTheDocs pipeline for auto-generated API reference#1832
jacalata wants to merge 8 commits into
developmentfrom
jac/docs-sphinx-readthedocs

Conversation

@jacalata

@jacalata jacalata commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

Introduces Sphinx + ReadTheDocs alongside the existing Jekyll site on gh-pages.

Long-term goal is to replace api-ref.md on gh-pages. Keeping api-ref.md in sync with the code is currently manual and dev-driven; Sphinx auto-generates the same content from docstrings, giving devs a smoother update path (write docstrings, docs regenerate). Concepts and tutorials stay in Jekyll.

Not surfacing this in the Jekyll site yet -- docstring coverage across the models package is too thin for the generated reference to be an improvement over the current api-ref.md. Merging the pipeline now unblocks incremental docstring work without a public-facing rush.

What's included

  • .readthedocs.yaml -- RTD build config (Python 3.13)
  • docs/conf.py -- Sphinx config; reads project details from pyproject.toml; uses furo theme
  • docs/index.rst -- automodule with :members: :imported-members: so re-exports from tableauserverclient/__init__.py render (without :imported-members: the output was nearly empty)
  • .github/workflows/docs.yml -- triggers on push: branches: [master], builds Sphinx, opens an automated PR into gh-pages at sphinx/. Uses concurrency: docs-publish to serialize runs, delete-branch: true and fetch-depth: 0 so unmerged prior PR review comments don't get stranded
  • pyproject.toml -- adds docs = ["sphinx>=7,<9", "furo>=2024,<2027", "tomli; python_version < '3.11'"] optional-deps group. tomli is only needed by Python 3.10 users building docs locally; the workflow and RTD both pin 3.13
  • Small docstring cleanups in connection_item.py, job_item.py, site_item.py, task_item.py (side effect of the initial Sphinx pass; id_ docstring parameters kept as id_ to match the actual constructor signature)

Notes for reviewers

Test plan

  • Sphinx builds cleanly locally (sphinx-build -b html docs sphinx_build) -- 3000-line index with all re-exports rendering. One benign warning about a duplicate UserItem.idp_configuration_id object description (pre-existing property+setter shape).
  • RTD build succeeds via the .readthedocs.yaml
  • .github/workflows/docs.yml runtime not exercised until this is on master

🤖 Generated with Claude Code

jacalata and others added 6 commits July 27, 2026 18:00
Add Read the Docs configuration file for documentation build
Added configuration settings for Sphinx documentation. Direct copy from example conf file.
Updated project information to load from pyproject.toml.
- Add docs optional-dependencies group (sphinx, tomli) to pyproject.toml
- Wire up .readthedocs.yaml to install .[docs] extra
- Fix conf.py: correct pyproject.toml path, use importlib.metadata for
  version, switch to alabaster theme, use tomllib/tomli compat import
- Add minimal docs/index.rst
- Fix RST docstring errors in connection_item, site_item, job_item,
  task_item that caused Sphinx build warnings/errors

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On push to master, builds Sphinx HTML and opens a PR from
docs-update into gh-pages so the generated API reference
can be reviewed before going live.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 28, 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.py941414 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.py3777 81%
   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.py6911 99%
   workbook_item.py3621616 96%
tableauserverclient/server
   __init__.py90100% 
   exceptions.py40100% 
   filter.py2911 97%
   pager.py3311 97%
   query.py1431515 90%
   request_factory.py1335195195 85%
   request_options.py38655 99%
   server.py1882323 88%
   sort.py60100% 
tableauserverclient/server/endpoint
   __init__.py350100% 
   auth_endpoint.py771111 86%
   custom_views_endpoint.py1521212 92%
   data_acceleration_report_endpoint.py210100% 
   data_alert_endpoint.py942323 76%
   databases_endpoint.py1113030 73%
   datasources_endpoint.py3233333 90%
   default_permissions_endpoint.py4433 93%
   dqw_endpoint.py451616 64%
   endpoint.py2122020 91%
   exceptions.py7766 92%
   extensions_endpoint.py310100% 
   favorites_endpoint.py942222 77%
   fileuploads_endpoint.py510100% 
   flow_runs_endpoint.py6299 85%
   flow_task_endpoint.py2122 90%
   flows_endpoint.py1985353 73%
   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.py1782424 87%
   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.py18388 96%
   views_endpoint.py15099 94%
   virtual_connections_endpoint.py1131010 91%
   webhooks_endpoint.py5499 83%
   workbooks_endpoint.py3382222 93%
TOTAL12002142388% 

jacalata and others added 2 commits July 28, 2026 00:21
Four cleanups on the docs branch surfaced by an adversarial review:

- Revert id_ -> id docstring renames in JobItem and TaskItem. The
  constructors take `id_` (trailing underscore because `id` shadows the
  builtin); the docstring should describe the actual parameter name.
  The original rename was cosmetic and made the docstring actively
  misleading — users copying the docstring's kwarg would get a
  TypeError.

- Add :imported-members: to docs/index.rst. Without it, the top-level
  automodule directive only documents symbols defined in
  tableauserverclient/__init__.py itself (which is 99% re-exports), so
  the generated API reference was nearly empty. With this, all
  re-exported classes render.

- Pin [docs] extras. Was `sphinx`, `tomli`, `furo` — unpinned. Now
  `sphinx>=7,<9`, `furo>=2024,<2027`, `tomli; python_version < '3.11'`.
  A future Sphinx major bump can silently break the RTD reproducible
  build otherwise. `tomli` narrowed to just the Python 3.10 build path;
  3.11+ has stdlib tomllib.

- Workflow changes:
  - Add `concurrency: docs-publish` so overlapping runs don't rewrite
    docs-update mid-flight.
  - Set `delete-branch: true` on peter-evans/create-pull-request so
    stale docs-update branches don't accumulate and force-updates
    don't strand review comments.
  - Set `fetch-depth: 0` on the gh-pages checkout so
    create-pull-request can detect no-op diffs correctly.

- Remove the templates_path = ["_templates"] config in docs/conf.py.
  The referenced directory doesn't ship, so Sphinx emits a warning on
  every build.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.

1 participant