Github messages for voidlinux
 help / color / mirror / Atom feed
* [PR PATCH] sagemath: fix for python 3.11
@ 2022-11-06 22:12 tornaria
  2022-11-06 23:40 ` [PR PATCH] [Closed]: " ahesford
  0 siblings, 1 reply; 2+ messages in thread
From: tornaria @ 2022-11-06 22:12 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 2258 bytes --]

There is a new pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath-update
https://github.com/void-linux/void-packages/pull/40369

sagemath: fix for python 3.11
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **YES**

Without this sagemath is completely broken on python 3.11 (as in: won't even start).

With this I've run tests (on x86_64) both in normal and `--long` mode, all pass. I also installed the package and run from CLI:
```
$ sage
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 9.7, Release Date: 2022-09-19                     │
│ Using Python 3.11.0. Type "help()" for help.                       │
└────────────────────────────────────────────────────────────────────┘
sage: 2+2
4
```

All patches added have been submitted upstream see https://trac.sagemath.org/ticket/33842#comment:79. Hopefully everything will be upstream in sagemath 9.8.

Ping @ahesford


<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/40369.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-update-40369.patch --]
[-- Type: text/x-diff, Size: 69950 bytes --]

From c6b94ba0436ad197c4fad8cf4e47802d4dd9fec5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 6 Nov 2022 17:38:53 -0300
Subject: [PATCH] sagemath: fix for python 3.11

---
 ...ac-33842-01-python_3.11-de38bac21e2.patch} |   47 +-
 ...-python_3.11-argspec-fix-9eb08f3afde.patch |  168 +++
 ...3-python3.11-final_fixes-7b6fa565f42.patch | 1279 +++++++++++++++++
 srcpkgs/sagemath/template                     |    2 +-
 4 files changed, 1482 insertions(+), 14 deletions(-)
 rename srcpkgs/sagemath/patches/{trac-33842-python-3.11.patch => trac-33842-01-python_3.11-de38bac21e2.patch} (51%)
 create mode 100644 srcpkgs/sagemath/patches/trac-33842-02-python_3.11-argspec-fix-9eb08f3afde.patch
 create mode 100644 srcpkgs/sagemath/patches/trac-33842-03-python3.11-final_fixes-7b6fa565f42.patch

diff --git a/srcpkgs/sagemath/patches/trac-33842-python-3.11.patch b/srcpkgs/sagemath/patches/trac-33842-01-python_3.11-de38bac21e2.patch
similarity index 51%
rename from srcpkgs/sagemath/patches/trac-33842-python-3.11.patch
rename to srcpkgs/sagemath/patches/trac-33842-01-python_3.11-de38bac21e2.patch
index eafe76bfb794..70b1fed99ce4 100644
--- a/srcpkgs/sagemath/patches/trac-33842-python-3.11.patch
+++ b/srcpkgs/sagemath/patches/trac-33842-01-python_3.11-de38bac21e2.patch
@@ -1,6 +1,20 @@
+From de38bac21e276c6dba95b8b33f7457a0ac56bdeb Mon Sep 17 00:00:00 2001
+From: Matthias Koeppe <mkoeppe@math.ucdavis.edu>
+Date: Tue, 25 Oct 2022 19:43:53 -0700
+Subject: [PATCH] src/sage: Apply python-3.11.patch from
+ https://github.com/void-linux/void-packages/commit/6229f313450ecae88743b4d5e99da2ed4de44e07
+
+---
+ src/sage/cpython/cython_metaclass.h | 2 +-
+ src/sage/libs/gmp/pylong.pyx        | 8 +++-----
+ src/sage/symbolic/ginac/numeric.cpp | 1 -
+ 3 files changed, 4 insertions(+), 7 deletions(-)
+
+diff --git a/src/sage/cpython/cython_metaclass.h b/src/sage/cpython/cython_metaclass.h
+index cc620a4dac7..6487342b71e 100644
 --- a/src/sage/cpython/cython_metaclass.h
 +++ b/src/sage/cpython/cython_metaclass.h
-@@ -66,7 +66,7 @@
+@@ -66,7 +66,7 @@ static CYTHON_INLINE int Sage_PyType_Ready(PyTypeObject* t)
          }
  
          /* Now, set t.__class__ to metaclass */
@@ -9,19 +23,11 @@
          PyType_Modified(t);
      }
      else
---- a/src/sage/symbolic/ginac/numeric.cpp
-+++ b/src/sage/symbolic/ginac/numeric.cpp
-@@ -52,7 +52,6 @@
- #define register
- #define PY_SSIZE_T_CLEAN
- #include <Python.h>
--#include <longintrepr.h>
- #include "flint/fmpz.h"
- #include "flint/fmpz_factor.h"
- 
+diff --git a/src/sage/libs/gmp/pylong.pyx b/src/sage/libs/gmp/pylong.pyx
+index 388be32c55e..e772b60e3e0 100644
 --- a/src/sage/libs/gmp/pylong.pyx
 +++ b/src/sage/libs/gmp/pylong.pyx
-@@ -32,7 +32,7 @@
+@@ -32,7 +32,7 @@ from cpython.longintrepr cimport _PyLong_New, py_long, digit, PyLong_SHIFT
  from .mpz cimport *
  
  cdef extern from *:
@@ -30,7 +36,7 @@
      int hash_bits """
          #ifdef _PyHASH_BITS
          _PyHASH_BITS         /* Python 3 */
-@@ -57,10 +57,8 @@
+@@ -57,10 +57,8 @@ cdef mpz_get_pylong_large(mpz_srcptr z):
      mpz_export(L.ob_digit, NULL,
              -1, sizeof(digit), 0, PyLong_nails, z)
      if mpz_sgn(z) < 0:
@@ -43,3 +49,18 @@
      return L
  
  
+diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp
+index 22060441760..b40ed64edb5 100644
+--- a/src/sage/symbolic/ginac/numeric.cpp
++++ b/src/sage/symbolic/ginac/numeric.cpp
+@@ -52,7 +52,6 @@
+ #define register
+ #define PY_SSIZE_T_CLEAN
+ #include <Python.h>
+-#include <longintrepr.h>
+ #include "flint/fmpz.h"
+ #include "flint/fmpz_factor.h"
+ 
+-- 
+2.38.1
+
diff --git a/srcpkgs/sagemath/patches/trac-33842-02-python_3.11-argspec-fix-9eb08f3afde.patch b/srcpkgs/sagemath/patches/trac-33842-02-python_3.11-argspec-fix-9eb08f3afde.patch
new file mode 100644
index 000000000000..0bb1f5f68b0e
--- /dev/null
+++ b/srcpkgs/sagemath/patches/trac-33842-02-python_3.11-argspec-fix-9eb08f3afde.patch
@@ -0,0 +1,168 @@
+From 9eb08f3afde3266bbd667e196513240a0fe245f4 Mon Sep 17 00:00:00 2001
+From: Matthias Koeppe <mkoeppe@math.ucdavis.edu>
+Date: Tue, 25 Oct 2022 22:52:56 -0700
+Subject: [PATCH] inspect.ArgSpec -> inspect.FullArgSpec
+
+---
+ src/sage/misc/cachefunc.pyx         |  4 ++--
+ src/sage/misc/decorators.py         |  6 ++++--
+ src/sage/misc/function_mangling.pyx |  2 +-
+ src/sage/misc/sageinspect.py        | 24 +++++++++++++-----------
+ 4 files changed, 20 insertions(+), 16 deletions(-)
+
+diff --git a/src/sage/misc/cachefunc.pyx b/src/sage/misc/cachefunc.pyx
+index 9fa967ce737..72042ef13d6 100644
+--- a/src/sage/misc/cachefunc.pyx
++++ b/src/sage/misc/cachefunc.pyx
+@@ -2818,7 +2818,7 @@ cdef class CachedMethod():
+                 except Exception:
+                     pass
+             if self.nargs == 0:
+-                args, varargs, keywords, defaults = sage_getargspec(f)
++                args, varargs, keywords, defaults, kwonlyargs, kwonlydefaults, annotations = sage_getargspec(f)
+                 if varargs is None and keywords is None and len(args)<=1:
+                     self.nargs = 1
+                 else:
+@@ -2954,7 +2954,7 @@ cdef class CachedSpecialMethod(CachedMethod):
+         # we need to analyse the argspec
+         f = self._cachedfunc.f
+         if self.nargs == 0:
+-            args, varargs, keywords, defaults = sage_getargspec(f)
++            args, varargs, keywords, defaults, kwonlyargs, kwonlydefaults, annotations = sage_getargspec(f)
+             if varargs is None and keywords is None and len(args)<=1:
+                 self.nargs = 1
+                 Caller = CachedMethodCallerNoArgs(inst, f, name=name, do_pickle=self._cachedfunc.do_pickle)
+diff --git a/src/sage/misc/decorators.py b/src/sage/misc/decorators.py
+index 28c52448813..311a5105739 100644
+--- a/src/sage/misc/decorators.py
++++ b/src/sage/misc/decorators.py
+@@ -32,7 +32,8 @@ from copy import copy
+ 
+ from sage.misc.sageinspect import (sage_getsource, sage_getsourcelines,
+                                    sage_getargspec)
+-from inspect import ArgSpec
++
++from inspect import FullArgSpec
+ 
+ 
+ def sage_wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES):
+@@ -499,7 +500,8 @@ class options():
+                     list(self.options))
+             defaults = (argspec.defaults or ()) + tuple(self.options.values())
+             # Note: argspec.defaults is not always a tuple for some reason
+-            return ArgSpec(args, argspec.varargs, argspec.keywords, defaults)
++            return FullArgSpec(args, argspec.varargs, argspec.keywords, defaults,
++                               kwonlyargs=[], kwonlydefaults={}, annotations={})
+ 
+         wrapper._sage_argspec_ = argspec
+ 
+diff --git a/src/sage/misc/function_mangling.pyx b/src/sage/misc/function_mangling.pyx
+index 0ac03cf0715..e1bb7978953 100644
+--- a/src/sage/misc/function_mangling.pyx
++++ b/src/sage/misc/function_mangling.pyx
+@@ -116,7 +116,7 @@ cdef class ArgumentFixer:
+     """
+     def __init__(self, f, classmethod = False):
+         try:
+-            arg_names, varargs, varkw, defaults = sage_getargspec(f)
++            arg_names, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations = sage_getargspec(f)
+         except AttributeError:
+             # This error occurs if f is defined in a Cython file and the
+             # source file has gone.
+diff --git a/src/sage/misc/sageinspect.py b/src/sage/misc/sageinspect.py
+index fbca2defc20..a3821cb56b9 100644
+--- a/src/sage/misc/sageinspect.py
++++ b/src/sage/misc/sageinspect.py
+@@ -359,7 +359,7 @@ def _extract_embedded_signature(docstring, name):
+         docstring = L[1] if len(L) > 1 else ''  # Remove first line, keep the rest
+         def_string = "def " + name + signature + ": pass"
+         try:
+-            return docstring, inspect.ArgSpec(*_sage_getargspec_cython(def_string))
++            return docstring, inspect.FullArgSpec(*_sage_getargspec_cython(def_string))
+         except SyntaxError:
+             docstring = os.linesep.join(L)
+     return docstring, None
+@@ -1135,8 +1135,9 @@ def _sage_getargspec_from_ast(source):
+     vararg = getattr(ast_args.vararg, 'arg', None)
+     kwarg = getattr(ast_args.kwarg, 'arg', None)
+ 
+-    return inspect.ArgSpec(args, vararg, kwarg,
+-                           tuple(defaults) if defaults else None)
++    return inspect.FullArgSpec(args, vararg, kwarg,
++                               tuple(defaults) if defaults else None,
++                               kwonlyargs=[], kwonlydefaults={}, annotations={})
+ 
+ 
+ def _sage_getargspec_cython(source):
+@@ -1152,7 +1153,7 @@ def _sage_getargspec_cython(source):
+ 
+     OUTPUT:
+ 
+-    - an instance of :obj:`inspect.ArgSpec`, i.e., a named tuple
++    - an instance of :class:`inspect.FullArgSpec`, i.e., a named tuple
+ 
+     EXAMPLES::
+ 
+@@ -1662,11 +1663,11 @@ def sage_getargspec(obj):
+         return sage_getargspec(obj.__call__)
+     if isinstance(obj, (lazy_attribute, AbstractMethod)):
+         source = sage_getsource(obj)
+-        return inspect.ArgSpec(*_sage_getargspec_cython(source))
++        return inspect.FullArgSpec(*_sage_getargspec_cython(source))
+     if not callable(obj):
+         raise TypeError("obj is not a code object")
+     try:
+-        return inspect.ArgSpec(*obj._sage_argspec_())
++        return inspect.FullArgSpec(*obj._sage_argspec_())
+     except (AttributeError, TypeError):
+         pass
+     # If we are lucky, the function signature is embedded in the docstring.
+@@ -1682,7 +1683,7 @@ def sage_getargspec(obj):
+         # Note that this may give a wrong result for the constants!
+         try:
+             args, varargs, varkw = inspect.getargs(obj.__code__)
+-            return inspect.ArgSpec(args, varargs, varkw, obj.__defaults__)
++            return inspect.FullArgSpec(args, varargs, varkw, obj.__defaults__)
+         except (TypeError, AttributeError):
+             pass
+     if isclassinstance(obj):
+@@ -1717,7 +1718,7 @@ def sage_getargspec(obj):
+         except TypeError: # happens for Python builtins
+             source = ''
+         if source:
+-            return inspect.ArgSpec(*_sage_getargspec_cython(source))
++            return inspect.FullArgSpec(*_sage_getargspec_cython(source))
+         else:
+             func_obj = obj
+ 
+@@ -1730,7 +1731,7 @@ def sage_getargspec(obj):
+         except TypeError: # arg is not a code object
+             # The above "hopefully" was wishful thinking:
+             try:
+-                return inspect.ArgSpec(*_sage_getargspec_cython(sage_getsource(obj)))
++                return inspect.FullArgSpec(*_sage_getargspec_cython(sage_getsource(obj)))
+             except TypeError: # This happens for Python builtins
+                 # The best we can do is to return a generic argspec
+                 args = []
+@@ -1740,7 +1741,8 @@ def sage_getargspec(obj):
+         defaults = func_obj.__defaults__
+     except AttributeError:
+         defaults = None
+-    return inspect.ArgSpec(args, varargs, varkw, defaults)
++    return inspect.FullArgSpec(args, varargs, varkw, defaults,
++                               kwonlyargs=[], kwonlydefaults={}, annotations={})
+ 
+ 
+ def formatannotation(annotation, base_module=None):
+@@ -1811,7 +1813,7 @@ def sage_formatargspec(args, varargs=None, varkw=None, defaults=None,
+     :func:`sage_getargspec`. Since :func:`sage_getargspec` works for
+     Cython functions while Python's inspect module does not, it makes
+     sense to keep this function for formatting instances of
+-    ``inspect.ArgSpec``.
++    ``inspect.FullArgSpec``.
+ 
+     EXAMPLES::
+ 
+-- 
+2.38.1
+
diff --git a/srcpkgs/sagemath/patches/trac-33842-03-python3.11-final_fixes-7b6fa565f42.patch b/srcpkgs/sagemath/patches/trac-33842-03-python3.11-final_fixes-7b6fa565f42.patch
new file mode 100644
index 000000000000..cd2fa11622c3
--- /dev/null
+++ b/srcpkgs/sagemath/patches/trac-33842-03-python3.11-final_fixes-7b6fa565f42.patch
@@ -0,0 +1,1279 @@
+From 8955607c71cb94e4a810b89f113b7b220a351417 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Sun, 6 Nov 2022 11:26:10 -0300
+Subject: [PATCH 01/11] dict_del_by_value: move python internal definitions to
+ a separate file
+
+---
+ src/sage/cpython/dict_del_by_value.pyx | 153 ++++++++---------------
+ src/sage/cpython/dict_internal.h       | 165 +++++++++++++++++++++++++
+ 2 files changed, 214 insertions(+), 104 deletions(-)
+ create mode 100644 src/sage/cpython/dict_internal.h
+
+diff --git a/src/sage/cpython/dict_del_by_value.pyx b/src/sage/cpython/dict_del_by_value.pyx
+index 488bf9c84cc..3894554c13d 100644
+--- a/src/sage/cpython/dict_del_by_value.pyx
++++ b/src/sage/cpython/dict_del_by_value.pyx
+@@ -19,13 +19,8 @@ AUTHORS:
+ #                  https://www.gnu.org/licenses/
+ # ****************************************************************************
+ 
+-import weakref
+-from weakref import KeyedRef
+-
+ from cpython.list cimport PyList_New
+-from cpython cimport Py_XINCREF, Py_XDECREF
+ 
+-from libc.stdint cimport int8_t, int16_t, int32_t, int64_t
+ cdef extern from "Python.h":
+     ctypedef struct PyDictKeysObject
+ 
+@@ -34,99 +29,47 @@ cdef extern from "Python.h":
+         PyDictKeysObject * ma_keys
+         PyObject ** ma_values
+ 
+-    #we need this redefinition because we want to be able to call
+-    #PyWeakref_GetObject with borrowed references. This is the recommended
+-    #strategy according to Cython/Includes/cpython/__init__.pxd
+-    PyObject* PyWeakref_GetObject(PyObject * wr)
+     int PyList_SetItem(object list, Py_ssize_t index, PyObject * item) except -1
+-    int PyWeakref_Check(PyObject * ob)
+-####
+-#definitions replicated from CPython's Objects/dict-common.h
+-#(this file is not exported from CPython, so we need to be
+-#careful the definitions are in step with what happens there.
+-
+-ctypedef void* dict_lookup_func  # Precise definition not needed
+-
+-ctypedef union IndexBlock:
+-    int8_t as_1[8]
+-    int16_t as_2[4]
+-    int32_t as_4[2]
+-    int64_t as_8[1]
+-
+-ctypedef struct MyPyDictKeysObject:
+-    Py_ssize_t dk_refcnt
+-    Py_ssize_t dk_size
+-    dict_lookup_func dk_lookup
+-    Py_ssize_t dk_usable
+-    Py_ssize_t dk_nentries
+-    IndexBlock dk_indices
+-
+-ctypedef struct PyDictKeyEntry:
+-    Py_hash_t me_hash
+-    PyObject * me_key
+-    PyObject * me_value
+-
+-cdef Py_ssize_t DKIX_EMPTY = -1
+-cdef Py_ssize_t DKIX_DUMMY = -2
+-cdef Py_ssize_t DKIX_ERROR = -3
+-
+-#####
+-#These routines are copied from CPython's Object/dictobject.c
+-#in order to access PyDictKeysObject fields
+-
+-cdef inline int DK_IXSIZE(MyPyDictKeysObject *keys):
+-    cdef Py_ssize_t s = keys.dk_size
+-    if s <= 0xff:
+-        return 1
+-    elif s <= 0xffff:
+-        return 2
+-    elif s <= 0xffffffff:
+-        return 4
+-    else:
+-        return 8
+-
+-cdef inline PyDictKeyEntry * DK_ENTRIES(MyPyDictKeysObject *keys):
+-    return <PyDictKeyEntry*> &(keys.dk_indices.as_1[keys.dk_size * DK_IXSIZE(keys)])
+-
+-cdef inline Py_ssize_t dk_get_index(MyPyDictKeysObject *keys, Py_ssize_t i):
+-    cdef Py_ssize_t s = keys.dk_size
+-    if s <= 0xff:
+-        return keys.dk_indices.as_1[i]
+-    elif s <= 0xffff:
+-        return keys.dk_indices.as_2[i]
+-    elif s <= 0xffffffff:
+-        return keys.dk_indices.as_4[i]
+-    else:
+-        return keys.dk_indices.as_8[i]
+-
+-cdef inline void dk_set_index(MyPyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix):
+-    cdef Py_ssize_t s = keys.dk_size
+-    if s <= 0xff:
+-        keys.dk_indices.as_1[i] = ix
+-    elif s <= 0xffff:
+-        keys.dk_indices.as_2[i] = ix
+-    elif s <= 0xffffffff:
+-        keys.dk_indices.as_4[i] = ix
+-    else:
+-        keys.dk_indices.as_8[i] = ix
+-
+-#End of replication of Object/dictobject.c
+-######
+-
+-cdef dict_lookup_func lookdict
+-
+-cdef dict_lookup_func DK_LOOKUP(PyDictObject *mp):
+-    return (<MyPyDictKeysObject *>(mp.ma_keys)).dk_lookup
+-
+-def init_lookdict():
+-    global lookdict
+-    # A dict which a non-string key uses the generic "lookdict"
+-    # as lookup function
+-    cdef object D = {}
+-    D[0] = 0
+-    lookdict = DK_LOOKUP(<PyDictObject *>D)
+-
+-init_lookdict()
++
++cdef extern from "dict_internal.h":
++    Py_ssize_t DK_MASK(PyDictKeysObject *)
++    PyDictKeyEntry * DK_ENTRIES(PyDictKeysObject *keys)
++
++    Py_ssize_t dictkeys_get_index (PyDictKeysObject *keys, Py_ssize_t i)
++    void dictkeys_set_index (PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
++
++    Py_ssize_t DKIX_EMPTY, DKIX_DUMMY
++    int PERTURB_SHIFT
++
++    ctypedef struct PyDictKeyEntry:
++        Py_hash_t me_hash
++        PyObject * me_key
++        PyObject * me_value
++
++
++# dk_lookup was removed in python 3.11
++DEF HAS_DK_LOOKUP = PY_VERSION_HEX < 0x30b0000
++
++IF HAS_DK_LOOKUP:
++
++    cdef extern from *:
++        """
++        #define DK_LOOKUP(dk) ((dk)->dk_lookup)
++        """
++        ctypedef void * dict_lookup_func  # Precise definition not needed
++        dict_lookup_func DK_LOOKUP(PyDictKeysObject *mp)
++
++    cdef dict_lookup_func lookdict
++
++    def init_lookdict():
++        global lookdict
++        # A dict which a non-string key uses the generic "lookdict"
++        # as lookup function
++        cdef object D = {}
++        D[0] = 0
++        lookdict = DK_LOOKUP((<PyDictObject *>D).ma_keys)
++
++    init_lookdict()
+ 
+ cdef int del_dictitem_by_exact_value(PyDictObject *mp, PyObject *value, Py_hash_t hash) except -1:
+     """
+@@ -177,9 +120,9 @@ cdef int del_dictitem_by_exact_value(PyDictObject *mp, PyObject *value, Py_hash_
+         sage: for i in range(10^3+10): newA = A(); M[newA] = prev; prev = newA
+         sage: del a
+     """
+-    keys = <MyPyDictKeysObject *>(mp.ma_keys)
++    keys = mp.ma_keys
+     cdef size_t perturb
+-    cdef size_t mask = <size_t> keys.dk_size-1
++    cdef size_t mask = DK_MASK(keys)
+     cdef PyDictKeyEntry *entries = DK_ENTRIES(keys)
+     cdef PyDictKeyEntry *ep
+ 
+@@ -187,7 +130,7 @@ cdef int del_dictitem_by_exact_value(PyDictObject *mp, PyObject *value, Py_hash_
+         raise TypeError("del_dictitem_by_exact_value cannot be applied to a shared key dict")
+ 
+     cdef size_t i = <size_t>hash & mask
+-    ix = dk_get_index(keys, i)
++    ix = dictkeys_get_index(keys, i)
+ 
+     if ix == DKIX_EMPTY:
+         # key not found
+@@ -196,9 +139,9 @@ cdef int del_dictitem_by_exact_value(PyDictObject *mp, PyObject *value, Py_hash_
+     ep = &(entries[ix])
+     perturb = hash
+     while (ep.me_value != value or ep.me_hash != hash):
+-        perturb = perturb >> 5 #this is the value of PERTURB_SHIFT
++        perturb = perturb >> PERTURB_SHIFT
+         i = mask & (i * 5 + perturb + 1)
+-        ix = dk_get_index(keys, i)
++        ix = dictkeys_get_index(keys, i)
+         if ix == DKIX_EMPTY:
+             # key not found
+             return 0
+@@ -206,7 +149,9 @@ cdef int del_dictitem_by_exact_value(PyDictObject *mp, PyObject *value, Py_hash_
+ 
+     # We need the lookup function to be the generic lookdict, otherwise
+     # deletions may not work correctly
+-    keys.dk_lookup = lookdict
++    IF HAS_DK_LOOKUP:
++        # Can this fail? In any case dk_lookup was removed in python 3.11
++        assert DK_LOOKUP(keys) is lookdict
+ 
+     T = PyList_New(2)
+     PyList_SetItem(T, 0, ep.me_key)
+@@ -214,7 +159,7 @@ cdef int del_dictitem_by_exact_value(PyDictObject *mp, PyObject *value, Py_hash_
+     ep.me_key = NULL
+     ep.me_value = NULL
+     mp.ma_used -= 1
+-    dk_set_index(keys, i, DKIX_DUMMY)
++    dictkeys_set_index(keys, i, DKIX_DUMMY)
+     #We have transferred the to-be-deleted references to the list T
+     #we now delete the list so that the actual decref happens through a
+     #deallocation routine that uses the Python Trashcan macros to
+diff --git a/src/sage/cpython/dict_internal.h b/src/sage/cpython/dict_internal.h
+new file mode 100644
+index 00000000000..06c7a16b275
+--- /dev/null
++++ b/src/sage/cpython/dict_internal.h
+@@ -0,0 +1,165 @@
++/* This contains internal definitions for python dictionaries,
++ * mostly copied from cpython sourcecode.
++ *
++ * Moved here to make it easier to maintain in the face of python
++ * changes.
++ * */
++
++/************************************************************/
++/* Copied verbatim from cpython 3.8 (Objects/dict-common.h) */
++/************************************************************/
++
++#ifndef Py_DICT_COMMON_H
++#define Py_DICT_COMMON_H
++
++typedef struct {
++    /* Cached hash code of me_key. */
++    Py_hash_t me_hash;
++    PyObject *me_key;
++    PyObject *me_value; /* This field is only meaningful for combined tables */
++} PyDictKeyEntry;
++
++/* dict_lookup_func() returns index of entry which can be used like DK_ENTRIES(dk)[index].
++ * -1 when no entry found, -3 when compare raises error.
++ */
++typedef Py_ssize_t (*dict_lookup_func)
++    (PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr);
++
++#define DKIX_EMPTY (-1)
++#define DKIX_DUMMY (-2)  /* Used internally */
++#define DKIX_ERROR (-3)
++
++/* See dictobject.c for actual layout of DictKeysObject */
++struct _dictkeysobject {
++    Py_ssize_t dk_refcnt;
++
++    /* Size of the hash table (dk_indices). It must be a power of 2. */
++    Py_ssize_t dk_size;
++
++    /* Function to lookup in the hash table (dk_indices):
++
++       - lookdict(): general-purpose, and may return DKIX_ERROR if (and
++         only if) a comparison raises an exception.
++
++       - lookdict_unicode(): specialized to Unicode string keys, comparison of
++         which can never raise an exception; that function can never return
++         DKIX_ERROR.
++
++       - lookdict_unicode_nodummy(): similar to lookdict_unicode() but further
++         specialized for Unicode string keys that cannot be the <dummy> value.
++
++       - lookdict_split(): Version of lookdict() for split tables. */
++    dict_lookup_func dk_lookup;
++
++    /* Number of usable entries in dk_entries. */
++    Py_ssize_t dk_usable;
++
++    /* Number of used entries in dk_entries. */
++    Py_ssize_t dk_nentries;
++
++    /* Actual hash table of dk_size entries. It holds indices in dk_entries,
++       or DKIX_EMPTY(-1) or DKIX_DUMMY(-2).
++
++       Indices must be: 0 <= indice < USABLE_FRACTION(dk_size).
++
++       The size in bytes of an indice depends on dk_size:
++
++       - 1 byte if dk_size <= 0xff (char*)
++       - 2 bytes if dk_size <= 0xffff (int16_t*)
++       - 4 bytes if dk_size <= 0xffffffff (int32_t*)
++       - 8 bytes otherwise (int64_t*)
++
++       Dynamically sized, SIZEOF_VOID_P is minimum. */
++    char dk_indices[];  /* char is required to avoid strict aliasing. */
++
++    /* "PyDictKeyEntry dk_entries[dk_usable];" array follows:
++       see the DK_ENTRIES() macro */
++};
++
++#endif
++
++
++/***********************************************************/
++/* Copied verbatim from cpython 3.8 (Objects/dictobject.c) */
++/***********************************************************/
++
++#define PERTURB_SHIFT 5
++#define DK_SIZE(dk) ((dk)->dk_size)
++#if SIZEOF_VOID_P > 4
++#define DK_IXSIZE(dk)                          \
++    (DK_SIZE(dk) <= 0xff ?                     \
++        1 : DK_SIZE(dk) <= 0xffff ?            \
++            2 : DK_SIZE(dk) <= 0xffffffff ?    \
++                4 : sizeof(int64_t))
++#else
++#define DK_IXSIZE(dk)                          \
++    (DK_SIZE(dk) <= 0xff ?                     \
++        1 : DK_SIZE(dk) <= 0xffff ?            \
++            2 : sizeof(int32_t))
++#endif
++#define DK_ENTRIES(dk) \
++    ((PyDictKeyEntry*)(&((int8_t*)((dk)->dk_indices))[DK_SIZE(dk) * DK_IXSIZE(dk)]))
++
++#define DK_MASK(dk) (((dk)->dk_size)-1)
++
++/* lookup indices.  returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */
++static inline Py_ssize_t
++dictkeys_get_index(PyDictKeysObject *keys, Py_ssize_t i)
++{
++    Py_ssize_t s = DK_SIZE(keys);
++    Py_ssize_t ix;
++
++    if (s <= 0xff) {
++        int8_t *indices = (int8_t*)(keys->dk_indices);
++        ix = indices[i];
++    }
++    else if (s <= 0xffff) {
++        int16_t *indices = (int16_t*)(keys->dk_indices);
++        ix = indices[i];
++    }
++#if SIZEOF_VOID_P > 4
++    else if (s > 0xffffffff) {
++        int64_t *indices = (int64_t*)(keys->dk_indices);
++        ix = indices[i];
++    }
++#endif
++    else {
++        int32_t *indices = (int32_t*)(keys->dk_indices);
++        ix = indices[i];
++    }
++    assert(ix >= DKIX_DUMMY);
++    return ix;
++}
++
++/* write to indices. */
++static inline void
++dictkeys_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
++{
++    Py_ssize_t s = DK_SIZE(keys);
++
++    assert(ix >= DKIX_DUMMY);
++
++    if (s <= 0xff) {
++        int8_t *indices = (int8_t*)(keys->dk_indices);
++        assert(ix <= 0x7f);
++        indices[i] = (char)ix;
++    }
++    else if (s <= 0xffff) {
++        int16_t *indices = (int16_t*)(keys->dk_indices);
++        assert(ix <= 0x7fff);
++        indices[i] = (int16_t)ix;
++    }
++#if SIZEOF_VOID_P > 4
++    else if (s > 0xffffffff) {
++        int64_t *indices = (int64_t*)(keys->dk_indices);
++        indices[i] = ix;
++    }
++#endif
++    else {
++        int32_t *indices = (int32_t*)(keys->dk_indices);
++        assert(ix <= 0x7fffffff);
++        indices[i] = (int32_t)ix;
++    }
++}
++
++/************************************************************/
+-- 
+2.38.1
+
+
+From 76040803c8ae150baef449edce67ebdafb2ee896 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Sun, 6 Nov 2022 11:53:24 -0300
+Subject: [PATCH 02/11] dict_del_by_value: add internal definitions for python
+ 3.11
+
+---
+ src/sage/cpython/dict_internal.h | 77 ++++++++++++++++++++++++++++++++
+ 1 file changed, 77 insertions(+)
+
+diff --git a/src/sage/cpython/dict_internal.h b/src/sage/cpython/dict_internal.h
+index 06c7a16b275..42a57bcb468 100644
+--- a/src/sage/cpython/dict_internal.h
++++ b/src/sage/cpython/dict_internal.h
+@@ -5,6 +5,8 @@
+  * changes.
+  * */
+ 
++#if PY_VERSION_HEX < 0x30b0000
++
+ /************************************************************/
+ /* Copied verbatim from cpython 3.8 (Objects/dict-common.h) */
+ /************************************************************/
+@@ -163,3 +165,78 @@ dictkeys_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
+ }
+ 
+ /************************************************************/
++
++#else   /* Python >= 3.11 */
++
++#define Py_BUILD_CORE
++#include <internal/pycore_dict.h>
++
++/************************************************************/
++/* Copied verbatim from cpython 3.11 (Objects/dictobject.c) */
++/************************************************************/
++
++#define PERTURB_SHIFT 5
++#define DK_MASK(dk) (DK_SIZE(dk)-1)
++
++/* lookup indices.  returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */
++static inline Py_ssize_t
++dictkeys_get_index(const PyDictKeysObject *keys, Py_ssize_t i)
++{
++    int log2size = DK_LOG_SIZE(keys);
++    Py_ssize_t ix;
++
++    if (log2size < 8) {
++        const int8_t *indices = (const int8_t*)(keys->dk_indices);
++        ix = indices[i];
++    }
++    else if (log2size < 16) {
++        const int16_t *indices = (const int16_t*)(keys->dk_indices);
++        ix = indices[i];
++    }
++#if SIZEOF_VOID_P > 4
++    else if (log2size >= 32) {
++        const int64_t *indices = (const int64_t*)(keys->dk_indices);
++        ix = indices[i];
++    }
++#endif
++    else {
++        const int32_t *indices = (const int32_t*)(keys->dk_indices);
++        ix = indices[i];
++    }
++    assert(ix >= DKIX_DUMMY);
++    return ix;
++}
++
++/* write to indices. */
++static inline void
++dictkeys_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
++{
++    int log2size = DK_LOG_SIZE(keys);
++
++    assert(ix >= DKIX_DUMMY);
++    assert(keys->dk_version == 0);
++
++    if (log2size < 8) {
++        int8_t *indices = (int8_t*)(keys->dk_indices);
++        assert(ix <= 0x7f);
++        indices[i] = (char)ix;
++    }
++    else if (log2size < 16) {
++        int16_t *indices = (int16_t*)(keys->dk_indices);
++        assert(ix <= 0x7fff);
++        indices[i] = (int16_t)ix;
++    }
++#if SIZEOF_VOID_P > 4
++    else if (log2size >= 32) {
++        int64_t *indices = (int64_t*)(keys->dk_indices);
++        indices[i] = ix;
++    }
++#endif
++    else {
++        int32_t *indices = (int32_t*)(keys->dk_indices);
++        assert(ix <= 0x7fffffff);
++        indices[i] = (int32_t)ix;
++    }
++}
++
++#endif
+-- 
+2.38.1
+
+
+From 014c2ac9a6f6de25d4e31fe0bdaf819e9c67d24b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 06:47:18 -0300
+Subject: [PATCH 03/11] deprecated uu -> base64
+
+---
+ src/sage/rings/polynomial/pbori/gbrefs.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/sage/rings/polynomial/pbori/gbrefs.py b/src/sage/rings/polynomial/pbori/gbrefs.py
+index 76e3924715d..70dc795cbab 100644
+--- a/src/sage/rings/polynomial/pbori/gbrefs.py
++++ b/src/sage/rings/polynomial/pbori/gbrefs.py
+@@ -1,6 +1,6 @@
+ import gzip
+ from io import StringIO
+-import uu
++import base64 as uu
+ import re
+ from types import ModuleType
+ from .PyPolyBoRi import Polynomial
+-- 
+2.38.1
+
+
+From dc8e155994a870a5e0b01a690a3fec8975197973 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 06:47:34 -0300
+Subject: [PATCH 04/11] sage.misc.fpickle: fix for python 3.11
+
+---
+ src/sage/misc/fpickle.pyx | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/src/sage/misc/fpickle.pyx b/src/sage/misc/fpickle.pyx
+index 502080e2c10..c5d544765bb 100644
+--- a/src/sage/misc/fpickle.pyx
++++ b/src/sage/misc/fpickle.pyx
+@@ -34,6 +34,12 @@ def reduce_code(co):
+         sage: def foo(N): return N+1
+         sage: sage.misc.fpickle.reduce_code(foo.__code__)
+         (<cyfunction code_ctor at ...>, ...)
++
++    Test that the constructed code matches the original code:
++
++        sage: ctor, args = sage.misc.fpickle.reduce_code(foo.__code__)
++        sage: ctor(*args) == foo.__code__
++        True
+     """
+     if co.co_freevars or co.co_cellvars:
+         raise ValueError("Cannot pickle code objects from closures")
+@@ -44,7 +50,12 @@ def reduce_code(co):
+     co_args += (co.co_kwonlyargcount, co.co_nlocals,
+                 co.co_stacksize, co.co_flags, co.co_code,
+                 co.co_consts, co.co_names, co.co_varnames, co.co_filename,
+-                co.co_name, co.co_firstlineno, co.co_lnotab)
++                co.co_name)
++    if sys.version_info.minor >= 11:
++        co_args += (co.co_qualname, co.co_firstlineno,
++                    co.co_linetable, co.co_exceptiontable)
++    else:
++        co_args += (co.co_firstlineno, co.co_lnotab)
+ 
+     return (code_ctor, co_args)
+ 
+-- 
+2.38.1
+
+
+From 8b0dac2322d4a888c607c56d3b5a72ff71df4147 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 08:15:43 -0300
+Subject: [PATCH 05/11] Fix FullArgSpec usage after
+ 9eb08f3afde3266bbd667e196513240a0fe245f4
+
+ - `kwonlydefaults` default is `[]` rather than `{}`
+ - `argspec.keywords` changed to `argspec.varkw`
+ - `ArgSpec` changed to `FullArgSpec`
+---
+ src/sage/coding/abstract_code.py | 2 +-
+ src/sage/misc/decorators.py      | 7 ++++---
+ src/sage/misc/sageinspect.py     | 9 +++++----
+ 3 files changed, 10 insertions(+), 8 deletions(-)
+
+diff --git a/src/sage/coding/abstract_code.py b/src/sage/coding/abstract_code.py
+index ba2ec68a038..238a165c021 100644
+--- a/src/sage/coding/abstract_code.py
++++ b/src/sage/coding/abstract_code.py
+@@ -123,7 +123,7 @@ def _explain_constructor(cl):
+         reqs = "The constructor requires the arguments {}.".format(args)
+     else:
+         reqs = "The constructor requires no arguments."
+-    if argspec.varargs or argspec.keywords:
++    if argspec.varargs or argspec.varkw:
+         var = "It accepts unspecified arguments as well.\n"
+     else:
+         var = ""
+diff --git a/src/sage/misc/decorators.py b/src/sage/misc/decorators.py
+index 311a5105739..271e243050f 100644
+--- a/src/sage/misc/decorators.py
++++ b/src/sage/misc/decorators.py
+@@ -423,7 +423,8 @@ class suboptions():
+             defaults = (argspec.defaults if argspec.defaults is not None else ()) \
+                         + tuple(self.options.values())
+             # Note: argspec.defaults is not always a tuple for some reason
+-            return ArgSpec(args, argspec.varargs, argspec.keywords, defaults)
++            return FullArgSpec(args, argspec.varargs, argspec.varkw, defaults,
++                               kwonlyargs=[], kwonlydefaults=None, annotations={})
+         wrapper._sage_argspec_ = argspec
+ 
+         return wrapper
+@@ -500,8 +501,8 @@ class options():
+                     list(self.options))
+             defaults = (argspec.defaults or ()) + tuple(self.options.values())
+             # Note: argspec.defaults is not always a tuple for some reason
+-            return FullArgSpec(args, argspec.varargs, argspec.keywords, defaults,
+-                               kwonlyargs=[], kwonlydefaults={}, annotations={})
++            return FullArgSpec(args, argspec.varargs, argspec.varkw, defaults,
++                               kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+         wrapper._sage_argspec_ = argspec
+ 
+diff --git a/src/sage/misc/sageinspect.py b/src/sage/misc/sageinspect.py
+index a3821cb56b9..ce9a74f931d 100644
+--- a/src/sage/misc/sageinspect.py
++++ b/src/sage/misc/sageinspect.py
+@@ -1137,7 +1137,7 @@ def _sage_getargspec_from_ast(source):
+ 
+     return inspect.FullArgSpec(args, vararg, kwarg,
+                                tuple(defaults) if defaults else None,
+-                               kwonlyargs=[], kwonlydefaults={}, annotations={})
++                               kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+ 
+ def _sage_getargspec_cython(source):
+@@ -1683,7 +1683,8 @@ def sage_getargspec(obj):
+         # Note that this may give a wrong result for the constants!
+         try:
+             args, varargs, varkw = inspect.getargs(obj.__code__)
+-            return inspect.FullArgSpec(args, varargs, varkw, obj.__defaults__)
++            return inspect.FullArgSpec(args, varargs, varkw, obj.__defaults__,
++                                       kwonlyargs=[], kwonlydefaults=None, annotations={})
+         except (TypeError, AttributeError):
+             pass
+     if isclassinstance(obj):
+@@ -1742,7 +1743,7 @@ def sage_getargspec(obj):
+     except AttributeError:
+         defaults = None
+     return inspect.FullArgSpec(args, varargs, varkw, defaults,
+-                               kwonlyargs=[], kwonlydefaults={}, annotations={})
++                               kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+ 
+ def formatannotation(annotation, base_module=None):
+@@ -1788,7 +1789,7 @@ def formatannotation(annotation, base_module=None):
+ 
+ 
+ def sage_formatargspec(args, varargs=None, varkw=None, defaults=None,
+-                       kwonlyargs=(), kwonlydefaults={}, annotations={},
++                       kwonlyargs=(), kwonlydefaults=None, annotations={},
+                        formatarg=str,
+                        formatvarargs=lambda name: '*' + name,
+                        formatvarkw=lambda name: '**' + name,
+-- 
+2.38.1
+
+
+From db45aebfd6bd8413bec0fda218410d72deacd398 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 07:13:38 -0300
+Subject: [PATCH 06/11] warnings: ignore deprecation for 'import cgi' in cython
+
+---
+ src/sage/all.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/src/sage/all.py b/src/sage/all.py
+index 6aef26c42a9..92d36d1fd26 100644
+--- a/src/sage/all.py
++++ b/src/sage/all.py
+@@ -104,6 +104,11 @@ warnings.filterwarnings('ignore', category=DeprecationWarning,
+                         message='The distutils(.sysconfig module| package) is deprecated',
+                         module='Cython|distutils|numpy|sage.env|sage.features')
+ 
++# triggered by cython 0.29.32
++warnings.filterwarnings('ignore', category=DeprecationWarning,
++                        message="'cgi' is deprecated and slated for removal in Python 3.13",
++                        module='Cython')
++
+ ################ end setup warnings ###############################
+ 
+ 
+-- 
+2.38.1
+
+
+From 664fc008ed50c2f61fb3df3020c0d81b41170628 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 20:39:12 -0300
+Subject: [PATCH 07/11] warnings: ignore deprecation for 'import sre_constants'
+ in pyparsing
+
+---
+ src/sage/all.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/src/sage/all.py b/src/sage/all.py
+index 92d36d1fd26..ea0712308b4 100644
+--- a/src/sage/all.py
++++ b/src/sage/all.py
+@@ -109,6 +109,11 @@ warnings.filterwarnings('ignore', category=DeprecationWarning,
+                         message="'cgi' is deprecated and slated for removal in Python 3.13",
+                         module='Cython')
+ 
++# triggered by pyparsing 2.4.7
++warnings.filterwarnings('ignore', category=DeprecationWarning,
++                        message="module 'sre_constants' is deprecated",
++                        module='pyparsing')
++
+ ################ end setup warnings ###############################
+ 
+ 
+-- 
+2.38.1
+
+
+From 08e1161c23caeeed5ad0e0237df8172eb8806ee5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 22:40:17 -0300
+Subject: [PATCH 08/11] warnings: ignore deprecation of
+ importlib.resources.path/read_binary
+
+---
+ src/sage/all.py                    | 6 ++++++
+ src/sage/repl/display/formatter.py | 3 +++
+ 2 files changed, 9 insertions(+)
+
+diff --git a/src/sage/all.py b/src/sage/all.py
+index ea0712308b4..fedf2a17aab 100644
+--- a/src/sage/all.py
++++ b/src/sage/all.py
+@@ -114,6 +114,12 @@ warnings.filterwarnings('ignore', category=DeprecationWarning,
+                         message="module 'sre_constants' is deprecated",
+                         module='pyparsing')
+ 
++# importlib.resources.path and ...read_binary are deprecated in python 3.11,
++# but the replacement importlib.resources.files needs python 3.9
++warnings.filterwarnings('ignore', category=DeprecationWarning,
++                        message=r'(path|read_binary) is deprecated\. Use files\(\) instead\.',
++                        module='sage.repl.rich_output.output_(graphics|graphics3d|video)')
++
+ ################ end setup warnings ###############################
+ 
+ 
+diff --git a/src/sage/repl/display/formatter.py b/src/sage/repl/display/formatter.py
+index 488f0bf2791..7e06656d880 100644
+--- a/src/sage/repl/display/formatter.py
++++ b/src/sage/repl/display/formatter.py
+@@ -143,6 +143,9 @@ class SageDisplayFormatter(DisplayFormatter):
+ 
+             sage: import os
+             sage: import importlib.resources
++            sage: import warnings
++            sage: warnings.filterwarnings('ignore', category=DeprecationWarning,
++            ....:     message=r'path is deprecated\. Use files\(\) instead\.')
+             sage: from sage.repl.rich_output.backend_ipython import BackendIPython
+             sage: backend = BackendIPython()
+             sage: shell = get_test_shell()
+-- 
+2.38.1
+
+
+From 44480f4827e2bc1ed8daf6f4504a22ae6e8be4a4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 07:14:01 -0300
+Subject: [PATCH 09/11] doctests: fixes due to ArgSpec -> FullArgSpec change
+
+---
+ src/sage/interfaces/singular.py            |  3 +-
+ src/sage/libs/singular/standard_options.py |  3 +-
+ src/sage/misc/cachefunc.pyx                |  6 +-
+ src/sage/misc/decorators.py                |  9 ++-
+ src/sage/misc/lazy_import.pyx              |  4 +-
+ src/sage/misc/sageinspect.py               | 94 ++++++++++------------
+ src/sage/parallel/decorate.py              |  3 +-
+ src/sage/plot/plot3d/plot3d.py             | 18 +++--
+ src/sage/sets/set_from_iterator.py         |  4 +-
+ 9 files changed, 76 insertions(+), 68 deletions(-)
+
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index 9c9586d8bc7..1dea77cdff0 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -2734,7 +2734,8 @@ def singular_gb_standard_options(func):
+         sage: P.<x,y> = QQ[]
+         sage: I = P*[x,y]
+         sage: sage_getargspec(I.interreduced_basis)
+-        ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
++        FullArgSpec(args=['self'], varargs=None, varkw=None, defaults=None,
++                    kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sage_getsourcelines(I.interreduced_basis)
+         (['    @handle_AA_and_QQbar\n',
+           '    @singular_gb_standard_options\n',
+diff --git a/src/sage/libs/singular/standard_options.py b/src/sage/libs/singular/standard_options.py
+index 6797cb05001..5d74da3ce3a 100644
+--- a/src/sage/libs/singular/standard_options.py
++++ b/src/sage/libs/singular/standard_options.py
+@@ -117,7 +117,8 @@ def libsingular_gb_standard_options(func):
+         sage: P.<x,y> = QQ[]
+         sage: I = P*[x,y]
+         sage: sage_getargspec(I.interreduced_basis)
+-        ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
++        FullArgSpec(args=['self'], varargs=None, varkw=None, defaults=None,
++                    kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sage_getsourcelines(I.interreduced_basis)
+         (['    @handle_AA_and_QQbar\n',
+           '    @singular_gb_standard_options\n',
+diff --git a/src/sage/misc/cachefunc.pyx b/src/sage/misc/cachefunc.pyx
+index 72042ef13d6..cea3071115d 100644
+--- a/src/sage/misc/cachefunc.pyx
++++ b/src/sage/misc/cachefunc.pyx
+@@ -931,9 +931,9 @@ cdef class CachedFunction():
+             sage: I = P*[x,y]
+             sage: from sage.misc.sageinspect import sage_getargspec
+             sage: sage_getargspec(I.groebner_basis)   # indirect doctest
+-            ArgSpec(args=['self', 'algorithm', 'deg_bound', 'mult_bound', 'prot'],
+-            varargs='args', keywords='kwds', defaults=('', None, None,
+-            False))
++            FullArgSpec(args=['self', 'algorithm', 'deg_bound', 'mult_bound', 'prot'],
++                        varargs='args', varkw='kwds', defaults=('', None, None, False),
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+         """
+         return sage_getargspec(self.f)
+diff --git a/src/sage/misc/decorators.py b/src/sage/misc/decorators.py
+index 271e243050f..dd9123f5004 100644
+--- a/src/sage/misc/decorators.py
++++ b/src/sage/misc/decorators.py
+@@ -93,7 +93,8 @@ def sage_wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES):
+         5
+         sage: from sage.misc.sageinspect import sage_getargspec
+         sage: sage_getargspec(g)
+-        ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)
++        FullArgSpec(args=['x'], varargs=None, varkw=None, defaults=None,
++                    kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     Demonstrate that it correctly gets the source lines and the source
+     file, which is essential for interactive code edition; note that we
+@@ -392,7 +393,8 @@ class suboptions():
+ 
+             sage: from sage.misc.sageinspect import sage_getargspec
+             sage: sage_getargspec(f)
+-            ArgSpec(args=['arrow_size'], varargs='args', keywords='kwds', defaults=(2,))
++            FullArgSpec(args=['arrow_size'], varargs='args', varkw='kwds', defaults=(2,),
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+         """
+         @sage_wraps(func)
+         def wrapper(*args, **kwds):
+@@ -460,7 +462,8 @@ class options():
+             sage: f1 = o(f)
+             sage: from sage.misc.sageinspect import sage_getargspec
+             sage: sage_getargspec(f1)
+-            ArgSpec(args=['rgbcolor'], varargs='args', keywords='kwds', defaults=((0, 0, 1),))
++            FullArgSpec(args=['rgbcolor'], varargs='args', varkw='kwds', defaults=((0, 0, 1),),
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+         """
+         self.options = options
+         self.original_opts = options.pop('__original_opts', False)
+diff --git a/src/sage/misc/lazy_import.pyx b/src/sage/misc/lazy_import.pyx
+index 2d4413cd1a3..018078b0cf2 100644
+--- a/src/sage/misc/lazy_import.pyx
++++ b/src/sage/misc/lazy_import.pyx
+@@ -351,7 +351,9 @@ cdef class LazyImport():
+             sage: from sage.misc.lazy_import import LazyImport
+             sage: rm = LazyImport('sage.all', 'random_matrix')
+             sage: rm._sage_argspec_()
+-            ArgSpec(args=['ring', 'nrows', 'ncols', 'algorithm', 'implementation'], varargs='args', keywords='kwds', defaults=(None, 'randomize', None))
++            FullArgSpec(args=['ring', 'nrows', 'ncols', 'algorithm', 'implementation'],
++                        varargs='args', varkw='kwds', defaults=(None, 'randomize', None),
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+         """
+         return sageinspect.sage_getargspec(self.get_object())
+ 
+diff --git a/src/sage/misc/sageinspect.py b/src/sage/misc/sageinspect.py
+index ce9a74f931d..619ff6da661 100644
+--- a/src/sage/misc/sageinspect.py
++++ b/src/sage/misc/sageinspect.py
+@@ -109,7 +109,7 @@ defined Cython code, and with rather tricky argument lines::
+     sage: print(sage_getsource(foo))                                                                        # optional - sage.misc.cython
+     def foo(unsigned int x=1, a=')"', b={not (2+1==3):'bar'}, *args, **kwds): return
+     sage: sage_getargspec(foo)                                                                              # optional - sage.misc.cython
+-    ArgSpec(args=['x', 'a', 'b'], varargs='args', keywords='kwds', defaults=(1, ')"', {False: 'bar'}))
++    FullArgSpec(args=['x', 'a', 'b'], varargs='args', varkw='kwds', defaults=(1, ')"', {False: 'bar'}), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+ """
+ 
+@@ -343,7 +343,7 @@ def _extract_embedded_signature(docstring, name):
+         File: sage/misc/nested_class.pyx (starting at line ...)
+         ...
+         sage: _extract_embedded_signature(MainClass.NestedClass.NestedSubClass.dummy.__doc__, 'dummy')[1]
+-        ArgSpec(args=['self', 'x', 'r'], varargs='args', keywords='kwds', defaults=((1, 2, 3.4),))
++        FullArgSpec(args=['self', 'x', 'r'], varargs='args', varkw='kwds', defaults=((1, 2, 3.4),), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: _extract_embedded_signature(range.__call__.__doc__, '__call__')
+         ('Call self as a function.', None)
+     """
+@@ -1107,22 +1107,18 @@ def _sage_getargspec_from_ast(source):
+ 
+     EXAMPLES::
+ 
+-        sage: import warnings
+-        sage: warnings.filterwarnings('ignore',
+-        ....:                         r'inspect.getargspec\(\) is deprecated',
+-        ....:                         DeprecationWarning)
+         sage: import inspect, sage.misc.sageinspect as sms
+         sage: from_ast = sms._sage_getargspec_from_ast
+         sage: s = "def f(a, b=2, c={'a': [4, 5.5, False]}, d=(None, True)):\n    return"
+         sage: from_ast(s)
+-        ArgSpec(args=['a', 'b', 'c', 'd'], varargs=None, keywords=None, defaults=(2, {'a': [4, 5.5, False]}, (None, True)))
++        FullArgSpec(args=['a', 'b', 'c', 'd'], varargs=None, varkw=None, defaults=(2, {'a': [4, 5.5, False]}, (None, True)), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: context = {}
+         sage: exec(compile(s, '<string>', 'single'), context)
+-        sage: inspect.getargspec(context['f'])
+-        ArgSpec(args=['a', 'b', 'c', 'd'], varargs=None, keywords=None, defaults=(2, {'a': [4, 5.5, False]}, (None, True)))
+-        sage: from_ast(s) == inspect.getargspec(context['f'])
++        sage: inspect.getfullargspec(context['f'])
++        FullArgSpec(args=['a', 'b', 'c', 'd'], varargs=None, varkw=None, defaults=(2, {'a': [4, 5.5, False]}, (None, True)), kwonlyargs=[], kwonlydefaults=None, annotations={})
++        sage: from_ast(s) == inspect.getfullargspec(context['f'])
+         True
+-        sage: set(from_ast(sms.sage_getsource(x)) == inspect.getargspec(x) for x in [factor, identity_matrix, Graph.__init__])
++        sage: set(from_ast(sms.sage_getsource(x)) == inspect.getfullargspec(x) for x in [factor, identity_matrix, Graph.__init__])
+         {True}
+     """
+     ast_args = ast.parse(source.lstrip()).body[0].args
+@@ -1159,23 +1155,23 @@ def _sage_getargspec_cython(source):
+ 
+         sage: from sage.misc.sageinspect import _sage_getargspec_cython as sgc
+         sage: sgc("cpdef double abc(self, Element x=None, Parent base=0):")
+-        ArgSpec(args=['self', 'x', 'base'], varargs=None, keywords=None, defaults=(None, 0))
++        FullArgSpec(args=['self', 'x', 'base'], varargs=None, varkw=None, defaults=(None, 0), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sgc("def __init__(self, x=None, unsigned int base=0):")
+-        ArgSpec(args=['self', 'x', 'base'], varargs=None, keywords=None, defaults=(None, 0))
++        FullArgSpec(args=['self', 'x', 'base'], varargs=None, varkw=None, defaults=(None, 0), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sgc('def o(p, r={}, *q, **s) except? -1:')
+-        ArgSpec(args=['p', 'r'], varargs='q', keywords='s', defaults=({},))
++        FullArgSpec(args=['p', 'r'], varargs='q', varkw='s', defaults=({},), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sgc('cpdef how(r=(None, "u:doing?")):')
+-        ArgSpec(args=['r'], varargs=None, keywords=None, defaults=((None, 'u:doing?'),))
++        FullArgSpec(args=['r'], varargs=None, varkw=None, defaults=((None, 'u:doing?'),), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sgc('def _(x="):"):')
+-        ArgSpec(args=['x'], varargs=None, keywords=None, defaults=('):',))
++        FullArgSpec(args=['x'], varargs=None, varkw=None, defaults=('):',), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sgc('def f(z = {(1, 2, 3): True}):\n    return z')
+-        ArgSpec(args=['z'], varargs=None, keywords=None, defaults=({(1, 2, 3): True},))
++        FullArgSpec(args=['z'], varargs=None, varkw=None, defaults=({(1, 2, 3): True},), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sgc('def f(double x, z = {(1, 2, 3): True}):\n    return z')
+-        ArgSpec(args=['x', 'z'], varargs=None, keywords=None, defaults=({(1, 2, 3): True},))
++        FullArgSpec(args=['x', 'z'], varargs=None, varkw=None, defaults=({(1, 2, 3): True},), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sgc('def f(*args): pass')
+-        ArgSpec(args=[], varargs='args', keywords=None, defaults=None)
++        FullArgSpec(args=[], varargs='args', varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sgc('def f(**args): pass')
+-        ArgSpec(args=[], varargs=None, keywords='args', defaults=None)
++        FullArgSpec(args=[], varargs=None, varkw='args', defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     Some malformed input is detected::
+ 
+@@ -1207,17 +1203,17 @@ def _sage_getargspec_cython(source):
+ 
+         sage: def dummy_python(self, *args, x=1): pass
+         sage: sgc("def dummy_python(self, *args, x=1): pass")
+-        ArgSpec(args=['self', 'x'], varargs='args', keywords=None, defaults=(1,))
++        FullArgSpec(args=['self', 'x'], varargs='args', varkw=None, defaults=(1,), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: cython("def dummy_cython(self, *args, x=1): pass")
+         sage: sgc("def dummy_cython(self, *args, x=1): pass")
+-        ArgSpec(args=['self', 'x'], varargs='args', keywords=None, defaults=(1,))
++        FullArgSpec(args=['self', 'x'], varargs='args', varkw=None, defaults=(1,), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     In some examples above, a syntax error was raised when a type
+     definition contains a pointer. An exception is made for ``char*``,
+     since C strings are acceptable input in public Cython functions::
+ 
+         sage: sgc('def f(char *x = "a string", z = {(1,2,3): True}): pass')
+-        ArgSpec(args=['x', 'z'], varargs=None, keywords=None, defaults=('a string', {(1, 2, 3): True}))
++        FullArgSpec(args=['x', 'z'], varargs=None, varkw=None, defaults=('a string', {(1, 2, 3): True}), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+ 
+     AUTHORS:
+@@ -1503,40 +1499,40 @@ def sage_getargspec(obj):
+         sage: def f(x, y, z=1, t=2, *args, **keywords):
+         ....:     pass
+         sage: sage_getargspec(f)
+-        ArgSpec(args=['x', 'y', 'z', 't'], varargs='args', keywords='keywords', defaults=(1, 2))
++        FullArgSpec(args=['x', 'y', 'z', 't'], varargs='args', varkw='keywords', defaults=(1, 2), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     We now run sage_getargspec on some functions from the Sage library::
+ 
+         sage: sage_getargspec(identity_matrix)
+-        ArgSpec(args=['ring', 'n', 'sparse'], varargs=None, keywords=None, defaults=(0, False))
++        FullArgSpec(args=['ring', 'n', 'sparse'], varargs=None, varkw=None, defaults=(0, False), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sage_getargspec(factor)
+-        ArgSpec(args=['n', 'proof', 'int_', 'algorithm', 'verbose'], varargs=None, keywords='kwds', defaults=(None, False, 'pari', 0))
++        FullArgSpec(args=['n', 'proof', 'int_', 'algorithm', 'verbose'], varargs=None, varkw='kwds', defaults=(None, False, 'pari', 0), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     In the case of a class or a class instance, the ``ArgSpec`` of the
+     ``__new__``, ``__init__`` or ``__call__`` method is returned::
+ 
+         sage: P.<x,y> = QQ[]
+         sage: sage_getargspec(P)
+-        ArgSpec(args=['base_ring', 'n', 'names', 'order'], varargs=None, keywords=None, defaults=('degrevlex',))
++        FullArgSpec(args=['base_ring', 'n', 'names', 'order'], varargs=None, varkw=None, defaults=('degrevlex',), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sage_getargspec(P.__class__)
+-        ArgSpec(args=['self', 'x'], varargs='args', keywords='kwds', defaults=(0,))
++        FullArgSpec(args=['self', 'x'], varargs='args', varkw='kwds', defaults=(0,), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     The following tests against various bugs that were fixed in
+     :trac:`9976`::
+ 
+         sage: from sage.rings.polynomial.real_roots import bernstein_polynomial_factory_ratlist
+         sage: sage_getargspec(bernstein_polynomial_factory_ratlist.coeffs_bitsize)
+-        ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
++        FullArgSpec(args=['self'], varargs=None, varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: from sage.rings.polynomial.pbori.pbori import BooleanMonomialMonoid
+         sage: sage_getargspec(BooleanMonomialMonoid.gen)
+-        ArgSpec(args=['self', 'i'], varargs=None, keywords=None, defaults=(0,))
++        FullArgSpec(args=['self', 'i'], varargs=None, varkw=None, defaults=(0,), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: I = P*[x,y]
+         sage: sage_getargspec(I.groebner_basis)
+-        ArgSpec(args=['self', 'algorithm', 'deg_bound', 'mult_bound', 'prot'],
+-        varargs='args', keywords='kwds', defaults=('', None, None, False))
++        FullArgSpec(args=['self', 'algorithm', 'deg_bound', 'mult_bound', 'prot'],
++        varargs='args', varkw='kwds', defaults=('', None, None, False), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: cython("cpdef int foo(x,y) except -1: return 1")
+         sage: sage_getargspec(foo)
+-        ArgSpec(args=['x', 'y'], varargs=None, keywords=None, defaults=None)
++        FullArgSpec(args=['x', 'y'], varargs=None, varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     If a ``functools.partial`` instance is involved, we see no other meaningful solution
+     than to return the argspec of the underlying function::
+@@ -1546,7 +1542,7 @@ def sage_getargspec(obj):
+         sage: import functools
+         sage: f1 = functools.partial(f, 1,c=2)
+         sage: sage_getargspec(f1)
+-        ArgSpec(args=['a', 'b', 'c', 'd'], varargs=None, keywords=None, defaults=(1,))
++        FullArgSpec(args=['a', 'b', 'c', 'd'], varargs=None, varkw=None, defaults=(1,), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     TESTS:
+ 
+@@ -1572,14 +1568,14 @@ def sage_getargspec(obj):
+         sage: print(sage.misc.sageinspect.sage_getsource(O))
+         def foo(x, a=')"', b={(2+1):'bar', not 1:3, 3<<4:5}): return
+         sage: spec = sage.misc.sageinspect.sage_getargspec(O)
+-        sage: spec.args, spec.varargs, spec.keywords
++        sage: spec.args, spec.varargs, spec.varkw
+         (['x', 'a', 'b'], None, None)
+         sage: spec.defaults[0]
+         ')"'
+         sage: sorted(spec.defaults[1].items(), key=lambda x: str(x))
+         [(3, 'bar'), (48, 5), (False, 3)]
+         sage: sage.misc.sageinspect.sage_getargspec(O.__call__)
+-        ArgSpec(args=['self', 'm', 'n'], varargs=None, keywords=None, defaults=None)
++        FullArgSpec(args=['self', 'm', 'n'], varargs=None, varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     ::
+ 
+@@ -1588,13 +1584,13 @@ def sage_getargspec(obj):
+         def foo(x, a='\')"', b={not (2+1==3):'bar'}): return
+         <BLANKLINE>
+         sage: sage.misc.sageinspect.sage_getargspec(foo)
+-        ArgSpec(args=['x', 'a', 'b'], varargs=None, keywords=None, defaults=('\')"', {False: 'bar'}))
++        FullArgSpec(args=['x', 'a', 'b'], varargs=None, varkw=None, defaults=('\')"', {False: 'bar'}), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     The following produced a syntax error before the patch at :trac:`11913`,
+     see also :trac:`26906`::
+ 
+         sage: sage.misc.sageinspect.sage_getargspec(r.lm)                         # optional - rpy2
+-        ArgSpec(args=['self'], varargs='args', keywords='kwds', defaults=None)
++        FullArgSpec(args=['self'], varargs='args', varkw='kwds', defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     The following was fixed in :trac:`16309`::
+ 
+@@ -1608,23 +1604,23 @@ def sage_getargspec(obj):
+         ....:     cpdef meet(categories, bint as_list = False, tuple ignore_axioms=(), tuple axioms=()): pass
+         ....: ''')
+         sage: sage_getargspec(Foo.join)
+-        ArgSpec(args=['categories', 'as_list', 'ignore_axioms', 'axioms'], varargs=None, keywords=None, defaults=(False, (), ()))
++        FullArgSpec(args=['categories', 'as_list', 'ignore_axioms', 'axioms'], varargs=None, varkw=None, defaults=(False, (), ()), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sage_getargspec(Bar.join)
+-        ArgSpec(args=['categories', 'as_list', 'ignore_axioms', 'axioms'], varargs=None, keywords=None, defaults=(False, (), ()))
++        FullArgSpec(args=['categories', 'as_list', 'ignore_axioms', 'axioms'], varargs=None, varkw=None, defaults=(False, (), ()), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: sage_getargspec(Bar.meet)
+-        ArgSpec(args=['categories', 'as_list', 'ignore_axioms', 'axioms'], varargs=None, keywords=None, defaults=(False, (), ()))
++        FullArgSpec(args=['categories', 'as_list', 'ignore_axioms', 'axioms'], varargs=None, varkw=None, defaults=(False, (), ()), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     Test that :trac:`17009` is fixed::
+ 
+         sage: sage_getargspec(gap)
+-        ArgSpec(args=['self', 'x', 'name'], varargs=None, keywords=None, defaults=(None,))
++        FullArgSpec(args=['self', 'x', 'name'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     By :trac:`17814`, the following gives the correct answer (previously, the
+     defaults would have been found ``None``)::
+ 
+         sage: from sage.misc.nested_class import MainClass
+         sage: sage_getargspec(MainClass.NestedClass.NestedSubClass.dummy)
+-        ArgSpec(args=['self', 'x', 'r'], varargs='args', keywords='kwds', defaults=((1, 2, 3.4),))
++        FullArgSpec(args=['self', 'x', 'r'], varargs='args', varkw='kwds', defaults=((1, 2, 3.4),), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     In :trac:`18249` was decided to return a generic signature for Python
+     builtin functions, rather than to raise an error (which is what Python's
+@@ -1632,7 +1628,7 @@ def sage_getargspec(obj):
+ 
+         sage: import inspect
+         sage: sage_getargspec(range)
+-        ArgSpec(args=[], varargs='args', keywords='kwds', defaults=None)
++        FullArgSpec(args=[], varargs='args', varkw='kwds', defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     Test that :trac:`28524` is fixed::
+ 
+@@ -1819,14 +1815,10 @@ def sage_formatargspec(args, varargs=None, varkw=None, defaults=None,
+     EXAMPLES::
+ 
+         sage: from sage.misc.sageinspect import sage_formatargspec
+-        sage: from inspect import formatargspec # deprecated in Python 3
+         sage: args = ['a', 'b', 'c']
+         sage: defaults = [3]
+         sage: sage_formatargspec(args, defaults=defaults)
+         '(a, b, c=3)'
+-        sage: import warnings; warnings.simplefilter('ignore')  # ignore DeprecationWarning
+-        sage: formatargspec(args, defaults=defaults) == sage_formatargspec(args, defaults=defaults)
+-        True
+     """
+     def formatargandannotation(arg):
+         result = formatarg(arg)
+@@ -2649,11 +2641,11 @@ def __internal_tests():
+     Test _sage_getargspec_cython with multiple default arguments and a type::
+ 
+         sage: _sage_getargspec_cython("def init(self, x=None, base=0):")
+-        ArgSpec(args=['self', 'x', 'base'], varargs=None, keywords=None, defaults=(None, 0))
++        FullArgSpec(args=['self', 'x', 'base'], varargs=None, varkw=None, defaults=(None, 0), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: _sage_getargspec_cython("def __init__(self, x=None, base=0):")
+-        ArgSpec(args=['self', 'x', 'base'], varargs=None, keywords=None, defaults=(None, 0))
++        FullArgSpec(args=['self', 'x', 'base'], varargs=None, varkw=None, defaults=(None, 0), kwonlyargs=[], kwonlydefaults=None, annotations={})
+         sage: _sage_getargspec_cython("def __init__(self, x=None, unsigned int base=0, **keys):")
+-        ArgSpec(args=['self', 'x', 'base'], varargs=None, keywords='keys', defaults=(None, 0))
++        FullArgSpec(args=['self', 'x', 'base'], varargs=None, varkw='keys', defaults=(None, 0), kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+     Test _extract_embedded_position:
+ 
+diff --git a/src/sage/parallel/decorate.py b/src/sage/parallel/decorate.py
+index c14518af570..3a7152d5ac9 100644
+--- a/src/sage/parallel/decorate.py
++++ b/src/sage/parallel/decorate.py
+@@ -243,7 +243,8 @@ for a in args[0]))
+             ....:     return x + y
+             sage: from sage.misc.sageinspect import sage_getargspec
+             sage: sage_getargspec(p(f))
+-            ArgSpec(args=['x', 'y'], varargs=None, keywords=None, defaults=None)
++            FullArgSpec(args=['x', 'y'], varargs=None, varkw=None, defaults=None,
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+         """
+         from sage.misc.sageinspect import sage_getargspec
+         return sage_getargspec(self.func)
+diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
+index 64b11a0442a..174765980f7 100644
+--- a/src/sage/plot/plot3d/plot3d.py
++++ b/src/sage/plot/plot3d/plot3d.py
+@@ -329,19 +329,24 @@ class _Coordinates():
+             sage: t1,t2,t3=T.to_cartesian(lambda a,b: 2*a+b)
+             sage: from sage.misc.sageinspect import sage_getargspec
+             sage: sage_getargspec(t1)
+-            ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=None)
++            FullArgSpec(args=['a', 'b'], varargs=None, varkw=None, defaults=None,
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+             sage: sage_getargspec(t2)
+-            ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=None)
++            FullArgSpec(args=['a', 'b'], varargs=None, varkw=None, defaults=None,
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+             sage: sage_getargspec(t3)
+-            ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=None)
++            FullArgSpec(args=['a', 'b'], varargs=None, varkw=None, defaults=None,
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+             sage: def g(a,b): return 2*a+b
+             sage: t1,t2,t3=T.to_cartesian(g)
+             sage: sage_getargspec(t1)
+-            ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=None)
++            FullArgSpec(args=['a', 'b'], varargs=None, varkw=None, defaults=None,
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+             sage: t1,t2,t3=T.to_cartesian(2*a+b)
+             sage: sage_getargspec(t1)
+-            ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=None)
++            FullArgSpec(args=['a', 'b'], varargs=None, varkw=None, defaults=None,
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+ 
+         If we cannot guess the right parameter names, then the
+         parameters are named `u` and `v`::
+@@ -352,7 +357,8 @@ class _Coordinates():
+             sage: T = _ArbitraryCoordinates((x + y, x - y, z), z,[x,y])
+             sage: t1,t2,t3=T.to_cartesian(operator.add)
+             sage: sage_getargspec(t1)
+-            ArgSpec(args=['u', 'v'], varargs=None, keywords=None, defaults=None)
++            FullArgSpec(args=['u', 'v'], varargs=None, varkw=None, defaults=None,
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+             sage: [h(1,2) for h in T.to_cartesian(operator.mul)]
+             [3.0, -1.0, 2.0]
+             sage: [h(u=1,v=2) for h in T.to_cartesian(operator.mul)]
+diff --git a/src/sage/sets/set_from_iterator.py b/src/sage/sets/set_from_iterator.py
+index 3a2360383ea..74015c4433d 100644
+--- a/src/sage/sets/set_from_iterator.py
++++ b/src/sage/sets/set_from_iterator.py
+@@ -526,7 +526,9 @@ class Decorator():
+             sage: d = Decorator()
+             sage: d.f = find_local_minimum
+             sage: sage_getargspec(d) # indirect doctest
+-            ArgSpec(args=['f', 'a', 'b', 'tol', 'maxfun'], varargs=None, keywords=None, defaults=(1.48e-08, 500))
++            FullArgSpec(args=['f', 'a', 'b', 'tol', 'maxfun'],
++                        varargs=None, varkw=None, defaults=(1.48e-08, 500),
++                        kwonlyargs=[], kwonlydefaults=None, annotations={})
+         """
+         from sage.misc.sageinspect import sage_getargspec
+         return sage_getargspec(self.f)
+-- 
+2.38.1
+
+
+From 482dd1ac3d2bcaa94dd935e3add1a5165674b146 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 22:12:38 -0300
+Subject: [PATCH 10/11] doctests: AssertionError message changed in python 3.11
+
+---
+ src/sage/misc/lazy_format.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/sage/misc/lazy_format.py b/src/sage/misc/lazy_format.py
+index e3050695b25..b58ea155862 100644
+--- a/src/sage/misc/lazy_format.py
++++ b/src/sage/misc/lazy_format.py
+@@ -78,7 +78,7 @@ class LazyFormat(str):
+         ....:               LazyFormat("%s is wrong")%IDontLikeBeingPrinted())
+         Traceback (most recent call last):
+         ...
+-        AssertionError: <unprintable AssertionError object>
++        AssertionError: ...
+     """
+ 
+     def __mod__(self, args):
+-- 
+2.38.1
+
+
+From 7b6fa565f426e28e14be3b22c202301f9d530e9e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
+Date: Mon, 31 Oct 2022 22:13:13 -0300
+Subject: [PATCH 11/11] doctests: message added more info in python 3.11
+
+---
+ src/sage/repl/attach.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/sage/repl/attach.py b/src/sage/repl/attach.py
+index 39da6ee4acd..20b848e4f04 100644
+--- a/src/sage/repl/attach.py
++++ b/src/sage/repl/attach.py
+@@ -54,6 +54,7 @@ character-by-character::
+         exec(code, globals)
+       File ".../foobar.sage....py", line ..., in <module>
+         raise ValueError("third")   # this should appear in the source snippet
++    ...
+     ValueError: third
+     sage: detach(src)
+ """
+-- 
+2.38.1
+
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2e01d2002e01..627cd386c0dc 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
 version=9.7
-revision=2
+revision=3
 wrksrc=sage-$version
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PR PATCH] [Closed]: sagemath: fix for python 3.11
  2022-11-06 22:12 [PR PATCH] sagemath: fix for python 3.11 tornaria
@ 2022-11-06 23:40 ` ahesford
  0 siblings, 0 replies; 2+ messages in thread
From: ahesford @ 2022-11-06 23:40 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 2097 bytes --]

There's a closed pull request on the void-packages repository

sagemath: fix for python 3.11
https://github.com/void-linux/void-packages/pull/40369

Description:
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **YES**

Without this sagemath is completely broken on python 3.11 (as in: won't even start).

With this I've run tests (on x86_64) both in normal and `--long` mode, all pass. I also installed the package and run from CLI:
```
$ sage
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 9.7, Release Date: 2022-09-19                     │
│ Using Python 3.11.0. Type "help()" for help.                       │
└────────────────────────────────────────────────────────────────────┘
sage: 2+2
4
```

All patches added have been submitted upstream see https://trac.sagemath.org/ticket/33842#comment:79. Hopefully everything will be upstream in sagemath 9.8.

Ping @ahesford


<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-11-06 23:40 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-06 22:12 [PR PATCH] sagemath: fix for python 3.11 tornaria
2022-11-06 23:40 ` [PR PATCH] [Closed]: " ahesford

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).