diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 325ae0e..9cf4fde 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -15,6 +15,9 @@ env: jobs: pre-commit: + permissions: + contents: read + pull-requests: write name: linting runs-on: ubuntu-latest steps: @@ -22,12 +25,12 @@ jobs: - uses: actions/setup-python@v5 with: python-version: 3.x - - uses: pre-commit/action@v3.0.1 + - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd #v3.0.1 with: extra_args: --all-files --show-diff-on-failure env: PRE_COMMIT_COLOR: always - - uses: pre-commit-ci/lite-action@v1.0.2 + - uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 #v1.1.0 if: always() with: msg: Apply pre-commit code formatting diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 279d976..01ac855 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -30,7 +30,7 @@ # native support. It works, but is slow. # # Another major downside: You can't just re-run the job for one part -# of the matrix. So if there's a transient test failure that hit, say, 3.8, +# of the matrix. So if there's a transient test failure that hit, say, 3.11, # to get a clean run every version of Python runs again. That's bad. # https://github.community/t/ability-to-rerun-just-a-single-job-in-a-workflow/17234/65 @@ -97,12 +97,12 @@ jobs: matrix: python-version: - "pypy-3.10" - - "3.8" - "3.9" - "3.10" - "3.11" - "3.12" - "3.13" + - "3.14" os: [ubuntu-latest, macos-latest, windows-latest] exclude: - os: macos-latest @@ -111,6 +111,8 @@ jobs: steps: - name: checkout uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: @@ -152,10 +154,17 @@ jobs: restore-keys: | ${{ runner.os }}-pip- + - name: Install Build Dependencies (3.14) + if: matrix.python-version == '3.14' + run: | + pip install -U pip + pip install -U --pre cffi + pip install -U "setuptools <= 75.6.0" wheel twine - name: Install Build Dependencies + if: matrix.python-version != '3.14' run: | pip install -U pip - pip install -U "setuptools <74" wheel twine + pip install -U "setuptools <= 75.6.0" wheel twine pip install cffi - name: Build zope.index (macOS x86_64) @@ -194,7 +203,15 @@ jobs: python setup.py build_ext -i python setup.py bdist_wheel + - name: Install zope.index and dependencies (3.14) + if: matrix.python-version == '3.14' + run: | + # Install to collect dependencies into the (pip) cache. + # Use "--pre" here because dependencies with support for this future + # Python release may only be available as pre-releases + pip install --pre .[test] - name: Install zope.index and dependencies + if: matrix.python-version != '3.14' run: | # Install to collect dependencies into the (pip) cache. pip install .[test] @@ -237,6 +254,7 @@ jobs: && startsWith(github.ref, 'refs/tags') && !startsWith(runner.os, 'Linux') && !startsWith(matrix.python-version, 'pypy') + && !startsWith(matrix.python-version, '3.14') env: TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} run: | @@ -250,12 +268,12 @@ jobs: matrix: python-version: - "pypy-3.10" - - "3.8" - "3.9" - "3.10" - "3.11" - "3.12" - "3.13" + - "3.14" os: [ubuntu-latest, macos-latest, windows-latest] exclude: - os: macos-latest @@ -264,6 +282,8 @@ jobs: steps: - name: checkout uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: @@ -310,9 +330,25 @@ jobs: with: name: zope.index-${{ runner.os }}-${{ matrix.python-version }}.whl path: dist/ + - name: Install zope.index ${{ matrix.python-version }} + if: matrix.python-version == '3.14' + run: | + pip install -U --pre cffi + pip install -U wheel "setuptools <= 75.6.0" + # coverage might have a wheel on PyPI for a future python version which is + # not ABI compatible with the current one, so build it from sdist: + pip install -U --no-binary :all: coverage[toml] + # Unzip into src/ so that testrunner can find the .so files + # when we ask it to load tests from that directory. This + # might also save some build time? + unzip -n dist/zope.index-*whl -d src + # Use "--pre" here because dependencies with support for this future + # Python release may only be available as pre-releases + pip install --pre -e .[test] - name: Install zope.index + if: matrix.python-version != '3.14' run: | - pip install -U wheel "setuptools <74" + pip install -U wheel "setuptools <= 75.6.0" pip install -U coverage[toml] pip install -U 'cffi; platform_python_implementation == "CPython"' # Unzip into src/ so that testrunner can find the .so files @@ -361,6 +397,8 @@ jobs: steps: - name: checkout uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: @@ -431,6 +469,8 @@ jobs: steps: - name: checkout uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: @@ -506,6 +546,8 @@ jobs: name: manylinux_${{ matrix.image }}_wheels.zip - name: Restore pip cache permissions run: sudo chown -R $(whoami) ${{ steps.pip-cache-default.outputs.dir }} + - name: Prevent publishing wheels for unreleased Python versions + run: VER=$(echo '3.14' | tr -d .) && ls -al wheelhouse && sudo rm -f wheelhouse/*-cp${VER}*.whl && ls -al wheelhouse - name: Publish package to PyPI uses: pypa/gh-action-pypi-publish@release/v1 if: > diff --git a/.manylinux-install.sh b/.manylinux-install.sh index 15316fa..b3ef47d 100755 --- a/.manylinux-install.sh +++ b/.manylinux-install.sh @@ -28,12 +28,12 @@ yum -y install libffi-devel tox_env_map() { case $1 in - *"cp38"*) echo 'py38';; *"cp39"*) echo 'py39';; *"cp310"*) echo 'py310';; *"cp311"*) echo 'py311';; *"cp312"*) echo 'py312';; *"cp313"*) echo 'py313';; + *"cp314"*) echo 'py314';; *) echo 'py';; esac } @@ -41,14 +41,19 @@ tox_env_map() { # Compile wheels for PYBIN in /opt/python/*/bin; do if \ - [[ "${PYBIN}" == *"cp38/"* ]] || \ [[ "${PYBIN}" == *"cp39/"* ]] || \ [[ "${PYBIN}" == *"cp310/"* ]] || \ [[ "${PYBIN}" == *"cp311/"* ]] || \ [[ "${PYBIN}" == *"cp312/"* ]] || \ - [[ "${PYBIN}" == *"cp313/"* ]] ; then - "${PYBIN}/pip" install -e /io/ - "${PYBIN}/pip" wheel /io/ -w wheelhouse/ + [[ "${PYBIN}" == *"cp313/"* ]] || \ + [[ "${PYBIN}" == *"cp314/"* ]] ; then + if [[ "${PYBIN}" == *"cp314/"* ]] ; then + "${PYBIN}/pip" install --pre -e /io/ + "${PYBIN}/pip" wheel /io/ --pre -w wheelhouse/ + else + "${PYBIN}/pip" install -e /io/ + "${PYBIN}/pip" wheel /io/ -w wheelhouse/ + fi if [ `uname -m` == 'aarch64' ]; then cd /io/ ${PYBIN}/pip install tox diff --git a/.meta.toml b/.meta.toml index 9737c87..8d1a82d 100644 --- a/.meta.toml +++ b/.meta.toml @@ -2,14 +2,14 @@ # https://github.com/zopefoundation/meta/tree/master/config/c-code [meta] template = "c-code" -commit-id = "85622de1" +commit-id = "e78b9550" [python] with-windows = true with-pypy = true with-docs = true with-sphinx-doctests = true -with-future-python = false +with-future-python = true with-macos = false [tox] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b5d6386..7d30407 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,19 +3,19 @@ minimum_pre_commit_version: '3.6' repos: - repo: https://github.com/pycqa/isort - rev: "5.13.2" + rev: "6.0.0" hooks: - id: isort - repo: https://github.com/hhatto/autopep8 - rev: "v2.3.1" + rev: "v2.3.2" hooks: - id: autopep8 args: [--in-place, --aggressive, --aggressive] - repo: https://github.com/asottile/pyupgrade - rev: v3.17.0 + rev: v3.19.1 hooks: - id: pyupgrade - args: [--py38-plus] + args: [--py39-plus] - repo: https://github.com/isidentical/teyit rev: 0.4.3 hooks: diff --git a/CHANGES.rst b/CHANGES.rst index 0866f19..dd7c7f9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ 7.1 (unreleased) ================ +- Drop support for Python 3.8. + +- Add preliminary support for Python 3.14. 7.0 (2024-09-18) ================ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e6d84b8..5242e6a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ +--> # Contributing to zopefoundation projects The projects under the zopefoundation GitHub organization are open source and diff --git a/pyproject.toml b/pyproject.toml index 2fd06b4..db41b90 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ # https://github.com/zopefoundation/meta/tree/master/config/c-code [build-system] -requires = ["setuptools<74"] +requires = ["setuptools <= 75.6.0"] build-backend = "setuptools.build_meta" [tool.coverage.run] diff --git a/setup.py b/setup.py index 544cb10..c476ac5 100644 --- a/setup.py +++ b/setup.py @@ -79,9 +79,9 @@ def _unavailable(self, e): setup(name='zope.index', version=version, url='https://github.com/zopefoundation/zope.index', - license='ZPL 2.1', + license='ZPL-2.1', author='Zope Foundation and Contributors', - author_email='zope-dev@zope.org', + author_email='zope-dev@zope.dev', description="Indices for using with catalog like text, field, etc.", long_description=long_description, classifiers=[ @@ -90,7 +90,6 @@ def _unavailable(self, e): 'License :: OSI Approved :: Zope Public License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', @@ -106,7 +105,7 @@ def _unavailable(self, e): packages=find_packages('src'), package_dir={'': 'src'}, namespace_packages=['zope'], - python_requires='>=3.8', + python_requires='>=3.9', extras_require={ 'test': [ 'zope.testrunner', diff --git a/src/zope/index/text/okapiindex.py b/src/zope/index/text/okapiindex.py index 229cb55..a243398 100644 --- a/src/zope/index/text/okapiindex.py +++ b/src/zope/index/text/okapiindex.py @@ -203,7 +203,7 @@ PURE_PYTHON = int(os.environ.get('PURE_PYTHON', '0')) or _is_pypy try: from zope.index.text.okascore import score -except ImportError: # pragma: no cover +except ModuleNotFoundError: # pragma: no cover score = None score = None if PURE_PYTHON else score diff --git a/tox.ini b/tox.ini index c434027..98482b7 100644 --- a/tox.ini +++ b/tox.ini @@ -4,19 +4,21 @@ minversion = 4.0 envlist = lint - py38,py38-pure py39,py39-pure py310,py310-pure py311,py311-pure py312,py312-pure py313,py313-pure + py314,py314-pure pypy3 docs coverage [testenv] +pip_pre = py314: true deps = - setuptools <74 + setuptools <= 75.6.0 + Sphinx setenv = pure: PURE_PYTHON=1 !pure-!pypy3: PURE_PYTHON=0 @@ -51,7 +53,7 @@ description = ensure that the distribution is ready to release basepython = python3 skip_install = true deps = - setuptools <74 + setuptools <= 75.6.0 twine build check-manifest