From 9b263de98df21937a5b1f2777154ebb3ff9a1333 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Sep 2026 04:18:48 +0000 Subject: [PATCH 1/6] Bump the all-pip-dependencies group in /infra with 23 updates Updates the requirements on [pycurl](https://github.com/pycurl/pycurl), [boto3](https://github.com/boto/boto3), [django-admin-cursor-paginator](https://github.com/a1tus/django-admin-cursor-paginator), [django-compressor](https://github.com/django-compressor/django-compressor), [django-node-assets](https://github.com/whitespy/django-node-assets), [django](https://github.com/django/django), [selenium](https://github.com/SeleniumHQ/Selenium), [requests](https://github.com/psf/requests), [whitenoise](https://github.com/evansd/whitenoise), [requests-mock](https://github.com/jamielennox/requests-mock), [coverage](https://github.com/coveragepy/coveragepy), [pylint](https://github.com/pylint-dev/pylint), [pylint-django](https://github.com/pylint-dev/pylint-django), [pycodestyle](https://github.com/PyCQA/pycodestyle), [djangorestframework](https://github.com/encode/django-rest-framework), [markdown](https://github.com/Python-Markdown/markdown), [celery](https://github.com/celery/celery), [pillow](https://github.com/python-pillow/Pillow), [gunicorn](https://github.com/benoitc/gunicorn), [sphinx](https://github.com/sphinx-doc/sphinx), [sphinx-mdinclude](https://github.com/omnilib/sphinx-mdinclude), [sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme) and [mistune](https://github.com/lepture/mistune) to permit the latest version. Updates `pycurl` from 7.45.4 to 7.47.0 - [Release notes](https://github.com/pycurl/pycurl/releases) - [Changelog](https://github.com/pycurl/pycurl/blob/master/ChangeLog) - [Commits](https://github.com/pycurl/pycurl/commits/v7.47.0) Updates `boto3` from 1.38.38 to 1.43.90 - [Release notes](https://github.com/boto/boto3/releases) - [Commits](https://github.com/boto/boto3/compare/1.38.38...1.43.90) Updates `django-admin-cursor-paginator` from 0.1.6 to 0.1.7 - [Release notes](https://github.com/a1tus/django-admin-cursor-paginator/releases) - [Commits](https://github.com/a1tus/django-admin-cursor-paginator/compare/v0.1.6...v0.1.7) Updates `django-compressor` from 4.5.1 to 4.6.0 - [Changelog](https://github.com/django-compressor/django-compressor/blob/develop/docs/changelog.txt) - [Commits](https://github.com/django-compressor/django-compressor/compare/4.5.1...4.6) Updates `django-node-assets` from 0.9.15 to 0.9.16 - [Changelog](https://github.com/whitespy/django-node-assets/blob/master/CHANGELOG.rst) - [Commits](https://github.com/whitespy/django-node-assets/compare/0.9.15...0.9.16) Updates `django` from 5.2.16 to 6.1.1 - [Commits](https://github.com/django/django/compare/5.2.16...6.1.1) Updates `selenium` from 4.31.0 to 4.48.0 - [Release notes](https://github.com/SeleniumHQ/Selenium/releases) - [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.31.0...selenium-4.48.0) Updates `requests` from 2.33.0 to 2.34.2 - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.33.0...v2.34.2) Updates `whitenoise` from 6.4.0 to 6.12.0 - [Changelog](https://github.com/evansd/whitenoise/blob/main/docs/changelog.rst) - [Commits](https://github.com/evansd/whitenoise/compare/6.4.0...6.12.0) Updates `requests-mock` from 1.12.0 to 1.12.1 - [Release notes](https://github.com/jamielennox/requests-mock/releases) - [Commits](https://github.com/jamielennox/requests-mock/compare/1.12.0...1.12.1) Updates `coverage` from 7.9.1 to 7.16.0 - [Release notes](https://github.com/coveragepy/coveragepy/releases) - [Changelog](https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst) - [Commits](https://github.com/coveragepy/coveragepy/compare/7.9.1...7.16.0) Updates `pylint` from 3.3.7 to 4.0.8 - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.7...v4.0.8) Updates `pylint-django` from 2.6.1 to 2.8.0 - [Release notes](https://github.com/pylint-dev/pylint-django/releases) - [Changelog](https://github.com/pylint-dev/pylint-django/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pylint-dev/pylint-django/compare/v2.6.1...v2.8.0) Updates `pycodestyle` from 2.13.0 to 2.14.0 - [Release notes](https://github.com/PyCQA/pycodestyle/releases) - [Changelog](https://github.com/PyCQA/pycodestyle/blob/main/CHANGES.txt) - [Commits](https://github.com/PyCQA/pycodestyle/compare/2.13.0...2.14.0) Updates `djangorestframework` from 3.17.2 to 3.18.1 - [Release notes](https://github.com/encode/django-rest-framework/releases) - [Commits](https://github.com/encode/django-rest-framework/compare/3.17.2...3.18.1) Updates `markdown` from 3.8.1 to 3.10.3 - [Release notes](https://github.com/Python-Markdown/markdown/releases) - [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md) - [Commits](https://github.com/Python-Markdown/markdown/compare/3.8.1...3.10.3) Updates `celery` from 5.5.3 to 5.6.3 - [Release notes](https://github.com/celery/celery/releases) - [Changelog](https://github.com/celery/celery/blob/v5.6.3/Changelog.rst) - [Commits](https://github.com/celery/celery/compare/v5.5.3...v5.6.3) Updates `pillow` to 12.3.0 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/1.0...12.3.0) Updates `gunicorn` from 23.0.0 to 26.2.0 - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/23.0.0...26.2.0) Updates `sphinx` to 9.1.0 - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v0.1.61611...v9.1.0) Updates `sphinx-mdinclude` from 0.5.3 to 0.6.2 - [Changelog](https://github.com/omnilib/sphinx-mdinclude/blob/main/CHANGELOG.md) - [Commits](https://github.com/omnilib/sphinx-mdinclude/compare/v0.5.3...v0.6.2) Updates `sphinx-rtd-theme` from 1.2.2 to 3.1.0 - [Changelog](https://github.com/readthedocs/sphinx_rtd_theme/blob/master/docs/changelog.rst) - [Commits](https://github.com/readthedocs/sphinx_rtd_theme/compare/1.2.2...3.1.0) Updates `mistune` to 3.3.4 - [Release notes](https://github.com/lepture/mistune/releases) - [Changelog](https://github.com/lepture/mistune/blob/main/docs/changes.rst) - [Commits](https://github.com/lepture/mistune/compare/v0.1.0...v3.3.4) --- updated-dependencies: - dependency-name: pycurl dependency-version: 7.47.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: boto3 dependency-version: 1.43.90 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: django-admin-cursor-paginator dependency-version: 0.1.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-pip-dependencies - dependency-name: django-compressor dependency-version: 4.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: django-node-assets dependency-version: 0.9.16 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-pip-dependencies - dependency-name: django dependency-version: 6.1.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-pip-dependencies - dependency-name: selenium dependency-version: 4.48.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: requests dependency-version: 2.34.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: whitenoise dependency-version: 6.12.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: requests-mock dependency-version: 1.12.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-pip-dependencies - dependency-name: coverage dependency-version: 7.16.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: pylint dependency-version: 4.0.8 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-pip-dependencies - dependency-name: pylint-django dependency-version: 2.8.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: pycodestyle dependency-version: 2.14.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: djangorestframework dependency-version: 3.18.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: markdown dependency-version: 3.10.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: celery dependency-version: 5.6.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: pillow dependency-version: 12.3.0 dependency-type: direct:production dependency-group: all-pip-dependencies - dependency-name: gunicorn dependency-version: 26.2.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-pip-dependencies - dependency-name: sphinx dependency-version: 9.1.0 dependency-type: direct:production dependency-group: all-pip-dependencies - dependency-name: sphinx-mdinclude dependency-version: 0.6.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-pip-dependencies - dependency-name: sphinx-rtd-theme dependency-version: 3.1.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-pip-dependencies - dependency-name: mistune dependency-version: 3.3.4 dependency-type: direct:production dependency-group: all-pip-dependencies ... Signed-off-by: dependabot[bot] --- infra/requirements-core.txt | 36 +++++++++++----------- infra/requirements-for-readthedocs.txt | 8 ++--- infra/requirements-not-for-readthedocs.txt | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/infra/requirements-core.txt b/infra/requirements-core.txt index 006ad907..bedb44a4 100644 --- a/infra/requirements-core.txt +++ b/infra/requirements-core.txt @@ -1,42 +1,42 @@ -boto3==1.38.38 +boto3==1.43.90 csscompressor==0.9.5 -django-admin-cursor-paginator==0.1.6 -django-compressor==4.5.1 +django-admin-cursor-paginator==0.1.7 +django-compressor==4.6.0 django-extra-views==0.16.0 -django-node-assets==0.9.15 +django-node-assets==0.9.16 django-registration==5.2.1 django-social-share==2.3.0 django-sortedm2m==4.0.0 django-storages==1.14.6 -Django==5.2.16 +Django==6.1.1 rcvformats==0.0.46 -selenium==4.31.0 # Stay below 4.32.0 until this is fixed: https://github.com/SeleniumHQ/selenium/issues/15772 -requests==2.33.0 -whitenoise==6.4.0 +selenium==4.48.0 # Stay below 4.32.0 until this is fixed: https://github.com/SeleniumHQ/selenium/issues/15772 +requests==2.34.2 +whitenoise==6.12.0 # For tests mock==5.2.0 -requests-mock==1.12.0 +requests-mock==1.12.1 django_extensions==4.1 # For coverage autopep8==2.3.2 -coverage==7.9.1 -pylint==3.3.7 -pylint-django==2.6.1 -pycodestyle==2.13.0 +coverage==7.16.0 +pylint==4.0.8 +pylint-django==2.8.0 +pycodestyle==2.14.0 # For django-rest -djangorestframework==3.17.2 +djangorestframework==3.18.1 drf-api-tracking==1.8.4 -markdown==3.8.1 +markdown==3.10.3 # For movie creation -celery==5.5.3 +celery==5.6.3 django-cleanup==9.0.0 moviepy==2.2.1 -pillow<12.0.0 # Highest version supported by moviepy +pillow<13.0.0 # Highest version supported by moviepy # For Heroku -gunicorn==23.0.0 +gunicorn==26.2.0 django-on-heroku==1.1.2 diff --git a/infra/requirements-for-readthedocs.txt b/infra/requirements-for-readthedocs.txt index 840facc7..d494101f 100644 --- a/infra/requirements-for-readthedocs.txt +++ b/infra/requirements-for-readthedocs.txt @@ -1,7 +1,7 @@ -r requirements-core.txt # For docs -sphinx<7 -sphinx-mdinclude==0.5.3 -sphinx-rtd-theme==1.2.2 -mistune<3 +sphinx<10 +sphinx-mdinclude==0.6.2 +sphinx-rtd-theme==3.1.0 +mistune<4 diff --git a/infra/requirements-not-for-readthedocs.txt b/infra/requirements-not-for-readthedocs.txt index c5aa2163..2a0bb02c 100644 --- a/infra/requirements-not-for-readthedocs.txt +++ b/infra/requirements-not-for-readthedocs.txt @@ -1,2 +1,2 @@ # For movie creation -pycurl==7.45.4 +pycurl==7.47.0 From 9534e66e7b94b5c66010c4bef36091ccce469e53 Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Mon, 14 Sep 2026 11:25:22 -0400 Subject: [PATCH 2/6] Fix test and lint breakage from the selenium and pylint bumps Selenium 4.32+ removed get_log() from webdriver.Remote, which the SauceLabs tests use. The underlying getLog command is still registered on every driver, so call it directly through execute(). Pylint 4 rejects the removed suggestion-mode option, applies constant naming to every module-level assignment, and can't infer selenium's lazily-loaded webdriver.Chrome/Remote (false not-callable errors). Drop the option, mark the celery/test names that must stay lowercase, and import the concrete WebDriver classes directly. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_0144rNCqqKzcJbNHVpCTWqUX --- .pylintrc | 4 ---- common/testUtils.py | 5 +++-- infra/requirements-core.txt | 2 +- movie/tasks.py | 5 +++-- rcvis/celeryconfig.py | 4 ++-- visualizer/tasks.py | 5 +++-- visualizer/tests/__init__.py | 2 +- visualizer/tests/liveServerTestBaseClass.py | 8 ++++++-- 8 files changed, 19 insertions(+), 16 deletions(-) diff --git a/.pylintrc b/.pylintrc index c83f5478..c9abc2dc 100644 --- a/.pylintrc +++ b/.pylintrc @@ -36,10 +36,6 @@ load-plugins= # Pickle collected data for later comparisons. persistent=yes -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages. -suggestion-mode=yes - # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no diff --git a/common/testUtils.py b/common/testUtils.py index a0d327af..d28a0640 100644 --- a/common/testUtils.py +++ b/common/testUtils.py @@ -15,6 +15,7 @@ from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService +from selenium.webdriver.chrome.webdriver import WebDriver as Chrome from scraper.models import MultiScraper, Scraper from visualizer.models import JsonConfig from visualizer.tests import filenames @@ -76,9 +77,9 @@ def get_headless_browser(cls): if 'CHROMEDRIVER_PATH' in os.environ: chromeOptions.add_argument("--remote-debugging-port=9222") service = ChromeService(executable_path=os.environ["CHROMEDRIVER_PATH"]) - return webdriver.Chrome(service=service, options=chromeOptions) + return Chrome(service=service, options=chromeOptions) - return webdriver.Chrome(options=chromeOptions) + return Chrome(options=chromeOptions) # Or, Firefox # firefoxOptions = webdriver.FirefoxOptions() diff --git a/infra/requirements-core.txt b/infra/requirements-core.txt index bedb44a4..7c10b326 100644 --- a/infra/requirements-core.txt +++ b/infra/requirements-core.txt @@ -10,7 +10,7 @@ django-sortedm2m==4.0.0 django-storages==1.14.6 Django==6.1.1 rcvformats==0.0.46 -selenium==4.48.0 # Stay below 4.32.0 until this is fixed: https://github.com/SeleniumHQ/selenium/issues/15772 +selenium==4.48.0 requests==2.34.2 whitenoise==6.12.0 diff --git a/movie/tasks.py b/movie/tasks.py index 1b00403e..209e5dec 100644 --- a/movie/tasks.py +++ b/movie/tasks.py @@ -10,6 +10,7 @@ import requests from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService +from selenium.webdriver.chrome.webdriver import WebDriver as Chrome from movie.creation.movieCreator import MovieCreationFactory from visualizer.models import JsonConfig, MovieGenerationStatuses @@ -59,9 +60,9 @@ def create_movie_task(pk, domain): if 'CHROMEDRIVER_PATH' in os.environ: chromeOptions.add_argument("--remote-debugging-port=9222") service = ChromeService(executable_path=os.environ["CHROMEDRIVER_PATH"]) - browser = webdriver.Chrome(service=service, options=chromeOptions) + browser = Chrome(service=service, options=chromeOptions) else: - browser = webdriver.Chrome(options=chromeOptions) + browser = Chrome(options=chromeOptions) browser.implicitly_wait(10) diff --git a/rcvis/celeryconfig.py b/rcvis/celeryconfig.py index 8eb02f7a..3ea14d86 100644 --- a/rcvis/celeryconfig.py +++ b/rcvis/celeryconfig.py @@ -11,7 +11,7 @@ # No backend - we don't care about the results, we'll update the database result_backend = None # pylint: disable=invalid-name -task_annotations = { +task_annotations = { # pylint: disable=invalid-name 'tasks.create_movie_task': {'rate_limit': '1/s'} } @@ -20,7 +20,7 @@ # Otherwise we get a cryptic error message raise NotImplementedError("No queue name set. Set SQS_QUEUE_NAME.") -broker_transport_options = { +broker_transport_options = { # pylint: disable=invalid-name 'queue_name_prefix': sqs_queue_name } diff --git a/visualizer/tasks.py b/visualizer/tasks.py index e150d4d3..fda78736 100644 --- a/visualizer/tasks.py +++ b/visualizer/tasks.py @@ -11,6 +11,7 @@ def create_headless_browser(): """Create a browser with internal imports for use in process pool executor""" from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService + from selenium.webdriver.chrome.webdriver import WebDriver as Chrome chromeOptions = webdriver.ChromeOptions() for arg in [ @@ -24,11 +25,11 @@ def create_headless_browser(): chromedriverPath = os.getenv('CHROMEDRIVER_PATH') if chromedriverPath: chromeOptions.add_argument("--remote-debugging-port=9222") - return webdriver.Chrome( + return Chrome( service=ChromeService( executable_path=chromedriverPath), options=chromeOptions) - return webdriver.Chrome(options=chromeOptions) + return Chrome(options=chromeOptions) def generate_json_config_title_image(pk, domain): diff --git a/visualizer/tests/__init__.py b/visualizer/tests/__init__.py index 8d8fdd07..5640b9c5 100644 --- a/visualizer/tests/__init__.py +++ b/visualizer/tests/__init__.py @@ -6,7 +6,7 @@ from unittest.mock import MagicMock, patch -executor_mock = MagicMock() +executor_mock = MagicMock() # pylint: disable=invalid-name patcher = patch("visualizer.executor.get_executor", MagicMock(return_value=executor_mock)) patcher.start() diff --git a/visualizer/tests/liveServerTestBaseClass.py b/visualizer/tests/liveServerTestBaseClass.py index ca9f90d9..74acefcf 100644 --- a/visualizer/tests/liveServerTestBaseClass.py +++ b/visualizer/tests/liveServerTestBaseClass.py @@ -12,6 +12,8 @@ from selenium import webdriver from selenium.common.exceptions import WebDriverException from selenium.webdriver.common.by import By +from selenium.webdriver.remote.command import Command +from selenium.webdriver.remote.webdriver import WebDriver as Remote from selenium.webdriver.support.ui import Select from common.testUtils import TestHelpers @@ -59,7 +61,7 @@ def setUp(self): options.set_capability('sauce:options', sauceOptions) seleniumEndpoint = f"https://{username}:{accessKey}@ondemand.saucelabs.com:443/wd/hub" - self.browser = webdriver.Remote(command_executor=seleniumEndpoint, options=options) + self.browser = Remote(command_executor=seleniumEndpoint, options=options) else: self.browser = TestHelpers.get_headless_browser() self.browser.set_window_size(1280, 1024) @@ -108,7 +110,9 @@ def _has_test_failed(self): def _get_log(self): """ Returns and clears the console log """ - return self.browser.get_log('browser') + # Selenium 4.32+ removed get_log() from webdriver.Remote (used for SauceLabs), + # but the underlying command is still registered on every driver, so call it directly. + return self.browser.execute(Command.GET_LOG, {'type': 'browser'})['value'] def _assert_log_len(self, num): """ Asserts the log contains num elements, or prints out what's in the log. From 0b33557dd29066f92adc339800d2ce211d0c470f Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Mon, 14 Sep 2026 11:29:40 -0400 Subject: [PATCH 3/6] Update sidecar test for Django 6's https URL default URLField now assumes https:// for scheme-less input, so the rendered Ballotpedia source link changed from http://test.com to https://test.com. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_0144rNCqqKzcJbNHVpCTWqUX --- visualizer/tests/testSidecar.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visualizer/tests/testSidecar.py b/visualizer/tests/testSidecar.py index 45442b6a..8e773e10 100644 --- a/visualizer/tests/testSidecar.py +++ b/visualizer/tests/testSidecar.py @@ -109,7 +109,7 @@ def _test_ballotpedia_text_with_config(self, uploadConfig, testConfigFuncs): 'incumbentsBolded': b'Incumbents are ' b'bolded and underlined', 'noIncumbents': b'There were no incumbents in this race', - 'source': b'Source [test.com]' + 'source': b'Source [test.com]' } # Look through the test config to see if the text should be in or not in the HTML @@ -174,7 +174,7 @@ def test_ballotpedia_text(self): self._test_ballotpedia_text_with_config({ 'jsonFile': jsonFile, 'candidateSidecarFile': sidecarFile, - 'dataSourceURL': 'test.com', # note: http:// is auto-added + 'dataSourceURL': 'test.com', # note: https:// is auto-added 'areResultsCertified': True }, { 'title': self.assertIn, From c7a2f0f758b6643543f1f6473a30c3e2c764a035 Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Mon, 14 Sep 2026 11:31:32 -0400 Subject: [PATCH 4/6] Build docs on Python 3.13 so Read the Docs can install Django 6 Django 6 requires Python 3.12+, and the repo already pins 3.13. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_0144rNCqqKzcJbNHVpCTWqUX --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 22f3f94d..cc54be48 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,7 +8,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.11" + python: "3.13" # Build documentation in the docs/ directory with Sphinx From fdad6df3f47793fb84c8fac8dae81b6710cfd070 Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Mon, 14 Sep 2026 11:36:08 -0400 Subject: [PATCH 5/6] Give the docs build an in-memory database Sphinx 9's autodoc calls repr() on class attributes like the REST views' `queryset = Model.objects.all()`, which runs a query. Read the Docs has no database, so the build crashed with "no such table". Point the docs build at a migrated in-memory SQLite database instead. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_0144rNCqqKzcJbNHVpCTWqUX --- docs/source/conf.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index 0c799425..6b0168b1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -15,7 +15,15 @@ sys.path.insert(0, os.path.abspath('../../')) os.environ['DJANGO_SETTINGS_MODULE'] = 'rcvis.settings' + +# Sphinx 9's autodoc calls repr() on class attributes such as the REST views' +# `queryset = Model.objects.all()`, which queries the database. Read the Docs has +# no database, so give the docs build an empty in-memory one with every table. +from django.conf import settings # noqa: E402 pylint: disable=wrong-import-position +settings.DATABASES['default']['NAME'] = ':memory:' django.setup() +from django.core.management import call_command # noqa: E402 pylint: disable=wrong-import-position +call_command('migrate', verbosity=0) # -- Project information ----------------------------------------------------- From d576f8acc111d6cb112649bdc56b10ddb7d3459c Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Mon, 14 Sep 2026 12:18:37 -0400 Subject: [PATCH 6/6] Retrigger CI The previous run failed after a docs-only change; the run before it passed. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_0144rNCqqKzcJbNHVpCTWqUX