From 6dd84456013f7d1f5448f19bc83f6ac224038714 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 1 Apr 2025 18:20:02 +0100 Subject: [PATCH 01/21] Run tests on 3.14 --- .github/workflows/test.yml | 1 + noxfile.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6f544df95a..b34c57c11b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -62,6 +62,7 @@ jobs: 3.11 3.12 3.13 + 3.14-dev - run: pip install poetry nox nox-poetry uv - run: nox -r -t tests -s "${{ matrix.session.session }}" diff --git a/noxfile.py b/noxfile.py index 0eec7d66d6..5bda8cc3fc 100644 --- a/noxfile.py +++ b/noxfile.py @@ -8,7 +8,7 @@ nox.options.error_on_external_run = True nox.options.default_venv_backend = "uv" -PYTHON_VERSIONS = ["3.13", "3.12", "3.11", "3.10", "3.9"] +PYTHON_VERSIONS = ["3.14", "3.13", "3.12", "3.11", "3.10"] GQL_CORE_VERSIONS = [ "3.2.3", From e16bcda81fc7e2b77ad5cb7eb4bfdf224ef29daa Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Wed, 16 Jul 2025 00:34:04 +0200 Subject: [PATCH 02/21] Fix deps --- poetry.lock | 150 ++++++++++++++++++++++++------------------------- pyproject.toml | 5 ++ 2 files changed, 80 insertions(+), 75 deletions(-) diff --git a/poetry.lock b/poetry.lock index 436b1f3da2..63ca2e9e73 100644 --- a/poetry.lock +++ b/poetry.lock @@ -154,7 +154,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -166,7 +166,7 @@ version = "1.89.0" description = "Python wrapper for loading Jason Hood's ANSICON" optional = false python-versions = "*" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] markers = "platform_system == \"Windows\"" files = [ {file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"}, @@ -264,7 +264,7 @@ version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, @@ -332,7 +332,7 @@ version = "1.11.1" description = "Function decoration for backoff and retry" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "backoff-1.11.1-py2.py3-none-any.whl", hash = "sha256:61928f8fa48d52e4faa81875eecf308eccfb1016b018bb6bd21e05b5d90a96c5"}, {file = "backoff-1.11.1.tar.gz", hash = "sha256:ccb962a2378418c667b3c979b504fdeb7d9e0d29c0579e3b13b86467177728cb"}, @@ -408,7 +408,7 @@ version = "1.21.0" description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities." optional = false python-versions = ">=2.7" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "blessed-1.21.0-py2.py3-none-any.whl", hash = "sha256:f831e847396f5a2eac6c106f4dfadedf46c4f804733574b15fe86d2ed45a9588"}, {file = "blessed-1.21.0.tar.gz", hash = "sha256:ece8bbc4758ab9176452f4e3a719d70088eb5739798cd5582c9e05f2a28337ec"}, @@ -507,7 +507,7 @@ version = "24.1.3" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "cattrs-24.1.3-py3-none-any.whl", hash = "sha256:adf957dddd26840f27ffbd060a6c4dd3b2192c5b7c2c0525ef1bd8131d8a83f5"}, {file = "cattrs-24.1.3.tar.gz", hash = "sha256:981a6ef05875b5bb0c7fb68885546186d306f10f0f6718fe9b96c226e68821ff"}, @@ -534,7 +534,7 @@ version = "2025.4.26" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, @@ -676,7 +676,7 @@ version = "3.4.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["codeflash", "dev"] files = [ {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, @@ -794,7 +794,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -809,7 +809,7 @@ version = "0.15.4" description = "Client for codeflash.ai - automatic code performance optimization, powered by AI" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "codeflash-0.15.4.tar.gz", hash = "sha256:a3b9c19dafc0c1822ec5c9a13a88386e663d56e8432223749907f488fa57ae27"}, ] @@ -848,12 +848,12 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\" or os_name == \"nt\"", integrations = "platform_system == \"Windows\" or sys_platform == \"win32\""} +markers = {main = "platform_system == \"Windows\"", codeflash = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\" or os_name == \"nt\"", integrations = "platform_system == \"Windows\" or sys_platform == \"win32\""} [[package]] name = "colorlog" @@ -891,7 +891,7 @@ version = "7.8.2" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["codeflash", "dev"] files = [ {file = "coverage-7.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd8ec21e1443fd7a447881332f7ce9d35b8fbd2849e761bb290b584535636b0a"}, {file = "coverage-7.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26c2396674816deaeae7ded0e2b42c26537280f8fe313335858ffff35019be"}, @@ -986,7 +986,7 @@ version = "0.0.87" description = "Analyze Python code for correctness using symbolic execution." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "crosshair_tool-0.0.87-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2c0c0fef5da45092773c0f0a47471704f7211bbde668ef684ff4f3bc69529a7a"}, {file = "crosshair_tool-0.0.87-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d834102775cef696dd2c866628bb56af7c10669368813d7ffc429e45eb65f8d"}, @@ -1152,7 +1152,7 @@ version = "0.4.0" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, @@ -1180,7 +1180,7 @@ version = "1.9.0" description = "Distro - an OS platform information API" optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, @@ -1301,7 +1301,7 @@ version = "1.6.6" description = "🖋 Open the default text editor 🖋" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "editor-1.6.6-py3-none-any.whl", hash = "sha256:e818e6913f26c2a81eadef503a2741d7cca7f235d20e217274a009ecd5a74abf"}, {file = "editor-1.6.6.tar.gz", hash = "sha256:bb6989e872638cd119db9a4fce284cd8e13c553886a1c044c6b8d8a160c871f8"}, @@ -1333,7 +1333,7 @@ version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, @@ -1620,7 +1620,7 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1635,7 +1635,7 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1826,7 +1826,7 @@ version = "4.12.3" description = "Python humanize utilities" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6"}, {file = "humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0"}, @@ -1896,7 +1896,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1911,7 +1911,7 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -1936,7 +1936,7 @@ version = "6.5.2" description = "Read resources from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -1978,7 +1978,7 @@ version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.8" -groups = ["dev", "integrations"] +groups = ["codeflash", "dev", "integrations"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -2011,7 +2011,7 @@ version = "3.4.0" description = "Collection of common interactive command line user interfaces, based on Inquirer.js" optional = false python-versions = ">=3.8.1" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "inquirer-3.4.0-py3-none-any.whl", hash = "sha256:bb0ec93c833e4ce7b51b98b1644b0a4d2bb39755c39787f6a504e4fee7a11b60"}, {file = "inquirer-3.4.0.tar.gz", hash = "sha256:8edc99c076386ee2d2204e5e3653c2488244e82cb197b2d498b3c1b5ffb25d0b"}, @@ -2040,7 +2040,7 @@ version = "6.0.1" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.9.0" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, @@ -2129,7 +2129,7 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -2184,7 +2184,7 @@ version = "1.3.0" description = "Jinxed Terminal Library" optional = false python-versions = "*" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] markers = "platform_system == \"Windows\"" files = [ {file = "jinxed-1.3.0-py2.py3-none-any.whl", hash = "sha256:b993189f39dc2d7504d802152671535b06d380b26d78070559551cbf92df4fc5"}, @@ -2212,7 +2212,7 @@ version = "3.2.0" description = "Manipulates JUnit/xUnit Result XML files" optional = false python-versions = "*" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "junitparser-3.2.0-py2.py3-none-any.whl", hash = "sha256:e14fdc0a999edfc15889b637390e8ef6ca09a49532416d3bd562857d42d4b96d"}, {file = "junitparser-3.2.0.tar.gz", hash = "sha256:b05e89c27e7b74b3c563a078d6e055d95cf397444f8f689b0ca616ebda0b3c65"}, @@ -2254,7 +2254,7 @@ version = "1.8.2" description = "A concrete syntax tree with AST-like properties for Python 3.0 through 3.13 programs." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main", "codeflash", "dev"] files = [ {file = "libcst-1.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:67d9720d91f507c87b3e5f070627ad640a00bc6cfdf5635f8c6ee9f2964cf71c"}, {file = "libcst-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:94b7c032b72566077614a02baab1929739fd0af0cc1d46deaba4408b870faef2"}, @@ -2330,7 +2330,7 @@ version = "4.2.0" description = "Line-by-line profiler" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "line_profiler-4.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:70e2503f52ee6464ac908b578d73ad6dae21d689c95f2252fee97d7aa8426693"}, {file = "line_profiler-4.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b6047c8748d7a2453522eaea3edc8d9febc658b57f2ea189c03fe3d5e34595b5"}, @@ -2461,7 +2461,7 @@ version = "2023.0.1" description = "Python implementation of the Language Server Protocol." optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "lsprotocol-2023.0.1-py3-none-any.whl", hash = "sha256:c75223c9e4af2f24272b14c6375787438279369236cd568f596d4951052a60f2"}, {file = "lsprotocol-2023.0.1.tar.gz", hash = "sha256:cc5c15130d2403c18b734304339e51242d3018a05c4f7d0f198ad6e0cd21861d"}, @@ -2477,7 +2477,7 @@ version = "5.4.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c"}, {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7"}, @@ -2626,7 +2626,7 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2722,7 +2722,7 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -3063,7 +3063,7 @@ version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash", "dev"] files = [ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, @@ -3177,7 +3177,7 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -3189,7 +3189,7 @@ version = "0.9.0" description = "Parameterized testing with any Python test framework" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "parameterized-0.9.0-py2.py3-none-any.whl", hash = "sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b"}, {file = "parameterized-0.9.0.tar.gz", hash = "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1"}, @@ -3204,7 +3204,7 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -3280,7 +3280,7 @@ version = "4.3.8" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["codeflash", "dev"] files = [ {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, @@ -3297,7 +3297,7 @@ version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.9" -groups = ["dev", "integrations"] +groups = ["codeflash", "dev", "integrations"] files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -3404,7 +3404,7 @@ version = "4.2.0" description = "Integrate PostHog into any python application." optional = false python-versions = "*" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "posthog-4.2.0-py2.py3-none-any.whl", hash = "sha256:60c7066caac43e43e326e9196d8c1aadeafc8b0be9e5c108446e352711fa456b"}, {file = "posthog-4.2.0.tar.gz", hash = "sha256:c4abc95de03294be005b3b7e8735e9d7abab88583da26262112bacce64b0c3b5"}, @@ -3613,7 +3613,7 @@ version = "2.11.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7"}, {file = "pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a"}, @@ -3635,7 +3635,7 @@ version = "2.33.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, @@ -3747,7 +3747,7 @@ version = "1.3.1" description = "A pythonic generic language server (pronounced like 'pie glass')" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "pygls-1.3.1-py3-none-any.whl", hash = "sha256:6e00f11efc56321bdeb6eac04f6d86131f654c7d49124344a9ebb968da3dd91e"}, {file = "pygls-1.3.1.tar.gz", hash = "sha256:140edceefa0da0e9b3c533547c892a42a7d2fd9217ae848c330c53d266a55018"}, @@ -3766,7 +3766,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3925,7 +3925,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" -groups = ["dev", "integrations"] +groups = ["codeflash", "dev", "integrations"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -4106,7 +4106,7 @@ version = "2.4.0" description = "pytest plugin to abort hanging tests" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2"}, {file = "pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a"}, @@ -4143,7 +4143,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -4183,7 +4183,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -4239,7 +4239,7 @@ files = [ {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] -markers = {dev = "python_version < \"3.13\""} +markers = {codeflash = "python_version < \"3.13\"", dev = "python_version < \"3.13\""} [[package]] name = "pyyaml-ft" @@ -4247,7 +4247,7 @@ version = "8.0.0" description = "YAML parser and emitter for Python with support for free-threading" optional = false python-versions = ">=3.13" -groups = ["main", "dev"] +groups = ["main", "codeflash", "dev"] markers = "python_version >= \"3.13\"" files = [ {file = "pyyaml_ft-8.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c1306282bc958bfda31237f900eb52c9bedf9b93a11f82e1aab004c9a5657a6"}, @@ -4410,7 +4410,7 @@ version = "4.2.1" description = "Library to easily read single chars and key strokes" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "readchar-4.2.1-py3-none-any.whl", hash = "sha256:a769305cd3994bb5fa2764aa4073452dc105a4ec39068ffe6efd3c20c60acc77"}, {file = "readchar-4.2.1.tar.gz", hash = "sha256:91ce3faf07688de14d800592951e5575e9c7a3213738ed01d394dcc949b79adb"}, @@ -4422,7 +4422,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -4459,7 +4459,7 @@ version = "14.0.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, @@ -4530,7 +4530,7 @@ version = "1.2.2" description = "🏃 Run a block of text as a subprocess 🏃" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "runs-1.2.2-py3-none-any.whl", hash = "sha256:0980dcbc25aba1505f307ac4f0e9e92cbd0be2a15a1e983ee86c24c87b839dfd"}, {file = "runs-1.2.2.tar.gz", hash = "sha256:9dc1815e2895cfb3a48317b173b9f1eac9ba5549b36a847b5cc60c3bf82ecef1"}, @@ -4625,7 +4625,7 @@ version = "2.29.1" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "sentry_sdk-2.29.1-py2.py3-none-any.whl", hash = "sha256:90862fe0616ded4572da6c9dadb363121a1ae49a49e21c418f0634e9d10b4c19"}, {file = "sentry_sdk-2.29.1.tar.gz", hash = "sha256:8d4a0206b95fa5fe85e5e7517ed662e3888374bdc342c00e435e10e6d831aa6d"}, @@ -4740,7 +4740,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -4752,7 +4752,7 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -4828,7 +4828,7 @@ version = "0.5.0" description = "Timeout decorator" optional = false python-versions = "*" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "timeout-decorator-0.5.0.tar.gz", hash = "sha256:6a2f2f58db1c5b24a2cc79de6345760377ad8bdc13813f5265f6c3e63d16b3d7"}, ] @@ -4851,7 +4851,7 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] markers = "python_version < \"3.11\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, @@ -4894,7 +4894,7 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash", "dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -5151,7 +5151,7 @@ version = "2.7.0" description = "A library for accessing stubs in typeshed." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "typeshed_client-2.7.0-py3-none-any.whl", hash = "sha256:97084e5abc58a76ace2c4618ecaebd625f2d19bbd85aa1b3fb86216bf174bbea"}, {file = "typeshed_client-2.7.0.tar.gz", hash = "sha256:e63df1e738588ad39f1226de042f4407ab6a99c456f0837063afd83b1415447c"}, @@ -5167,7 +5167,7 @@ version = "4.13.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, @@ -5179,7 +5179,7 @@ version = "0.9.0" description = "Runtime inspection utilities for typing module." optional = false python-versions = "*" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, @@ -5195,7 +5195,7 @@ version = "0.4.1" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, @@ -5312,7 +5312,7 @@ version = "0.7.5" description = "Unified diff parsing/metadata extraction library." optional = false python-versions = "*" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "unidiff-0.7.5-py2.py3-none-any.whl", hash = "sha256:c93bf2265cc1ba2a520e415ab05da587370bc2a3ae9e0414329f54f0c2fc09e8"}, {file = "unidiff-0.7.5.tar.gz", hash = "sha256:2e5f0162052248946b9f0970a40e9e124236bf86c82b70821143a6fc1dea2574"}, @@ -5324,7 +5324,7 @@ version = "3.2.0" description = "unittest-based test runner with Ant/JUnit like XML reporting." optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "unittest-xml-reporting-3.2.0.tar.gz", hash = "sha256:edd8d3170b40c3a81b8cf910f46c6a304ae2847ec01036d02e9c0f9b85762d28"}, {file = "unittest_xml_reporting-3.2.0-py2.py3-none-any.whl", hash = "sha256:f3d7402e5b3ac72a5ee3149278339db1a8f932ee405f48bcb9c681372f2717d5"}, @@ -5339,7 +5339,7 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -5450,7 +5450,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -5765,7 +5765,7 @@ version = "1.8.1" description = "🌱 Turn any object into a module 🌱" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "integrations"] files = [ {file = "xmod-1.8.1-py3-none-any.whl", hash = "sha256:a24e9458a4853489042522bdca9e50ee2eac5ab75c809a91150a8a7f40670d48"}, {file = "xmod-1.8.1.tar.gz", hash = "sha256:38c76486b9d672c546d57d8035df0beb7f4a9b088bc3fb2de5431ae821444377"}, @@ -5896,7 +5896,7 @@ version = "4.15.0.0" description = "an efficient SMT solver library" optional = false python-versions = "*" -groups = ["dev"] +groups = ["codeflash"] files = [ {file = "z3_solver-4.15.0.0-py3-none-macosx_13_0_arm64.whl", hash = "sha256:f39d07f6df4c8c09df594f1c9d2bb8b424805033a94725bfd535e7eca13eacfc"}, {file = "z3_solver-4.15.0.0-py3-none-macosx_13_0_x86_64.whl", hash = "sha256:83e82ed14073e72ca62bd3833866a9457df124448054a0c9d36db55e2f5baac6"}, @@ -5913,7 +5913,7 @@ version = "3.22.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" -groups = ["main", "dev", "integrations"] +groups = ["main", "codeflash", "dev", "integrations"] files = [ {file = "zipp-3.22.0-py3-none-any.whl", hash = "sha256:fe208f65f2aca48b81f9e6fd8cf7b8b32c26375266b009b413d45306b6148343"}, {file = "zipp-3.22.0.tar.gz", hash = "sha256:dd2f28c3ce4bc67507bfd3781d21b7bb2be31103b51a4553ad7d90b84e57ace5"}, @@ -6117,4 +6117,4 @@ sanic = ["sanic"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "f0efcc147ae2c6c29b1132ebb6d41fc1fed4b6765b84cfaa55b0285de64e5711" +content-hash = "daaf74cd76f10ff82950de6d980e8f7850471d4819072e49c33f67972551abf5" diff --git a/pyproject.toml b/pyproject.toml index f449096633..db5db6d8dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -109,6 +109,11 @@ types-six = "^1.17.0.20250403" types-pyyaml = "^6.0.12.20240917" mypy = "^1.15.0" pyright = "1.1.401" + +[tool.poetry.group.codeflash] +optional = true + +[tool.poetry.group.codeflash.dependencies] codeflash = ">=0.9.2" [tool.poetry.group.integrations] From 429397c6984313aaed8b33ad976289bf25e46ef4 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Thu, 17 Jul 2025 00:24:08 +0200 Subject: [PATCH 03/21] Bump graphql core 3.2 --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 5bda8cc3fc..d2847a71d5 100644 --- a/noxfile.py +++ b/noxfile.py @@ -11,7 +11,7 @@ PYTHON_VERSIONS = ["3.14", "3.13", "3.12", "3.11", "3.10"] GQL_CORE_VERSIONS = [ - "3.2.3", + "3.2.6", "3.3.0a8", ] From 766ac8e77415794c61bf2ed99beb14e4530068ec Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Thu, 17 Jul 2025 00:26:06 +0200 Subject: [PATCH 04/21] Fix doc param --- TWEET.md | 5 +++++ strawberry/types/field.py | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 TWEET.md diff --git a/TWEET.md b/TWEET.md new file mode 100644 index 0000000000..d9580adc11 --- /dev/null +++ b/TWEET.md @@ -0,0 +1,5 @@ +🆕 Release $version is out! Thanks to $contributor for the PR 👏 + +This releases adds support for Python 3.14! + +Get it here 👉 $release_url diff --git a/strawberry/types/field.py b/strawberry/types/field.py index 02d90ab818..cb8a3ce5bc 100644 --- a/strawberry/types/field.py +++ b/strawberry/types/field.py @@ -99,6 +99,10 @@ def __init__( if sys.version_info >= (3, 10): kwargs["kw_only"] = dataclasses.MISSING + # doc was added to python 3.14 and it is required + if sys.version_info >= (3, 14): + kwargs["doc"] = None + super().__init__( default=default, default_factory=default_factory, # type: ignore From 43dbd31400c5ade25ee3bf93154666e37cc65031 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Wed, 16 Jul 2025 23:34:57 +0100 Subject: [PATCH 05/21] Apply suggestion from @greptile-apps[bot] Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- TWEET.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TWEET.md b/TWEET.md index d9580adc11..e4d985cddc 100644 --- a/TWEET.md +++ b/TWEET.md @@ -1,5 +1,5 @@ 🆕 Release $version is out! Thanks to $contributor for the PR 👏 -This releases adds support for Python 3.14! +This release adds support for Python 3.14! Get it here 👉 $release_url From 4491442d97311c0a7c1e64375a1cee545dfe9df0 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Thu, 17 Jul 2025 00:26:06 +0200 Subject: [PATCH 06/21] Fix doc param --- RELEASE.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 RELEASE.md diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000000..2c54b5ca35 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,3 @@ +Release type: patch + +This release adds support for the upcoming Python 3.14 From 0a1f20f1ae88187a395215a2b774988714ff1bc1 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Thu, 17 Jul 2025 00:36:24 +0200 Subject: [PATCH 07/21] Keep 3.9 --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index d2847a71d5..b725921a46 100644 --- a/noxfile.py +++ b/noxfile.py @@ -8,7 +8,7 @@ nox.options.error_on_external_run = True nox.options.default_venv_backend = "uv" -PYTHON_VERSIONS = ["3.14", "3.13", "3.12", "3.11", "3.10"] +PYTHON_VERSIONS = ["3.14", "3.13", "3.12", "3.11", "3.10", "3.9"] GQL_CORE_VERSIONS = [ "3.2.6", From 5b4794fc98c8a665dac1a4256dcd0f516e200d54 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Thu, 17 Jul 2025 00:58:49 +0200 Subject: [PATCH 08/21] Use annotationlib in 3.14 --- strawberry/types/object_type.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/strawberry/types/object_type.py b/strawberry/types/object_type.py index 1c05113d4b..cd05246ad7 100644 --- a/strawberry/types/object_type.py +++ b/strawberry/types/object_type.py @@ -42,6 +42,19 @@ def _get_interfaces(cls: builtins.type[Any]) -> list[StrawberryObjectDefinition] return interfaces +def _get_annotations(cls: builtins.type[Any]) -> dict[str, Any]: + try: + import annotationlib + + annotations = annotationlib.get_annotations( + cls, format=annotationlib.Format.FORWARDREF + ) + except ImportError: + annotations = cls.__dict__.get("__annotations__", {}) + + return annotations + + def _check_field_annotations(cls: builtins.type[Any]) -> None: """Are any of the dataclass Fields missing type annotations? @@ -51,7 +64,8 @@ def _check_field_annotations(cls: builtins.type[Any]) -> None: https://github.com/python/cpython/blob/6fed3c85402c5ca704eb3f3189ca3f5c67a08d19/Lib/dataclasses.py#L881-L884 """ - cls_annotations = cls.__dict__.get("__annotations__", {}) + cls_annotations = _get_annotations(cls) + # TODO: do we need this? cls.__annotations__ = cls_annotations for field_name, field_ in cls.__dict__.items(): From 60b55a8639f09a69ec4cb55620575c38bcf2554b Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Thu, 17 Jul 2025 08:58:36 +0200 Subject: [PATCH 09/21] Fix date error assert --- tests/schema/types/test_date.py | 2 +- tests/schema/types/test_time.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/schema/types/test_date.py b/tests/schema/types/test_date.py index dbd75bac12..88dbca5685 100644 --- a/tests/schema/types/test_date.py +++ b/tests/schema/types/test_date.py @@ -113,7 +113,7 @@ def test_serialization_error_message_for_incorrect_date_string(): """ result = execute_mutation("2021-13-01") assert result.errors - assert result.errors[0].message == ( + assert result.errors[0].message.startswith( "Variable '$value' got invalid value '2021-13-01'; Value cannot represent a " 'Date: "2021-13-01". month must be in 1..12' ) diff --git a/tests/schema/types/test_time.py b/tests/schema/types/test_time.py index bb7a7f8e2f..9148ba42e4 100644 --- a/tests/schema/types/test_time.py +++ b/tests/schema/types/test_time.py @@ -112,7 +112,7 @@ def test_serialization_error_message_for_incorrect_time_string(): """ result = execute_mutation("25:00") assert result.errors - assert result.errors[0].message == ( + assert result.errors[0].message.startswith( "Variable '$value' got invalid value '25:00'; Value cannot represent a " 'Time: "25:00". hour must be in 0..23' ) From 89d6375f3bc665cfc4f0d5103d517ca85cf8892b Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Thu, 17 Jul 2025 09:14:01 +0200 Subject: [PATCH 10/21] Use get_annotations from typing_extensions --- poetry.lock | 2 +- pyproject.toml | 2 +- strawberry/types/object_type.py | 17 ++--------------- tests/schema/types/test_datetime.py | 2 +- 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/poetry.lock b/poetry.lock index 63ca2e9e73..ff84384cae 100644 --- a/poetry.lock +++ b/poetry.lock @@ -6117,4 +6117,4 @@ sanic = ["sanic"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "daaf74cd76f10ff82950de6d980e8f7850471d4819072e49c33f67972551abf5" +content-hash = "b4ee899a5197e07047440870d4ae0ee580c79224884f43a387a40286bace3cd5" diff --git a/pyproject.toml b/pyproject.toml index db5db6d8dd..04ebf174dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ classifiers = [ requires-python = ">=3.9,<4.0" dependencies = [ "graphql-core>=3.2.0,<3.4.0", - "typing-extensions>=4.5.0", + "typing-extensions>=4.13.0", "python-dateutil~=2.7", "packaging>=23", ] diff --git a/strawberry/types/object_type.py b/strawberry/types/object_type.py index cd05246ad7..9fd4c87d46 100644 --- a/strawberry/types/object_type.py +++ b/strawberry/types/object_type.py @@ -12,7 +12,7 @@ Union, overload, ) -from typing_extensions import dataclass_transform +from typing_extensions import dataclass_transform, get_annotations from strawberry.exceptions import ( InvalidSuperclassInterfaceError, @@ -42,19 +42,6 @@ def _get_interfaces(cls: builtins.type[Any]) -> list[StrawberryObjectDefinition] return interfaces -def _get_annotations(cls: builtins.type[Any]) -> dict[str, Any]: - try: - import annotationlib - - annotations = annotationlib.get_annotations( - cls, format=annotationlib.Format.FORWARDREF - ) - except ImportError: - annotations = cls.__dict__.get("__annotations__", {}) - - return annotations - - def _check_field_annotations(cls: builtins.type[Any]) -> None: """Are any of the dataclass Fields missing type annotations? @@ -64,7 +51,7 @@ def _check_field_annotations(cls: builtins.type[Any]) -> None: https://github.com/python/cpython/blob/6fed3c85402c5ca704eb3f3189ca3f5c67a08d19/Lib/dataclasses.py#L881-L884 """ - cls_annotations = _get_annotations(cls) + cls_annotations = get_annotations(cls) # TODO: do we need this? cls.__annotations__ = cls_annotations diff --git a/tests/schema/types/test_datetime.py b/tests/schema/types/test_datetime.py index eb318af513..d260d120ec 100644 --- a/tests/schema/types/test_datetime.py +++ b/tests/schema/types/test_datetime.py @@ -163,7 +163,7 @@ def test_serialization_error_message_for_incorrect_datetime_string(): """ result = execute_mutation("2021-13-01T09:00:00") assert result.errors - assert result.errors[0].message == ( + assert result.errors[0].message.startswith( "Variable '$value' got invalid value '2021-13-01T09:00:00'; Value cannot " 'represent a DateTime: "2021-13-01T09:00:00". month must be in 1..12' ) From f14a72915f1b93b52bd47a1490fd10bb3857c05f Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Thu, 17 Jul 2025 10:30:15 +0200 Subject: [PATCH 11/21] Fix union --- strawberry/utils/typing.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/strawberry/utils/typing.py b/strawberry/utils/typing.py index 54a7efaf69..b202af38b4 100644 --- a/strawberry/utils/typing.py +++ b/strawberry/utils/typing.py @@ -110,9 +110,8 @@ def get_optional_annotation(annotation: type) -> type: # if we have multiple non none types we want to return a copy of this # type (normally a Union type). - if len(non_none_types) > 1: - return annotation.copy_with(non_none_types) # type: ignore[attr-defined] + return Union[non_none_types] # type: ignore return non_none_types[0] From 268d1172b264d5ff9ba6c8acec3fd8c5fd4d8c9c Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Fri, 19 Sep 2025 16:54:22 +0100 Subject: [PATCH 12/21] Mypy --- strawberry/aiohttp/views.py | 2 +- strawberry/asgi/__init__.py | 2 +- strawberry/channels/handlers/ws_handler.py | 2 +- strawberry/codegen/query_codegen.py | 7 ++----- strawberry/fastapi/router.py | 2 +- strawberry/litestar/controller.py | 2 +- strawberry/quart/views.py | 2 +- strawberry/types/field.py | 2 +- strawberry/types/info.py | 2 +- strawberry/utils/typing.py | 7 ++----- 10 files changed, 12 insertions(+), 18 deletions(-) diff --git a/strawberry/aiohttp/views.py b/strawberry/aiohttp/views.py index 93a3aa9e9e..18b6174e13 100644 --- a/strawberry/aiohttp/views.py +++ b/strawberry/aiohttp/views.py @@ -87,7 +87,7 @@ class GraphQLView( allow_queries_via_get = True request_adapter_class = AiohttpHTTPRequestAdapter - websocket_adapter_class = AiohttpWebSocketAdapter + websocket_adapter_class = AiohttpWebSocketAdapter # type: ignore def __init__( self, diff --git a/strawberry/asgi/__init__.py b/strawberry/asgi/__init__.py index 1a17851518..0e476f377d 100644 --- a/strawberry/asgi/__init__.py +++ b/strawberry/asgi/__init__.py @@ -93,7 +93,7 @@ class GraphQL( ): allow_queries_via_get = True request_adapter_class = StarletteRequestAdapter - websocket_adapter_class = ASGIWebSocketAdapter + websocket_adapter_class = ASGIWebSocketAdapter # type: ignore def __init__( self, diff --git a/strawberry/channels/handlers/ws_handler.py b/strawberry/channels/handlers/ws_handler.py index 00d4fa2443..9578c155c1 100644 --- a/strawberry/channels/handlers/ws_handler.py +++ b/strawberry/channels/handlers/ws_handler.py @@ -102,7 +102,7 @@ class GraphQLWSConsumer( ``` """ - websocket_adapter_class = ChannelsWebSocketAdapter + websocket_adapter_class = ChannelsWebSocketAdapter # type: ignore def __init__( self, diff --git a/strawberry/codegen/query_codegen.py b/strawberry/codegen/query_codegen.py index abd36717dd..1b2da3d79a 100644 --- a/strawberry/codegen/query_codegen.py +++ b/strawberry/codegen/query_codegen.py @@ -13,7 +13,7 @@ Union, cast, ) -from typing_extensions import Literal, Protocol +from typing_extensions import Protocol import rich from graphql import ( @@ -473,10 +473,7 @@ def _convert_operation( class_name=result_class_name, ) - operation_kind = cast( - "Literal['query', 'mutation', 'subscription']", - operation_definition.operation.value, - ) + operation_kind = operation_definition.operation.value variables, variables_type = self._convert_variable_definitions( operation_definition.variable_definitions, operation_name=operation_name diff --git a/strawberry/fastapi/router.py b/strawberry/fastapi/router.py index e45f038f67..5b0af0978d 100644 --- a/strawberry/fastapi/router.py +++ b/strawberry/fastapi/router.py @@ -62,7 +62,7 @@ class GraphQLRouter( ): allow_queries_via_get = True request_adapter_class = StarletteRequestAdapter - websocket_adapter_class = ASGIWebSocketAdapter + websocket_adapter_class = ASGIWebSocketAdapter # type: ignore @staticmethod async def __get_root_value() -> None: diff --git a/strawberry/litestar/controller.py b/strawberry/litestar/controller.py index b29bdb845b..3008d8ec4a 100644 --- a/strawberry/litestar/controller.py +++ b/strawberry/litestar/controller.py @@ -208,7 +208,7 @@ class GraphQLController( } request_adapter_class = LitestarRequestAdapter - websocket_adapter_class = LitestarWebSocketAdapter + websocket_adapter_class = LitestarWebSocketAdapter # type: ignore allow_queries_via_get: bool = True graphiql_allowed_accept: frozenset[str] = frozenset({"text/html", "*/*"}) diff --git a/strawberry/quart/views.py b/strawberry/quart/views.py index c0df68b2a0..e8df22ba33 100644 --- a/strawberry/quart/views.py +++ b/strawberry/quart/views.py @@ -78,7 +78,7 @@ class GraphQLView( methods: ClassVar[list[str]] = ["GET", "POST"] allow_queries_via_get: bool = True request_adapter_class = QuartHTTPRequestAdapter - websocket_adapter_class = QuartWebSocketAdapter + websocket_adapter_class = QuartWebSocketAdapter # type: ignore def __init__( self, diff --git a/strawberry/types/field.py b/strawberry/types/field.py index 4553cdb0e3..0e06b7dd0a 100644 --- a/strawberry/types/field.py +++ b/strawberry/types/field.py @@ -296,7 +296,7 @@ def base_resolver(self, resolver: StrawberryResolver) -> None: # removed. _ = resolver.arguments - @property # type: ignore + @property def type( self, ) -> Union[ # type: ignore [valid-type] diff --git a/strawberry/types/info.py b/strawberry/types/info.py index 78626d3ed9..e24e01d2bc 100644 --- a/strawberry/types/info.py +++ b/strawberry/types/info.py @@ -78,7 +78,7 @@ def __class_getitem__(cls, types: Union[type, tuple[type, ...]]) -> type[Info]: https://discuss.python.org/t/passing-only-one-typevar-of-two-when-using-defaults/49134 """ if not isinstance(types, tuple): - types = (types, Any) # type: ignore + types = (types, Any) return super().__class_getitem__(types) # type: ignore diff --git a/strawberry/utils/typing.py b/strawberry/utils/typing.py index b202af38b4..d49d192b24 100644 --- a/strawberry/utils/typing.py +++ b/strawberry/utils/typing.py @@ -129,10 +129,7 @@ def is_concrete_generic(annotation: type) -> bool: def is_generic_subclass(annotation: type) -> bool: - return isinstance(annotation, type) and issubclass( - annotation, - Generic, # type:ignore - ) + return isinstance(annotation, type) and issubclass(annotation, Generic) def is_generic(annotation: type) -> bool: @@ -184,7 +181,7 @@ def get_parameters(annotation: type) -> Union[tuple[object], tuple[()]]: and issubclass(annotation, Generic) # type:ignore and annotation is not Generic ): - return annotation.__parameters__ # type: ignore[union-attr] + return annotation.__parameters__ return () # pragma: no cover From daf47695ea6ea3fecb59e2ca159939a4ae0dcb90 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Sat, 20 Sep 2025 11:25:27 +0100 Subject: [PATCH 13/21] Type ignore and pydantic version --- noxfile.py | 2 +- strawberry/codegen/query_codegen.py | 2 +- strawberry/utils/typing.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/noxfile.py b/noxfile.py index 978135dc9f..2f941fafbe 100644 --- a/noxfile.py +++ b/noxfile.py @@ -130,7 +130,7 @@ def tests_integrations(session: Session, integration: str, gql_core: str) -> Non @session(python=PYTHON_VERSIONS, name="Pydantic tests", tags=["tests", "pydantic"]) -@with_gql_core_parametrize("pydantic", ["1.10", "2.9.0", "2.10.0", "2.11.0"]) +@with_gql_core_parametrize("pydantic", ["1.10", "2.11.9"]) def test_pydantic(session: Session, pydantic: str, gql_core: str) -> None: session.run_always("poetry", "install", external=True) diff --git a/strawberry/codegen/query_codegen.py b/strawberry/codegen/query_codegen.py index 1b2da3d79a..ec149c09b2 100644 --- a/strawberry/codegen/query_codegen.py +++ b/strawberry/codegen/query_codegen.py @@ -481,7 +481,7 @@ def _convert_operation( return GraphQLOperation( operation_definition.name.value, - kind=operation_kind, + kind=operation_kind, # type: ignore[arg-type] selections=self._convert_selection_set(operation_definition.selection_set), directives=self._convert_directives(operation_definition.directives), variables=variables, diff --git a/strawberry/utils/typing.py b/strawberry/utils/typing.py index d49d192b24..50be5607ac 100644 --- a/strawberry/utils/typing.py +++ b/strawberry/utils/typing.py @@ -178,10 +178,10 @@ def type_has_annotation(type_: object, annotation: type) -> bool: def get_parameters(annotation: type) -> Union[tuple[object], tuple[()]]: if isinstance(annotation, _GenericAlias) or ( isinstance(annotation, type) - and issubclass(annotation, Generic) # type:ignore + and issubclass(annotation, Generic) and annotation is not Generic ): - return annotation.__parameters__ + return annotation.__parameters__ # type: ignore[union-attr] return () # pragma: no cover From 6e0e69d50bd646dd4a02904f2edc1d3c543054ef Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 7 Oct 2025 17:23:44 +0100 Subject: [PATCH 14/21] Fix brokenness --- noxfile.py | 2 +- tests/cli/test_locate_definition.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/noxfile.py b/noxfile.py index ce0f434dfc..556cef65c6 100644 --- a/noxfile.py +++ b/noxfile.py @@ -130,7 +130,7 @@ def tests_integrations(session: Session, integration: str, gql_core: str) -> Non @session(python=PYTHON_VERSIONS, name="Pydantic tests", tags=["tests", "pydantic"]) -@with_gql_core_parametrize("pydantic", ["1.10", "2.11.9"]) +@with_gql_core_parametrize("pydantic", ["1.10", "2.12.0"]) def test_pydantic(session: Session, pydantic: str, gql_core: str) -> None: session.run_always("poetry", "install", "--without=integrations", external=True) diff --git a/tests/cli/test_locate_definition.py b/tests/cli/test_locate_definition.py index 0e661b7791..c8f6d8e223 100644 --- a/tests/cli/test_locate_definition.py +++ b/tests/cli/test_locate_definition.py @@ -42,7 +42,7 @@ def test_find_missing_model(cli_app: Typer, cli_runner: CliRunner): result = cli_runner.invoke(cli_app, ["locate-definition", selector, "Missing"]) assert result.exit_code == 1 - assert result.stdout.strip() == snapshot("Definition not found: Missing") + assert result.stderr.strip() == snapshot("Definition not found: Missing") def test_find_missing_model_field(cli_app: Typer, cli_runner: CliRunner): @@ -52,7 +52,7 @@ def test_find_missing_model_field(cli_app: Typer, cli_runner: CliRunner): ) assert result.exit_code == 1 - assert result.stdout.strip() == snapshot("Definition not found: Missing.field") + assert result.stderr.strip() == snapshot("Definition not found: Missing.field") def test_find_missing_schema(cli_app: Typer, cli_runner: CliRunner): From b2b73804a41581496ae1bd1fc411a8de29276f85 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 7 Oct 2025 17:33:01 +0100 Subject: [PATCH 15/21] :) --- strawberry/schema/_graphql_core.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/strawberry/schema/_graphql_core.py b/strawberry/schema/_graphql_core.py index de39b6decc..5d8b921982 100644 --- a/strawberry/schema/_graphql_core.py +++ b/strawberry/schema/_graphql_core.py @@ -7,16 +7,16 @@ from strawberry.types import ExecutionResult try: - from graphql import ( - ExperimentalIncrementalExecutionResults as GraphQLIncrementalExecutionResults, # type: ignore[attr-defined] + from graphql import ( # type: ignore[attr-defined] + ExperimentalIncrementalExecutionResults as GraphQLIncrementalExecutionResults, ) - from graphql.execution import ( - InitialIncrementalExecutionResult, # type: ignore[attr-defined] - experimental_execute_incrementally, # type: ignore[attr-defined] + from graphql.execution import ( # type: ignore[attr-defined] + InitialIncrementalExecutionResult, + experimental_execute_incrementally, ) - from graphql.type.directives import ( - GraphQLDeferDirective, # type: ignore[attr-defined] - GraphQLStreamDirective, # type: ignore[attr-defined] + from graphql.type.directives import ( # type: ignore[attr-defined] + GraphQLDeferDirective, + GraphQLStreamDirective, ) incremental_execution_directives = ( From a5a4a4b28f36084b2d4b9c21aac260ad84bbcfb7 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 7 Oct 2025 17:42:01 +0100 Subject: [PATCH 16/21] Does it click --- noxfile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 556cef65c6..9a0966c039 100644 --- a/noxfile.py +++ b/noxfile.py @@ -166,7 +166,8 @@ def tests_typecheckers(session: Session) -> None: ) -@session(python=PYTHON_VERSIONS, name="CLI tests", tags=["tests"]) +# skipping python 3.9 because of some changes in click 8.2.0 +@session(python=PYTHON_VERSIONS[:-1], name="CLI tests", tags=["tests"]) def tests_cli(session: Session) -> None: session.run_always("poetry", "install", "--without=integrations", external=True) From d31e0c142a293a0d162cf159709d2e3d65e9249e Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 7 Oct 2025 17:54:34 +0100 Subject: [PATCH 17/21] Pydantic is all you need --- noxfile.py | 29 +++++++++++++++++-- .../pydantic/schema/test_1_and_2.py | 7 +++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/noxfile.py b/noxfile.py index 9a0966c039..efb7f0837f 100644 --- a/noxfile.py +++ b/noxfile.py @@ -129,12 +129,35 @@ def tests_integrations(session: Session, integration: str, gql_core: str) -> Non session.run("pytest", *COMMON_PYTEST_OPTIONS, "-m", integration) +@session( + python=["3.9", "3.10", "3.11", "3.12", "3.13"], + name="Pydantic V1 tests", + tags=["tests", "pydantic"], +) +@gql_core_parametrize +def test_pydantic(session: Session, gql_core: str) -> None: + session.run_always("poetry", "install", "--without=integrations", external=True) + + session._session.install("pydantic~=1.10") # type: ignore + _install_gql_core(session, gql_core) + session.run( + "pytest", + "--cov=.", + "--cov-append", + "--cov-report=xml", + "-m", + "pydantic", + "--ignore=tests/cli", + "--ignore=tests/benchmarks", + ) + + @session(python=PYTHON_VERSIONS, name="Pydantic tests", tags=["tests", "pydantic"]) -@with_gql_core_parametrize("pydantic", ["1.10", "2.12.0"]) -def test_pydantic(session: Session, pydantic: str, gql_core: str) -> None: +@gql_core_parametrize +def test_pydantic_v2(session: Session, gql_core: str) -> None: session.run_always("poetry", "install", "--without=integrations", external=True) - session._session.install(f"pydantic~={pydantic}") # type: ignore + session._session.install("pydantic~=2.12") # type: ignore _install_gql_core(session, gql_core) session.run( "pytest", diff --git a/tests/experimental/pydantic/schema/test_1_and_2.py b/tests/experimental/pydantic/schema/test_1_and_2.py index 5e8b3fea72..a5f4b23224 100644 --- a/tests/experimental/pydantic/schema/test_1_and_2.py +++ b/tests/experimental/pydantic/schema/test_1_and_2.py @@ -1,10 +1,17 @@ +import sys import textwrap from typing import Optional, Union +import pytest + import strawberry from tests.experimental.pydantic.utils import needs_pydantic_v2 +@pytest.mark.skipif( + sys.version_info >= (3, 14), + reason="Pydantic v1 is not compatible with Python 3.14+", +) @needs_pydantic_v2 def test_can_use_both_pydantic_1_and_2(): import pydantic From a80095721c352085f9111878a990e73e8190f518 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 7 Oct 2025 17:59:23 +0100 Subject: [PATCH 18/21] SUPERSANIC --- tests/typecheckers/utils/mypy.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/typecheckers/utils/mypy.py b/tests/typecheckers/utils/mypy.py index 8fc44ad230..7eb1c458c6 100644 --- a/tests/typecheckers/utils/mypy.py +++ b/tests/typecheckers/utils/mypy.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import os import pathlib import subprocess import tempfile @@ -52,7 +53,13 @@ def run_mypy(code: str, strict: bool = True) -> list[Result]: module_path.write_text(code) process_result = subprocess.run( - [*args, str(module_path)], check=False, capture_output=True + [*args, str(module_path)], + check=False, + capture_output=True, + env={ + "PYTHONWARNINGS": "error,ignore::SyntaxWarning", + "PATH": os.environ["PATH"], + }, ) full_output = ( From cced0095b6382e615d6d8311a6d78473c890c825 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 7 Oct 2025 18:03:56 +0100 Subject: [PATCH 19/21] Less dev --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b34c57c11b..1aa1d011f5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -62,7 +62,7 @@ jobs: 3.11 3.12 3.13 - 3.14-dev + 3.14 - run: pip install poetry nox nox-poetry uv - run: nox -r -t tests -s "${{ matrix.session.session }}" From d180e9a47ac48e2ad7c4f9be56a21e59b3cee4b9 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 7 Oct 2025 18:14:21 +0100 Subject: [PATCH 20/21] Keep dev for now --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1aa1d011f5..b34c57c11b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -62,7 +62,7 @@ jobs: 3.11 3.12 3.13 - 3.14 + 3.14-dev - run: pip install poetry nox nox-poetry uv - run: nox -r -t tests -s "${{ matrix.session.session }}" From 7741475b0616b0b896d8bb9dd74707e62bb0a107 Mon Sep 17 00:00:00 2001 From: Patrick Arminio Date: Tue, 7 Oct 2025 18:18:17 +0100 Subject: [PATCH 21/21] =?UTF-8?q?=F0=9F=94=A6=F0=9F=94=A6=F0=9F=94=A6?= =?UTF-8?q?=F0=9F=94=A6=F0=9F=94=A6=F0=9F=94=A6=F0=9F=94=A6=F0=9F=94=A6?= =?UTF-8?q?=F0=9F=94=A6=F0=9F=94=A6=F0=9F=94=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/codeflash.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeflash.yaml b/.github/workflows/codeflash.yaml index 6d923e8f0b..146d3a70fe 100644 --- a/.github/workflows/codeflash.yaml +++ b/.github/workflows/codeflash.yaml @@ -38,4 +38,4 @@ jobs: - name: Run Codeflash to optimize code run: | poetry env use python - poetry run codeflash --benchmark + poetry run codeflash --benchmark --benchmarks-root tests/benchmarks