sagemath/sagemath-python3.patch
Jerry James eaa777c690 Update to sagemath 8.4.
Also:
- Build for python 3 instead of python 2 due to upcoming python 2 removal.
- Add -python3 and -escape patches to fix problems with python 3.
- Drop -nofstring patch, only needed for python 2.
- Drop upstreamed -eclib patch.
- Switch from atlas to openblas and rename -atlas patch to -openblas.
- Add -buildroot patch and only build cython interfaces once.
2018-11-01 19:25:26 -06:00

1075 lines
40 KiB
Diff

--- build/pkgs/sagenb/src/sagenb/flask_version/worksheet_listing.py.orig 2018-01-24 04:17:47.000000000 -0700
+++ build/pkgs/sagenb/src/sagenb/flask_version/worksheet_listing.py 2018-10-25 13:25:53.284617298 -0600
@@ -2,7 +2,12 @@
"""
from __future__ import absolute_import
import os
-import urllib, urlparse
+try:
+ from urllib.request import urlopen
+ from urllib.parse import urlparse
+except ImportError:
+ from urlparse import urlparse
+ from urllib import urlopen
from flask import Blueprint, url_for, render_template, request, session, redirect, g, current_app
from .decorators import login_required, guest_or_login_required, with_lock
from flask_babel import Babel, gettext, ngettext, lazy_gettext
--- build/pkgs/sagenb/src/sagenb/misc/sphinxify.py.orig 2018-06-10 13:56:16.000000000 -0600
+++ build/pkgs/sagenb/src/sagenb/misc/sphinxify.py 2018-10-25 13:29:39.187960000 -0600
@@ -19,6 +19,7 @@ AUTHORS:
import os
import re
import shutil
+import six.moves
from tempfile import mkdtemp
# We import Sphinx on demand, to reduce Sage startup time.
@@ -94,9 +95,8 @@ def sphinxify(docstring, format='html'):
suffix = '.txt'
output_name = base_name + suffix
- filed = open(rst_name, 'w')
- filed.write(docstring)
- filed.close()
+ with open(rst_name, 'w') as filed:
+ filed.write(docstring)
# Sphinx constructor: Sphinx(srcdir, confdir, outdir, doctreedir,
# buildername, confoverrides, status, warning, freshenv).
@@ -120,8 +120,8 @@ def sphinxify(docstring, format='html'):
sys.path = old_sys_path
#We need to remove "_" from __builtin__ that the gettext module installs
- import __builtin__
- __builtin__.__dict__.pop('_', None)
+ from six.moves import builtins
+ builtins.__dict__.pop('_', None)
if os.path.exists(output_name):
output = open(output_name, 'r').read()
@@ -481,7 +481,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):
@@ -532,7 +532,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
if (hasattr(obj, '__name__') and obj.__name__.find('.') != -1 and
--- build/pkgs/sagenb/src/sagenb/misc/support.py.orig 2018-05-22 10:01:48.000000000 -0600
+++ build/pkgs/sagenb/src/sagenb/misc/support.py 2018-10-25 13:30:02.499892169 -0600
@@ -17,7 +17,7 @@ import sys
import pydoc
from six import iteritems
-import __builtin__
+import builtins
try:
from cPickle import PicklingError
@@ -467,7 +467,7 @@ def cython_import(filename, verbose=Fals
use_cache=use_cache,
create_local_c_file=create_local_c_file)
sys.path.append(build_dir)
- return __builtin__.__import__(name)
+ return builtins.__import__(name)
def cython_import_all(filename, globals, verbose=False, compile_message=False,
--- build/pkgs/sagenb/src/sagenb/notebook/cell.py.orig 2018-08-29 08:44:38.823169061 -0600
+++ build/pkgs/sagenb/src/sagenb/notebook/cell.py 2018-10-25 13:30:55.707737342 -0600
@@ -20,6 +20,7 @@ import shutil
import textwrap
import time
from cgi import escape
+from sys import maxsize
from sagenb.misc.misc import (word_wrap, strip_string_literals,
set_restrictive_permissions, unicode_str,
@@ -701,9 +702,8 @@ class Cell(Cell_generic):
# start with a random integer so that evaluations of the cell
# from different runs have different version numbers.
- from sys import maxint
from random import randint
- self._version = randint(0,maxint)
+ self._version = randint(0,maxsize)
def __repr__(self):
"""
@@ -2189,9 +2189,8 @@ class Cell(Cell_generic):
except AttributeError:
# start with a random integer so that evaluations of the cell
# from different runs have different version numbers.
- from sys import maxint
from random import randint
- self._version = randint(0,maxint)
+ self._version = randint(0,maxsize)
return self._version
def time(self):
--- build/pkgs/sagenb/src/sagenb/notebook/docHTMLProcessor.py.orig 2018-01-24 04:17:38.000000000 -0700
+++ build/pkgs/sagenb/src/sagenb/notebook/docHTMLProcessor.py 2018-10-25 13:35:09.227001150 -0600
@@ -7,7 +7,7 @@ file.
This takes an HTML document, i.e., Sage documentation, and returns it in
the editable format (notebook worksheet format with evaluable examples). It
-also returns a string representing the CSS link for the document. The SGML
+also returns a string representing the CSS link for the document. The HTML
parser is setup to return only the body of the HTML documentation page and
to re-format Sage examples and type-setting.
@@ -25,7 +25,7 @@ This module contains three classes:
.. NOTE::
- This extension of sgmllib.SGMLParser was partly inspired by Mark
+ This extension of html.parser.HTMLParser was partly inspired by Mark
Pilgrim's 'Dive Into Python' examples.
AUTHORS:
@@ -111,14 +111,14 @@ WARNING:
#############################################################################
from __future__ import unicode_literals
-from sgmllib import SGMLParser
+from html.parser import HTMLParser
from htmlentitydefs import entitydefs
from flask import Markup
from sagenb.misc.misc import unicode_str
-class genericHTMLProcessor(SGMLParser):
+class genericHTMLProcessor(HTMLParser):
r"""
This class gathers the methods that are common to both classes
:class:`sagenb.notebook.SphinxHTMLProcessor` and
@@ -155,16 +155,16 @@ class genericHTMLProcessor(SGMLParser):
u'<h1 class="title">Title</h1>\n\n<p>nSome text</p>\n\n\n\n'
"""
- # self.feed() is a SGMLParser method and starts everything
+ # self.feed() is an HTMLParser method and starts everything
# off; Most of the functions here are extensions to
- # SGMLParser, and may never actually be visibly called here.
+ # HTMLParser, and may never actually be visibly called here.
# This module works with unicode literals. In case that input data is
# ascii, exceptions may occur. So, input data must be converted to
# unicode if it were not.
doc_in = unicode_str(doc_in)
- self.feed(doc_in) #SGMLParser call
- self.close() #SGMLParser call
+ self.feed(doc_in) #HTMLParser call
+ self.close() #HTMLParser call
self.hand_off_temp_pieces('to_doc_pieces')
return self.all_pieces.replace('\\(', '').replace('\\)', '').replace('\\[', '').replace('\\]', '')
@@ -390,7 +390,7 @@ class genericHTMLProcessor(SGMLParser):
else:
# first occurrence of an output string
# write /// denoting output
- if output_flag == False:
+ if output_flag is False:
piece += '///'
if p:
piece += '\n' + p
@@ -400,7 +400,29 @@ class genericHTMLProcessor(SGMLParser):
piece += p
piece += '\n}}}\n\n'
return Markup(piece).unescape()
-
+
+ def handle_starttag(self, tag, attrs):
+ """
+ introduced when replacing SGMLParser by HTMLParser
+ """
+ try:
+ method = getattr(self, 'start_' + tag)
+ except AttributeError:
+ self.unknown_starttag(tag, attrs)
+ else:
+ method(attrs)
+
+ def handle_endtag(self, tag):
+ """
+ introduced when replacing SGMLParser by HTMLParser
+ """
+ try:
+ method = getattr(self, 'end_' + tag)
+ except AttributeError:
+ self.unknown_endtag(tag)
+ else:
+ method()
+
##############################################
## General tag handlers
## These just append their HTML to self.temp_pieces.
@@ -473,6 +495,7 @@ class genericHTMLProcessor(SGMLParser):
"""
if self.keep_data:
self.temp_pieces.append(data)
+
def handle_charref(self, ref):
r"""
INPUT:
@@ -540,6 +563,7 @@ class genericHTMLProcessor(SGMLParser):
"""
if self.keep_data:
self.temp_pieces.append("<!--%(data)s-->" % locals())
+
def handle_pi(self, text):
r"""
Handle processing instructions
@@ -585,7 +609,7 @@ class genericHTMLProcessor(SGMLParser):
"""
if self.keep_data:
self.temp_pieces.append("<!%(text)s>" % locals())
-
+
##############################################
## Specific tag handlers
def start_body(self, attrs):
@@ -634,6 +658,7 @@ class genericHTMLProcessor(SGMLParser):
['bunch ', 'of ', 'tmp ', 'strings']
"""
pass
+
def end_html(self):
r"""
INPUT:
@@ -658,7 +683,7 @@ class SphinxHTMLProcessor(genericHTMLPro
def reset(self):
r"""
Initialize necessary variables. Called by
- :meth:`SGMLParser.__init__`.
+ :meth:`HTMLParser.__init__`.
EXAMPLES::
@@ -685,8 +710,8 @@ class SphinxHTMLProcessor(genericHTMLPro
# counters
self.cellcount = 0
-
- SGMLParser.reset(self)
+
+ HTMLParser.reset(self)
def false_positive_input_output_cell(self, cell_piece):
r"""
@@ -733,7 +758,7 @@ class SphinxHTMLProcessor(genericHTMLPro
Once we hit the <div> tag in a highlighted block,
hand of all of the pieces we've encountered so far
and ignore the tag.
-
+
INPUT:
- ``attrs`` - list of tuple
@@ -835,7 +860,7 @@ class SphinxHTMLProcessor(genericHTMLPro
self.hand_off_temp_pieces('to_cell_pieces')
return
self.temp_pieces.append("</div>")
-
+
def start_pre(self, attrs):
r"""
Ignore tag <pre> when inside highligh div.
@@ -1000,6 +1025,7 @@ class SphinxHTMLProcessor(genericHTMLPro
if self.in_highlight_div:
return
self.unknown_starttag('span', attrs)
+
def end_span(self):
r"""
Ignore all spans that occur within highlighted blocks
@@ -1095,7 +1121,7 @@ class docutilsHTMLProcessor(genericHTMLP
def reset(self):
r"""
Initialize necessary variables. Called by
- :meth:`SGMLParser.__init__`.
+ :meth:`HTMLParser.__init__`.
EXAMPLES::
@@ -1125,8 +1151,8 @@ class docutilsHTMLProcessor(genericHTMLP
# counters
self.cellcount = 0
-
- SGMLParser.reset(self)
+
+ HTMLParser.reset(self)
def false_positive_input_output_cell(self, cell_piece):
r"""
@@ -1162,7 +1188,7 @@ class docutilsHTMLProcessor(genericHTMLP
piece = piece.replace('}','}&nbsp;')
piece += '\n</pre>'
return piece
-
+
#############################################
## Specific tag handlers
##
--- build/pkgs/sagenb/src/sagenb/notebook/notebook.py.orig 2018-05-22 10:16:28.000000000 -0600
+++ build/pkgs/sagenb/src/sagenb/notebook/notebook.py 2018-10-25 13:35:37.122921027 -0600
@@ -1268,7 +1268,7 @@ class Notebook(object):
W.set_not_computing()
def quit(self):
- for W in self.__worksheets.values():
+ for W in list(self.__worksheets.values()):
W.quit()
def update_worksheet_processes(self):
--- build/pkgs/sagetex/src/extractsagecode.py.orig 2015-08-26 17:28:42.000000000 -0600
+++ build/pkgs/sagetex/src/extractsagecode.py 2018-10-25 13:36:23.465787905 -0600
@@ -45,8 +45,8 @@ See the SageTeX documentation for more d
try:
opts, args = getopt.getopt(sys.argv[1:], 'ho', ['help', 'overwrite'])
-except getopt.GetoptError, err:
- print str(err)
+except getopt.GetoptError as err:
+ print(str(err))
usage()
sys.exit(2)
--- build/pkgs/sagetex/src/makestatic.py.orig 2015-08-26 17:28:42.000000000 -0600
+++ build/pkgs/sagetex/src/makestatic.py 2018-10-25 13:36:41.193736977 -0600
@@ -45,8 +45,8 @@ See the SageTeX documentation for more d
try:
opts, args = getopt.getopt(sys.argv[1:], 'ho', ['help', 'overwrite'])
-except getopt.GetoptError, err:
- print str(err)
+except getopt.GetoptError as err:
+ print(str(err))
usage()
sys.exit(2)
--- build/pkgs/sagetex/src/remote-sagetex.py.orig 2015-08-26 17:28:42.000000000 -0600
+++ build/pkgs/sagetex/src/remote-sagetex.py 2018-10-25 13:38:40.218395127 -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
--- build/pkgs/sagetex/src/run-sagetex-if-necessary.py.orig 2015-08-26 17:28:42.000000000 -0600
+++ build/pkgs/sagetex/src/run-sagetex-if-necessary.py 2018-10-25 13:39:39.506224849 -0600
@@ -58,7 +58,7 @@ with open(src + '.tex') as texf:
break
if not uses_sagetex:
- print src + ".tex doesn't seem to use SageTeX, exiting."
+ print(src + ".tex doesn't seem to use SageTeX, exiting.")
sys.exit(0)
# if something goes wrong, assume we need to run Sage
@@ -72,7 +72,7 @@ try:
if not re.search(ignore, line):
h.update(line)
except IOError:
- print '{0}.sagetex.sage not found, I think you need to typeset {0}.tex first.'.format(src)
+ print('{0}.sagetex.sage not found, I think you need to typeset {0}.tex first.'.format(src))
sys.exit(1)
try:
@@ -80,8 +80,8 @@ try:
for line in outf:
m = re.match('%([0-9a-f]+)% md5sum', line)
if m:
- print 'computed md5:', h.hexdigest()
- print 'sagetex.sout md5:', m.group(1)
+ print('computed md5:', h.hexdigest())
+ print('sagetex.sout md5:', m.group(1))
if h.hexdigest() == m.group(1):
run_sage = False
break
@@ -89,7 +89,7 @@ except IOError:
pass
if run_sage:
- print 'Need to run Sage on {0}.'.format(src)
+ print('Need to run Sage on {0}.'.format(src))
sys.exit(subprocess.call([path_to_sage, src + '.sagetex.sage']))
else:
- print 'Not necessary to run Sage on {0}.'.format(src)
+ print('Not necessary to run Sage on {0}.'.format(src))
--- build/pkgs/sagetex/src/sagetexparse.py.orig 2015-08-26 17:28:42.000000000 -0600
+++ build/pkgs/sagetex/src/sagetexparse.py 2018-10-25 13:40:02.522158738 -0600
@@ -52,7 +52,7 @@ class SoutParser():
try:
OneOrMore(parselabel).parseFile(fn)
except IOError:
- print 'Error accessing %s; exiting. Does your .sout file exist?' % fn
+ print('Error accessing %s; exiting. Does your .sout file exist?' % fn)
sys.exit(1)
def newlabel(self, s, l, t):
self.label.append(t.result[1:-1])
--- build/pkgs/sagetex/src/sagetex.py.orig 2015-08-26 17:28:42.000000000 -0600
+++ build/pkgs/sagetex/src/sagetex.py 2018-10-25 13:42:20.168763355 -0600
@@ -73,10 +73,10 @@ from your current version of Sage; see
http://www.sagemath.org/doc/installation/sagetex.html.""".format(jobname,
version, pyversion)
if version_check:
- raise VersionError, errstr
+ raise VersionError(errstr)
else:
- print '**** WARNING! Skipping version check for .sty and .py files, and'
- print errstr
+ print('**** WARNING! Skipping version check for .sty and .py files, and')
+ print(errstr)
if ' ' in jobname:
jobname = jobname.strip('"')
self.progress('Processing Sage code for {0}.tex...'.format(jobname))
@@ -116,7 +116,7 @@ http://www.sagemath.org/doc/installation
elif labelname == 'sagecmdline':
pass # output message already printed
else:
- raise ValueError, 'inline() got a bad labelname "{0}"'.format(labelname)
+ raise ValueError('inline() got a bad labelname "{0}"'.format(labelname))
self.souttmp.write(r'\newlabel{@' + labelname + str(counter) +
'}{{%\n' + s.rstrip() + '}{}{}{}{}}\n')
def savecmd(self, s):
@@ -178,7 +178,7 @@ http://www.sagemath.org/doc/installation
latex(result),
r' \end{displaymath}']
except SyntaxError:
- exec preparse(splitup[i][2]) in globals, locals
+ exec(preparse(splitup[i][2]), globals, locals)
self.inline(counter, '\n'.join(tex_strs))
def commandline(self, counter, s, globals, locals, text_output):
self.progress('Sage commandline {0} (line {1})'.format(counter, self.current_tex_line))
@@ -208,7 +208,7 @@ http://www.sagemath.org/doc/installation
latex(result) +
r'\end{displaymath}')
except SyntaxError:
- exec preparse(splitup[i][2]) in globals, locals
+ exec(preparse(splitup[i][2]), globals, locals)
if 'displaymath' not in tex_strs[-1]:
tex_strs.append(skip)
self.inline(counter, '\n'.join(tex_strs), labelname='sagecmdline')
@@ -233,8 +233,8 @@ http://www.sagemath.org/doc/installation
except ValueError as inst:
if re.match('filetype .*not supported by save', str(inst)):
newfilename = plotfilename[:-3] + 'png'
- print ' saving {0} failed; saving to {1} instead.'.format(
- plotfilename, newfilename)
+ print(' saving {0} failed; saving to {1} instead.'.format(
+ plotfilename, newfilename))
_p_.save(filename=newfilename, **kwargs)
break
else:
--- src/doc/common/conf.py.orig 2018-10-17 17:13:34.000000000 -0600
+++ src/doc/common/conf.py 2018-10-25 13:43:39.882534395 -0600
@@ -490,7 +490,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):
@@ -539,7 +539,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)
--- src/sage/arith/long.pxd.orig 2018-10-17 17:13:35.000000000 -0600
+++ src/sage/arith/long.pxd 2018-10-25 13:46:00.073131738 -0600
@@ -19,7 +19,7 @@ from cpython.object cimport Py_SIZE
from cpython.int cimport PyInt_AS_LONG
from cpython.long cimport PyLong_AsLong
from cpython.number cimport PyNumber_Index, PyIndex_Check
-from cpython.longintrepr cimport PyLongObject, PyLong_SHIFT, digit
+from cpython.longintrepr cimport py_long, PyLong_SHIFT, digit
from sage.libs.gmp.mpz cimport mpz_fits_slong_p, mpz_get_si
from sage.rings.integer_fake cimport is_Integer, Integer_AS_MPZ
@@ -208,7 +208,7 @@ cdef inline bint integer_check_long_py(x
return 0
# x is a Python "long" (called "int" on Python 3)
- cdef const digit* D = (<PyLongObject*>x).ob_digit
+ cdef const digit* D = (<py_long>x).ob_digit
cdef Py_ssize_t size = Py_SIZE(x)
# We assume that PyLong_SHIFT is 15 on a 32-bit system and 30 on a
--- src/sage/combinat/finite_state_machine.py.orig 2018-10-17 17:13:35.000000000 -0600
+++ src/sage/combinat/finite_state_machine.py 2018-10-25 13:47:08.277935821 -0600
@@ -937,7 +937,7 @@ from six.moves import range
from six import itervalues
from six.moves import zip_longest
-import collections
+import collections.abc
import itertools
import sage
@@ -14140,7 +14140,7 @@ def is_FSMProcessIterator(PI):
class FSMProcessIterator(sage.structure.sage_object.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
--- src/sage/cpython/dict_del_by_value.pyx.orig 2018-10-17 17:13:36.000000000 -0600
+++ src/sage/cpython/dict_del_by_value.pyx 2018-10-25 13:48:05.887770337 -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")
--- src/sage/libs/gap/util.pyx.orig 2018-10-17 17:13:52.000000000 -0600
+++ src/sage/libs/gap/util.pyx 2018-10-25 13:50:51.168295628 -0600
@@ -171,7 +171,7 @@ def gap_root():
return GAP_ROOT_DIR
print('The gap-4.5.5.spkg (or later) seems to be not installed!')
gap_sh = open(os.path.join(SAGE_LOCAL, 'bin', 'gap')).read().splitlines()
- gapdir = filter(lambda dir:dir.strip().startswith('GAP_DIR'), gap_sh)[0]
+ gapdir = next(filter(lambda dir:dir.strip().startswith('GAP_DIR'), gap_sh))
gapdir = gapdir.split('"')[1]
gapdir = gapdir.replace('$SAGE_LOCAL', SAGE_LOCAL)
return gapdir
--- src/sage/libs/gmp/pylong.pyx.orig 2018-10-17 17:13:52.000000000 -0600
+++ src/sage/libs/gmp/pylong.pyx 2018-10-25 13:52:12.296063129 -0600
@@ -28,7 +28,7 @@ AUTHORS:
from cpython.object cimport Py_SIZE
from cpython.int cimport PyInt_FromLong
from cpython.long cimport PyLong_FromLong
-from cpython.longintrepr cimport _PyLong_New, PyLongObject, digit, PyLong_SHIFT
+from cpython.longintrepr cimport _PyLong_New, py_long, digit, PyLong_SHIFT
from .mpz cimport *
cdef extern from *:
@@ -54,7 +54,7 @@ cdef mpz_get_pylong_large(mpz_srcptr z):
cdef size_t nbits = mpz_sizeinbase(z, 2)
cdef size_t pylong_size = (nbits + PyLong_SHIFT - 1) // PyLong_SHIFT
L = _PyLong_New(pylong_size)
- mpz_export((<PyLongObject*>L).ob_digit, NULL,
+ mpz_export(L.ob_digit, NULL,
-1, sizeof(digit), 0, PyLong_nails, z)
if mpz_sgn(z) < 0:
# Set correct size (use a pointer to hack around Cython's
@@ -91,7 +91,7 @@ cdef int mpz_set_pylong(mpz_ptr z, L) ex
if pylong_size < 0:
pylong_size = -pylong_size
mpz_import(z, pylong_size, -1, sizeof(digit), 0, PyLong_nails,
- (<PyLongObject*>L).ob_digit)
+ (<py_long>L).ob_digit)
if Py_SIZE(L) < 0:
mpz_neg(z, z)
--- src/sage/misc/parser.pyx.orig 2018-10-17 17:13:54.000000000 -0600
+++ src/sage/misc/parser.pyx 2018-10-25 13:57:47.183108335 -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:
--- src/sage/plot/plot3d/plot3d.py.orig 2018-10-17 17:14:08.000000000 -0600
+++ src/sage/plot/plot3d/plot3d.py 2018-10-25 13:58:48.502933505 -0600
@@ -194,7 +194,8 @@ class _Coordinates(object):
Arbitrary Coordinates coordinate transform (z in terms of x, y)
"""
import inspect
- all_vars = 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
--- src/sage/plot/point.py.orig 2018-10-17 17:14:09.000000000 -0600
+++ src/sage/plot/point.py 2018-10-25 13:59:15.278857161 -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:
--- src/sage/repl/display/fancy_repr.py.orig 2018-10-17 17:14:09.000000000 -0600
+++ src/sage/repl/display/fancy_repr.py 2018-10-25 14:00:10.301700282 -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_()
--- src/sage/repl/ipython_kernel/interact.py.orig 2018-10-17 17:14:09.000000000 -0600
+++ src/sage/repl/ipython_kernel/interact.py 2018-10-25 14:00:53.038578439 -0600
@@ -36,7 +36,7 @@ EXAMPLES::
from ipywidgets.widgets import SelectionSlider, ValueWidget, ToggleButtons
from ipywidgets.widgets.interaction import interactive, signature
from copy import copy
-from collections import Iterable, Iterator
+from collections.abc import Iterable, Iterator
from .widgets import EvalText, SageColorPicker
from sage.structure.element import parent
from sage.symbolic.ring import SR
--- src/sage/rings/integer.pyx.orig 2018-10-17 17:14:11.000000000 -0600
+++ src/sage/rings/integer.pyx 2018-10-25 14:01:31.320469294 -0600
@@ -6940,7 +6940,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
--- src/sage/rings/real_mpfi.pyx.orig 2018-10-17 17:14:17.000000000 -0600
+++ src/sage/rings/real_mpfi.pyx 2018-10-25 14:02:07.823365223 -0600
@@ -1951,12 +1951,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
@@ -2125,7 +2125,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'-')
--- src/sage/symbolic/expression.pyx.orig 2018-10-17 17:14:17.000000000 -0600
+++ src/sage/symbolic/expression.pyx 2018-10-25 14:03:50.129073537 -0600
@@ -12955,7 +12955,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):
"""
@@ -12968,7 +12968,7 @@ cdef class hold_class:
sage: SR(2)^5
32
"""
- g_set_state('hold', False)
+ g_set_state(b'hold', False)
def start(self):
"""
--- src/setup.py.orig 2018-10-25 11:40:44.402943434 -0600
+++ src/setup.py 2018-10-25 14:04:15.582000968 -0600
@@ -284,6 +284,7 @@ class sage_build_cython(Command):
cdivision=True,
embedsignature=True,
fast_getattr=True,
+ language_level=3,
preliminary_late_includes_cy28=True,
profile=self.profile,
)