Conversation
## Walkthrough
This update removes the Haskell-based platform service, its infrastructure-as-code (Pulumi) deployment, and related CI/CD workflows. It introduces a new Python-based "datamanager" FastAPI service with Docker support, updates project configuration to focus on Python, and streamlines ignore and task files. New GitHub issue templates are added for bug and feature reporting.
## Changes
| File(s) / Path(s) | Change Summary |
|-----------------------------------------------------|---------------|
| `.flox/.gitignore`, `.flox/env.json`, `.flox/env/manifest.toml` | Deleted or reformatted `.flox` files; removed ignored directories and cleaned up manifest. |
| `.github/PULL_REQUEST_TEMPLATE.md` | Removed a comment line from PR template. |
| `.github/workflows/lint.yaml`, `.github/workflows/stale.yaml`, `.github/workflows/test.yaml` | Deleted lint workflow; updated stale workflow permissions and naming; renamed and modified test workflow for push trigger and coverage upload. |
| `.github/workflows/quality.yaml` | Added new GitHub Actions workflow for Python code quality checks. |
| `.gitignore` | Simplified: removed language/editor-specific ignores, now ignores only `.flox`, `.env`, and `.DS_Store`. |
| `.mise.toml` | Removed Haskell and platform-specific tasks; added generic Python install and parameterized Docker build/run tasks for services. |
| `README.md` | Simplified repository description; removed detailed component listing and section header; clarified setup instructions with new install task. |
| `index.html` | Deleted static HTML landing page. |
| `infrastructure/*` | Deleted all infrastructure code and configs: Pulumi YAML, Python modules, dependencies, and project metadata. |
| `platform/*` | Deleted all Haskell platform service code, build files, Dockerfile, and test suite. |
| `pyproject.toml` | Updated: capitalized description, Python 3.13+, changed workspace members, added build configuration sections. |
| `.github/ISSUE_TEMPLATE/BUG.md`, `.github/ISSUE_TEMPLATE/FEATURE.md` | Added new issue templates for bugs and features. |
| `application/datamanager/.dockerignore` | Added Docker ignore file for Python build artifacts and VCS data. |
| `application/datamanager/Dockerfile` | Added Dockerfile for FastAPI service with Uvicorn and DuckDB/Polars. |
| `application/datamanager/pyproject.toml` | Added Python project config for datamanager with dependencies and build settings. |
| `application/datamanager/src/datamanager/main.py` | Added new FastAPI service for querying equity bar data from DuckDB or GCS, with health and data endpoints. |
| `.pre-commit-config.yaml` | Added pre-commit configuration for Python quality and test hooks. |
| `application/datamanager/tests/test_main.py` | Added test for health endpoint of the datamanager FastAPI service. |
## Sequence Diagram(s)
```mermaid
sequenceDiagram
participant User
participant FastAPI (application)
participant Database
participant DuckDB
participant GCS
User->>FastAPI (application): GET /equity-bars?start_date&end_date
FastAPI (application)->>Database: query(start_date, end_date)
alt GCS credentials provided
Database->>DuckDB: Install & load httpfs extension
Database->>GCS: Generate daily CSV file paths
Database->>DuckDB: Query read_csv(GCS paths)
else No GCS credentials
Database->>DuckDB: Query local in-memory table
end
DuckDB-->>Database: Return Polars DataFrame
Database-->>FastAPI (application): DataFrame
FastAPI (application)-->>User: JSON response with data and metadataPoem
|
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (4)
README.md (2)
9-9: Clarify the repository description.
The line reads "This repository holds the resources for the fund platform," which is quite generic. Consider specifying which resources are included (e.g., initial Python modules, configuration scripts, data pipelines) or rephrasing for greater clarity. For example:“This repository contains the foundational Python modules and configuration scripts for the Pocket Size Fund platform.”
25-35: Reintroduce a header for the principles list.
The list of principles currently appears without its own section heading. Adding a header (e.g.,## Principles) before the block will improve the document’s structure and help readers understand the context of these items..flox/env.json (1)
2-3: Approve JSON reformatting. The updated indentation improves readability without altering any configuration values.Consider ensuring a trailing newline at the end of this file to maintain POSIX compatibility.
.flox/env/manifest.toml (1)
24-24: Add POSIX-compliant trailing newline. Reintroducing a final newline improves compatibility with Unix tools and editors.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (3)
.flox/env/manifest.lockis excluded by!**/*.lockplatform/stack.yaml.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock
📒 Files selected for processing (32)
.flox/.gitignore(0 hunks).flox/env.json(1 hunks).flox/env/manifest.toml(1 hunks).github/CODE_OF_CONDUCT.md(0 hunks).github/CONTRIBUTING.md(0 hunks).github/PULL_REQUEST_TEMPLATE.md(0 hunks).github/SECURITY.md(0 hunks).github/workflows/lint.yaml(0 hunks).github/workflows/stale.yaml(0 hunks).github/workflows/test.yaml(0 hunks).gitignore(1 hunks).mise.toml(0 hunks)README.md(1 hunks)index.html(0 hunks)infrastructure/Pulumi.prod.yaml(0 hunks)infrastructure/Pulumi.yaml(0 hunks)infrastructure/__main__.py(0 hunks)infrastructure/cloud_run.py(0 hunks)infrastructure/project.py(0 hunks)infrastructure/pyproject.toml(0 hunks)infrastructure/topics.py(0 hunks)platform/Dockerfile(0 hunks)platform/Setup.hs(0 hunks)platform/app/Main.hs(0 hunks)platform/compose.yaml(0 hunks)platform/package.yaml(0 hunks)platform/platform.cabal(0 hunks)platform/src/Account.hs(0 hunks)platform/src/Lib.hs(0 hunks)platform/stack.yaml(0 hunks)platform/test/Spec.hs(0 hunks)pyproject.toml(0 hunks)
💤 Files with no reviewable changes (28)
- .github/CONTRIBUTING.md
- platform/compose.yaml
- .github/CODE_OF_CONDUCT.md
- infrastructure/topics.py
- infrastructure/main.py
- platform/app/Main.hs
- .github/PULL_REQUEST_TEMPLATE.md
- infrastructure/Pulumi.yaml
- infrastructure/project.py
- platform/stack.yaml
- .github/workflows/stale.yaml
- infrastructure/Pulumi.prod.yaml
- platform/Setup.hs
- infrastructure/pyproject.toml
- .flox/.gitignore
- platform/src/Lib.hs
- .mise.toml
- pyproject.toml
- index.html
- .github/workflows/test.yaml
- platform/test/Spec.hs
- platform/Dockerfile
- .github/workflows/lint.yaml
- .github/SECURITY.md
- platform/package.yaml
- platform/platform.cabal
- platform/src/Account.hs
- infrastructure/cloud_run.py
🔇 Additional comments (2)
.gitignore (1)
2-4: Approve simplified ignore patterns. Retaining only.DS_Storeand the relevant.floxsubdirectories aligns perfectly with the new minimal project structure..flox/env/manifest.toml (1)
1-23: Approve manifest cleanup. The removal of Haskell and Pulumi package paths aligns with the PR’s objective to strip out unused dependencies and tooling.
There was a problem hiding this comment.
Actionable comments posted: 5
🧹 Nitpick comments (4)
application/datamanager/Dockerfile (1)
19-19: Consider adding health check to Dockerfile.Adding a HEALTHCHECK instruction would improve container orchestration by allowing Docker to monitor the application's health.
+HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 CMD curl -f http://localhost:8080/health || exit 1 ENTRYPOINT ["uv", "run", "uvicorn", "application.datamanager.src.datamanager.main:application", "--host", "0.0.0.0", "--port", "8080"].mise.toml (1)
16-23: Docker run task could use additional container options.The run task is good but could benefit from some improvements for development use cases.
[tasks."application:service:run"] description = "Run the application service" run = """ docker run \ --env-file .env \ --publish 8080:8080 \ +--rm \ +--name {{arg(name="service_name")}} \ pocketsizefund/{{arg(name="service_name")}}:latest \ """Adding
--rmwould automatically remove the container when it stops, and--namewould make it easier to reference the running container in other commands.application/datamanager/src/datamanager/main.py (2)
91-101: Consider using environment configuration pattern.Environment variables are loaded directly at module level. Consider using a configuration pattern with validation.
+from pydantic import BaseSettings, Field + +class Settings(BaseSettings): + gcp_key_id: str = Field("", env="GCP_KEY_ID") + gcp_secret: str = Field("", env="GCP_SECRET") + gcp_gcs_bucket: str = Field("", env="GCP_GCS_BUCKET") + + class Config: + env_file = ".env" + application = FastAPI() -gcp_key_id = os.getenv("GCP_KEY_ID") -gcp_secret = os.getenv("GCP_SECRET") -gcp_gcs_bucket = os.getenv("GCP_GCS_BUCKET") +settings = Settings() database = Database( - gcp_key_id=gcp_key_id, - gcp_secret=gcp_secret, - gcp_gcs_bucket=gcp_gcs_bucket, + gcp_key_id=settings.gcp_key_id, + gcp_secret=settings.gcp_secret, + gcp_gcs_bucket=settings.gcp_gcs_bucket, )
1-6: Add missing typing imports.The code uses types in function signatures but doesn't import the typing module.
from fastapi import FastAPI import duckdb import polars as pl from datetime import datetime, timedelta import os +from typing import List, Dict, Any
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (10)
.github/ISSUE_TEMPLATE/BUG.md(1 hunks).github/ISSUE_TEMPLATE/FEATURE.md(1 hunks).github/PULL_REQUEST_TEMPLATE.md(0 hunks).gitignore(1 hunks).mise.toml(1 hunks)application/datamanager/.dockerignore(1 hunks)application/datamanager/Dockerfile(1 hunks)application/datamanager/pyproject.toml(1 hunks)application/datamanager/src/datamanager/main.py(1 hunks)pyproject.toml(1 hunks)
💤 Files with no reviewable changes (1)
- .github/PULL_REQUEST_TEMPLATE.md
✅ Files skipped from review due to trivial changes (4)
- application/datamanager/.dockerignore
- .github/ISSUE_TEMPLATE/FEATURE.md
- .github/ISSUE_TEMPLATE/BUG.md
- application/datamanager/pyproject.toml
🚧 Files skipped from review as they are similar to previous changes (1)
- pyproject.toml
🔇 Additional comments (7)
.gitignore (1)
1-5: LGTM! Clean and focused .gitignore file.The simplified .gitignore file is now focused only on the essential patterns needed for the Python-based rebuild, matching the PR objective of starting from scratch with minimal resources.
application/datamanager/Dockerfile (4)
1-1: Good choice of base image.Using Python 3.13-slim as the base image is a good choice for minimizing container size while using the latest Python version.
3-3: Great choice using uv!Copying the
uvbinary from a separate image is an excellent approach. Theuvtool is significantly faster than pip and provides better dependency resolution.
5-7: Best practice for apt operations.Following best practices by combining apt commands and cleaning up cache in a single layer, which reduces image size.
11-15: Good dependency caching strategy.Copying just the pyproject.toml before the application code allows Docker to cache the dependency installation layer, which speeds up builds when only application code changes.
.mise.toml (2)
1-4: Good dependency management approach.Using
uv syncfor Python dependency management is an excellent choice for speed and reliability.
5-14: Well-structured service build task.The parameterized build task provides a clean way to handle multiple services with a single task definition. Good use of timestamped tags along with the latest tag.
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (5)
.mise.toml (5)
6-6: Consistent property spacing
Usedescription = "Format Python code"instead ofdescription="Format Python code"to match the spacing style used in other tasks.
11-11: Consistent property spacing
Usedescription = "Check for dead Python code"instead ofdescription="Check for dead Python code"for uniformity.
21-21: Consistent property spacing
Usedescription = "Run Python code quality checks"instead ofdescription="Run Python code quality checks".
28-36: Restrict Docker build context & pull latest base image
Building from.will send the entire repo (including any unwanted files) to the daemon, potentially slowing builds. Also, add--pullto ensure you’re using the latest base image. For example:run = """ TIMESTAMP=$(date +%Y%m%d) -docker build \ - --file application/{{arg(name="service_name")}}/Dockerfile \ - --tag pocketsizefund/{{arg(name="service_name")}}:latest \ - --tag pocketsizefund/{{arg(name="service_name")}}:${TIMESTAMP} \ - . +docker build --pull \ + --file application/{{arg(name="service_name")}}/Dockerfile \ + --tag pocketsizefund/{{arg(name="service_name")}}:latest \ + --tag pocketsizefund/{{arg(name="service_name")}}:${TIMESTAMP} \ + application/{{arg(name="service_name")}} """This change narrows your build context to the service folder and keeps the base image up-to-date.
39-45: Parameterize port mapping & streamline container run
Exposing a hard-coded8080:8080can lead to conflicts when multiple services run concurrently. Consider making the host port an argument and adding cleanup/detached flags:run = """ -docker run \ - --env-file .env \ - --publish 8080:8080 \ - pocketsizefund/{{arg(name="service_name")}}:latest \ -""" +docker run --rm -d \ + --env-file .env \ + --publish {{arg(name="host_port")}}:8080 \ + pocketsizefund/{{arg(name="service_name")}}:latest \ +"""You might also reintroduce a generic
docker-composetask for orchestrating multi-service setups.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
.mise.toml(2 hunks)
🔇 Additional comments (1)
.mise.toml (1)
1-3: Check for CLI tool availability
Ensure theuvcommand is installed and available in all environments (CI, local dev). If this is a custom alias or part of a specific toolkit, document it or add a fallback (e.g.,pip install -r requirements.txtor switch to a more common installer likepip-sync).
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (2)
.github/workflows/stale.yaml (1)
24-24: Add newline at end of file.YAML files should end with a single newline to satisfy POSIX standards and avoid lint errors.
🧰 Tools
🪛 YAMLlint (1.35.1)
[error] 24-24: no new line character at the end of file
(new-line-at-end-of-file)
.mise.toml (1)
45-54: Consider adding--pullto docker build.To ensure you always use the latest base images, you could add
--pull. Example diff:docker build \ - --file application/{{arg(name="service_name")}}/Dockerfile \ + --pull \ + --file application/{{arg(name="service_name")}}/Dockerfile \ --tag pocketsizefund/{{arg(name="service_name")}}:latest \ --tag pocketsizefund/{{arg(name="service_name")}}:${TIMESTAMP} \ .
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (8)
.github/workflows/quality.yaml(1 hunks).github/workflows/stale.yaml(2 hunks).github/workflows/test.yaml(1 hunks).gitignore(1 hunks).mise.toml(2 hunks).pre-commit-config.yaml(1 hunks)README.md(1 hunks)pyproject.toml(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- .gitignore
- README.md
- pyproject.toml
🧰 Additional context used
🪛 actionlint (1.7.4)
.github/workflows/test.yaml
12-12: the runner of "actions/setup-python@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
.github/workflows/quality.yaml
12-12: the runner of "actions/setup-python@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
🪛 YAMLlint (1.35.1)
.github/workflows/stale.yaml
[error] 24-24: no new line character at the end of file
(new-line-at-end-of-file)
🔇 Additional comments (11)
.github/workflows/stale.yaml (1)
5-7: Approve permissions configuration.Defining
issues: writeandpull-requests: writeat the workflow root correctly scopes permissions for the stale action..github/workflows/quality.yaml (2)
12-13: Skip actionlint false positive for setup-python.
actions/setup-python@v4is the current recommended major version and is fully supported. You can safely ignore this actionlint warning.🧰 Tools
🪛 actionlint (1.7.4)
12-12: the runner of "actions/setup-python@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
1-25: Workflow setup is correct.All steps correctly set up Python 3.13, install and configure
uvandmise, and run the lint task as intended.🧰 Tools
🪛 actionlint (1.7.4)
12-12: the runner of "actions/setup-python@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
.mise.toml (6)
1-4: Approve python:install task.The
python:installtask correctly installs dependencies usinguv sync --all-packages.
5-8: Approve python:format task.The
python:formattask is properly configured to format code withruff format.
9-17: Approve python:dead-code task.The
dead-codecheck withvultureis set up correctly with appropriate exclusion patterns.
19-27: Approve python:lint task.
ruff checkis correctly configured to run code quality checks with GitHub output formatting.
28-44: Approve python:test task.The coverage steps (
run,report,xml) are well-defined for parallel coverage collection and reporting.
56-63: Approve application:service:run task.The
docker runconfiguration correctly uses environment variables and port mapping..github/workflows/test.yaml (2)
12-13: Skip actionlint false positive for setup-python.
actions/setup-python@v4is fully supported and correct. Ignore this warning.🧰 Tools
🪛 actionlint (1.7.4)
12-12: the runner of "actions/setup-python@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
1-32: Workflow changes are appropriate.The test and coverage workflow correctly sets up Python 3.13, installs
uvandmise, runs tests, and uploads coverage to Coveralls.🧰 Tools
🪛 actionlint (1.7.4)
12-12: the runner of "actions/setup-python@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (2)
.mise.toml (2)
1-3: Introducingpython:installtask
The new task correctly bootstraps Python dependencies usinguv sync --all-packages. Consider adding a cache mechanism (e.g., leveraging pip’s cache or preserving a virtual environment directory) to speed up CI and local iterations.
59-66: Declareservice_nameargument for run task (and consider detach)
Similarly, define theservice_nameargument here for consistency. Optionally, you may add-dto detach the container by default.[tasks."application:service:run"] +args = ["service_name"] description = "Run the application service" run = """ docker run \ --env-file .env \ --publish 8080:8080 \ pocketsizefund/{{arg(name="service_name")}}:latest """
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
.mise.toml(2 hunks)
🔇 Additional comments (3)
.mise.toml (3)
6-6: Formatting task configuration is solid
Thepython:formattask usingruff formatis clear and effective for automatic code styling.
11-11: Dead-code detection is well-configured
python:dead-codeleverages Vulture with a high confidence threshold and excludes common folders—good balance between noise and accuracy.
21-21: Lint task dependency and description look good
Chainingpython:lintafterpython:dead-codeensures cleanup before static analysis.
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (2)
application/datamanager/tests/test_main.py (2)
2-2: Consider simplifying the import path.The import path
from application.datamanager.src.datamanager.main import applicationis unusually deep and repeats "datamanager" twice. This might indicate a suboptimal package structure.Consider restructuring the project to simplify imports, perhaps to something like:
-from application.datamanager.src.datamanager.main import application +from datamanager.main import applicationThis would require adjusting your package structure and ensuring proper Python path configuration.
6-6: Remove unnecessary blank line.There are two consecutive blank lines before the test function definition. One is sufficient according to PEP 8 style guidelines.
- def test_health_check():
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (3)
.gitignore(1 hunks)application/datamanager/tests/test_main.py(1 hunks)pyproject.toml(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- .gitignore
🧰 Additional context used
🪛 GitHub Actions: Test and coverage check
application/datamanager/tests/test_main.py
[error] 1-1: ModuleNotFoundError: No module named 'fastapi'. The test module failed to import due to missing dependency 'fastapi'.
🔇 Additional comments (4)
application/datamanager/tests/test_main.py (1)
7-10: LGTM: Health check test is well-structured.This test function correctly validates both the status code and response body of the health endpoint.
pyproject.toml (3)
15-16:Details
✅ Verification successful
Verify workspace source configuration.
The new
[tool.uv.sources]section withdatamanager = { workspace = true }suggests usinguvfor dependency management. Ensure this configuration is correct and that the team is familiar withuvusage.
🏁 Script executed:
#!/bin/bash # Check if uv is mentioned in any documentation or configuration files find . -type f -name "*.md" -o -name "*.yaml" -o -name "*.toml" | xargs grep -l "uv" | grep -v "pyproject.toml"Length of output: 211
🏁 Script executed:
#!/bin/bash set -euo pipefail echo "🔍 Searching for ‘tool.uv’ references across the repo" rg -n "tool\.uv" || echo "No matches for tool.uv found" echo echo "📄 Showing top 200 lines of .mise.toml to inspect uv usage" sed -n '1,200p' .mise.toml || echo ".mise.toml not found" echo echo "📄 Showing top 200 lines of .github/workflows/quality.yaml to inspect uv steps" sed -n '1,200p' .github/workflows/quality.yaml || echo "quality.yaml not found" echo echo "📄 Showing top 200 lines of .github/workflows/test.yaml to inspect uv steps" sed -n '1,200p' .github/workflows/test.yaml || echo "test.yaml not found" echo echo "📄 Showing top 200 lines of .flox/env/manifest.toml to inspect uv config" sed -n '1,200p' .flox/env/manifest.toml || echo "manifest.toml not found"Length of output: 4283
Workspace Source Configuration Verified
- Confirmed extensive uv usage in the repo:
•.mise.tomltasks invokeuv syncanduv run …
• CI workflows install uv viaastral-sh/setup-uv@v3and run tasks with mise
•.flox/env/manifest.tomldefinesuv.pkg-path = "uv"- The new
[tool.uv.sources] datamanager = { workspace = true }correctly overrides thedatamanagerpackage to use the local workspace.- No further changes required.
12-13:Details
✅ Verification successful
Infrastructure replacement verification.
The workspace members have changed from
["infrastructure"]to["application/datamanager"], indicating a significant architectural shift. Make sure that all functionality previously in the infrastructure module has been either migrated or intentionally removed.
🏁 Script executed:
#!/bin/bash # Check if there are any references to the old infrastructure module git ls-files | xargs grep -l "infrastructure" | grep -v "pyproject.toml"Length of output: 70
I’ll double-check whether the old
infrastructuredirectory or files still exist in the repo.
🏁 Script executed:
#!/usr/bin/env bash # Verify if any files or directories under "infrastructure/" remain tracked git ls-files | grep '^infrastructure/'Length of output: 64
Infrastructure module removal verified.
A search confirms that the only remaining file under
infrastructure/is.gitkeepand there are no references to “infrastructure” elsewhere in the repo. The old module’s code has been fully migrated or removed. You may delete the emptyinfrastructure/directory (and its.gitkeep) if it’s no longer needed.
5-5:Details
❓ Verification inconclusive
Verify Python 3.13 requirement.
Python 3.13 is a very recent version requirement which might limit adoption and compatibility. Ensure this is intentional and necessary for your project.
🏁 Script executed:
#!/bin/bash # Check current Python versions in GitHub Actions cat .github/workflows/test.yaml | grep -i python # Check if any specific Python 3.13 features are being used find application -name "*.py" | xargs grep -l "match" | head -5Length of output: 381
🌐 Web query:
When was Python 3.13 released and what is its adoption rate?💡 Result:
Python 3.13 Release Date
Python 3.13 was officially released on October 7, 2024[2][3][5][10]. This version was initially scheduled for October 1, 2024, but the release was delayed by a week to address last-minute issues discovered during testing[3][5].
Adoption Rate of Python 3.13
As of May 2025, Python 3.13 adoption is progressing but is not yet universal among developers and organizations. Here are key points about its adoption:
- Staged Adoption Typical: Historically, new Python versions see gradual adoption as libraries and tools update support. The initial recommendation for most production environments was to wait until all critical dependencies officially supported Python 3.13[8].
- Ecosystem Support Improving: By the time of the first maintenance releases (3.13.1 in December 2024 and 3.13.2 in February 2025), most widely used packages had started supporting 3.13, making it feasible for many projects to upgrade[8][6].
- Industry Adoption: There are no precise, up-to-date statistics on adoption rates specifically for Python 3.13 as of May 2025 in the public search results. However, expert commentary suggests that adoption is accelerating now that major libraries and tools have been updated, and more projects are beginning to use 3.13, especially to leverage new features like improved interpreter performance and experimental free-threaded mode[8][6].
"Now that 3.13.1 has come out, you can both get the bug fixes and most packages will be updated, so it’s worth trying to upgrade. If the dependencies you require are still missing 3.13 support, keep trying again every month or two."[8]
Summary Table
Python Version Official Release Date Typical Adoption Status (as of May 2025) 3.13 October 7, 2024 Increasing, but not universal; major projects updating[8][6] Conclusion
Python 3.13 was released on October 7, 2024. Its adoption rate is steadily increasing, especially following bug-fix releases and wider support across major Python libraries, but it is not yet the default choice in all environments as of mid-2025. Deliberate upgrade pacing is common in the Python ecosystem to ensure compatibility and stability[8][6].
Citations:
- 1: https://peps.python.org/pep-0719/
- 2: https://www.python.org/downloads/release/python-3130/
- 3: https://flyaps.com/blog/update-python-3-13/
- 4: https://www.python.org/downloads/release/python-3130rc3/
- 5: https://realpython.com/python313-new-features/
- 6: https://realpython.com/python-news-march-2025/
- 7: https://www.infoq.com/news/2024/10/python-313-latest-features/
- 8: https://pythonspeed.com/articles/upgrade-python-3.13/
- 9: https://blog.jetbrains.com/pycharm/2024/10/python-3-13-and-the-latest-trends-a-developer-s-guide-to-2025/
- 10: https://docs.python.org/3/whatsnew/3.13.html
Confirm Python ≥3.13 Requirement
Please verify that locking the minimum Python version to 3.13 is intentional:
- pyproject.toml (requires-python = ">=3.13")
- .github/workflows/test.yaml is already using
python-version: "3.13".- No Python 3.13-only syntax (e.g. new pattern-matching constructs) was found in the application code.
- Python 3.13 was released on October 7, 2024; adoption is growing but not yet universal.
If you rely on new features or performance improvements in 3.13, this requirement is reasonable. Otherwise, consider lowering the bound (for example to 3.11+) to maximize compatibility.
Changes
Comments
Starting from scratch in Python for the rebuild sprint.
Summary by CodeRabbit