Skip to content

chore(deps): consolidated dependency bump - #3108

Merged
vpetersson merged 5 commits into
masterfrom
chore/deps-consolidated-bump
Jul 2, 2026
Merged

chore(deps): consolidated dependency bump#3108
vpetersson merged 5 commits into
masterfrom
chore/deps-consolidated-bump

Conversation

@vpetersson

@vpetersson vpetersson commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Combines the six open Dependabot PRs into a single bump and regenerates both lockfiles (uv.lock, bun.lock) so they resolve together.

Bumps

Package From To Supersedes
requests 2.33.1 2.34.2 #3098
ansible-core 2.21.0 2.21.1 #3097
redis 7.4.0 8.0.1 #3096
djangorestframework-stubs 3.16.9 3.17.0 #3095
django-stubs-ext 6.0.5 6.0.6 #3094
tailwindcss + @tailwindcss/cli 4.3.1 4.3.2 #3104

redis major bump (7 → 8)

kombu 5.6.2 caps its optional redis extra at <6.5, but we depend on redis-py directly so that cap is not enforced. Verified against a live redis that redis-py 8.0.1 works for every way the codebase uses it:

  • direct client API — get/set/rpush/blpop/pubsub round-trip
  • the Celery → redis broker enqueue path (via kombu's redis transport)
  • the channels-redis channel layer that backs the WebSocket endpoint

Testing

  • uv run ruff check . and ruff format --check . — clean
  • uv run pytest -m "not integration" — 1147 passed

The six superseded Dependabot PRs (#3094, #3095, #3096, #3097, #3098, #3104) have been closed in favour of this one.

🤖 Generated with Claude Code

Combine six open Dependabot PRs into one bump and regenerate both
lockfiles so they resolve together:

- requests 2.33.1 -> 2.34.2 (#3098)
- ansible-core 2.21.0 -> 2.21.1 (#3097)
- redis 7.4.0 -> 8.0.1 (#3096)
- djangorestframework-stubs 3.16.9 -> 3.17.0 (#3095)
- django-stubs-ext 6.0.5 -> 6.0.6 (#3094)
- tailwindcss + @tailwindcss/cli 4.3.1 -> 4.3.2 (#3104)

redis is a major bump. kombu 5.6.2 caps its optional redis extra at
<6.5, but we depend on redis-py directly, so the cap is not enforced.
Verified against a live redis that the direct client API (get/set/
rpush/blpop/pubsub), the celery->redis broker enqueue path, and the
channels-redis channel layer all work with redis-py 8.0.1.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@vpetersson
vpetersson requested a review from a team as a code owner July 2, 2026 10:01
@vpetersson
vpetersson requested a review from Copilot July 2, 2026 10:01

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates multiple Dependabot updates into a single dependency bump across the Python and Bun ecosystems, updating declared dependency pins and regenerating both lockfiles so resolution is consistent.

Changes:

  • Bump Python dependencies (requests, redis, ansible-core, django-stubs-ext, djangorestframework-stubs) and regenerate uv.lock.
  • Bump Tailwind packages and regenerate bun.lock.
  • Update pyproject.toml and package.json to reflect the new versions.

Reviewed changes

Copilot reviewed 2 out of 4 changed files in this pull request and generated 2 comments.

File Description
uv.lock Regenerated UV lockfile reflecting bumped Python dependency versions.
pyproject.toml Updates pinned Python dependency versions in dependency groups.
package.json Bumps Tailwind-related devDependencies to ^4.3.2.
bun.lock Regenerated Bun lockfile reflecting Tailwind package updates.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread pyproject.toml
Comment thread pyproject.toml
Address Copilot review on the consolidated bump:

- Bump the hardcoded requests pin in build-balena-disk-image.yaml
  (rpi-imager.json generation) to 2.34.2 to match pyproject.
- requests 2.34.2 now ships py.typed, so the types-requests stub in
  the dev-host group is redundant; remove it and relock. The inline
  types are stricter and surfaced a latent bytes/str inconsistency in
  handle_github_error's errdesc, now annotated as bytes | str.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 6 changed files in this pull request and generated 1 comment.

Comment thread src/anthias_server/lib/github.py Outdated
vpetersson and others added 2 commits July 2, 2026 10:13
The build-rpi-imager-json job installed requests with a hardcoded
`pip install 'requests==X'`, a pin that had to be hand-synced with
pyproject.toml (and had already drifted). Replace it with the pinned
astral-sh/setup-uv action and `uv run --locked --group local`, which
resolves requests from uv.lock and fails the job if pyproject and the
lockfile ever diverge. Removes the drift source permanently.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
jq empty asserts the file is well-formed JSON and exits non-zero on
failure without dumping the payload to the build log; jq . only
pretty-printed it as a side effect of parsing.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 6 changed files in this pull request and generated no new comments.

handle_github_error logged exc.response.content (bytes), which renders
as a b'...' repr in the log line. Use .text so the GitHub error body
reads as the server's actual message and errdesc stays a plain str.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@sonarqubecloud

sonarqubecloud Bot commented Jul 2, 2026

Copy link
Copy Markdown

@vpetersson
vpetersson merged commit fa21f6a into master Jul 2, 2026
11 checks passed
vpetersson-bot added a commit to vpetersson-bot/Anthias that referenced this pull request Jul 30, 2026
Fixes Screenly#3228. On an open WebSocket the server logged, every ~5s:

    redis.exceptions.TimeoutError: Timeout reading from redis:6379
    ERROR: Exception in ASGI application

Root cause: redis-py 8.0.1 (bumped from 7.4.0 in Screenly#3108) introduced a
default 5-second async socket read timeout (DEFAULT_SOCKET_TIMEOUT = 5;
7.4.0 had none). channels_redis polls each channel with a blocking
BZPOPMIN whose server-side timeout is brpop_timeout = 5s. With no
override the blocking read inherits the 5s socket timeout, so an empty
poll that legitimately blocks the full 5s races the socket read timeout
and raises -- on every poll cycle, for any connected WebSocket. Not
config drift and not board-specific; reproduces on healthy redis on any
install running v2026.7.4 whenever the web UI is open.

Fix: set the channel-layer connection socket_timeout to 15s -- above the
5s blocking poll so it can't race, while still bounding a genuinely dead
redis connection (rather than disabling the read timeout entirely).
Message delivery is unaffected.

Reproduced and verified: an idle channel-layer receive() raised the
exact error under redis-py 8.0.1 (DEFAULT_SOCKET_TIMEOUT=5) and now
blocks cleanly with socket_timeout=15; bisected to redis-py 7.4.0
(clean) vs 8.0.1 (broken). test_consumers + test_messaging pass; full
non-integration suite green (1513).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HJ3ucEkn62cbgPoisAZ5LQ
vpetersson-bot added a commit to vpetersson-bot/Anthias that referenced this pull request Jul 30, 2026
Fixes Screenly#3228. On an open WebSocket the server logged, every ~5s:

    redis.exceptions.TimeoutError: Timeout reading from redis:6379
    ERROR: Exception in ASGI application

Root cause: redis-py 8.0.1 (bumped from 7.4.0 in Screenly#3108) introduced a
default 5-second async socket read timeout (DEFAULT_SOCKET_TIMEOUT = 5;
7.4.0 had none). channels_redis polls each channel with a blocking
BZPOPMIN whose server-side timeout is brpop_timeout = 5s. With no
override the blocking read inherits the 5s socket timeout, so an empty
poll that legitimately blocks the full 5s races the socket read timeout
and raises -- on every poll cycle, for any connected WebSocket. Not
config drift and not board-specific; reproduces on healthy redis on any
install running v2026.7.4 whenever the web UI is open.

Fix: set the channel-layer connection socket_timeout to 15s -- above the
5s blocking poll so it can't race, while still bounding a genuinely dead
redis connection (rather than disabling the read timeout entirely).
Message delivery is unaffected.

Reproduced and verified: an idle channel-layer receive() raised the
exact error under redis-py 8.0.1 (DEFAULT_SOCKET_TIMEOUT=5) and now
blocks cleanly with socket_timeout=15; bisected to redis-py 7.4.0
(clean) vs 8.0.1 (broken). test_consumers + test_messaging pass; full
non-integration suite green (1513).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HJ3ucEkn62cbgPoisAZ5LQ
vpetersson pushed a commit that referenced this pull request Jul 30, 2026
…#3229)

Fixes #3228. On an open WebSocket the server logged, every ~5s:

    redis.exceptions.TimeoutError: Timeout reading from redis:6379
    ERROR: Exception in ASGI application

Root cause: redis-py 8.0.1 (bumped from 7.4.0 in #3108) introduced a
default 5-second async socket read timeout (DEFAULT_SOCKET_TIMEOUT = 5;
7.4.0 had none). channels_redis polls each channel with a blocking
BZPOPMIN whose server-side timeout is brpop_timeout = 5s. With no
override the blocking read inherits the 5s socket timeout, so an empty
poll that legitimately blocks the full 5s races the socket read timeout
and raises -- on every poll cycle, for any connected WebSocket. Not
config drift and not board-specific; reproduces on healthy redis on any
install running v2026.7.4 whenever the web UI is open.

Fix: set the channel-layer connection socket_timeout to 15s -- above the
5s blocking poll so it can't race, while still bounding a genuinely dead
redis connection (rather than disabling the read timeout entirely).
Message delivery is unaffected.

Reproduced and verified: an idle channel-layer receive() raised the
exact error under redis-py 8.0.1 (DEFAULT_SOCKET_TIMEOUT=5) and now
blocks cleanly with socket_timeout=15; bisected to redis-py 7.4.0
(clean) vs 8.0.1 (broken). test_consumers + test_messaging pass; full
non-integration suite green (1513).


Claude-Session: https://claude.ai/code/session_01HJ3ucEkn62cbgPoisAZ5LQ

Co-authored-by: vpetersson-bot <[email protected]>
Co-authored-by: Claude Opus 4.8 <[email protected]>
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.

2 participants