diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml
index 07805b1e..ac975048 100644
--- a/.github/workflows/build_wheels.yml
+++ b/.github/workflows/build_wheels.yml
@@ -40,7 +40,7 @@ jobs:
arch: x86_64
- version: 14
arch: arm64
- python-version: [cp38, cp39, cp310, cp311, cp312]
+ python-version: [cp38, cp39, cp310, cp311, cp312, cp313]
steps:
- name: Checkout
@@ -85,7 +85,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest]
- python-version: [cp38, cp39, cp310, cp311, cp312]
+ python-version: [cp38, cp39, cp310, cp311, cp312, cp313]
steps:
- name: Checkout
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6f7a7686..b4a6018f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -16,7 +16,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-24.04]
- python: ["3.8", "3.9", "3.10", "3.11", "3.12"]
+ python: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
compiler:
# Newest gcc on 24.04
- C: gcc-14
@@ -37,7 +37,7 @@ jobs:
warning_options: "-Wall;-Wextra;-Werror"
# gcc 14 (Newest gcc available on Ubuntu 24.04)
- os: ubuntu-24.04
- python: "3.12"
+ python: "3.13"
compiler:
C: gcc-14
CXX: g++-14
@@ -54,7 +54,7 @@ jobs:
warning_options: "-Wall;-Wextra;-Werror"
# Clang 19 (Newest clang available on Ubuntu 24.04)
- os: ubuntu-24.04
- python: "3.12"
+ python: "3.13"
compiler:
C: clang-19
CXX: clang++-19
diff --git a/.github/workflows/test_editable_pip_install.yml b/.github/workflows/test_editable_pip_install.yml
index 0d0a6281..4a3bb706 100644
--- a/.github/workflows/test_editable_pip_install.yml
+++ b/.github/workflows/test_editable_pip_install.yml
@@ -26,7 +26,7 @@ jobs:
name: Set up user-managed python
uses: actions/setup-python@v5
with:
- python-version: '3.11'
+ python-version: '3.13'
- name: Upgrade versions
run: |
@@ -67,9 +67,9 @@ jobs:
- name: Set expected install locations for macos
if: ${{ matrix.os == 'macos-latest' }}
run: |
- echo CC_SYM_LOCATION=/Users/runner/work/${{ github.event.repository.name }}/${{ github.event.repository.name }}/cc_sym.cpython-311-darwin.so >> $GITHUB_ENV
- echo SYM_LOCATION=/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/sym/__init__.py >> $GITHUB_ENV
- echo SKYMARSHAL_LOCATION=/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/skymarshal/__init__.py >> $GITHUB_ENV
+ echo CC_SYM_LOCATION=/Users/runner/work/${{ github.event.repository.name }}/${{ github.event.repository.name }}/cc_sym.cpython-313-darwin.so >> $GITHUB_ENV
+ echo SYM_LOCATION=/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.11/site-packages/sym/__init__.py >> $GITHUB_ENV
+ echo SKYMARSHAL_LOCATION=/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.11/site-packages/skymarshal/__init__.py >> $GITHUB_ENV
echo SYMENGINE_LOCATION=/Users/runner/work/${{ github.event.repository.name }}/${{ github.event.repository.name }}/third_party/symenginepy/symengine/__init__.py >> $GITHUB_ENV
echo LCMTYPES_SYM_LOCATION=/Users/runner/work/${{ github.event.repository.name }}/${{ github.event.repository.name }}/lcmtypes_build/lcmtypes/sym/__init__.py >> $GITHUB_ENV
echo LCMTYPES_EIGEN_LCM_LOCATION=/Users/runner/work/${{ github.event.repository.name }}/${{ github.event.repository.name }}/lcmtypes_build/lcmtypes/eigen_lcm/__init__.py >> $GITHUB_ENV
diff --git a/README.md b/README.md
index 05b4d6c4..f93caa73 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
-
+
diff --git a/pyproject.toml b/pyproject.toml
index b365d65e..d19a085b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -34,6 +34,7 @@ classifiers = [
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: C++",
"License :: OSI Approved :: Apache Software License",
diff --git a/requirements_dev_py313.txt b/requirements_dev_py313.txt
new file mode 100644
index 00000000..ca04415e
--- /dev/null
+++ b/requirements_dev_py313.txt
@@ -0,0 +1,331 @@
+# This file was autogenerated by uv via the following command:
+# python test/symforce_requirements_test.py --update
+alabaster==1.0.0
+ # via sphinx
+argh==0.31.3
+ # via
+ # symforce (pyproject.toml)
+ # skymarshal
+asttokens==3.0.0
+ # via stack-data
+attrs==25.3.0
+ # via
+ # jsonschema
+ # referencing
+babel==2.17.0
+ # via sphinx
+beautifulsoup4==4.13.3
+ # via
+ # furo
+ # nbconvert
+bleach==6.2.0
+ # via nbconvert
+breathe==4.36.0
+ # via symforce (pyproject.toml)
+certifi==2025.1.31
+ # via requests
+charset-normalizer==3.4.1
+ # via requests
+clang-format==20.1.0
+ # via symforce (pyproject.toml)
+cmake==3.26.4
+ # via symforce (pyproject.toml)
+comm==0.2.2
+ # via ipykernel
+contourpy==1.3.1
+ # via matplotlib
+coverage==7.7.0
+ # via symforce (pyproject.toml)
+cycler==0.12.1
+ # via matplotlib
+cython==0.29.37
+ # via symforce (pyproject.toml)
+debugpy==1.8.13
+ # via ipykernel
+decorator==5.2.1
+ # via ipython
+defusedxml==0.7.1
+ # via nbconvert
+docutils==0.21.2
+ # via
+ # myst-parser
+ # nbsphinx
+ # sphinx
+executing==2.2.0
+ # via stack-data
+fastjsonschema==2.21.1
+ # via nbformat
+fonttools==4.56.0
+ # via matplotlib
+furo==2024.8.6
+ # via symforce (pyproject.toml)
+graphviz==0.20.3
+ # via symforce (pyproject.toml)
+idna==3.10
+ # via requests
+imagesize==1.4.1
+ # via sphinx
+ipykernel==6.29.5
+ # via symforce (pyproject.toml)
+ipython==9.0.2
+ # via ipykernel
+ipython-genutils==0.2.0
+ # via symforce (pyproject.toml)
+ipython-pygments-lexers==1.1.1
+ # via ipython
+jedi==0.19.2
+ # via ipython
+jinja2==3.1.6
+ # via
+ # symforce (pyproject.toml)
+ # myst-parser
+ # nbconvert
+ # nbsphinx
+ # skymarshal
+ # sphinx
+jsonschema==4.23.0
+ # via nbformat
+jsonschema-specifications==2024.10.1
+ # via jsonschema
+jupyter-client==8.6.3
+ # via
+ # ipykernel
+ # nbclient
+jupyter-core==5.7.2
+ # via
+ # ipykernel
+ # jupyter-client
+ # nbclient
+ # nbconvert
+ # nbformat
+jupyterlab-pygments==0.3.0
+ # via nbconvert
+kiwisolver==1.4.8
+ # via matplotlib
+llvmlite==0.44.0
+ # via numba
+markdown-it-py==3.0.0
+ # via
+ # mdit-py-plugins
+ # myst-parser
+markupsafe==3.0.2
+ # via
+ # jinja2
+ # nbconvert
+matplotlib==3.10.1
+ # via symforce (pyproject.toml)
+matplotlib-inline==0.1.7
+ # via
+ # ipykernel
+ # ipython
+mdit-py-plugins==0.4.2
+ # via myst-parser
+mdurl==0.1.2
+ # via markdown-it-py
+mistune==3.1.2
+ # via nbconvert
+mpmath==1.3.0
+ # via sympy
+mypy==1.11.2
+ # via symforce (pyproject.toml)
+mypy-extensions==1.0.0
+ # via mypy
+myst-parser==4.0.1
+ # via symforce (pyproject.toml)
+narwhals==1.30.0
+ # via plotly
+nbclient==0.10.2
+ # via nbconvert
+nbconvert==7.16.6
+ # via nbsphinx
+nbformat==5.10.4
+ # via
+ # nbclient
+ # nbconvert
+ # nbsphinx
+ # nbstripout
+nbsphinx==0.9.7
+ # via symforce (pyproject.toml)
+nbstripout==0.8.1
+ # via symforce (pyproject.toml)
+nest-asyncio==1.6.0
+ # via ipykernel
+numba==0.61.0
+ # via symforce (pyproject.toml)
+numpy==1.26.4
+ # via
+ # symforce (pyproject.toml)
+ # contourpy
+ # matplotlib
+ # numba
+ # pandas
+ # scipy
+ # skymarshal
+ # symforce-sym
+packaging==24.2
+ # via
+ # ipykernel
+ # matplotlib
+ # nbconvert
+ # plotly
+ # setuptools-scm
+ # sphinx
+pandas==2.2.3
+ # via symforce (pyproject.toml)
+pandocfilters==1.5.1
+ # via nbconvert
+parso==0.8.4
+ # via jedi
+pexpect==4.9.0
+ # via ipython
+pillow==11.1.0
+ # via matplotlib
+pip==25.0.1
+ # via symforce (pyproject.toml)
+platformdirs==4.3.6
+ # via jupyter-core
+plotly==6.0.0
+ # via symforce (pyproject.toml)
+ply==3.11
+ # via skymarshal
+prompt-toolkit==3.0.50
+ # via ipython
+psutil==7.0.0
+ # via ipykernel
+ptyprocess==0.7.0
+ # via pexpect
+pure-eval==0.2.3
+ # via stack-data
+pybind11-stubgen==2.5.3
+ # via symforce (pyproject.toml)
+pygments==2.19.1
+ # via
+ # furo
+ # ipython
+ # ipython-pygments-lexers
+ # nbconvert
+ # sphinx
+pyparsing==3.2.1
+ # via matplotlib
+python-dateutil==2.9.0.post0
+ # via
+ # jupyter-client
+ # matplotlib
+ # pandas
+pytz==2025.1
+ # via pandas
+pyyaml==6.0.2
+ # via myst-parser
+pyzmq==26.3.0
+ # via
+ # ipykernel
+ # jupyter-client
+referencing==0.36.2
+ # via
+ # jsonschema
+ # jsonschema-specifications
+requests==2.32.3
+ # via sphinx
+rpds-py==0.23.1
+ # via
+ # jsonschema
+ # referencing
+ruff==0.9.10
+ # via symforce (pyproject.toml)
+scipy==1.15.2
+ # via symforce (pyproject.toml)
+setuptools==76.0.0
+ # via
+ # symforce (pyproject.toml)
+ # setuptools-scm
+ # types-setuptools
+setuptools-scm==8.2.0
+ # via symforce (pyproject.toml)
+six==1.17.0
+ # via python-dateutil
+file:./third_party/skymarshal
+ # via symforce (pyproject.toml)
+snowballstemmer==2.2.0
+ # via sphinx
+soupsieve==2.6
+ # via beautifulsoup4
+sphinx==8.1.3
+ # via
+ # symforce (pyproject.toml)
+ # breathe
+ # furo
+ # myst-parser
+ # nbsphinx
+ # sphinx-basic-ng
+ # sphinx-copybutton
+ # sphinxext-opengraph
+sphinx-basic-ng==1.0.0b2
+ # via furo
+sphinx-copybutton==0.5.2
+ # via symforce (pyproject.toml)
+sphinxcontrib-applehelp==2.0.0
+ # via sphinx
+sphinxcontrib-devhelp==2.0.0
+ # via sphinx
+sphinxcontrib-htmlhelp==2.1.0
+ # via sphinx
+sphinxcontrib-jsmath==1.0.1
+ # via sphinx
+sphinxcontrib-qthelp==2.0.0
+ # via sphinx
+sphinxcontrib-serializinghtml==2.0.0
+ # via sphinx
+sphinxext-opengraph==0.9.1
+ # via symforce (pyproject.toml)
+stack-data==0.6.3
+ # via ipython
+file:./gen/python
+ # via symforce (pyproject.toml)
+sympy==1.11.1
+ # via symforce (pyproject.toml)
+tinycss2==1.4.0
+ # via bleach
+tornado==6.4.2
+ # via
+ # ipykernel
+ # jupyter-client
+traitlets==5.14.3
+ # via
+ # comm
+ # ipykernel
+ # ipython
+ # jupyter-client
+ # jupyter-core
+ # matplotlib-inline
+ # nbclient
+ # nbconvert
+ # nbformat
+ # nbsphinx
+types-jinja2==2.11.9
+ # via symforce (pyproject.toml)
+types-markupsafe==1.1.10
+ # via types-jinja2
+types-requests==2.32.0.20250306
+ # via symforce (pyproject.toml)
+types-setuptools==76.0.0.20250313
+ # via symforce (pyproject.toml)
+typing-extensions==4.12.2
+ # via
+ # beautifulsoup4
+ # mypy
+tzdata==2025.1
+ # via pandas
+urllib3==2.3.0
+ # via
+ # requests
+ # types-requests
+uv==0.6.6
+ # via symforce (pyproject.toml)
+wcwidth==0.2.13
+ # via prompt-toolkit
+webencodings==0.5.1
+ # via
+ # bleach
+ # tinycss2
+wheel==0.45.1
+ # via symforce (pyproject.toml)
diff --git a/test/symforce_requirements_test.py b/test/symforce_requirements_test.py
index 71c47416..44b53636 100644
--- a/test/symforce_requirements_test.py
+++ b/test/symforce_requirements_test.py
@@ -139,6 +139,10 @@ def test_dev_requirements_py312(self) -> None:
self.check_dev_requirements_for_version(12)
@requires_source_build
+ @sympy_only
+ def test_dev_requirements_py313(self) -> None:
+ self.check_dev_requirements_for_version(13)
+
@sympy_only
def test_build_requirements(self) -> None:
"""