sagemath/sagemath-python3.patch
Jerry James 05337076b6 Update to sagemath 8.7.
- Drop upstreamed -giac patch.
- Add -sagetex patch to fix a python indentation error.
- Add -rubiks patch to fix compilation of the rubiks library.
- Add -random patch to fix a non-random random bit generator.
- Drop pip3 workaround; the binary is now named just pip again.
2019-04-28 15:12:00 -06:00

794 lines
31 KiB
Diff

diff -up build/pkgs/sagenb/src/sagenb/misc/support.py.orig build/pkgs/sagenb/src/sagenb/misc/support.py
--- build/pkgs/sagenb/src/sagenb/misc/support.py.orig 2019-02-01 06:34:20.000000000 -0700
+++ build/pkgs/sagenb/src/sagenb/misc/support.py 2019-04-08 12:02:29.162692936 -0600
@@ -178,7 +178,7 @@ def completions(s, globs, format=False,
try:
if not '.' in s and not '(' in s:
v = [x for x in globs.keys() if x[:n] == s] + \
- [x for x in __builtins__.keys() if x[:n] == s]
+ [x for x in builtins.keys() if x[:n] == s]
else:
if not ')' in s:
i = s.rfind('.')
diff -up build/pkgs/sagenb/src/sagenb/notebook/docHTMLProcessor.py.orig build/pkgs/sagenb/src/sagenb/notebook/docHTMLProcessor.py
--- build/pkgs/sagenb/src/sagenb/notebook/docHTMLProcessor.py.orig 2019-02-01 05:37:36.000000000 -0700
+++ build/pkgs/sagenb/src/sagenb/notebook/docHTMLProcessor.py 2019-04-08 11:59:49.259545960 -0600
@@ -25,7 +25,7 @@ This module contains three classes:
.. NOTE::
- This extension of htmllib.HTMLParser was partly inspired by Mark
+ This extension of html.parser.HTMLParser was partly inspired by Mark
Pilgrim's 'Dive Into Python' examples.
AUTHORS:
@@ -155,7 +155,7 @@ class genericHTMLProcessor(HTMLParser):
u'<h1 class="title">Title</h1>\n\n<p>nSome text</p>\n\n\n\n'
"""
- # self.feed() is a HTMLParser method and starts everything
+ # self.feed() is an HTMLParser method and starts everything
# off; Most of the functions here are extensions to
# HTMLParser, and may never actually be visibly called here.
diff -up build/pkgs/sagenb/src/sagenb/notebook/wiki2html.py.orig build/pkgs/sagenb/src/sagenb/notebook/wiki2html.py
--- build/pkgs/sagenb/src/sagenb/notebook/wiki2html.py.orig 2019-02-01 05:37:36.000000000 -0700
+++ build/pkgs/sagenb/src/sagenb/notebook/wiki2html.py 2019-04-08 11:59:49.260545943 -0600
@@ -59,7 +59,7 @@ class Parser:
'parent': r'(?:%s)?' % re.escape(PARENT_PREFIX),
}
url_rule = r'%(url_guard)s(%(url)s)\:([^\s\<%(punct)s]|([%(punct)s][^\s\<%(punct)s]))+' % {
- 'url_guard': ur'(^|(?<!\w))',
+ 'url_guard': r'(^|(?<!\w))',
'url': url_pattern,
'punct': punct_pattern,
}
diff -up build/pkgs/sagetex/src/extractsagecode.py.orig build/pkgs/sagetex/src/extractsagecode.py
--- build/pkgs/sagetex/src/extractsagecode.py.orig 2019-04-08 11:59:49.261545925 -0600
+++ build/pkgs/sagetex/src/extractsagecode.py 2019-04-08 12:04:16.915757233 -0600
@@ -45,7 +45,7 @@ See the SageTeX documentation for more d
try:
opts, args = getopt.getopt(sys.argv[1:], 'ho', ['help', 'overwrite'])
-except getopt.GetoptError, err:
+except getopt.GetoptError as err:
print(str(err))
usage()
sys.exit(2)
diff -up build/pkgs/sagetex/src/makestatic.py.orig build/pkgs/sagetex/src/makestatic.py
--- build/pkgs/sagetex/src/makestatic.py.orig 2019-04-08 11:59:49.262545907 -0600
+++ build/pkgs/sagetex/src/makestatic.py 2019-04-08 12:04:42.619295492 -0600
@@ -45,7 +45,7 @@ See the SageTeX documentation for more d
try:
opts, args = getopt.getopt(sys.argv[1:], 'ho', ['help', 'overwrite'])
-except getopt.GetoptError, err:
+except getopt.GetoptError as err:
print(str(err))
usage()
sys.exit(2)
diff -up build/pkgs/sagetex/src/remote-sagetex.py.orig build/pkgs/sagetex/src/remote-sagetex.py
--- build/pkgs/sagetex/src/remote-sagetex.py.orig 2019-01-09 09:51:28.000000000 -0700
+++ build/pkgs/sagetex/src/remote-sagetex.py 2019-04-08 11:59:49.263545889 -0600
@@ -24,12 +24,11 @@
## You should have received a copy of the GNU General Public License along
## with this program. If not, see <http://www.gnu.org/licenses/>.
##
-from __future__ import print_function
import json
import sys
import time
import re
-import urllib
+import urllib.request, urllib.parse, urllib.error
import hashlib
import os
import os.path
@@ -156,7 +155,7 @@ class RemoteSage:
'\n*(?P<output>.*)', re.DOTALL)
self._404 = re.compile('404 Not Found')
self._session = self._get_url('login',
- urllib.urlencode({'username': user,
+ urllib.parse.urlencode({'username': user,
'password':
password}))['session']
self._codewrap = """try:
@@ -176,18 +175,18 @@ except:
_p_.save(filename=plotfilename, **kwargs)""")
def _encode(self, d):
- return 'session={0}&'.format(self._session) + urllib.urlencode(d)
+ return 'session={0}&'.format(self._session) + urllib.parse.urlencode(d)
def _get_url(self, action, u):
- with closing(urllib.urlopen(self._srv + '/simple/' + action +
- '?' + u)) as h:
+ with closing(urllib.request.urlopen(self._srv + '/simple/' + action +
+ '?' + u)) as h:
data = self._response.match(h.read())
result = json.loads(data.group('header'))
result['output'] = data.group('output').rstrip()
return result
def _get_file(self, fn, cell, ofn=None):
- with closing(urllib.urlopen(self._srv + '/simple/' + 'file' + '?' +
+ with closing(urllib.request.urlopen(self._srv + '/simple/' + 'file' + '?' +
self._encode({'cell': cell, 'file': fn}))) as h:
myfn = ofn if ofn else fn
data = h.read()
@@ -277,13 +276,13 @@ if login_info_file:
password = get_val(line)
if not server:
- server = raw_input('Enter server: ')
+ server = input('Enter server: ')
if not server.startswith('http'):
server = 'https://' + server
if not username:
- username = raw_input('Enter username: ')
+ username = input('Enter username: ')
if not password:
from getpass import getpass
diff -up src/doc/common/conf.py.orig src/doc/common/conf.py
--- src/doc/common/conf.py.orig 2019-03-23 16:20:31.000000000 -0600
+++ src/doc/common/conf.py 2019-04-08 12:05:07.088855913 -0600
@@ -547,7 +547,7 @@ skip_picklability_check_modules = [
#'sage.misc.nested_class_test', # for test only
'sage.misc.latex',
'sage.misc.explain_pickle',
- '__builtin__',
+ 'builtins',
]
def check_nested_class_picklability(app, what, name, obj, skip, options):
@@ -596,7 +596,7 @@ def skip_member(app, what, name, obj, sk
if 'SAGE_CHECK_NESTED' in os.environ:
check_nested_class_picklability(app, what, name, obj, skip, options)
- if getattr(obj, '__module__', None) == '__builtin__':
+ if getattr(obj, '__module__', None) == 'builtins':
return True
objname = getattr(obj, "__name__", None)
diff -up src/sage/combinat/finite_state_machine.py.orig src/sage/combinat/finite_state_machine.py
--- src/sage/combinat/finite_state_machine.py.orig 2019-03-23 16:20:38.000000000 -0600
+++ src/sage/combinat/finite_state_machine.py 2019-04-08 12:05:07.090855877 -0600
@@ -932,7 +932,7 @@ import six
from six.moves import range, zip_longest, zip
from six import itervalues
-import collections
+import collections.abc
import itertools
from copy import copy, deepcopy
@@ -14201,7 +14201,7 @@ def is_FSMProcessIterator(PI):
class FSMProcessIterator(SageObject,
- collections.Iterator):
+ collections.abc.Iterator):
"""
This class takes an input, feeds it into a finite state machine
(automaton or transducer, in particular), tests whether this was
diff -up src/sage/cpython/dict_del_by_value.pyx.orig src/sage/cpython/dict_del_by_value.pyx
--- src/sage/cpython/dict_del_by_value.pyx.orig 2019-03-23 16:20:40.000000000 -0600
+++ src/sage/cpython/dict_del_by_value.pyx 2019-04-08 12:05:07.091855859 -0600
@@ -347,8 +347,8 @@ ELIF PY_VERSION_HEX>=0x03060000:
cdef MyPyDictKeysObject * keys = <MyPyDictKeysObject *>(mp.ma_keys)
cdef size_t perturb
cdef size_t mask = <size_t> keys.dk_size-1
- cdef PyDictKeyEntry *entries, *ep
- entries = DK_ENTRIES(keys)
+ cdef PyDictKeyEntry *ep
+ cdef PyDictKeyEntry *entries = DK_ENTRIES(keys)
if mp.ma_values != NULL:
print ("del_dictitem_by_exact_value cannot be applied to a shared key dict")
diff -up src/sage/geometry/triangulation/point_configuration.py.orig src/sage/geometry/triangulation/point_configuration.py
--- src/sage/geometry/triangulation/point_configuration.py.orig 2019-03-23 16:20:40.000000000 -0600
+++ src/sage/geometry/triangulation/point_configuration.py 2019-04-08 12:05:07.091855859 -0600
@@ -623,7 +623,7 @@ class PointConfiguration(UniqueRepresent
['{{0,1,2,4},{1,2,3,4}}']
"""
timeout = 600
- proc = pexpect.spawn(executable, timeout=timeout)
+ proc = pexpect.spawn(executable, timeout=timeout, encoding='utf-8')
proc.expect(r'Evaluating Commandline Options \.\.\.')
proc.expect(r'\.\.\. done\.')
proc.setecho(0)
diff -up src/sage/interfaces/frobby.py.orig src/sage/interfaces/frobby.py
--- src/sage/interfaces/frobby.py.orig 2019-03-23 16:20:40.000000000 -0600
+++ src/sage/interfaces/frobby.py 2019-04-08 12:05:07.091855859 -0600
@@ -77,7 +77,7 @@ class Frobby:
print("Frobby command: ", repr(command))
print("Frobby input:\n", input)
- process = Popen(command, stdin = PIPE, stdout = PIPE, stderr = PIPE)
+ process = Popen(command, stdin = PIPE, stdout = PIPE, stderr = PIPE, encoding='utf-8')
output, err = process.communicate(input = input)
if verbose:
diff -up src/sage/interfaces/gfan.py.orig src/sage/interfaces/gfan.py
--- src/sage/interfaces/gfan.py.orig 2019-03-23 16:20:41.000000000 -0600
+++ src/sage/interfaces/gfan.py 2019-04-08 12:05:07.092855841 -0600
@@ -66,7 +66,7 @@ class Gfan(object):
if six.PY2:
enc_kwargs = {}
else:
- enc_kwargs = {'encoding': 'latin-1'}
+ enc_kwargs = {'encoding': 'utf-8'}
gfan_processes = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE,
**enc_kwargs)
diff -up src/sage/interfaces/gp.py.orig src/sage/interfaces/gp.py
--- src/sage/interfaces/gp.py.orig 2019-03-23 16:20:41.000000000 -0600
+++ src/sage/interfaces/gp.py 2019-04-08 12:05:07.092855841 -0600
@@ -934,17 +934,6 @@ class GpElement(ExpectElement):
"""
return repr(self.type()) == 't_STR'
- def __long__(self):
- """
- Return Python long.
-
- EXAMPLES::
-
- sage: long(gp(10))
- 10L
- """
- return long(str(self))
-
def __float__(self):
"""
Return Python float.
diff -up src/sage/interfaces/latte.py.orig src/sage/interfaces/latte.py
--- src/sage/interfaces/latte.py.orig 2019-03-23 16:20:41.000000000 -0600
+++ src/sage/interfaces/latte.py 2019-04-08 12:05:07.092855841 -0600
@@ -148,6 +148,7 @@ def count(arg, ehrhart_polynomial=False,
latte_proc = Popen(args,
stdin=PIPE, stdout=PIPE,
stderr=(None if verbose else PIPE),
+ encoding='utf-8',
cwd=str(SAGE_TMP))
ans, err = latte_proc.communicate(arg)
@@ -355,6 +356,7 @@ def integrate(arg, polynomial=None, algo
latte_proc = Popen(args,
stdin=PIPE, stdout=PIPE,
stderr=(None if verbose else PIPE),
+ encoding='utf-8',
cwd=str(SAGE_TMP))
ans, err = latte_proc.communicate(arg)
diff -up src/sage/interfaces/sagespawn.pyx.orig src/sage/interfaces/sagespawn.pyx
--- src/sage/interfaces/sagespawn.pyx.orig 2019-03-23 16:20:41.000000000 -0600
+++ src/sage/interfaces/sagespawn.pyx 2019-04-08 12:05:07.092855841 -0600
@@ -1,6 +1,6 @@
"""
Sage wrapper around pexpect's ``spawn`` class and
-the ptyprocess's ``PtyProcess`` class.
+the ptyprocess's ``PtyProcessUnicode`` class.
AUTHOR:
@@ -21,7 +21,7 @@ AUTHOR:
#*****************************************************************************
from pexpect import *
-from ptyprocess import PtyProcess
+from ptyprocess import PtyProcessUnicode
from cpython.ref cimport Py_INCREF
from libc.signal cimport *
@@ -30,7 +30,6 @@ from posix.unistd cimport getpid, getpgi
from time import sleep
-from sage.cpython.string cimport str_to_bytes
from sage.interfaces.process cimport ContainChildren
@@ -171,7 +170,7 @@ class SageSpawn(spawn):
return ret
-class SagePtyProcess(PtyProcess):
+class SagePtyProcess(PtyProcessUnicode):
def close(self, force=None):
"""
Quit the child process: send the quit string, close the
@@ -192,11 +191,7 @@ class SagePtyProcess(PtyProcess):
if self.quit_string is not None:
try:
# This can fail if the process already exited
- # PtyProcess.write takes bytes; ideally we would use
- # an encoding picked specifically for the target process
- # but the default (UTF-8) will do now, since I don't
- # think we have any non-ASCII quit_strings anyways.
- self.write(str_to_bytes(self.quit_string))
+ self.write(self.quit_string)
except (OSError, IOError):
pass
self.fileobj.close()
diff -up src/sage/misc/parser.pyx.orig src/sage/misc/parser.pyx
--- src/sage/misc/parser.pyx.orig 2019-03-23 16:20:41.000000000 -0600
+++ src/sage/misc/parser.pyx 2019-04-08 12:05:07.093855823 -0600
@@ -96,7 +96,7 @@ def token_to_str(int token):
cdef inline bint is_alphanumeric(char c):
- return 'a' <= c <= 'z' or 'A' <= c <= 'Z' or '0' <= c <= '9' or c == '_'
+ return c'a' <= c <= c'z' or c'A' <= c <= c'Z' or c'0' <= c <= c'9' or c == c'_'
cdef inline bint is_whitespace(char c):
return (c != 0) & (strchr(" \t\n\r", c) != NULL)
@@ -247,23 +247,23 @@ cdef class Tokenizer:
return EOS
# dipthongs
- if s[pos+1] == '=':
- if s[pos] == '<':
+ if s[pos+1] == c'=':
+ if s[pos] == c'<':
self.pos += 2
return LESS_EQ
- elif s[pos] == '>':
+ elif s[pos] == c'>':
self.pos += 2
return GREATER_EQ
- elif s[pos] == '!':
+ elif s[pos] == c'!':
self.pos += 2
return NOT_EQ
- elif s[pos] == '=':
+ elif s[pos] == c'=':
self.pos += 2
- return '='
+ return c'='
- elif s[pos] == '*' and s[pos+1] == '*':
+ elif s[pos] == c'*' and s[pos+1] == c'*':
self.pos += 2
- return '^'
+ return c'^'
# simple tokens
if strchr("+-*/^()=<>,[]{}!", s[pos]):
@@ -272,29 +272,29 @@ cdef class Tokenizer:
return type
# numeric literals
- if '0' <= s[pos] <= '9' or s[pos] == '.':
+ if c'0' <= s[pos] <= c'9' or s[pos] == c'.':
type = INT
seen_exp = False
seen_decimal = False
while True:
- if '0' <= s[pos] <= '9':
+ if c'0' <= s[pos] <= c'9':
pass
- elif s[pos] == '.':
+ elif s[pos] == c'.':
if seen_decimal or seen_exp:
self.pos = pos
return type
else:
type = FLOAT
seen_decimal = True
- elif s[pos] == 'e' or s[pos] == 'E':
+ elif s[pos] == c'e' or s[pos] == c'E':
if seen_exp:
self.pos = pos
return type
else:
type = FLOAT
seen_exp = True
- elif s[pos] == '+' or s[pos] == '-':
- if not (seen_exp and (s[pos-1] == 'e' or s[pos-1] == 'E')):
+ elif s[pos] == c'+' or s[pos] == c'-':
+ if not (seen_exp and (s[pos-1] == c'e' or s[pos-1] == c'E')):
self.pos = pos
return type
else:
@@ -573,13 +573,13 @@ cdef class Parser:
"""
cdef int token
all = []
- if tokens.next() == '(':
- token = ','
- while token == ',':
+ if tokens.next() == c'(':
+ token = c','
+ while token == c',':
all.append(self.p_list(tokens))
token = tokens.next()
- if token == ')':
+ if token == c')':
from sage.matrix.constructor import matrix
return matrix(all)
else:
@@ -601,8 +601,8 @@ cdef class Parser:
[(1, 2, 3), [a + 1, b + 2, c + 3, (d + 4,)]]
"""
all = []
- cdef int token = ','
- while token == ',':
+ cdef int token = c','
+ while token == c',':
token = tokens.peek()
if token == MATRIX:
tokens.next()
@@ -615,14 +615,14 @@ cdef class Parser:
else:
tokens.backtrack()
obj = self.p_eqn(tokens)
- elif token == '[':
+ elif token == c'[':
obj = self.p_list(tokens)
- elif token == '(':
+ elif token == c'(':
obj = self.p_tuple(tokens)
elif token == EOS:
return all
- elif token == ']' or token == ')':
- tokens.token = ','
+ elif token == c']' or token == c')':
+ tokens.token = c','
return all
else:
obj = self.p_eqn(tokens)
@@ -646,11 +646,11 @@ cdef class Parser:
[]
"""
cdef int token = tokens.next()
- if token != '[':
+ if token != c'[':
self.parse_error(tokens, "Malformed list")
all = self.p_sequence(tokens)
token = tokens.next()
- if token != ']':
+ if token != c']':
self.parse_error(tokens, "Malformed list")
return all
@@ -668,20 +668,20 @@ cdef class Parser:
cdef int start = tokens.pos
cdef int token = tokens.next()
cdef bint real_tuple = True
- if token != '(':
+ if token != c'(':
self.parse_error(tokens, "Malformed tuple")
all = self.p_sequence(tokens)
if len(all) == 1:
if tokens.last() != c',':
real_tuple = False
token = tokens.next()
- if token != ')':
+ if token != c')':
self.parse_error(tokens, "Malformed tuple")
if real_tuple:
return tuple(all)
else:
token = tokens.peek()
- if token == ',' or token == EOS:
+ if token == c',' or token == EOS:
return all[0]
else:
# we have to reparse the entire thing as an expression
@@ -717,15 +717,15 @@ cdef class Parser:
"""
lhs = self.p_expr(tokens)
cdef int op = tokens.next()
- if op == '=':
+ if op == c'=':
return lhs == self.p_expr(tokens)
elif op == NOT_EQ:
return lhs != self.p_expr(tokens)
- elif op == '<':
+ elif op == c'<':
return lhs < self.p_expr(tokens)
elif op == LESS_EQ:
return lhs <= self.p_expr(tokens)
- elif op == '>':
+ elif op == c'>':
return lhs > self.p_expr(tokens)
elif op == GREATER_EQ:
return lhs >= self.p_expr(tokens)
@@ -757,9 +757,9 @@ cdef class Parser:
cdef int op
operand1 = self.p_term(tokens)
op = tokens.next()
- while op == '+' or op == '-':
+ while op == c'+' or op == c'-':
operand2 = self.p_term(tokens)
- if op == '+':
+ if op == c'+':
operand1 = operand1 + operand2
else:
operand1 = operand1 - operand2
@@ -792,17 +792,17 @@ cdef class Parser:
operand1 = self.p_factor(tokens)
op = tokens.next()
if op == NAME and self.implicit_multiplication:
- op = '*'
+ op = c'*'
tokens.backtrack()
- while op == '*' or op == '/':
+ while op == c'*' or op == c'/':
operand2 = self.p_factor(tokens)
- if op == '*':
+ if op == c'*':
operand1 = operand1 * operand2
else:
operand1 = operand1 / operand2
op = tokens.next()
if op == NAME and self.implicit_multiplication:
- op = '*'
+ op = c'*'
tokens.backtrack()
tokens.backtrack()
return operand1
@@ -826,9 +826,9 @@ cdef class Parser:
t^11
"""
cdef int token = tokens.next()
- if token == '+':
+ if token == c'+':
return self.p_factor(tokens)
- elif token == '-':
+ elif token == c'-':
return -self.p_factor(tokens)
else:
tokens.backtrack()
@@ -862,13 +862,13 @@ cdef class Parser:
"""
operand1 = self.p_atom(tokens)
cdef int token = tokens.next()
- if token == '^':
+ if token == c'^':
operand2 = self.p_factor(tokens)
return operand1 ** operand2
- elif token == "!":
+ elif token == c'!':
from sage.functions.all import factorial
operand1 = factorial(operand1)
- if tokens.peek() == '^':
+ if tokens.peek() == c'^':
tokens.next()
operand2 = self.p_factor(tokens)
return operand1 ** operand2
@@ -913,20 +913,20 @@ cdef class Parser:
elif token == NAME:
name = tokens.last_token_string()
token = tokens.next()
- if token == '(':
+ if token == c'(':
func = self.callable_constructor(name)
args, kwds = self.p_args(tokens)
token = tokens.next()
- if token != ')':
+ if token != c')':
self.parse_error(tokens, "Bad function call")
return func(*args, **kwds)
else:
tokens.backtrack()
return self.variable_constructor(name)
- elif token == '(':
+ elif token == c'(':
expr = self.p_expr(tokens)
token = tokens.next()
- if token != ')':
+ if token != c')':
self.parse_error(tokens, "Mismatched parentheses")
return expr
else:
@@ -948,10 +948,10 @@ cdef class Parser:
"""
args = []
kwds = {}
- if tokens.peek() == ')':
+ if tokens.peek() == c')':
return args, kwds
- cdef int token = ','
- while token == ',':
+ cdef int token = c','
+ while token == c',':
arg = self.p_arg(tokens)
if isinstance(arg, tuple):
name, value = arg
@@ -993,11 +993,11 @@ cdef class Parser:
"""
cdef int token = tokens.next()
- if token == NAME and tokens.peek() == '=':
+ if token == NAME and tokens.peek() == c'=':
name = tokens.last_token_string()
tokens.next()
return name, self.p_expr(tokens)
- if token == "[" :
+ if token == c'[' :
tokens.backtrack()
return self.p_list(tokens)
else:
diff -up src/sage/plot/plot3d/plot3d.py.orig src/sage/plot/plot3d/plot3d.py
--- src/sage/plot/plot3d/plot3d.py.orig 2019-03-23 16:20:42.000000000 -0600
+++ src/sage/plot/plot3d/plot3d.py 2019-04-08 12:05:07.093855823 -0600
@@ -188,7 +188,8 @@ class _Coordinates(object):
sage: arb((x+z,y*z,z), z, (x,y))
Arbitrary Coordinates coordinate transform (z in terms of x, y)
"""
- all_vars = sage_getargspec(self.transform).args[1:]
+ args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = inspect.getfullargspec(self.transform)
+ all_vars=args[1:]
if set(all_vars) != set(indep_vars + [dep_var]):
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]))))
self.dep_var = dep_var
diff -up src/sage/plot/point.py.orig src/sage/plot/point.py
--- src/sage/plot/point.py.orig 2019-03-23 16:20:42.000000000 -0600
+++ src/sage/plot/point.py 2019-04-08 12:05:07.094855805 -0600
@@ -29,7 +29,7 @@ TESTS::
from sage.misc.decorators import options, rename_keyword
from sage.plot.colors import to_mpl_color
from sage.plot.primitive import GraphicPrimitive_xydata
-import collections
+import collections.abc
# TODO: create _allowed_options for 3D point classes to
@@ -343,7 +343,7 @@ def point(points, **kwds):
sage: point(iter([(1,2),(3,5)]))
Graphics object consisting of 1 graphics primitive
"""
- if isinstance(points, collections.Iterator):
+ if isinstance(points, collections.abc.Iterator):
points = list(points)
try:
diff -up src/sage/repl/display/fancy_repr.py.orig src/sage/repl/display/fancy_repr.py
--- src/sage/repl/display/fancy_repr.py.orig 2019-03-23 16:20:42.000000000 -0600
+++ src/sage/repl/display/fancy_repr.py 2019-04-08 12:05:07.094855805 -0600
@@ -15,7 +15,7 @@ Representations of objects.
import types
from IPython.lib.pretty import (
- _safe_getattr, _baseclass_reprs,
+ _safe_getattr,
_type_pprinters,
)
@@ -264,7 +264,7 @@ class PlainPythonRepr(ObjectReprABC):
"""
klass = _safe_getattr(obj, '__class__', None) or type(obj)
klass_repr = _safe_getattr(klass, '__repr__', None)
- if klass_repr in _baseclass_reprs:
+ if klass_repr is object.__repr__:
p.text(klass_repr(obj))
else:
# A user-provided repr. Find newlines and replace them with p.break_()
diff -up src/sage/repl/ipython_kernel/interact.py.orig src/sage/repl/ipython_kernel/interact.py
--- src/sage/repl/ipython_kernel/interact.py.orig 2019-03-23 16:20:42.000000000 -0600
+++ src/sage/repl/ipython_kernel/interact.py 2019-04-08 12:05:07.094855805 -0600
@@ -35,7 +35,8 @@ EXAMPLES::
from ipywidgets.widgets import SelectionSlider, ValueWidget, ToggleButtons
from ipywidgets.widgets.interaction import interactive, signature
-from collections import Iterable, Iterator, OrderedDict
+from collections.abc import Iterable, Iterator
+from collections import OrderedDict
from .widgets import EvalText, SageColorPicker
from sage.structure.element import parent
from sage.symbolic.ring import SR
diff -up src/sage/rings/integer.pyx.orig src/sage/rings/integer.pyx
--- src/sage/rings/integer.pyx.orig 2019-03-23 16:20:42.000000000 -0600
+++ src/sage/rings/integer.pyx 2019-04-08 12:05:07.095855787 -0600
@@ -6989,7 +6989,7 @@ cdef int mpz_set_str_python(mpz_ptr z, c
while x[0] == c' ': x += 1 # Strip spaces
# Disallow a sign here
- if x[0] == '-' or x[0] == '+':
+ if x[0] == c'-' or x[0] == c'+':
x = "" # Force an error below
assert base >= 2
diff -up src/sage/rings/polynomial/pbori.pyx.orig src/sage/rings/polynomial/pbori.pyx
--- src/sage/rings/polynomial/pbori.pyx.orig 2019-03-23 16:20:42.000000000 -0600
+++ src/sage/rings/polynomial/pbori.pyx 2019-04-08 12:05:07.096855769 -0600
@@ -4774,8 +4774,7 @@ cdef class PolynomialConstruct:
# So, it is just a conversion. [Simon King]
return (<BooleanPolynomialRing>ring)._element_constructor_(x)
- raise TypeError("Cannot generate Boolean polynomial from %s , %s%" %
- (type(x), type(ring)))
+ raise TypeError(f"Cannot generate Boolean polynomial from {type(x)}, {type(ring)}")
cdef class MonomialConstruct:
diff -up src/sage/rings/real_mpfi.pyx.orig src/sage/rings/real_mpfi.pyx
--- src/sage/rings/real_mpfi.pyx.orig 2019-03-23 16:20:42.000000000 -0600
+++ src/sage/rings/real_mpfi.pyx 2019-04-08 12:05:07.097855751 -0600
@@ -1943,12 +1943,12 @@ cdef class RealIntervalFieldElement(Ring
cdef long digits
digits = strlen(lower_s)
- if lower_s[0] == '-':
+ if lower_s[0] == c'-':
digits -= 1
lower_expo -= digits
digits = strlen(upper_s)
- if upper_s[0] == '-':
+ if upper_s[0] == c'-':
digits -= 1
upper_expo -= digits
@@ -2117,7 +2117,7 @@ cdef class RealIntervalFieldElement(Ring
raise MemoryError("Unable to allocate memory for the mantissa of an interval")
mpz_get_str(tmp_cstr, base, lower_mpz)
digits = strlen(tmp_cstr)
- if tmp_cstr[0] == '-':
+ if tmp_cstr[0] == c'-':
digits -= 1
mant_string = bytes_to_str(tmp_cstr+1)
sign_string = bytes_to_str(b'-')
diff -up src/sage/rings/real_mpfr.pyx.orig src/sage/rings/real_mpfr.pyx
--- src/sage/rings/real_mpfr.pyx.orig 2019-03-23 16:20:42.000000000 -0600
+++ src/sage/rings/real_mpfr.pyx 2019-04-08 12:05:07.098855733 -0600
@@ -2039,7 +2039,7 @@ cdef class RealNumber(sage.structure.ele
if s is NULL:
raise RuntimeError("unable to convert an mpfr number to a string")
# t contains just digits (no sign, decimal point or exponent)
- if s[0] == '-':
+ if s[0] == c'-':
sgn = "-"
t = char_to_str(s + 1)
else:
diff -up src/sage/structure/sage_object.pyx.orig src/sage/structure/sage_object.pyx
--- src/sage/structure/sage_object.pyx.orig 2019-03-23 16:20:43.000000000 -0600
+++ src/sage/structure/sage_object.pyx 2019-04-08 12:05:07.098855733 -0600
@@ -665,7 +665,7 @@ cdef class SageObject:
try:
s = self._interface_init_(I)
except Exception:
- raise NotImplementedError("coercion of object %s to %s not implemented:\n%s\n%s" % (repr(self), I))
+ raise NotImplementedError(f"coercion of object {repr(self)} to {I} not implemented")
X = I(s)
if c:
try:
diff -up src/sage/symbolic/expression.pyx.orig src/sage/symbolic/expression.pyx
--- src/sage/symbolic/expression.pyx.orig 2019-03-23 16:20:43.000000000 -0600
+++ src/sage/symbolic/expression.pyx 2019-04-08 12:05:07.100855697 -0600
@@ -12915,7 +12915,7 @@ cdef class hold_class:
sage: SR(2)^5
32
"""
- g_set_state('hold', True)
+ g_set_state(b'hold', True)
def __exit__(self, *args):
"""
@@ -12928,7 +12928,7 @@ cdef class hold_class:
sage: SR(2)^5
32
"""
- g_set_state('hold', False)
+ g_set_state(b'hold', False)
def start(self):
"""
diff -up src/setup.py.orig src/setup.py
--- src/setup.py.orig 2019-04-08 11:45:58.283274716 -0600
+++ src/setup.py 2019-04-08 12:05:07.101855679 -0600
@@ -232,7 +232,7 @@ class sage_build_cython(Command):
cdivision=True,
embedsignature=True,
fast_getattr=True,
- language_level="2",
+ language_level=3,
preliminary_late_includes_cy28=True,
profile=self.profile,
)