Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 27 additions & 27 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,22 +88,22 @@ jobs:
# 3.12.1 breaks zope.testrunner.
# See https://github.com/zopefoundation/zope.testrunner/issues/157
python-version:
- '3.9'
- '3.10'
- '3.11'
- "3.12"
- "3.13"
- "pypy-3.11"
- "3.14.0-rc.3"
os: [ubuntu-latest, macos-latest]
exclude:
# Can't build persistent on 3.12 with -UNDEBUG because it
# accesses fields of objects that aren't there in assert statements;
# we build linux with assertions enabled, and unless there is a 3.12
# persistent wheel, we have to exclude that one.
# The same thing goes for PyPy.
- os: ubuntu-latest
python-version: "pypy-3.11"
- "3.14"
- "3.15-dev"
# Too many modules we depend on aren't free-threaded to make
# it worthwhile to try to test this. We'd have to forcibly
# disable the GIL, which is almost certainly unsafe given
# the modules that aren't free-threaded (e.g., gevent, persistent),
# and the fact that our test suite heavily uses threads.
# - "3.14t"
os:
- ubuntu-latest
- macos-latest
# exclude:

steps:
- name: checkout
Expand Down Expand Up @@ -173,13 +173,12 @@ jobs:
ls -l dist
twine check dist/*
- name: Upload RelStorage wheel
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: RelStorage-${{ runner.os }}-${{ matrix.python-version }}.whl
path: dist/*whl
- name: lint
if: matrix.python-version == '3.11' && startsWith(runner.os, 'Linux')
# At this writing, PyLint 2.17/astroid 2.15 won't work on 3.12
if: matrix.python-version == '3.14' && startsWith(runner.os, 'Linux')
run: |
pip install -U pylint
python -m pylint --limit-inference-results=1 --rcfile=.pylintrc relstorage -f parseable -r n
Expand Down Expand Up @@ -212,14 +211,16 @@ jobs:
- name: Run tests and report coverage
uses: ./.github/actions/run-tests
with:
useCoverage: ${{ !startsWith(matrix.python-version, 'pypy') }}
# On 3.15b1 with coverage 7.14.0, the binary tracer isn't available
# and the pure-python tracer can't do greenlet concurrency
useCoverage: ${{ !startsWith(matrix.python-version, 'pypy') && matrix.python-version != '3.15-dev' }}
- name: Coveralls Parallel
uses: coverallsapp/github-action@v2
if: ${{ !startsWith(matrix.python-version, 'pypy') }}
if: ${{ !startsWith(matrix.python-version, 'pypy') && matrix.python-version != '3.15-dev' }}
with:
flag-name: run-${{ join(matrix.*, '-') }}
parallel: true
- name: Publish package to PyPI (mac)
- name: Publish package to PyPI (Mac)
# We cannot 'uses: pypa/gh-action-pypi-publish@v1.4.1' because
# that's apparently a container action, and those don't run on
# the Mac.
Expand All @@ -245,15 +246,14 @@ jobs:
# We use a regular Python matrix entry to share as much code as possible.
strategy:
matrix:
python-version: [3.9]
python-version: [3.14]
image:
- manylinux_2_28_x86_64
- manylinux2014_aarch64
- manylinux2014_ppc64le
- manylinux2014_s390x
- manylinux2014_x86_64
- musllinux_1_1_x86_64
- musllinux_1_1_aarch64
- manylinux_2_28_aarch64
# - manylinux_2_28_ppc64le
# - manylinux_2_28_s390x
- musllinux_1_2_x86_64
- musllinux_1_2_aarch64
name: ${{ matrix.image }}
steps:
- name: checkout
Expand All @@ -263,15 +263,15 @@ jobs:
with:
python-version: ${{ matrix.python-version }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@v4
with:
platforms: all
- name: Build RelStorage
env:
DOCKER_IMAGE: quay.io/pypa/${{ matrix.image }}
run: bash ./scripts/releases/make-manylinux
- name: Store RelStorage wheels
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
path: wheelhouse/*whl
name: ${{ matrix.image }}_wheels.zip
Expand Down
2 changes: 1 addition & 1 deletion .readthedocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ build:
# os is required for some reason
os: ubuntu-22.04
tools:
python: "3.11"
python: "3.14"

python:
install:
Expand Down
12 changes: 10 additions & 2 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,18 @@
Changes
=========

4.2.1 (unreleased)
4.3.0 (unreleased)
==================

- Nothing changed yet.
- Use newer ``manylinux`` images to build binary wheels.
- Drop support for Python 3.9. This will be the last major RelStorage
release to support 3.10.
- Stop testing on PyPy 3.11 and with psycopg2cffi.
- Build and provide binary wheels with free-threaded support. However, it is
likely that RelStorage dependencies will cause the GIL to be
automatically enabled, and these wheels are thus untested. Crashes
have been seen in combination with gevent on 3.14t.
- Add support for Python 3.15.


4.2.0 (2025-09-29)
Expand Down
7 changes: 1 addition & 6 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ environment:
# all the current (non EOL) versions.

- PYTHON: "C:\\Python314-x64"
PYTHON_VERSION: "3.14.0rc3"
PYTHON_VERSION: "3.14.0"
PYTHON_ARCH: "64"
PYTHON_EXE: python

Expand All @@ -63,11 +63,6 @@ environment:
PYTHON_ARCH: "64"
PYTHON_EXE: python

- PYTHON: "C:\\Python39-x64"
PYTHON_VERSION: "3.9.x"
PYTHON_ARCH: "64"
PYTHON_EXE: python



# The images have moved to MySQL8 only, and that cannot
Expand Down
8 changes: 6 additions & 2 deletions docs/install.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
Installation
==============

RelStorage 3.0 is supported on Python 3.8, through 3.12, as well as
PyPy3 3.9 or later.
RelStorage 4.3 is supported on Python 3.10 through 3.14. PyPy 3.11
was tested and supported in the past and may continue to work as long
as RelStorage supports Python 3.11.

.. seealso:: :doc:`supported-databases`

Expand All @@ -25,6 +26,9 @@ need to use even older versions of ZODB/ZEO, install RelStorage 1.6.
Likewise, if you need Python 2.6 support, install RelStorage 1.6 (note
that 1.6 *does not* run on Python 3 or PyPy).

RelStorage 4.2.0 was the last version to support Python 3.9.

RelStorage 4.0.0 was the last version to support Python 3.8.

Database Adapter
================
Expand Down
3 changes: 2 additions & 1 deletion scripts/releases/make-manylinux
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export GEVENT_MANYLINUX=1
# know. The env var works for pip 20.
export PIP_NO_PYTHON_VERSION_WARNING=1
export PIP_NO_WARN_SCRIPT_LOCATION=1
export PIP_ROOT_USER_ACTION=ignore

# Build configuration.
export CFLAGS="-pipe -O3"
Expand Down Expand Up @@ -58,7 +59,7 @@ if [ -d /RelStorage ] && [ -d /opt/python ]; then
rm -rf wheelhouse
mkdir wheelhouse
ls -l /opt/python
for variant in `ls -d /opt/python/cp{314,312,39,310,311,313}*`; do
for variant in `ls -d /opt/python/cp{315,314,312,310,311,313}*`; do
echo "Building $variant"
mkdir /tmp/build
cd /tmp/build
Expand Down
12 changes: 4 additions & 8 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,15 +168,12 @@ def read_file(*path):
license="ZPL-2.1",
platforms=["any"],
description="A backend for ZODB that stores pickles in a relational database.",
# Bump to 3.10 or even 3.11 at next release. We'll have to make changes
# in this file and our CI configuration to make sure we still have the
# same test coverage, as we were using just 3.9 for some things.
python_requires=">=3.9",
# Bump to 3.11 at next release.
python_requires=">=3.10",
classifiers=[
"Intended Audience :: Developers",
"Programming Language :: Python",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand Down Expand Up @@ -263,6 +260,7 @@ def read_file(*path):
'always_allow_keywords': False,
'infer_types': True,
'nonecheck': False,
'freethreading_compatible': True,
},
),
tests_require=tests_require,
Expand Down Expand Up @@ -344,7 +342,7 @@ def read_file(*path):

# First, mysql
# pymysql on 3.9 on all platforms.
'PyMySQL >= 0.6.6; python_version == "3.9"',
'PyMySQL >= 0.6.6; python_version == "3.14"',
# mysqlclient (binary) on all CPythons. It's the default.
'mysqlclient >= 2.0.0',
# mysql-connector-python; one of two pure-python versions
Expand All @@ -356,8 +354,6 @@ def read_file(*path):
# pg8000
# This requirement is repeated in the driver class.
'pg8000 >= 1.29.0; python_version == "3.11"',
# CFFI, runs on all implementations.
'psycopg2cffi >= 2.7.4; python_version == "3.11" or platform_python_implementation == "PyPy"',
# Psycopg2 on all CPython, it's the default
'psycopg2 >= 2.8.3; platform_python_implementation == "CPython"',
],
Expand Down
2 changes: 1 addition & 1 deletion src/relstorage/adapters/mysql/drivers/_mysqldb_gevent.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ def enter_critical_phase_until_transaction_end(self):
self.commit = self._critical_commit
self.rollback = self._critical_rollback
self.query = self._critical_query
self.gevent_sleep = _noop
self.gevent_sleep = _noop # pylint:disable=attribute-defined-outside-init

def is_in_critical_phase(self):
return 'gevent_sleep' in self.__dict__
Expand Down
2 changes: 1 addition & 1 deletion src/relstorage/tests/reltestbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def __init__(self, storage, *args, **kwargs):

def runtest(self):
try:
super().runtest()
super().runtest() # pylint:disable=no-member
finally:
self.storage.release()
self.storage = None
Expand Down
1 change: 1 addition & 0 deletions src/relstorage/zodbconvert.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ def main(argv=None):
default=logging.INFO,
help="Set the logging level to TRACE instead of the default of INFO."
)
# pylint:disable-next=deprecated-class
parser.add_argument("config_file", type=argparse.FileType('r'))

options = parser.parse_args(argv[1:])
Expand Down
1 change: 1 addition & 0 deletions src/relstorage/zodbpack.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ def main(argv=None):
"to objects that have already been removed. The --days and --prepack "
"arguments are ignored."
)
# pylint:disable-next=deprecated-class
parser.add_argument("config_file", type=argparse.FileType('r'))
options = parser.parse_args(argv[1:])

Expand Down
Loading