Skip to content

deps: bump all dependencies to latest major versions, require Python 3.14#4161

Merged
MarkusNeusinger merged 2 commits intomainfrom
deps/major-version-bumps
Feb 8, 2026
Merged

deps: bump all dependencies to latest major versions, require Python 3.14#4161
MarkusNeusinger merged 2 commits intomainfrom
deps/major-version-bumps

Conversation

@MarkusNeusinger
Copy link
Copy Markdown
Owner

Summary

  • Bump requires-python from >=3.12 to >=3.14
  • Bump all Python dependencies to latest major versions (numpy 2.x, pandas 3.x, fastmcp 2.x, cachetools 7.x, google-cloud-storage 3.x, plotly 6.x, kaleido 1.x, etc.)
  • Bump frontend ESLint from 9 to 10, TypeScript 5.9.3
  • Add 21 new tests for upgrade safety:
    • test_images.py: 4 GCS font download tests (mock client/bucket/blob)
    • test_tools.py: 4 fastmcp protocol-level tests (real server, no mocks)
    • test_data_deps.py: 12 numpy/pandas API compatibility smoke tests
    • test_cache.py: 1 cachetools maxsize overflow edge-case

Test plan

  • All 1011 unit tests pass (uv run pytest tests/unit -v)
  • Ruff lint + format clean
  • Frontend: 19 tests pass, lint clean, build succeeds
  • Backend API tested: /health, /stats, /specs, /libraries, /plots/filter
  • Frontend tested in browser: homepage, spec detail page, 0 console errors

🤖 Generated with Claude Code

…3.14

- Python: requires-python >=3.14 (was >=3.12)
- numpy >=2.0.0, pandas >=3.0.0, cachetools >=7.0.0
- fastmcp >=2.0.0, google-cloud-storage >=3.0.0
- plotly >=6.0.0, kaleido >=1.0.0, matplotlib >=3.10.0
- fastapi >=0.115.0, pillow >=11.0.0, httpx >=0.28.0
- Frontend: eslint 10, typescript 5.9.3
- Add 21 tests for upgrade safety: GCS (core/images), fastmcp protocol,
  numpy/pandas API smoke tests, cachetools maxsize edge-case

All 1011 unit tests pass. Frontend build, lint, and 19 tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings February 8, 2026 21:48
@codecov
Copy link
Copy Markdown

codecov Bot commented Feb 8, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 upgrades the backend and frontend dependency stacks to new major versions and raises the project’s minimum supported Python version, adding focused regression/smoke tests to catch common upgrade breakages.

Changes:

  • Bump backend requires-python to >=3.14 and update many Python dependency minimums (numpy/pandas/fastmcp/cachetools/etc.).
  • Update frontend dev tooling (ESLint 10, TypeScript 5.9.x) and refresh the lockfile.
  • Add new unit tests covering GCS font download behavior, FastMCP tool registration, numpy/pandas API smoke checks, and cachetools eviction behavior.

Reviewed changes

Copilot reviewed 14 out of 17 changed files in this pull request and generated 12 comments.

Show a summary per file
File Description
pyproject.toml Raises minimum Python to 3.14 and bumps dependency minimum versions.
tests/unit/core/test_images.py Adds tests for _get_monolisa_font_path() caching/download/failure behavior.
tests/unit/core/test_data_deps.py New numpy/pandas API compatibility smoke tests.
tests/unit/api/test_cache.py Adds TTLCache maxsize overflow eviction test.
tests/unit/api/mcp/test_tools.py Adds “protocol-level” (real server) FastMCP tool registration/schema tests.
app/package.json Bumps ESLint and React type packages in devDependencies.
app/yarn.lock Lockfile updates for the frontend toolchain bumps.
agentic/docs/project-guide.md Updates architecture/docs and tech stack version notes.
agentic/context/.gitkeep Keeps agentic/context/ tracked.
.serena/memories/task_completion.md Updates task completion checklist commands and rules.
.serena/memories/suggested_commands.md Removes older suggested-commands doc.
.serena/memories/project_overview.md Expands and updates the project overview content.
.serena/memories/directory_structure.md Removes older directory structure doc (content moved/expanded elsewhere).
.serena/memories/commands.md Adds consolidated commands reference doc.
.serena/memories/code_style.md Updates style/conventions documentation.
.github/copilot-instructions.md Updates repo structure and tech stack notes for Copilot guidance.

Comment thread .serena/memories/project_overview.md Outdated
matplotlib, seaborn, plotly, bokeh, altair, plotnine, pygal, highcharts, lets-plot

## Tech Stack
- **Backend**: Python 3.12+, FastAPI, SQLAlchemy async, asyncpg, PostgreSQL
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

This overview lists the backend as Python 3.12+, but pyproject.toml requires Python 3.14+. Please update this doc to match the project’s actual minimum Python version.

