55beead
diff -up build/pkgs/sagetex/src/remote-sagetex.py.orig build/pkgs/sagetex/src/remote-sagetex.py
861d3bc
--- build/pkgs/sagetex/src/remote-sagetex.py.orig	2020-08-12 02:35:31.000000000 -0600
861d3bc
+++ build/pkgs/sagetex/src/remote-sagetex.py	2020-10-30 14:03:01.286904419 -0600
eaa777c
@@ -24,12 +24,11 @@
eaa777c
 ## You should have received a copy of the GNU General Public License along
eaa777c
 ## with this program.  If not, see <http://www.gnu.org/licenses/>.
eaa777c
 ## 
eaa777c
-from __future__ import print_function
eaa777c
 import json
eaa777c
 import sys
eaa777c
 import time
eaa777c
 import re
eaa777c
-import urllib
eaa777c
+import urllib.request, urllib.parse, urllib.error
eaa777c
 import hashlib
eaa777c
 import os
eaa777c
 import os.path
eaa777c
@@ -156,7 +155,7 @@ class RemoteSage:
eaa777c
                                    '\n*(?P<output>.*)', re.DOTALL)
eaa777c
         self._404 = re.compile('404 Not Found')
eaa777c
         self._session = self._get_url('login',
eaa777c
-                                    urllib.urlencode({'username': user,
eaa777c
+                                    urllib.parse.urlencode({'username': user,
eaa777c
                                     'password':
eaa777c
                                     password}))['session']
eaa777c
         self._codewrap = """try:
eaa777c
@@ -176,18 +175,18 @@ except:
eaa777c
             _p_.save(filename=plotfilename, **kwargs)""")
eaa777c
 
eaa777c
     def _encode(self, d):
eaa777c
-        return 'session={0}&'.format(self._session) + urllib.urlencode(d)
eaa777c
+        return 'session={0}&'.format(self._session) + urllib.parse.urlencode(d)
eaa777c
 
eaa777c
     def _get_url(self, action, u):
eaa777c
-        with closing(urllib.urlopen(self._srv + '/simple/' + action +
eaa777c
-                                    '?' + u)) as h:
eaa777c
+        with closing(urllib.request.urlopen(self._srv + '/simple/' + action +
eaa777c
+                                            '?' + u)) as h:
eaa777c
             data = self._response.match(h.read())
eaa777c
             result = json.loads(data.group('header'))
eaa777c
             result['output'] = data.group('output').rstrip()
eaa777c
         return result
eaa777c
 
eaa777c
     def _get_file(self, fn, cell, ofn=None):
eaa777c
-        with closing(urllib.urlopen(self._srv + '/simple/' + 'file' + '?' +
eaa777c
+        with closing(urllib.request.urlopen(self._srv + '/simple/' + 'file' + '?' +
eaa777c
                      self._encode({'cell': cell, 'file': fn}))) as h:
eaa777c
             myfn = ofn if ofn else fn
eaa777c
             data = h.read()
eaa777c
@@ -277,13 +276,13 @@ if login_info_file:
eaa777c
                     password = get_val(line)
eaa777c
 
eaa777c
 if not server:
eaa777c
-    server = raw_input('Enter server: ')
eaa777c
+    server = input('Enter server: ')
eaa777c
 
eaa777c
 if not server.startswith('http'):
eaa777c
     server = 'https://' + server
eaa777c
 
eaa777c
 if not username:
eaa777c
-    username = raw_input('Enter username: ')
eaa777c
+    username = input('Enter username: ')
eaa777c
 
eaa777c
 if not password:
eaa777c
     from getpass import getpass
ecae648
diff -up build/pkgs/sagetex/src/sagetexparse.py.orig build/pkgs/sagetex/src/sagetexparse.py
861d3bc
--- build/pkgs/sagetex/src/sagetexparse.py.orig	2020-08-12 02:35:31.000000000 -0600
861d3bc
+++ build/pkgs/sagetex/src/sagetexparse.py	2020-10-30 14:03:01.286904419 -0600
ecae648
@@ -132,7 +132,7 @@ class SageCodeExtractor():
ecae648
 
ecae648
   def plotout(self, s, l, t):
ecae648
     self.result += '# \\sageplot{} from line %s:\n' % lineno(l, s)
ecae648
-    if t.format is not '':
ecae648
+    if t.format != '':
ecae648
       self.result += '# format: %s' % t.format[0][1:-1] + '\n'
ecae648
     self.result += t.code[1:-1] + '\n\n'
ecae648
 
eb706cd
diff -up src/sage/cpython/debugimpl.c.orig src/sage/cpython/debugimpl.c
861d3bc
--- src/sage/cpython/debugimpl.c.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/cpython/debugimpl.c	2020-10-30 14:03:01.299904398 -0600
861d3bc
@@ -148,6 +148,7 @@ static void _type_debug(PyTypeObject* tp
eb706cd
     printf("  tp_basicsize: %ld\n", (long)tp->tp_basicsize);
eb706cd
     printf("  tp_itemsize: %ld\n", (long)tp->tp_itemsize);
eb706cd
     printf("  tp_dictoffset: %ld\n", (long)tp->tp_dictoffset);
eb706cd
+    printf("  tp_vectorcall_offset: %ld\n", (long)tp->tp_vectorcall_offset);
eb706cd
     if HAVE_WEAKREFS(tp)
eb706cd
     {
eb706cd
         printf("  tp_weaklistoffset: %ld\n", (long)tp->tp_weaklistoffset);
861d3bc
@@ -178,7 +179,6 @@ static void _type_debug(PyTypeObject* tp
eb706cd
     attr_pointer(tp_free);
eb706cd
 
eb706cd
     attr_pointer_meth(tp_repr, "__repr__");
eb706cd
-    attr_pointer(tp_print);
eb706cd
     attr_pointer_meth(tp_hash, "__hash__");
eb706cd
     attr_pointer_meth(tp_call, "__call__");
eb706cd
     attr_pointer_meth(tp_str, "__str__");
eb706cd
diff -up src/sage/cpython/debug.pyx.orig src/sage/cpython/debug.pyx
861d3bc
--- src/sage/cpython/debug.pyx.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/cpython/debug.pyx	2020-10-30 14:03:01.300904396 -0600
eb706cd
@@ -232,6 +232,7 @@ def type_debug(cls):
eb706cd
           tp_basicsize: 16
eb706cd
           tp_itemsize: 0
eb706cd
           tp_dictoffset: 0
eb706cd
+          tp_vectorcall_offset: 0
eb706cd
           tp_weaklistoffset: 0
eb706cd
           tp_base (__base__): NULL
eb706cd
           tp_bases (__bases__): tuple:
eb706cd
@@ -259,7 +260,6 @@ def type_debug(cls):
eb706cd
           tp_dealloc (__dealloc__): 0x7fc57d757010
eb706cd
           tp_free: PyObject_Del
eb706cd
           tp_repr (__repr__): 0x7fc57d75b990
eb706cd
-          tp_print: NULL
eb706cd
           tp_hash (__hash__): _Py_HashPointer
eb706cd
           tp_call (__call__): NULL
eb706cd
           tp_str (__str__): 0x7fc57d757020
55beead
diff -up src/sage/geometry/triangulation/point_configuration.py.orig src/sage/geometry/triangulation/point_configuration.py
861d3bc
--- src/sage/geometry/triangulation/point_configuration.py.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/geometry/triangulation/point_configuration.py	2020-10-30 14:03:01.301904394 -0600
2fac775
@@ -619,11 +619,11 @@ class PointConfiguration(UniqueRepresent
55beead
             ['{{0,1,2,4},{1,2,3,4}}']
55beead
         """
55beead
         timeout = 600
55beead
-        proc = pexpect.spawn(executable, timeout=timeout)
55beead
+        proc = pexpect.spawn(executable, timeout=timeout, encoding='utf-8')
55beead
         proc.expect(r'Evaluating Commandline Options \.\.\.')
55beead
         proc.expect(r'\.\.\. done\.')
55beead
         proc.setecho(0)
2fac775
-        assert proc.readline().strip() == b''
2fac775
+        assert proc.readline().strip() == ''
2fac775
 
2fac775
         if verbose:
2fac775
             print("#### TOPCOM input ####")
55beead
diff -up src/sage/interfaces/frobby.py.orig src/sage/interfaces/frobby.py
861d3bc
--- src/sage/interfaces/frobby.py.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/interfaces/frobby.py	2020-10-30 14:03:02.534902319 -0600
2fac775
@@ -79,7 +79,7 @@ class Frobby:
55beead
             print("Frobby command: ", repr(command))
55beead
             print("Frobby input:\n", input)
55beead
 
55beead
-        process = Popen(command, stdin = PIPE, stdout = PIPE, stderr = PIPE)
2fac775
+        process = Popen(command, stdin = PIPE, stdout = PIPE, stderr = PIPE, encoding='utf-8')
2fac775
         if input:
2fac775
             frinput = str_to_bytes(input)
2fac775
         else:
55beead
diff -up src/sage/interfaces/gfan.py.orig src/sage/interfaces/gfan.py
861d3bc
--- src/sage/interfaces/gfan.py.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/interfaces/gfan.py	2020-10-30 14:11:30.550047499 -0600
861d3bc
@@ -62,7 +62,7 @@ class Gfan(object):
861d3bc
             print("gfan input:\n%s" % I)
55beead
 
55beead
         gfan_processes = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE,
861d3bc
-                               encoding='latin-1')
861d3bc
+                               encoding='utf-8')
861d3bc
         ans, err = gfan_processes.communicate(input=I)
55beead
 
861d3bc
         # sometimes, gfan outputs stuff to stderr even though everything is fine
55beead
diff -up src/sage/interfaces/latte.py.orig src/sage/interfaces/latte.py
861d3bc
--- src/sage/interfaces/latte.py.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/interfaces/latte.py	2020-10-30 14:03:03.974899895 -0600
7b54d21
@@ -152,6 +152,7 @@ def count(arg, ehrhart_polynomial=False,
55beead
     latte_proc = Popen(args,
55beead
                        stdin=PIPE, stdout=PIPE,
55beead
                        stderr=(None if verbose else PIPE),
55beead
+                       encoding='utf-8',
55beead
                        cwd=str(SAGE_TMP))
55beead
 
55beead
     ans, err = latte_proc.communicate(arg)
7b54d21
@@ -364,6 +365,7 @@ def integrate(arg, polynomial=None, algo
55beead
     latte_proc = Popen(args,
55beead
                        stdin=PIPE, stdout=PIPE,
55beead
                        stderr=(None if verbose else PIPE),
55beead
+                       encoding='utf-8',
55beead
                        cwd=str(SAGE_TMP))
55beead
 
55beead
     ans, err = latte_proc.communicate(arg)
55beead
diff -up src/sage/interfaces/sagespawn.pyx.orig src/sage/interfaces/sagespawn.pyx
861d3bc
--- src/sage/interfaces/sagespawn.pyx.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/interfaces/sagespawn.pyx	2020-10-30 14:03:03.975899894 -0600
55beead
@@ -1,6 +1,6 @@
55beead
 """
55beead
 Sage wrapper around pexpect's ``spawn`` class and
55beead
-the ptyprocess's ``PtyProcess`` class.
55beead
+the ptyprocess's ``PtyProcessUnicode`` class.
55beead
 
55beead
 AUTHOR:
55beead
 
55beead
@@ -21,7 +21,7 @@ AUTHOR:
55beead
 #*****************************************************************************
55beead
 
55beead
 from pexpect import *
55beead
-from ptyprocess import PtyProcess
55beead
+from ptyprocess import PtyProcessUnicode
55beead
 
55beead
 from cpython.ref cimport Py_INCREF
55beead
 from libc.signal cimport *
55beead
@@ -30,7 +30,6 @@ from posix.unistd cimport getpid, getpgi
55beead
 
55beead
 from time import sleep
55beead
 
55beead
-from sage.cpython.string cimport str_to_bytes
55beead
 from sage.interfaces.process cimport ContainChildren
55beead
 
55beead
 
861d3bc
@@ -173,7 +172,7 @@ class SageSpawn(spawn):
55beead
         return ret
55beead
 
55beead
 
55beead
-class SagePtyProcess(PtyProcess):
55beead
+class SagePtyProcess(PtyProcessUnicode):
55beead
     def close(self, force=None):
55beead
         """
55beead
         Quit the child process: send the quit string, close the
861d3bc
@@ -194,11 +193,7 @@ class SagePtyProcess(PtyProcess):
55beead
             if self.quit_string is not None:
55beead
                 try:
55beead
                     # This can fail if the process already exited
55beead
-                    # PtyProcess.write takes bytes; ideally we would use
55beead
-                    # an encoding picked specifically for the target process
55beead
-                    # but the default (UTF-8) will do now, since I don't
55beead
-                    # think we have any non-ASCII quit_strings anyways.
55beead
-                    self.write(str_to_bytes(self.quit_string))
55beead
+                    self.write(self.quit_string)
55beead
                 except (OSError, IOError):
55beead
                     pass
55beead
             self.fileobj.close()
ecae648
diff -up src/sage/libs/coxeter3/coxeter.pyx.orig src/sage/libs/coxeter3/coxeter.pyx
861d3bc
--- src/sage/libs/coxeter3/coxeter.pyx.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/libs/coxeter3/coxeter.pyx	2020-10-30 14:03:03.976899892 -0600
861d3bc
@@ -37,7 +37,7 @@ cdef class String:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import String       # optional - coxeter3
ecae648
-            sage: s = String("hello"); s                              # optional - coxeter3
ecae648
+            sage: s = String(b"hello"); s                             # optional - coxeter3
ecae648
             hello
ecae648
             sage: del s                                               # optional - coxeter3
ecae648
         """
861d3bc
@@ -48,11 +48,11 @@ cdef class String:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import String       # optional - coxeter3
ecae648
-            sage: s = String('Hi')                                    # optional - coxeter3
ecae648
+            sage: s = String(b'Hi')                                   # optional - coxeter3
ecae648
             sage: s                                                   # optional - coxeter3
ecae648
             Hi
ecae648
         """
7b54d21
-        return bytes_to_str(self.x.ptr())
ecae648
+        return self.x.ptr().decode('utf-8')
ecae648
 
ecae648
     def __hash__(self):
ecae648
         """
861d3bc
@@ -64,7 +64,7 @@ cdef class String:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import String        # optional - coxeter3
ecae648
-            sage: s = String('hello')                                  # optional - coxeter3
ecae648
+            sage: s = String(b'hello')                                 # optional - coxeter3
ecae648
             sage: hash(s) == hash('hello')                             # optional - coxeter3
ecae648
             True
ecae648
         """
861d3bc
@@ -75,9 +75,9 @@ cdef class String:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import String        # optional - coxeter3
ecae648
-            sage: ta1 = String('A')                                    # optional - coxeter3
ecae648
-            sage: ta2 = String('A')                                    # optional - coxeter3
ecae648
-            sage: tb = String('b')                                     # optional - coxeter3
ecae648
+            sage: ta1 = String(b'A')                                   # optional - coxeter3
ecae648
+            sage: ta2 = String(b'A')                                   # optional - coxeter3
ecae648
+            sage: tb = String(b'b')                                    # optional - coxeter3
ecae648
             sage: ta1 == ta2                                           # optional - coxeter3
ecae648
             True
ecae648
             sage: tb != ta1                                            # optional - coxeter3
861d3bc
@@ -113,7 +113,7 @@ cdef class String:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import String       # optional - coxeter3
ecae648
-            sage: s = String('Hi')                                    # optional - coxeter3
ecae648
+            sage: s = String(b'Hi')                                   # optional - coxeter3
ecae648
             sage: len(s)                                              # optional - coxeter3
ecae648
             2
ecae648
         """
861d3bc
@@ -124,7 +124,7 @@ cdef class String:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import String       # optional - coxeter3
ecae648
-            sage: s = String('Hi')                                    # optional - coxeter3
ecae648
+            sage: s = String(b'Hi')                                   # optional - coxeter3
ecae648
             sage: TestSuite(s).run()                                  # optional - coxeter3
ecae648
         """
ecae648
         return (String, (repr(self),) )
861d3bc
@@ -138,7 +138,7 @@ cdef class Type:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import Type         # optional - coxeter3
ecae648
-            sage: t = Type('A'); t                                    # optional - coxeter3
ecae648
+            sage: t = Type(b'A'); t                                   # optional - coxeter3
ecae648
             A
ecae648
             sage: del t                                               # optional - coxeter3
ecae648
         """
861d3bc
@@ -149,7 +149,7 @@ cdef class Type:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import Type         # optional - coxeter3
ecae648
-            sage: t = Type('A'); t                                    # optional - coxeter3
ecae648
+            sage: t = Type(b'A'); t                                   # optional - coxeter3
ecae648
             A
ecae648
         """
7b54d21
         return bytes_to_str(self.x.name().ptr())
861d3bc
@@ -159,7 +159,7 @@ cdef class Type:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import Type         # optional - coxeter3
ecae648
-            sage: t = Type('A')                                       # optional - coxeter3
ecae648
+            sage: t = Type(b'A')                                      # optional - coxeter3
ecae648
             sage: t.name()                                            # optional - coxeter3
ecae648
             A
ecae648
         """
861d3bc
@@ -175,8 +175,8 @@ cdef class Type:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import Type          # optional - coxeter3
ecae648
-            sage: a = Type('A')                                        # optional - coxeter3
ecae648
-            sage: b = Type('B')                                        # optional - coxeter3
ecae648
+            sage: a = Type(b'A')                                       # optional - coxeter3
ecae648
+            sage: b = Type(b'B')                                       # optional - coxeter3
ecae648
             sage: hash(a) == hash(b)                                   # optional - coxeter3
ecae648
             False
ecae648
             sage: d = {a: 1, b: 2}                                     # optional - coxeter3
861d3bc
@@ -188,9 +188,9 @@ cdef class Type:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import Type          # optional - coxeter3
ecae648
-            sage: ta1 = Type('A')                                      # optional - coxeter3
ecae648
-            sage: ta2 = Type('A')                                      # optional - coxeter3
ecae648
-            sage: tb = Type('b')                                       # optional - coxeter3
ecae648
+            sage: ta1 = Type(b'A')                                     # optional - coxeter3
ecae648
+            sage: ta2 = Type(b'A')                                     # optional - coxeter3
ecae648
+            sage: tb = Type(b'b')                                      # optional - coxeter3
ecae648
             sage: ta1 == ta2                                           # optional - coxeter3
ecae648
             True
ecae648
             sage: tb != ta1                                            # optional - coxeter3
861d3bc
@@ -224,7 +224,7 @@ cdef class Type:
ecae648
         EXAMPLES::
ecae648
 
ecae648
             sage: from sage.libs.coxeter3.coxeter import Type           # optional - coxeter3
ecae648
-            sage: t = Type('A')                                         # optional - coxeter3
ecae648
+            sage: t = Type(b'A')                                        # optional - coxeter3
ecae648
             sage: TestSuite(t).run()                                    # optional - coxeter3
ecae648
         """
ecae648
         return (Type, (repr(self), ))
861d3bc
@@ -268,7 +268,7 @@ cdef class CoxGroup(SageObject):
861d3bc
                 pass
ecae648
             type = type.lower()
ecae648
 
ecae648
-        type = 'B' if type == 'C' else type
ecae648
+        type = b'B' if type == 'C' else type.encode('utf-8')
ecae648
 
ecae648
         if rank == 0:
ecae648
             raise NotImplementedError("Coxeter group of type ['A',0] using Coxeter 3 not yet implemented")
eb706cd
diff -up src/sage/misc/sageinspect.py.orig src/sage/misc/sageinspect.py
861d3bc
--- src/sage/misc/sageinspect.py.orig	2020-11-01 10:38:08.203022437 -0700
861d3bc
+++ src/sage/misc/sageinspect.py	2020-11-01 10:43:43.355143620 -0700
861d3bc
@@ -463,12 +463,9 @@ class SageArgSpecVisitor(ast.NodeVisitor
861d3bc
         """
eb706cd
         return node.id
eb706cd
 
861d3bc
-    def visit_NameConstant(self, node):
861d3bc
-        """
861d3bc
-        Visit a Python AST :class:`ast.NameConstant` node.
861d3bc
-
861d3bc
-        This is an optimization added in Python 3.4 for the special cases
861d3bc
-        of True, False, and None.
eb706cd
+    def visit_Constant(self, node):
eb706cd
+        r"""
eb706cd
+        Visit a Python AST :class:`ast.Constant` node.
eb706cd
 
861d3bc
         INPUT:
eb706cd
 
861d3bc
@@ -476,17 +473,21 @@ class SageArgSpecVisitor(ast.NodeVisitor
eb706cd
 
861d3bc
         OUTPUT:
eb706cd
 
861d3bc
-        - None, True, False.
eb706cd
+        - the boolean, number, or string the ``node`` represents
eb706cd
 
861d3bc
         EXAMPLES::
eb706cd
 
861d3bc
-            sage: import ast, sage.misc.sageinspect as sms  # py3
861d3bc
-            sage: visitor = sms.SageArgSpecVisitor()  # py3
861d3bc
-            sage: vis = lambda x: visitor.visit_NameConstant(ast.parse(x).body[0].value)  # py3
861d3bc
-            sage: [vis(n) for n in ['True', 'False', 'None']]  # py3
eb706cd
+            sage: import ast, sage.misc.sageinspect as sms
eb706cd
+            sage: visitor = sms.SageArgSpecVisitor()
eb706cd
+            sage: vis = lambda x: visitor.visit_Constant(ast.parse(x).body[0].value)
eb706cd
+            sage: [vis(n) for n in ['True', 'False', 'None']]
861d3bc
             [True, False, None]
861d3bc
-            sage: [type(vis(n)) for n in ['True', 'False', 'None']]  # py3
eb706cd
+            sage: [type(vis(n)) for n in ['True', 'False', 'None']]
861d3bc
             [<type 'bool'>, <type 'bool'>, <type 'NoneType'>]
eb706cd
+            sage: [vis(s) for s in ['"abstract"', "u'syntax'", r'''r"tr\ee"''']]
eb706cd
+            ['abstract', u'syntax', 'tr\\ee']
861d3bc
+            sage: [vis(n) for n in ['123', '0.0']]
eb706cd
+            [123, 0.0]
861d3bc
         """
eb706cd
 
861d3bc
         return node.value
861d3bc
@@ -520,57 +521,6 @@ class SageArgSpecVisitor(ast.NodeVisitor
861d3bc
         """
861d3bc
         return node.arg
eb706cd
 
eb706cd
-    def visit_Num(self, node):
eb706cd
-        """
eb706cd
-        Visit a Python AST :class:`ast.Num` node.
eb706cd
-
eb706cd
-        INPUT:
eb706cd
-
eb706cd
-        - ``node`` - the node instance to visit
eb706cd
-
eb706cd
-        OUTPUT:
eb706cd
-
eb706cd
-        - the number the ``node`` represents
eb706cd
-
eb706cd
-        EXAMPLES::
eb706cd
-
eb706cd
-            sage: import ast, sage.misc.sageinspect as sms
eb706cd
-            sage: visitor = sms.SageArgSpecVisitor()
eb706cd
-            sage: vis = lambda x: visitor.visit_Num(ast.parse(x).body[0].value)
eb706cd
-            sage: [vis(n) for n in ['123', '0.0', str(-pi.n())]]  # py2
eb706cd
-            [123, 0.0, -3.14159265358979]
eb706cd
-            sage: [vis(n) for n in ['123', '0.0']]  # py3
eb706cd
-            [123, 0.0]
eb706cd
-
eb706cd
-        .. NOTE::
eb706cd
-
eb706cd
-            On Python 3 negative numbers are parsed first, for some reason, as
eb706cd
-            a UnaryOp node.
eb706cd
-        """
eb706cd
-        return node.n
eb706cd
-
eb706cd
-    def visit_Str(self, node):
eb706cd
-        r"""
eb706cd
-        Visit a Python AST :class:`ast.Str` node.
eb706cd
-
eb706cd
-        INPUT:
eb706cd
-
eb706cd
-        - ``node`` - the node instance to visit
eb706cd
-
eb706cd
-        OUTPUT:
eb706cd
-
eb706cd
-        - the string the ``node`` represents
eb706cd
-
eb706cd
-        EXAMPLES::
eb706cd
-
eb706cd
-            sage: import ast, sage.misc.sageinspect as sms
eb706cd
-            sage: visitor = sms.SageArgSpecVisitor()
eb706cd
-            sage: vis = lambda x: visitor.visit_Str(ast.parse(x).body[0].value)
eb706cd
-            sage: [vis(s) for s in ['"abstract"', "u'syntax'", r'''r"tr\ee"''']]
eb706cd
-            ['abstract', u'syntax', 'tr\\ee']
eb706cd
-        """
eb706cd
-        return node.s
eb706cd
-
eb706cd
     def visit_List(self, node):
eb706cd
         """
eb706cd
         Visit a Python AST :class:`ast.List` node.
55beead
diff -up src/sage/plot/plot3d/plot3d.py.orig src/sage/plot/plot3d/plot3d.py
861d3bc
--- src/sage/plot/plot3d/plot3d.py.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/plot/plot3d/plot3d.py	2020-10-30 14:24:36.813732073 -0600
861d3bc
@@ -186,7 +186,7 @@ class _Coordinates(object):
55beead
             sage: arb((x+z,y*z,z), z, (x,y))
eaa777c
             Arbitrary Coordinates coordinate transform (z in terms of x, y)
eaa777c
         """
55beead
-        all_vars = sage_getargspec(self.transform).args[1:]
861d3bc
+        all_vars = inspect.getfullargspec(self.transform)[0][1:]
eaa777c
         if set(all_vars) != set(indep_vars + [dep_var]):
eaa777c
             raise ValueError('variables were specified incorrectly for this coordinate system; incorrect variables were %s'%list(set(all_vars).symmetric_difference(set(indep_vars+[dep_var]))))
eaa777c
         self.dep_var = dep_var
0533707
diff -up src/sage/rings/integer.pyx.orig src/sage/rings/integer.pyx
861d3bc
--- src/sage/rings/integer.pyx.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/rings/integer.pyx	2020-10-30 14:03:05.737896928 -0600
861d3bc
@@ -7093,7 +7093,7 @@ cdef int mpz_set_str_python(mpz_ptr z, c
861d3bc
         x += 1  # Strip spaces
eaa777c
 
eaa777c
     # Disallow a sign here
eaa777c
-    if x[0] == '-' or x[0] == '+':
eaa777c
+    if x[0] == c'-' or x[0] == c'+':
eaa777c
         x = ""  # Force an error below
eaa777c
 
eaa777c
     assert base >= 2
861d3bc
diff -up src/sage/rings/polynomial/pbori/pbori.pyx.orig src/sage/rings/polynomial/pbori/pbori.pyx
861d3bc
--- src/sage/rings/polynomial/pbori/pbori.pyx.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/rings/polynomial/pbori/pbori.pyx	2020-11-05 15:44:02.756454276 -0700
861d3bc
@@ -4800,8 +4800,7 @@ cdef class PolynomialConstruct:
55beead
             # So, it is just a conversion. [Simon King]
55beead
             return (<BooleanPolynomialRing>ring)._element_constructor_(x)
55beead
 
7b54d21
-        raise TypeError("Cannot generate Boolean polynomial from %s , %s" %
55beead
-                        (type(x), type(ring)))
55beead
+        raise TypeError(f"Cannot generate Boolean polynomial from {type(x)}, {type(ring)}")
55beead
 
55beead
 
55beead
 cdef class MonomialConstruct:
55beead
diff -up src/sage/rings/real_mpfi.pyx.orig src/sage/rings/real_mpfi.pyx
861d3bc
--- src/sage/rings/real_mpfi.pyx.orig	2020-10-30 11:34:28.078977132 -0600
861d3bc
+++ src/sage/rings/real_mpfi.pyx	2020-10-30 14:03:09.088891288 -0600
861d3bc
@@ -1955,12 +1955,12 @@ cdef class RealIntervalFieldElement(Ring
eaa777c
 
eaa777c
         cdef long digits
eaa777c
         digits = strlen(lower_s)
eaa777c
-        if lower_s[0] == '-':
eaa777c
+        if lower_s[0] == c'-':
eaa777c
             digits -= 1
eaa777c
         lower_expo -= digits
eaa777c
 
eaa777c
         digits = strlen(upper_s)
eaa777c
-        if upper_s[0] == '-':
eaa777c
+        if upper_s[0] == c'-':
eaa777c
             digits -= 1
eaa777c
         upper_expo -= digits
eaa777c
 
861d3bc
@@ -2129,7 +2129,7 @@ cdef class RealIntervalFieldElement(Ring
eaa777c
             raise MemoryError("Unable to allocate memory for the mantissa of an interval")
eaa777c
         mpz_get_str(tmp_cstr, base, lower_mpz)
eaa777c
         digits = strlen(tmp_cstr)
eaa777c
-        if tmp_cstr[0] == '-':
eaa777c
+        if tmp_cstr[0] == c'-':
eaa777c
             digits -= 1
eaa777c
             mant_string = bytes_to_str(tmp_cstr+1)
eaa777c
             sign_string = bytes_to_str(b'-')
55beead
diff -up src/sage/rings/real_mpfr.pyx.orig src/sage/rings/real_mpfr.pyx
861d3bc
--- src/sage/rings/real_mpfr.pyx.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/rings/real_mpfr.pyx	2020-11-05 15:44:02.769454276 -0700
861d3bc
@@ -2091,7 +2091,7 @@ cdef class RealNumber(sage.structure.ele
55beead
         if s is NULL:
55beead
             raise RuntimeError("unable to convert an mpfr number to a string")
55beead
         # t contains just digits (no sign, decimal point or exponent)
55beead
-        if s[0] == '-':
55beead
+        if s[0] == c'-':
55beead
             sgn = "-"
55beead
             t = char_to_str(s + 1)
55beead
         else:
55beead
diff -up src/sage/structure/sage_object.pyx.orig src/sage/structure/sage_object.pyx
861d3bc
--- src/sage/structure/sage_object.pyx.orig	2020-10-24 11:37:59.000000000 -0600
861d3bc
+++ src/sage/structure/sage_object.pyx	2020-10-30 14:03:09.091891283 -0600
861d3bc
@@ -688,7 +688,7 @@ cdef class SageObject:
55beead
             try:
55beead
                 s = self._interface_init_(I)
55beead
             except Exception:
55beead
-                raise NotImplementedError("coercion of object %s to %s not implemented:\n%s\n%s" % (repr(self), I))
55beead
+                raise NotImplementedError(f"coercion of object {repr(self)} to {I} not implemented")
55beead
         X = I(s)
55beead
         if c:
55beead
             try:
55beead
diff -up src/sage/symbolic/expression.pyx.orig src/sage/symbolic/expression.pyx
861d3bc
--- src/sage/symbolic/expression.pyx.orig	2020-10-30 12:10:19.747169301 -0600
861d3bc
+++ src/sage/symbolic/expression.pyx	2020-10-30 14:03:09.095891276 -0600
861d3bc
@@ -13071,7 +13071,7 @@ cdef class hold_class:
eaa777c
             sage: SR(2)^5
eaa777c
             32
eaa777c
         """
eaa777c
-        g_set_state('hold', True)
eaa777c
+        g_set_state(b'hold', True)
eaa777c
 
eaa777c
     def __exit__(self, *args):
eaa777c
         """
861d3bc
@@ -13084,7 +13084,7 @@ cdef class hold_class:
eaa777c
             sage: SR(2)^5
eaa777c
             32
eaa777c
         """
eaa777c
-        g_set_state('hold', False)
eaa777c
+        g_set_state(b'hold', False)
eaa777c
 
eaa777c
     def start(self):
eaa777c
         """