diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a3314411..75409092 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,6 +19,7 @@ jobs: - '3.10' - '3.11' - '3.12' + - '3.13' arch: - 'arm64' - 'x86' @@ -49,7 +50,8 @@ jobs: env: # Enable fuzzing tests, other expensive tests. ZSTD_SLOW_TESTS: '1' - # Make all compile warnings fatal. + # Make all compile warnings fatal except on 3.13, which has some deprecations + # at the moment. ZSTD_WARNINGS_AS_ERRORS: '1' # More thorough fuzzing coverage. HYPOTHESIS_PROFILE: 'ci' @@ -61,6 +63,7 @@ jobs: with: python-version: ${{ matrix.py }} architecture: ${{ matrix.arch }} + allow-prereleases: ${{ matrix.py == '3.13' && true || false }} - name: Install Rust if: matrix.arch == 'x64' @@ -71,17 +74,26 @@ jobs: - uses: actions/checkout@v4 - name: Install Dependencies + if: matrix.py != '3.13' shell: bash run: | python -m pip install --require-hashes -r ci/requirements.txt + # TODO remove once cffi 1.17 is released and is part of requirements.txt. + - name: Install Dependencies (Python 3.13) + if: matrix.py == '3.13' + shell: bash + run: | + python -m pip install --require-hashes -r ci/requirements.313.txt + + # TODO enable once PyO3 supports 3.13. - name: Build (Rust) - if: matrix.arch == 'x64' + if: matrix.arch == 'x64' && matrix.py != '3.13' run: | - python -m pip install --config-setting='--build-option=--rust-backend' -e . + python -m pip install --config-settings='--build-option=--rust-backend' -e . - name: Build (No Rust) - if: matrix.arch != 'x64' + if: matrix.arch != 'x64' || matrix.py == '3.13' run: | python -m pip install -e . diff --git a/.github/workflows/typing.yml b/.github/workflows/typing.yml index 84f3d95a..b7a866a3 100644 --- a/.github/workflows/typing.yml +++ b/.github/workflows/typing.yml @@ -14,12 +14,14 @@ jobs: - '3.10' - '3.11' - '3.12' + - '3.13' runs-on: 'ubuntu-22.04' steps: - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.py }} + allow-prereleases: ${{ matrix.py == '3.13' && true || false }} - uses: actions/checkout@v4 diff --git a/.github/workflows/wheel.yml b/.github/workflows/wheel.yml index b833e48b..c3e1fd8e 100644 --- a/.github/workflows/wheel.yml +++ b/.github/workflows/wheel.yml @@ -21,6 +21,7 @@ jobs: - 'cp310-cp310' - 'cp311-cp311' - 'cp312-cp312' + - 'cp313-cp313' runs-on: 'ubuntu-22.04' steps: - uses: actions/checkout@v4 @@ -49,6 +50,7 @@ jobs: - 'cp310' - 'cp311' - 'cp312' + - 'cp313' arch: - 'arm64' - 'x86_64' @@ -91,6 +93,7 @@ jobs: - '3.10' - '3.11' - '3.12' + - '3.13' arch: - 'x86' - 'x64' @@ -103,6 +106,7 @@ jobs: with: python-version: ${{ matrix.py }} architecture: ${{ matrix.arch }} + allow-prereleases: ${{ matrix.py == '3.13' && true || false }} - uses: actions/checkout@v4 diff --git a/ci/requirements.313.txt b/ci/requirements.313.txt new file mode 100644 index 00000000..8bf3fcd8 --- /dev/null +++ b/ci/requirements.313.txt @@ -0,0 +1,193 @@ +# +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: +# +# pip-compile --generate-hashes --output-file=ci/requirements.313.txt --pre ci/requirements.in +# +atomicwrites==1.4.1 \ + --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 + # via -r ci/requirements.in +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 + # via hypothesis +bashlex==0.18 \ + --hash=sha256:5bb03a01c6d5676338c36fd1028009c8ad07e7d61d8a1ce3f513b7fff52796ee \ + --hash=sha256:91d73a23a3e51711919c1c899083890cdecffc91d8c088942725ac13e9dcfffa + # via cibuildwheel +bracex==2.4 \ + --hash=sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb \ + --hash=sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418 + # via cibuildwheel +certifi==2024.2.2 \ + --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ + --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 + # via cibuildwheel +cffi==1.17.0rc1 \ + --hash=sha256:157cfe06e48356a7552e68cb73976a710f2620a5f9eb25a5fe7066cf71601b68 \ + --hash=sha256:1c9f4df436f3780f2dbea2ff066cea0bb2f74425883bc5b098812768da2b34f7 \ + --hash=sha256:1da24a9bf6fd9ab987a915887f0d3577d0a0b3946d582b776b380294dc5fce18 \ + --hash=sha256:1db9f6fcf79e92ee2d193cd989dde4e1419193ff11eef4bcc00cb06293e22f4b \ + --hash=sha256:1fee79745f50734490d3358f9cb6578f57850bb61287256115dda2a513abe3c6 \ + --hash=sha256:205051765f126c1480d1eaf6268c644262bae3ed610423f0783349f04e7f5a6b \ + --hash=sha256:22eac8f9c77df0899a6cd373d6a62da40644573a5e27982f7713bd2a9f0b0edf \ + --hash=sha256:2e5562c744d495f838dc0fbe9cd76cff27ebea0a2e747dd84dd8a7e47bcd3c8f \ + --hash=sha256:3113951a250b021d2092e870fe86cd4292a633a786f7ece67200663406409659 \ + --hash=sha256:319ec248b55d34a49d7a43c48f2cf922b526e5ad2a3988887cc822a0c226b983 \ + --hash=sha256:35bd512b1a16723b8c50665c3fe83c80789f7e5599c8f0721ef145552b6853e7 \ + --hash=sha256:3745df375d5e66261295840fa219797251ff6a30afedfae650576ab2b10f43db \ + --hash=sha256:39b9131ed6c28f63132dee75d1fa5653436cb46fc7e6a097af29f32c7f5f8eca \ + --hash=sha256:3c4b0e03d0d9f3a31110994bf657076f3821ad1a88e2cdb7c3e43b4e4f96e7b0 \ + --hash=sha256:3ea7190f834a5979e30bc4af334c031303a4f16f38216599645034751d683171 \ + --hash=sha256:3f60cc0a65ac412887ba284c946242ed4e07065003b358a4d288334f6c2a54ed \ + --hash=sha256:475d2832950f9a65740aeb20d5baf6d84cf0d08a7063c8c6c407ec24cac41881 \ + --hash=sha256:494abc4dc78792d210249127a75021049c7832468f9daa6e81ec0dfc1f55d9d0 \ + --hash=sha256:4f17c3cfc4a7a53693bda38ac1631f30ceb2430f4a038550f5515728592ccd6f \ + --hash=sha256:58463f9a28f4357f4a07a94fbb0dca91486f6948f19a4971e0bedd6292ef0394 \ + --hash=sha256:614afb2f32d5ea64a946643d798f3391d53bba868290e7433f4eaae7d1692e06 \ + --hash=sha256:625eb8d8d377438cfbf64899e09969d20cd139019838a60644f05216f7c7767d \ + --hash=sha256:6a891c9e564527b4e65d65f87e3e989c3369329d04b39c49f279a91266287b85 \ + --hash=sha256:6aff0256e080afb8964e091f94222c2808cdf7c5f13d58f88e799e2fbde53a9d \ + --hash=sha256:6bce1aa64c52c3cb0c7326dd81d1dc5a4831946b29721592983eb4ae80beb2ac \ + --hash=sha256:6df680dccdb5fcd257343532d5354c0059a6e5e4bc27b24a6a310cc51ba35a31 \ + --hash=sha256:7249add87681d15f1a291e096f49350b28c44be958c5ca650d8c4dfbce3a458f \ + --hash=sha256:730a92dd144eb89f69c7b61ba4e6ac48ee6a01ba92f70c17e277c3e2c49b253d \ + --hash=sha256:752c6a06036a24b54936f488ad13b0a83b7d1e0f9fefbe3a4fc237676b1091cf \ + --hash=sha256:7953cd1968a8ea99482d7bfcf5bb9c56d56e91660b97ee940923394c8194d921 \ + --hash=sha256:7e12962a21ba417611c7f9ae3e7f42d5354b68bf3c894af7796c171f6a965acf \ + --hash=sha256:84269088c987aa34045ee808b8a3c5f44397403f1afeff65429cd7c9e123dc01 \ + --hash=sha256:85b997ce260a93010a72767c0f2f7c405524cada076792a9baad75cef435f293 \ + --hash=sha256:8b77f45d5b938f8fa6d3087892458c57458f55a90410ce15c61585627930838b \ + --hash=sha256:8e7b261c3ea000b9a7c4fd40dd54ec3749d4592808025261d82e82f6457e8b7f \ + --hash=sha256:8fe736c2666e20090ae52af3b0297fb9273830f9d31f6041d7a8c7172fb6a566 \ + --hash=sha256:94af5cfe8eb0d2742435458b8c8708aeb88f17fb48372bc4dacb87671e1ba867 \ + --hash=sha256:98c7f31f55c4d0f9dba7da07bab8cd822cff6ac8dbea28ea8385e3a1e7074ac6 \ + --hash=sha256:98e89b4eabb3f98c7882016cb4c498bded7882ad655f80d7a9d23043a1d12d43 \ + --hash=sha256:98eaba1ed99a0a219cabe7d8bb716d9d87aeeb1b6f33792bcf84cc222c1a37b1 \ + --hash=sha256:9b5cb07680e7d3c522733d14fbc0cac0660b597a2e33d8bbd305537b65eb6a51 \ + --hash=sha256:9e39b8008534eedae1bde35d7cd5b71069f8aa7e6c079ae549a0de68299af43c \ + --hash=sha256:a23431415147e0c711742b4e273b362758e632bd11a1e676c58011f0ed96da42 \ + --hash=sha256:a33648455eefb348b265bd10764833ab7d5f3811912a90dcefc00328d548da0d \ + --hash=sha256:a4b7e94db6e6bc2582fa540175384070edbd63c61103b182f57be3a958c0b7ad \ + --hash=sha256:a72748e56cd5edfc808c508da6e4b903225d1ed4c45463c28edf188ffea6d442 \ + --hash=sha256:b3245d8073632f958cf239a198c0c3bed112a59d6ee2202e85367955b92794c6 \ + --hash=sha256:b57fa5d8a1a2cc960613e0e578867d21a018f4405e9bad31c7b0af2b14004f2b \ + --hash=sha256:b6f35a638639298d4f9dca59db1f7568860ea179ace42318d658698850f2f540 \ + --hash=sha256:b7cb4755dc605ac5f2cf0b00e4063fdc2ca474da7bdc473877f8b5cba133b43e \ + --hash=sha256:ba993bea9f3195dc2f8dd9e3739f97f41eac5d71f5804d1ef87ee1283a13a280 \ + --hash=sha256:bf62263af2a3fadaf992775e0e555d657546dee30d3ca8a2ed1559c90006d46e \ + --hash=sha256:c207ccc9f2e459eab7952401dc9237e36d6b630b5020890736e6b18002a750f3 \ + --hash=sha256:c82e1f580f3dd473a9d8b213071dfd8da07f7a433b04ba6be4773ada211d3fdb \ + --hash=sha256:ca0dd9cfb6a3fd91d6f1de5a2e2ee7a0f4b5b753309ec4edce32d5505dbc9149 \ + --hash=sha256:cfc1d8a64c44544a01b06b1688dca70433dc47e2d46f462c9ee6dc02ab233ba8 \ + --hash=sha256:d1089e9654cbbeb4e3ba84caa5eb0a92371fcac6ba43b14514680d339068abed \ + --hash=sha256:d50cef1600b59ec5669a28050286a456682443f20be9b0226c0fe5502860216e \ + --hash=sha256:e27ceb498d5a93f7fe833c5a3a85f8b9f0a4f1a182f1d37936e9ed31dda6926b \ + --hash=sha256:e3ae055e90ea13480185a1ef5325ebd9ac092e03f5f473be3e93eac62bfd43df \ + --hash=sha256:e547a347a983bda467ae8d8b607d278cdf8a37bea735399d655c82cba3f5d725 \ + --hash=sha256:e6c686d93378b18a7b26bbb376dab75716a72bd95c04b7f2cff9094ac66a4582 \ + --hash=sha256:ec95c379f5ebd92cd09e3e8183da9afee8c2da2544593fe091421ed2d757f3c1 \ + --hash=sha256:f6e933e0118a97df454139ca84a28473a024429c7c1eb82619a56ef886b07583 \ + --hash=sha256:f9155a5b35097cbe7a2e31611daf681b7119d895090bb101bf94805fb6bc7834 \ + --hash=sha256:fa76f23281fd49c305002f510c773ecf6216118f2e7083b34ffa06983d6db96a \ + --hash=sha256:ffe885231b8b58f18149e9eaece2d556602aeb233161c069618bda31f3a30d04 + # via -r ci/requirements.in +cibuildwheel==2.18.1 \ + --hash=sha256:a1b0c17dfa690c452022962f2b8d676e39774c0ee1fd5f07a992364b7705e98e \ + --hash=sha256:a3e911b34b10b015690f8332c5c78369191136462ec2626169e202f98a453a41 + # via -r ci/requirements.in +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via -r ci/requirements.in +execnet==2.1.1 \ + --hash=sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc \ + --hash=sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3 + # via pytest-xdist +filelock==3.14.0 \ + --hash=sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f \ + --hash=sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a + # via cibuildwheel +hypothesis==6.102.6 \ + --hash=sha256:ef281ba8b2626ebade9f463fbe8851ae6ff6ae4a8621a9e54c7c2477a97ccff0 \ + --hash=sha256:ef5655b4ca349082241ab55f899a34ea6d75cc336a7b07356680909059db1349 + # via -r ci/requirements.in +iniconfig==2.0.0 \ + --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ + --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 + # via pytest +mypy==1.10.0 \ + --hash=sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061 \ + --hash=sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99 \ + --hash=sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de \ + --hash=sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a \ + --hash=sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9 \ + --hash=sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec \ + --hash=sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1 \ + --hash=sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131 \ + --hash=sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f \ + --hash=sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821 \ + --hash=sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5 \ + --hash=sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee \ + --hash=sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e \ + --hash=sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746 \ + --hash=sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2 \ + --hash=sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0 \ + --hash=sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b \ + --hash=sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53 \ + --hash=sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30 \ + --hash=sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda \ + --hash=sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051 \ + --hash=sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2 \ + --hash=sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7 \ + --hash=sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee \ + --hash=sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727 \ + --hash=sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976 \ + --hash=sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4 + # via -r ci/requirements.in +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 + # via mypy +packaging==24.0 \ + --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ + --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 + # via + # cibuildwheel + # pytest +platformdirs==4.2.2 \ + --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ + --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 + # via cibuildwheel +pluggy==1.5.0 \ + --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ + --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 + # via pytest +pycparser==2.22 \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc + # via + # -r ci/requirements.in + # cffi +pytest==8.2.1 \ + --hash=sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd \ + --hash=sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1 + # via + # -r ci/requirements.in + # pytest-xdist +pytest-xdist==3.6.1 \ + --hash=sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 \ + --hash=sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d + # via -r ci/requirements.in +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via hypothesis +typing-extensions==4.12.0 \ + --hash=sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8 \ + --hash=sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594 + # via mypy +wheel==0.43.0 \ + --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ + --hash=sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81 + # via -r ci/requirements.in diff --git a/docs/news.rst b/docs/news.rst index 923845c5..cdd6a115 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -52,6 +52,16 @@ Changes ------- * PyO3 Rust crate upgraded from 0.18 to 0.21. +* Semi official support for CPython 3.13. Binary wheels for 3.13 are now published + during releases. There were no meaningful code changes to support Python 3.12. + Support is *semi official* since 3.13 is still in beta and 3.13 is currently being + built against a pre-release version of cffi 1.17. We also lack a Rust extension + for 3.13 since PyO3 lacks a release with 3.13 support. +* ``pyproject.toml`` now lists version constraints of `[build-system]` requirements, + not exact versions. This should provide more compatibility with more environments. + ``setuptools`` is held back before 69.0.0 because that version apparently broke + support for using ``--global-settings=--build-option`` in editable installs, which + our CI relies on. 0.22.0 (released 2023-11-01) ============================ diff --git a/pyproject.toml b/pyproject.toml index 9adcf30b..c09bd574 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,13 @@ [build-system] requires = [ - "cffi==1.16.0", - "setuptools==68.2.2", - "wheel==0.41.2", + "cffi>=1.16.0; python_version <= '3.12'", + "cffi==1.17.0rc1; python_version >= '3.13'", + # 69.0.0 breaks handling of --config-settings=--build-option, which our CI + # relies on. So constrained to an older version until we figure out a + # workaround. See comment at + # https://github.com/pypa/pip/issues/11859#issuecomment-2132287974. + "setuptools<69.0.0", + "wheel>=0.41.2", ] # Need to use legacy backend because setup_zstd.py breaks build isolation. build-backend = "setuptools.build_meta:__legacy__" diff --git a/setup.py b/setup.py index 2b2895ba..bd7482f1 100755 --- a/setup.py +++ b/setup.py @@ -29,6 +29,10 @@ # garbage collection pitfalls. MINIMUM_CFFI_VERSION = "1.11" +# Need 1.17+ on 3.13 to avoid deprecated and removed APIs. +if sys.version_info[0:2] >= (3, 13): + MINIMUM_CFFI_VERSION = "1.17" + try: import cffi @@ -37,8 +41,8 @@ cffi_version = LooseVersion(cffi.__version__) if cffi_version < LooseVersion(MINIMUM_CFFI_VERSION): print( - "CFFI 1.11 or newer required (%s found); " - "not building CFFI backend" % cffi_version, + "CFFI %s or newer required (%s found); " + "not building CFFI backend" % (MINIMUM_CFFI_VERSION, cffi_version), file=sys.stderr, ) cffi = None @@ -144,6 +148,7 @@ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ], keywords=["zstandard", "zstd", "compression"], packages=["zstandard"],