Suggested change
- **Backend**: Python 3.12+, FastAPI, SQLAlchemy async, asyncpg, PostgreSQL
- **Backend**: Python 3.14+, FastAPI, SQLAlchemy async, asyncpg, PostgreSQL

Copilot uses AI. Check for mistakes.
Comment thread .serena/memories/code_style.md Outdated
- **Linter/Formatter**: Ruff (enforces PEP 8)
- **Line Length**: 120 characters
## Python (API, Core, Tests)
- **Linter/Formatter**: Ruff (line-length=120, target=py312)
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

This doc claims Ruff targets py312, which no longer matches the PR’s stated minimum Python (3.14). Update the stated Ruff target (and/or the actual Ruff configuration) to reflect the supported Python version so linting rules match runtime semantics.

Suggested change
- **Linter/Formatter**: Ruff (line-length=120, target=py312)
- **Linter/Formatter**: Ruff (line-length=120, target=py314)

Copilot uses AI. Check for mistakes.
Comment thread .serena/memories/code_style.md Outdated
- **Async**: SQLAlchemy async, pytest-asyncio (auto mode)

## TypeScript (Frontend)
- **Linter**: ESLint 9 with typescript-eslint
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

This doc still says “ESLint 9”, but app/package.json in this PR bumps ESLint to 10. Please update the documentation to reflect the actual toolchain version.

Suggested change
- **Linter**: ESLint 9 with typescript-eslint
- **Linter**: ESLint 10 with typescript-eslint

Copilot uses AI. Check for mistakes.
Comment on lines 46 to +51
x = np.random.randn(100)
y = x * 0.8 + np.random.randn(100) * 0.5

# Plot
fig, ax = plt.subplots(figsize=(16, 9))
ax.scatter(x, y, alpha=0.7, s=50, color='#306998')

ax.set_xlabel('X Value')
ax.set_ylabel('Y Value')
ax.set_title('Basic Scatter Plot')
ax.grid(True, alpha=0.3)

ax.scatter(x, y)
ax.set_title('Title')
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

The plot implementation example uses ax.scatter(x, y) but y is never defined in the snippet, so it won’t run as written. Please either define y in the example or change the call to match the variables created in the snippet.

Copilot uses AI. Check for mistakes.
Comment on lines +401 to +405
# Call through the fastmcp protocol layer — exercises serialization
# get_tag_values("invalid") should raise ValueError
with pytest.raises(ValueError, match="Invalid category"):
tool = await mcp_server.get_tool("get_tag_values")
await tool.fn(category="invalid")
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

This test claims it “exercises serialization” via the FastMCP protocol layer, but it directly calls tool.fn(...) (bypassing any protocol/message serialization). Either update the test description/name to reflect what it actually does, or call the tool through the server’s protocol entrypoint (e.g., a call_tool/client request API) if the intent is to catch serialization-layer breaking changes.

Copilot uses AI. Check for mistakes.
Comment thread .github/copilot-instructions.md Outdated

- **Backend**: FastAPI, SQLAlchemy (async), PostgreSQL, Python 3.10+
- **Frontend**: React 19, TypeScript, Vite 7, MUI 7
- **Backend**: FastAPI, SQLAlchemy (async), PostgreSQL, Python 3.12+
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

This instructions doc says the backend is Python 3.12+, but pyproject.toml now requires Python 3.14+. Please keep these in sync to avoid confusion and accidental use of an unsupported Python version.

Suggested change
- **Backend**: FastAPI, SQLAlchemy (async), PostgreSQL, Python 3.12+
- **Backend**: FastAPI, SQLAlchemy (async), PostgreSQL, Python 3.14+

Copilot uses AI. Check for mistakes.
"""Should return cached font path without calling GCS when file exists."""
from unittest.mock import patch

import core.images
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

Module 'core.images' is imported with both 'import' and 'import from'.

Copilot uses AI. Check for mistakes.
"""Should download font from GCS when not cached."""
from unittest.mock import MagicMock, patch

import core.images
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

Module 'core.images' is imported with both 'import' and 'import from'.

Copilot uses AI. Check for mistakes.
"""Should return None gracefully when GCS download fails."""
from unittest.mock import patch

import core.images
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

Module 'core.images' is imported with both 'import' and 'import from'.

Copilot uses AI. Check for mistakes.
"""Should create cache directory if it doesn't exist before downloading."""
from unittest.mock import MagicMock, patch

import core.images
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

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

Module 'core.images' is imported with both 'import' and 'import from'.

Copilot uses AI. Check for mistakes.
Address Copilot review feedback:
- CI workflows: bump python-version from 3.13 to 3.14
- Docs: update Python 3.12+ references to 3.14+
- Serena memories: update ESLint 9 to 10, ruff target to py314

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@MarkusNeusinger MarkusNeusinger merged commit 31fd6f9 into main Feb 8, 2026
8 checks passed
@MarkusNeusinger MarkusNeusinger deleted the deps/major-version-bumps branch February 8, 2026 22:03
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