Date: Friday, August 5, 2016 @ 10:44:40 Author: arojas Revision: 185267
archrelease: copy trunk to community-any Added: sage-notebook/repos/community-any/PKGBUILD (from rev 185266, sage-notebook/trunk/PKGBUILD) sage-notebook/repos/community-any/jmol.patch (from rev 185266, sage-notebook/trunk/jmol.patch) sage-notebook/repos/community-any/sage.service (from rev 185266, sage-notebook/trunk/sage.service) sage-notebook/repos/community-any/sagenb-flask-0.11.patch (from rev 185266, sage-notebook/trunk/sagenb-flask-0.11.patch) Deleted: sage-notebook/repos/community-any/PKGBUILD sage-notebook/repos/community-any/jmol.patch sage-notebook/repos/community-any/sage.service -------------------------+ PKGBUILD | 144 +++++++++---------- jmol.patch | 42 ++--- sage.service | 16 +- sagenb-flask-0.11.patch | 342 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 439 insertions(+), 105 deletions(-) Deleted: PKGBUILD =================================================================== --- PKGBUILD 2016-08-05 10:44:07 UTC (rev 185266) +++ PKGBUILD 2016-08-05 10:44:40 UTC (rev 185267) @@ -1,76 +0,0 @@ -# $Id$ -# Maintainer: Antonio Rojas <aro...@archlinux.org> -# Maintainer: Evgeniy Alekseev <arcanis.arch at gmail dot com> - -pkgname=sage-notebook -pkgver=0.13 -pkgrel=2 -pkgdesc='Browser-based notebook interface for SageMath' -arch=(any) -url='http://www.sagemath.org' -license=(GPL3) -depends=(sagemath python2-twisted python2-flask-oldsessions python2-flask-openid python2-flask-autoindex python2-flask-babel mathjax) -optdepends=('python2-pyopenssl: to use the notebook in secure mode') -makedepends=(gendesk) -source=($pkgname-$pkgver::"https://github.com/sagemath/sagenb/archive/$pkgver.tar.gz" 'sage.service' 'jmol.patch' - "https://pypi.io/packages/source/F/Flask/Flask-0.10.1.tar.gz") -md5sums=('f72cd81add5373f74b459957a64074ce' - '61620179a7ecd85401d8e5a6ece3ea41' - 'b29760c97a5328faa179a46008391bf0' - '378670fe456957eb3c27ddaef60b2b24') - -prepare() { -# create *.desktop file - gendesk -f -n \ - --pkgname="sage-notebook" \ - --pkgdesc="SageMath notebook" \ - --name="SageMath" \ - --exec="/usr/bin/sage -notebook" \ - --terminal=true \ - --categories="Education;Science;Math" \ - --custom="X-DCOP-ServiceType= -X-KDE-SubstituteUID=false -X-KDE-Username=" - - cd sagenb-$pkgver - -# Use python2 - find -name '*.py' | xargs sed -e 's|#! /usr/bin/python|#! /usr/bin/python2|' -e 's|#!/usr/bin/python|#!/usr/bin/python2|' \ - -e 's|#!/usr/bin/env python|#!/usr/bin/env python2|' -i - sed -e 's|python %s|python2 %s|' -i sagenb/notebook/run_notebook.py - sed -e "s|python = 'python'|python = 'python2'|" -i sagenb/interfaces/expect.py - -# fix displaying 3D plots - patch -p0 -i "$srcdir"/jmol.patch -} - -build() { - cd sagenb-$pkgver - python2 setup.py build - - cd "$srcdir"/Flask-0.10.1 - python2 setup.py build -} - -package() { - cd sagenb-$pkgver - - python2 setup.py install --root "$pkgdir" --optimize=1 - - install -D -m644 COPYING "$pkgdir"/usr/share/licenses/${pkgname}/COPYING - - ln -s /usr/share/mathjax "$pkgdir"/usr/lib/python2.7/site-packages/sagenb/data/mathjax - -# install a systemd user unit - install -Dm644 "${srcdir}/sage.service" "$pkgdir/usr/lib/systemd/user/sage.service" -# install *.desktop and icon files - install -Dm644 "${srcdir}/sage-notebook.desktop" "$pkgdir/usr/share/applications/sage-notebook.desktop" - install -Dm644 "$pkgdir/usr/lib/python2.7/site-packages/sagenb/data/sage/images/icon48x48.png" \ - "$pkgdir/usr/share/pixmaps/sage-notebook.png" - -# Install flask 0.10 - cd "$srcdir"/Flask-0.10.1 - python2 setup.py install --root "$pkgdir" --optimize=1 - install -d "$pkgdir"/usr/lib/sage/site-packages - mv "$pkgdir"/usr/lib/python2.7/site-packages/{f,F}lask* "$pkgdir"/usr/lib/sage/site-packages -} Copied: sage-notebook/repos/community-any/PKGBUILD (from rev 185266, sage-notebook/trunk/PKGBUILD) =================================================================== --- PKGBUILD (rev 0) +++ PKGBUILD 2016-08-05 10:44:40 UTC (rev 185267) @@ -0,0 +1,68 @@ +# $Id$ +# Maintainer: Antonio Rojas <aro...@archlinux.org> +# Maintainer: Evgeniy Alekseev <arcanis.arch at gmail dot com> + +pkgname=sage-notebook +pkgver=0.13 +pkgrel=3 +pkgdesc='Browser-based notebook interface for SageMath' +arch=(any) +url='http://www.sagemath.org' +license=(GPL3) +depends=(sagemath python2-twisted python2-flask-oldsessions python2-flask-openid python2-flask-autoindex python2-flask-babel mathjax) +optdepends=('python2-pyopenssl: to use the notebook in secure mode') +makedepends=(gendesk) +source=($pkgname-$pkgver::"https://github.com/sagemath/sagenb/archive/$pkgver.tar.gz" sage.service jmol.patch sagenb-flask-0.11.patch) +md5sums=('f72cd81add5373f74b459957a64074ce' + '61620179a7ecd85401d8e5a6ece3ea41' + 'b29760c97a5328faa179a46008391bf0' + 'a63fe71bfd4b36384ef5b802f592e319') + +prepare() { +# create *.desktop file + gendesk -f -n \ + --pkgname="sage-notebook" \ + --pkgdesc="SageMath notebook" \ + --name="SageMath" \ + --exec="/usr/bin/sage -notebook" \ + --terminal=true \ + --categories="Education;Science;Math" \ + --custom="X-DCOP-ServiceType= +X-KDE-SubstituteUID=false +X-KDE-Username=" + + cd sagenb-$pkgver + +# Use python2 + find -name '*.py' | xargs sed -e 's|#! /usr/bin/python|#! /usr/bin/python2|' -e 's|#!/usr/bin/python|#!/usr/bin/python2|' \ + -e 's|#!/usr/bin/env python|#!/usr/bin/env python2|' -i + sed -e 's|python %s|python2 %s|' -i sagenb/notebook/run_notebook.py + sed -e "s|python = 'python'|python = 'python2'|" -i sagenb/interfaces/expect.py + +# fix displaying 3D plots + patch -p0 -i "$srcdir"/jmol.patch +# port away from deprecated Flask API + patch -p0 -i "$srcdir"/sagenb-flask-0.11.patch +} + +build() { + cd sagenb-$pkgver + python2 setup.py build +} + +package() { + cd sagenb-$pkgver + + python2 setup.py install --root "$pkgdir" --optimize=1 + + install -D -m644 COPYING "$pkgdir"/usr/share/licenses/${pkgname}/COPYING + + ln -s /usr/share/mathjax "$pkgdir"/usr/lib/python2.7/site-packages/sagenb/data/mathjax + +# install a systemd user unit + install -Dm644 "${srcdir}/sage.service" "$pkgdir/usr/lib/systemd/user/sage.service" +# install *.desktop and icon files + install -Dm644 "${srcdir}/sage-notebook.desktop" "$pkgdir/usr/share/applications/sage-notebook.desktop" + install -Dm644 "$pkgdir/usr/lib/python2.7/site-packages/sagenb/data/sage/images/icon48x48.png" \ + "$pkgdir/usr/share/pixmaps/sage-notebook.png" +} Deleted: jmol.patch =================================================================== --- jmol.patch 2016-08-05 10:44:07 UTC (rev 185266) +++ jmol.patch 2016-08-05 10:44:40 UTC (rev 185267) @@ -1,21 +0,0 @@ ---- sagenb/flask_version/base.py.orig 2015-01-06 19:30:34.326174783 +0100 -+++ sagenb/flask_version/base.py 2015-01-06 19:31:08.439723240 +0100 -@@ -36,12 +36,12 @@ - self.add_static_path('/javascript', DATA) - self.add_static_path('/static', DATA) - self.add_static_path('/java', DATA) -- self.add_static_path('/java/jmol', os.path.join(os.environ["SAGE_ROOT"],"local","share","jmol")) -- self.add_static_path('/jsmol', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol")) -- self.add_static_path('/jsmol/js', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol","js")) -- self.add_static_path('/j2s', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol","j2s")) -- self.add_static_path('/jsmol/j2s', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol","j2s")) -- self.add_static_path('/j2s/core', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol","j2s","core")) -+ self.add_static_path('/java/jmol', os.path.join(os.environ["SAGE_ROOT"],"share","jmol")) -+ self.add_static_path('/jsmol', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol")) -+ self.add_static_path('/jsmol/js', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol","js")) -+ self.add_static_path('/j2s', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol","j2s")) -+ self.add_static_path('/jsmol/j2s', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol","j2s")) -+ self.add_static_path('/j2s/core', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol","j2s","core")) - import mimetypes - mimetypes.add_type('text/plain','.jmol') - Copied: sage-notebook/repos/community-any/jmol.patch (from rev 185266, sage-notebook/trunk/jmol.patch) =================================================================== --- jmol.patch (rev 0) +++ jmol.patch 2016-08-05 10:44:40 UTC (rev 185267) @@ -0,0 +1,21 @@ +--- sagenb/flask_version/base.py.orig 2015-01-06 19:30:34.326174783 +0100 ++++ sagenb/flask_version/base.py 2015-01-06 19:31:08.439723240 +0100 +@@ -36,12 +36,12 @@ + self.add_static_path('/javascript', DATA) + self.add_static_path('/static', DATA) + self.add_static_path('/java', DATA) +- self.add_static_path('/java/jmol', os.path.join(os.environ["SAGE_ROOT"],"local","share","jmol")) +- self.add_static_path('/jsmol', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol")) +- self.add_static_path('/jsmol/js', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol","js")) +- self.add_static_path('/j2s', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol","j2s")) +- self.add_static_path('/jsmol/j2s', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol","j2s")) +- self.add_static_path('/j2s/core', os.path.join(os.environ["SAGE_ROOT"],"local","share","jsmol","j2s","core")) ++ self.add_static_path('/java/jmol', os.path.join(os.environ["SAGE_ROOT"],"share","jmol")) ++ self.add_static_path('/jsmol', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol")) ++ self.add_static_path('/jsmol/js', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol","js")) ++ self.add_static_path('/j2s', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol","j2s")) ++ self.add_static_path('/jsmol/j2s', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol","j2s")) ++ self.add_static_path('/j2s/core', os.path.join(os.environ["SAGE_ROOT"],"share","jsmol","j2s","core")) + import mimetypes + mimetypes.add_type('text/plain','.jmol') + Deleted: sage.service =================================================================== --- sage.service 2016-08-05 10:44:07 UTC (rev 185266) +++ sage.service 2016-08-05 10:44:40 UTC (rev 185267) @@ -1,8 +0,0 @@ -[Unit] -Description=A free open-source mathematics software system - -[Service] -ExecStart=/usr/bin/sage -n - -[Install] -WantedBy=default.target Copied: sage-notebook/repos/community-any/sage.service (from rev 185266, sage-notebook/trunk/sage.service) =================================================================== --- sage.service (rev 0) +++ sage.service 2016-08-05 10:44:40 UTC (rev 185267) @@ -0,0 +1,8 @@ +[Unit] +Description=A free open-source mathematics software system + +[Service] +ExecStart=/usr/bin/sage -n + +[Install] +WantedBy=default.target Copied: sage-notebook/repos/community-any/sagenb-flask-0.11.patch (from rev 185266, sage-notebook/trunk/sagenb-flask-0.11.patch) =================================================================== --- sagenb-flask-0.11.patch (rev 0) +++ sagenb-flask-0.11.patch 2016-08-05 10:44:40 UTC (rev 185267) @@ -0,0 +1,342 @@ +diff -ur sagenb.orig/flask_version/admin.py sagenb/flask_version/admin.py +--- sagenb.orig/flask_version/admin.py 2016-08-05 12:37:25.543124604 +0200 ++++ sagenb/flask_version/admin.py 2016-08-05 12:36:19.142795085 +0200 +@@ -1,10 +1,10 @@ + import os +-from flask import Module, url_for, render_template, request, session, redirect, g, current_app ++from flask import Blueprint, url_for, render_template, request, session, redirect, g, current_app + from decorators import login_required, admin_required, with_lock +-from flask.ext.babel import Babel, gettext, ngettext, lazy_gettext ++from flask_babel import Babel, gettext, ngettext, lazy_gettext + _ = gettext + +-admin = Module('sagenb.flask_version.admin') ++admin = Blueprint('sagenb.flask_version.admin', __name__) + + @admin.route('/users') + @admin.route('/users/reset/<reset>') +diff -ur sagenb.orig/flask_version/authentication.py sagenb/flask_version/authentication.py +--- sagenb.orig/flask_version/authentication.py 2016-08-05 12:37:25.543124604 +0200 ++++ sagenb/flask_version/authentication.py 2016-08-05 12:36:19.146128435 +0200 +@@ -1,11 +1,11 @@ + import os + import random +-from flask import Module, url_for, render_template, request, session, redirect, g, current_app ++from flask import Blueprint, url_for, render_template, request, session, redirect, g, current_app + from decorators import with_lock +-from flask.ext.babel import gettext, ngettext, lazy_gettext ++from flask_babel import gettext, ngettext, lazy_gettext + _ = gettext + +-authentication = Module('sagenb.flask_version.authentication') ++authentication = Blueprint('sagenb.flask_version.authentication', __name__) + + ################## + # Authentication # +@@ -65,7 +65,7 @@ + #Valid user, everything is okay + session['username'] = username + session.modified = True +- return redirect(request.values.get('next', url_for('base.index'))) ++ return redirect(request.values.get('next', url_for('sagenb.flask_version.base.index'))) + else: + template_dict['password_error'] = True + +diff -ur sagenb.orig/flask_version/base.py sagenb/flask_version/base.py +--- sagenb.orig/flask_version/base.py 2016-08-05 12:37:25.543124604 +0200 ++++ sagenb/flask_version/base.py 2016-08-05 12:36:19.146128435 +0200 +@@ -1,17 +1,17 @@ + #!/usr/bin/env python2 + import os, time, re + from functools import partial +-from flask import Flask, Module, url_for, request, session, redirect, g, make_response, current_app, render_template ++from flask import Flask, Blueprint, url_for, request, session, redirect, g, make_response, current_app, render_template + from decorators import login_required, guest_or_login_required, with_lock + from decorators import global_lock + # Make flask use the old session foo from <=flask-0.9 + from flask_oldsessions import OldSecureCookieSessionInterface + +-from flask.ext.autoindex import AutoIndex ++from flask_autoindex import AutoIndex + from sage.env import SAGE_SRC, SAGE_DOC + SRC = os.path.join(SAGE_SRC, 'sage') +-from flask.ext.openid import OpenID +-from flask.ext.babel import Babel, gettext, ngettext, lazy_gettext, get_locale ++from flask_openid import OpenID ++from flask_babel import Babel, gettext, ngettext, lazy_gettext, get_locale + from sagenb.misc.misc import SAGENB_ROOT, DATA, translations_path, N_, nN_, unicode_str + from json import dumps + from sagenb.notebook.cell import number_of_rows +@@ -83,7 +83,7 @@ + return render_template(os.path.join('html', 'error_message.html'), + **template_dict) + +-base = Module('sagenb.flask_version.base') ++base = Blueprint('sagenb.flask_version.base', __name__) + + ############# + # Main Page # +@@ -95,7 +95,7 @@ + if 'next' in request.args: + response = redirect(request.values.get('next', '')) + return response +- response = redirect(url_for('worksheet_listing.home', username=session['username'])) ++ response = redirect(url_for('sagenb.flask_version.worksheet_listing.home', username=session['username'])) + if 'remember' in request.args: + response.set_cookie('nb_session_%s'%g.notebook.port, + expires=(time.time() + 60 * 60 * 24 * 14)) +diff -ur sagenb.orig/flask_version/decorators.py sagenb/flask_version/decorators.py +--- sagenb.orig/flask_version/decorators.py 2016-08-05 12:37:25.543124604 +0200 ++++ sagenb/flask_version/decorators.py 2016-08-05 12:36:19.142795085 +0200 +@@ -1,6 +1,6 @@ + from functools import wraps + from flask import Flask, url_for, render_template, request, session, redirect, g, current_app +-from flask.ext.babel import Babel, gettext, ngettext, lazy_gettext ++from flask_babel import Babel, gettext, ngettext, lazy_gettext + _ = gettext + + from threading import Lock +@@ -16,7 +16,7 @@ + g.username = 'guest' + return f(*args, **kwds) + else: +- return redirect(url_for('base.index', next=request.url)) ++ return redirect(url_for('sagenb.flask_version.base.index', next=request.url)) + else: + g.username = session['username'] + return f(*args, **kwds) +diff -ur sagenb.orig/flask_version/doc.py sagenb/flask_version/doc.py +--- sagenb.orig/flask_version/doc.py 2016-08-05 12:37:25.543124604 +0200 ++++ sagenb/flask_version/doc.py 2016-08-05 12:36:19.142795085 +0200 +@@ -14,13 +14,13 @@ + + """ + import os +-from flask import Module, url_for, render_template, request, session, redirect, g, current_app ++from flask import Blueprint, url_for, render_template, request, session, redirect, g, current_app + from decorators import login_required, guest_or_login_required + +-from flask.ext.babel import gettext, ngettext, lazy_gettext ++from flask_babel import gettext, ngettext, lazy_gettext + _ = gettext + +-doc = Module('sagenb.flask_version.doc') ++doc = Blueprint('sagenb.flask_version.doc', __name__) + + from sage.env import SAGE_DOC + DOC = os.path.join(SAGE_DOC, 'html', 'en') +diff -ur sagenb.orig/flask_version/settings.py sagenb/flask_version/settings.py +--- sagenb.orig/flask_version/settings.py 2016-08-05 12:37:25.543124604 +0200 ++++ sagenb/flask_version/settings.py 2016-08-05 12:36:19.146128435 +0200 +@@ -1,12 +1,12 @@ + import os + import random +-from flask import Module, url_for, render_template, request, session, redirect, g, current_app ++from flask import Blueprint, url_for, render_template, request, session, redirect, g, current_app + from decorators import login_required, with_lock +-from flask.ext.babel import gettext, ngettext, lazy_gettext ++from flask_babel import gettext, ngettext, lazy_gettext + _ = gettext + + +-settings = Module('sagenb.flask_version.settings') ++settings = Blueprint('sagenb.flask_version.settings', __name__) + + @settings.route('/settings', methods = ['GET','POST']) + @login_required +diff -ur sagenb.orig/flask_version/worksheet_listing.py sagenb/flask_version/worksheet_listing.py +--- sagenb.orig/flask_version/worksheet_listing.py 2016-08-05 12:37:25.543124604 +0200 ++++ sagenb/flask_version/worksheet_listing.py 2016-08-05 12:36:19.146128435 +0200 +@@ -2,12 +2,12 @@ + """ + import os + import urllib, urlparse +-from flask import Module, url_for, render_template, request, session, redirect, g, current_app ++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.ext.babel import Babel, gettext, ngettext, lazy_gettext ++from flask_babel import Babel, gettext, ngettext, lazy_gettext + _ = gettext + +-worksheet_listing = Module('sagenb.flask_version.worksheet_listing') ++worksheet_listing = Blueprint('sagenb.flask_version.worksheet_listing', __name__) + + def render_worksheet_list(args, pub, username): + """ +@@ -69,7 +69,7 @@ + @worksheet_listing.route('/home/') + @login_required + def bare_home(): +- return redirect(url_for('home', username=g.username)) ++ return redirect(url_for('sagenb.flask_version.home', username=g.username)) + + ########### + # Folders # +diff -ur sagenb.orig/flask_version/worksheet.py sagenb/flask_version/worksheet.py +--- sagenb.orig/flask_version/worksheet.py 2016-08-05 12:37:25.543124604 +0200 ++++ sagenb/flask_version/worksheet.py 2016-08-05 12:36:19.146128435 +0200 +@@ -1,17 +1,17 @@ + import re + import os, threading, collections + from functools import wraps +-from flask import Module, make_response, url_for, render_template, request, session, redirect, g, current_app ++from flask import Blueprint, make_response, url_for, render_template, request, session, redirect, g, current_app + from decorators import login_required, with_lock + from collections import defaultdict + from werkzeug.utils import secure_filename +-from flask.ext.babel import Babel, gettext, ngettext, lazy_gettext ++from flask_babel import Babel, gettext, ngettext, lazy_gettext + _ = gettext + + from sagenb.notebook.interact import INTERACT_UPDATE_PREFIX + from sagenb.notebook.misc import encode_response + +-ws = Module('sagenb.flask_version.worksheet') ++ws = Blueprint('sagenb.flask_version.worksheet', __name__) + worksheet_locks = defaultdict(threading.Lock) + + def worksheet_view(f): +@@ -53,7 +53,7 @@ + """ + Returns the url for a given worksheet. + """ +- return url_for('worksheet.worksheet', username=worksheet.owner(), ++ return url_for('sagenb.flask_version.worksheet.worksheet', username=worksheet.owner(), + id=worksheet.filename_without_owner()) + + +@@ -76,7 +76,7 @@ + @login_required + def new_worksheet(): + if g.notebook.readonly_user(g.username): +- return current_app.message(_("Account is in read-only mode"), cont=url_for('worksheet_listing.home', username=g.username)) ++ return current_app.message(_("Account is in read-only mode"), cont=url_for('sagenb.flask_version.worksheet_listing.home', username=g.username)) + + W = g.notebook.create_new_worksheet(gettext("Untitled"), g.username) + return redirect(url_for_worksheet(W)) +@@ -126,7 +126,7 @@ + raise NotImplementedError("User _sage_ can not access URL %s"%target) + if g.notebook.readonly_user(g.username): + if target.split('/')[0] not in readonly_commands_allowed: +- return current_app.message(_("Account is in read-only mode"), cont=url_for('worksheet_listing.home', username=g.username)) ++ return current_app.message(_("Account is in read-only mode"), cont=url_for('sagenb.flask_version.worksheet_listing.home', username=g.username)) + + #Make worksheet a non-keyword argument appearing before the + #other non-keyword arguments. +diff -ur sagenb.orig/notebook/challenge.py sagenb/notebook/challenge.py +--- sagenb.orig/notebook/challenge.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/challenge.py 2016-08-05 12:36:19.169461885 +0200 +@@ -27,7 +27,7 @@ + import os, random, re, urllib2, urllib + + from sagenb.notebook.template import template +-from flask.ext.babel import gettext, lazy_gettext ++from flask_babel import gettext, lazy_gettext + _ = lazy_gettext + + class ChallengeResponse(object): +diff -ur sagenb.orig/notebook/conf.py sagenb/notebook/conf.py +--- sagenb.orig/notebook/conf.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/conf.py 2016-08-05 12:36:19.169461885 +0200 +@@ -9,7 +9,7 @@ + # The full text of the GPL is available at: + # http://www.gnu.org/licenses/ + ############################################################################# +-from flask.ext.babel import gettext, lazy_gettext ++from flask_babel import gettext, lazy_gettext + + POS = 'pos' + DESC = 'desc' +diff -ur sagenb.orig/notebook/notebook.py sagenb/notebook/notebook.py +--- sagenb.orig/notebook/notebook.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/notebook.py 2016-08-05 12:36:19.169461885 +0200 +@@ -45,7 +45,7 @@ + from . import user_conf # user configuration + from . import user # users + from template import template, prettify_time_ago +-from flask.ext.babel import gettext, lazy_gettext ++from flask_babel import gettext, lazy_gettext + + try: + # sage is installed +diff -ur sagenb.orig/notebook/register.py sagenb/notebook/register.py +--- sagenb.orig/notebook/register.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/register.py 2016-08-05 12:36:19.169461885 +0200 +@@ -12,7 +12,7 @@ + """ + Helper functions dealing with the verification of user + """ +-from flask.ext.babel import gettext as _ ++from flask_babel import gettext as _ + + def build_msg(key, username, addr, port, secure): + url_prefix = "https" if secure else "http" +diff -ur sagenb.orig/notebook/server_conf.py sagenb/notebook/server_conf.py +--- sagenb.orig/notebook/server_conf.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/server_conf.py 2016-08-05 12:36:19.169461885 +0200 +@@ -8,7 +8,7 @@ + from conf import (POS, DESC, GROUP, TYPE, CHOICES, T_BOOL, T_INTEGER, + T_CHOICE, T_REAL, T_COLOR, T_STRING, T_LIST, T_INFO) + from sagenb.misc.misc import get_languages, N_ +-from flask.ext.babel import gettext, lazy_gettext ++from flask_babel import gettext, lazy_gettext + _ = lazy_gettext + + defaults = {'word_wrap_cols':72, +diff -ur sagenb.orig/notebook/template.py sagenb/notebook/template.py +--- sagenb.orig/notebook/template.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/template.py 2016-08-05 12:36:19.169461885 +0200 +@@ -20,7 +20,7 @@ + import os, re, sys + + from sagenb.misc.misc import SAGE_VERSION, DATA +-from flask.ext.babel import gettext, ngettext, lazy_gettext ++from flask_babel import gettext, ngettext, lazy_gettext + from flask import current_app as app + + if os.environ.has_key('SAGENB_TEMPLATE_PATH'): +diff -ur sagenb.orig/notebook/tutorial.py sagenb/notebook/tutorial.py +--- sagenb.orig/notebook/tutorial.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/tutorial.py 2016-08-05 12:36:19.169461885 +0200 +@@ -348,7 +348,7 @@ + + ##################################### + +-from flask.ext.babel import lazy_gettext as _ ++from flask_babel import lazy_gettext as _ + + notebook_help = [ + (_('Find Help and Documentation'), +diff -ur sagenb.orig/notebook/user_conf.py sagenb/notebook/user_conf.py +--- sagenb.orig/notebook/user_conf.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/user_conf.py 2016-08-05 12:36:19.216128785 +0200 +@@ -7,7 +7,7 @@ + from conf import (Configuration, POS, DESC, GROUP, TYPE, CHOICES, T_BOOL, + T_INTEGER, T_CHOICE, T_REAL, T_COLOR, T_STRING, T_LIST) + from sagenb.misc.misc import SAGENB_ROOT, get_languages +-from flask.ext.babel import lazy_gettext ++from flask_babel import lazy_gettext + + defaults = {'max_history_length':1000, + 'default_system':'sage', +diff -ur sagenb.orig/notebook/worksheet.py sagenb/notebook/worksheet.py +--- sagenb.orig/notebook/worksheet.py 2016-08-05 12:37:25.546457953 +0200 ++++ sagenb/notebook/worksheet.py 2016-08-05 12:36:19.172795235 +0200 +@@ -56,7 +56,7 @@ + # Imports specifically relevant to the sage notebook + from cell import Cell, TextCell + from template import template, clean_name, prettify_time_ago +-from flask.ext.babel import gettext, lazy_gettext ++from flask_babel import gettext, lazy_gettext + _ = gettext + + # Set some constants that will be used for regular expressions below. +@@ -4405,7 +4405,7 @@ + Converts ``t`` (in Unix time) to a locale-specific string + describing the time and date. + """ +- from flask.ext.babel import format_datetime ++ from flask_babel import format_datetime + import datetime, time + try: + return format_datetime(datetime.datetime.fromtimestamp(float(t)))