Repository: zopefoundation/AccessControl (language: python)

Issue:
Cannot be compiled under Python 3.12.a3
```
src/AccessControl/cAccessControl.c:1913:19: error: implicit declaration of function 'PyUnicode_GET_SIZE' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
              if (NATIVE_GET_SIZE(roles))
                  ^
```

Maybe related to #118.


Discussion / hints:

Fix patch:
diff --git a/.manylinux-install.sh b/.manylinux-install.sh
index 68b9547..29747aa 100755
--- a/.manylinux-install.sh
+++ b/.manylinux-install.sh
@@ -28,6 +28,7 @@ yum -y install libffi-devel
 
 tox_env_map() {
     case $1 in
+        *"cp312"*) echo 'py312';;
         *"cp37"*) echo 'py37';;
         *"cp38"*) echo 'py38';;
         *"cp39"*) echo 'py39';;
@@ -40,13 +41,19 @@ tox_env_map() {
 # Compile wheels
 for PYBIN in /opt/python/*/bin; do
     if \
+       [[ "${PYBIN}" == *"cp312"* ]] || \
        [[ "${PYBIN}" == *"cp311"* ]] || \
        [[ "${PYBIN}" == *"cp37"* ]] || \
        [[ "${PYBIN}" == *"cp38"* ]] || \
        [[ "${PYBIN}" == *"cp39"* ]] || \
        [[ "${PYBIN}" == *"cp310"* ]] ; then
-        "${PYBIN}/pip" install -e /io/
-        "${PYBIN}/pip" wheel /io/ -w wheelhouse/
+        if [[ "${PYBIN}" == *"cp312"* ]] ; 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 8b2b8b2..7a12127 100644
--- a/.meta.toml
+++ b/.meta.toml
@@ -2,13 +2,13 @@
 # https://github.com/zopefoundation/meta/tree/master/config/c-code
 [meta]
 template = "c-code"
-commit-id = "3c9d0741"
+commit-id = "c7a64084"
 
 [python]
 with-appveyor = true
 with-windows = false
 with-pypy = false
-with-future-python = false
+with-future-python = true
 with-sphinx-doctests = false
 with-macos = false
 
diff --git a/CHANGES.rst b/CHANGES.rst
index f619850..be81b4f 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -6,6 +6,8 @@ For changes before version 3.0, see ``HISTORY.rst``.
 6.1 (unreleased)
 ----------------
 
+- Add preliminary support for Python 3.12a5.
+
 
 6.0 (2023-01-12)
 ----------------
diff --git a/appveyor.yml b/appveyor.yml
index 92090ea..2839637 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -15,6 +15,9 @@ environment:
     - python: 39-x64
     - python: 310-x64
     - python: 311-x64
+    # `multibuild` cannot install non-final versions as they are not on
+    # ftp.python.org, so we skip Python 3.11 until its final release:
+    # - python: 312-x64
 
 install:
   - "SET PYTHONVERSION=%PYTHON%"
diff --git a/setup.cfg b/setup.cfg
index cba82bd..e952477 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -24,7 +24,7 @@ ignore =
 force_single_line = True
 combine_as_imports = True
 sections = FUTURE,STDLIB,THIRDPARTY,ZOPE,FIRSTPARTY,LOCALFOLDER
-known_third_party = six, docutils, pkg_resources
+known_third_party = six, docutils, pkg_resources, pytz
 known_zope =
 known_first_party =
 default_section = ZOPE
diff --git a/src/AccessControl/_compat.h b/src/AccessControl/_compat.h
index 86b16cc..6867874 100644
--- a/src/AccessControl/_compat.h
+++ b/src/AccessControl/_compat.h
@@ -15,4 +15,4 @@
 #include "Python.h"
 
 #define NATIVE_FORMAT PyUnicode_Format
-#define NATIVE_GET_SIZE PyUnicode_GET_SIZE
+#define NATIVE_GET_SIZE PyUnicode_GET_LENGTH
diff --git a/tox.ini b/tox.ini
index cc31b94..8352699 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,7 +1,7 @@
 # Generated from:
 # https://github.com/zopefoundation/meta/tree/master/config/c-code
 [tox]
-minversion = 3.18
+minversion = 4.0
 envlist =
     lint
     py37,py37-pure
@@ -9,10 +9,12 @@ envlist =
     py39,py39-pure
     py310,py310-pure
     py311,py311-pure
+    py312,py312-pure
     coverage
 
 [testenv]
 usedevelop = true
+pip_pre = py312: true
 deps =
 setenv =
     pure: PURE_PYTHON=1


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index f8d419e..c8d75de 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -101,6 +101,7 @@ jobs:
           - "3.9"
           - "3.10"
           - "3.11"
+          - "3.12.0-alpha.5"
         os: [ubuntu-20.04, macos-11]
 
     steps:
@@ -173,7 +174,15 @@ jobs:
           python setup.py build_ext -i
           python setup.py bdist_wheel
 
+      - name: Install AccessControl and dependencies (3.12.0-alpha.5)
+        if: matrix.python-version == '3.12.0-alpha.5'
+        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 AccessControl and dependencies
+        if: matrix.python-version != '3.12.0-alpha.5'
         run: |
           # Install to collect dependencies into the (pip) cache.
           pip install .[test]
@@ -217,6 +226,7 @@ jobs:
           && startsWith(github.ref, 'refs/tags')
           && startsWith(runner.os, 'Mac')
           && !startsWith(matrix.python-version, 'pypy')
+          && !startsWith(matrix.python-version, '3.12.0-alpha.5')
         env:
           TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }}
         run: |
@@ -234,6 +244,7 @@ jobs:
           - "3.9"
           - "3.10"
           - "3.11"
+          - "3.12.0-alpha.5"
         os: [ubuntu-20.04, macos-11]
 
     steps:
@@ -267,7 +278,22 @@ jobs:
         with:
           name: AccessControl-${{ runner.os }}-${{ matrix.python-version }}.whl
           path: dist/
+      - name: Install AccessControl 3.12.0-alpha.5
+        if: ${{ startsWith(matrix.python-version, '3.12.0-alpha.5') }}
+        run: |
+          pip install -U wheel setuptools
+          # coverage has 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
+          # 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/AccessControl-*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 -U -e .[test]
       - name: Install AccessControl
+        if: ${{ !startsWith(matrix.python-version, '3.12.0-alpha.5') }}
         run: |
           pip install -U wheel setuptools
           pip install -U coverage