Mercurial > kallithea
changeset 6219:af3539a458f6
Turbogears2 migration: replace pylons.url by kallithea.config.routing.url
In preparation for the migration to Turbogears2, introduce a
kallithea.config.routing.url to replace pylons.url. The implementation is
basically the same: wrap around routes.url().
This change involves:
- a number of import statement changes
- fixing some tests in test_libs.py; to avoid duplication, the different
implementations of fake_url were grouped in one place.
This change was first proposed by Alessandro Molina in his initial
port. Following changes were made afterwards:
- move UrlGenerator from kallithea.lib.utils to kallithea.config.routing
- add documentation to UrlGenerator
- kallithea/lib/auth.py used url_for instead of url, for no apparent reason
so this was changed.
- fix libs tests
- rebase onto Pylons-based Kallithea first
line wrap: on
line diff
--- a/kallithea/config/routing.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/config/routing.py Sat Sep 17 22:09:04 2016 +0200 @@ -19,6 +19,7 @@ refer to the routes manual at http://routes.groovie.org/docs/ """ +from pylons import request from routes import Mapper # prefix for non repository related links needs to be prefixed with `/` @@ -800,3 +801,27 @@ conditions=dict(function=check_repo)) return rmap + + +class UrlGenerator(object): + """Emulate pylons.url in providing a wrapper around routes.url + + This code was added during migration from Pylons to Turbogears2. Pylons + already provided a wrapper like this, but Turbogears2 does not. + + When the routing of Kallithea is changed to use less Routes and more + Turbogears2-style routing, this class may disappear or change. + + url() (the __call__ method) returns the URL based on a route name and + arguments. + url.current() returns the URL of the current page with arguments applied. + + Refer to documentation of Routes for details: + https://routes.readthedocs.io/en/latest/generating.html#generation + """ + def __call__(self, *args, **kwargs): + return request.environ['routes.url'](*args, **kwargs) + def current(self, *args, **kwargs): + return request.environ['routes.url'].current(*args, **kwargs) + +url = UrlGenerator()
--- a/kallithea/controllers/admin/admin.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/admin.py Sat Sep 17 22:09:04 2016 +0200 @@ -28,13 +28,14 @@ import logging -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from sqlalchemy.orm import joinedload from whoosh.qparser.default import QueryParser from whoosh.qparser.dateparse import DateParserPlugin from whoosh import query from sqlalchemy.sql.expression import or_, and_, func +from kallithea.config.routing import url from kallithea.model.db import UserLog from kallithea.lib.auth import LoginRequired, HasPermissionAnyDecorator from kallithea.lib.base import BaseController, render
--- a/kallithea/controllers/admin/auth_settings.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/auth_settings.py Sat Sep 17 22:09:04 2016 +0200 @@ -27,10 +27,11 @@ import formencode.htmlfill import traceback -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound +from kallithea.config.routing import url from kallithea.lib import helpers as h from kallithea.lib.compat import formatted_json from kallithea.lib.base import BaseController, render
--- a/kallithea/controllers/admin/defaults.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/defaults.py Sat Sep 17 22:09:04 2016 +0200 @@ -30,10 +30,11 @@ import formencode from formencode import htmlfill -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound +from kallithea.config.routing import url from kallithea.lib import helpers as h from kallithea.lib.auth import LoginRequired, HasPermissionAnyDecorator from kallithea.lib.base import BaseController, render
--- a/kallithea/controllers/admin/gists.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/gists.py Sat Sep 17 22:09:04 2016 +0200 @@ -30,10 +30,11 @@ import traceback import formencode.htmlfill -from pylons import request, response, tmpl_context as c, url +from pylons import request, response, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound, HTTPNotFound, HTTPForbidden +from kallithea.config.routing import url from kallithea.model.forms import GistForm from kallithea.model.gist import GistModel from kallithea.model.meta import Session
--- a/kallithea/controllers/admin/my_account.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/my_account.py Sat Sep 17 22:09:04 2016 +0200 @@ -31,10 +31,11 @@ from sqlalchemy import func from formencode import htmlfill -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound +from kallithea.config.routing import url from kallithea.lib import helpers as h from kallithea.lib import auth_modules from kallithea.lib.auth import LoginRequired, NotAnonymous, AuthUser
--- a/kallithea/controllers/admin/permissions.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/permissions.py Sat Sep 17 22:09:04 2016 +0200 @@ -31,10 +31,11 @@ import formencode from formencode import htmlfill -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound +from kallithea.config.routing import url from kallithea.lib import helpers as h from kallithea.lib.auth import LoginRequired, HasPermissionAnyDecorator from kallithea.lib.base import BaseController, render
--- a/kallithea/controllers/admin/repo_groups.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/repo_groups.py Sat Sep 17 22:09:04 2016 +0200 @@ -32,11 +32,12 @@ from formencode import htmlfill -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from pylons.i18n.translation import _, ungettext from webob.exc import HTTPFound, HTTPForbidden, HTTPNotFound, HTTPInternalServerError import kallithea +from kallithea.config.routing import url from kallithea.lib import helpers as h from kallithea.lib.compat import json from kallithea.lib.auth import LoginRequired, \
--- a/kallithea/controllers/admin/repos.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/repos.py Sat Sep 17 22:09:04 2016 +0200 @@ -29,11 +29,12 @@ import traceback import formencode from formencode import htmlfill -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from pylons.i18n.translation import _ from sqlalchemy.sql.expression import func from webob.exc import HTTPFound, HTTPInternalServerError, HTTPForbidden, HTTPNotFound +from kallithea.config.routing import url from kallithea.lib import helpers as h from kallithea.lib.auth import LoginRequired, \ HasRepoPermissionAnyDecorator, NotAnonymous, HasPermissionAny
--- a/kallithea/controllers/admin/settings.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/settings.py Sat Sep 17 22:09:04 2016 +0200 @@ -30,10 +30,11 @@ import formencode from formencode import htmlfill -from pylons import request, tmpl_context as c, url, config +from pylons import request, tmpl_context as c, config from pylons.i18n.translation import _ from webob.exc import HTTPFound +from kallithea.config.routing import url from kallithea.lib import helpers as h from kallithea.lib.auth import LoginRequired, HasPermissionAnyDecorator from kallithea.lib.base import BaseController, render
--- a/kallithea/controllers/admin/user_groups.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/user_groups.py Sat Sep 17 22:09:04 2016 +0200 @@ -30,7 +30,7 @@ import formencode from formencode import htmlfill -from pylons import request, tmpl_context as c, url, config +from pylons import request, tmpl_context as c, config from pylons.i18n.translation import _ from webob.exc import HTTPFound @@ -39,6 +39,7 @@ from webob.exc import HTTPInternalServerError import kallithea +from kallithea.config.routing import url from kallithea.lib import helpers as h from kallithea.lib.exceptions import UserGroupsAssignedException, \ RepoGroupAssignmentError
--- a/kallithea/controllers/admin/users.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/admin/users.py Sat Sep 17 22:09:04 2016 +0200 @@ -30,12 +30,13 @@ import formencode from formencode import htmlfill -from pylons import request, tmpl_context as c, url, config +from pylons import request, tmpl_context as c, config from pylons.i18n.translation import _ from sqlalchemy.sql.expression import func from webob.exc import HTTPFound, HTTPNotFound import kallithea +from kallithea.config.routing import url from kallithea.lib.exceptions import DefaultUserException, \ UserOwnsReposException, UserCreationError from kallithea.lib import helpers as h
--- a/kallithea/controllers/changelog.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/changelog.py Sat Sep 17 22:09:04 2016 +0200 @@ -28,11 +28,12 @@ import logging import traceback -from pylons import request, url, session, tmpl_context as c +from pylons import request, session, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound, HTTPNotFound, HTTPBadRequest import kallithea.lib.helpers as h +from kallithea.config.routing import url from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator from kallithea.lib.base import BaseRepoController, render from kallithea.lib.helpers import RepoPage
--- a/kallithea/controllers/compare.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/compare.py Sat Sep 17 22:09:04 2016 +0200 @@ -30,10 +30,11 @@ import logging import re -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound, HTTPBadRequest +from kallithea.config.routing import url from kallithea.lib.utils2 import safe_str, safe_int from kallithea.lib.vcs.utils.hgcompat import unionrepo from kallithea.lib import helpers as h
--- a/kallithea/controllers/files.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/files.py Sat Sep 17 22:09:04 2016 +0200 @@ -32,10 +32,11 @@ import tempfile import shutil -from pylons import request, response, tmpl_context as c, url +from pylons import request, response, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound +from kallithea.config.routing import url from kallithea.lib.utils import jsonify, action_logger from kallithea.lib import diffs from kallithea.lib import helpers as h
--- a/kallithea/controllers/forks.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/forks.py Sat Sep 17 22:09:04 2016 +0200 @@ -30,12 +30,13 @@ import traceback from formencode import htmlfill -from pylons import tmpl_context as c, request, url +from pylons import tmpl_context as c, request from pylons.i18n.translation import _ from webob.exc import HTTPFound import kallithea.lib.helpers as h +from kallithea.config.routing import url from kallithea.lib.helpers import Page from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator, \ NotAnonymous, HasRepoPermissionAny, HasPermissionAnyDecorator, HasPermissionAny
--- a/kallithea/controllers/journal.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/journal.py Sat Sep 17 22:09:04 2016 +0200 @@ -37,9 +37,10 @@ from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed from webob.exc import HTTPBadRequest -from pylons import request, tmpl_context as c, response, url +from pylons import request, tmpl_context as c, response from pylons.i18n.translation import _ +from kallithea.config.routing import url from kallithea.controllers.admin.admin import _journal_filter from kallithea.model.db import UserLog, UserFollowing, Repository, User from kallithea.model.meta import Session
--- a/kallithea/controllers/login.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/login.py Sat Sep 17 22:09:04 2016 +0200 @@ -32,10 +32,11 @@ from formencode import htmlfill from pylons.i18n.translation import _ -from pylons import request, session, tmpl_context as c, url +from pylons import request, session, tmpl_context as c from webob.exc import HTTPFound, HTTPBadRequest import kallithea.lib.helpers as h +from kallithea.config.routing import url from kallithea.lib.auth import AuthUser, HasPermissionAnyDecorator from kallithea.lib.base import BaseController, log_in_user, render from kallithea.lib.exceptions import UserCreationError
--- a/kallithea/controllers/pullrequests.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/controllers/pullrequests.py Sat Sep 17 22:09:04 2016 +0200 @@ -30,10 +30,11 @@ import formencode import re -from pylons import request, tmpl_context as c, url +from pylons import request, tmpl_context as c from pylons.i18n.translation import _ from webob.exc import HTTPFound, HTTPNotFound, HTTPForbidden, HTTPBadRequest +from kallithea.config.routing import url from kallithea.lib.vcs.utils.hgcompat import unionrepo from kallithea.lib.compat import json, OrderedDict from kallithea.lib.base import BaseRepoController, render
--- a/kallithea/lib/auth.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/lib/auth.py Sat Sep 17 22:09:04 2016 +0200 @@ -34,7 +34,7 @@ from decorator import decorator -from pylons import url, request, session +from pylons import request, session from pylons.i18n.translation import _ from webhelpers.pylonslib import secure_form from sqlalchemy import or_ @@ -43,6 +43,7 @@ from webob.exc import HTTPFound, HTTPBadRequest, HTTPForbidden, HTTPMethodNotAllowed from kallithea import __platform__, is_windows, is_unix +from kallithea.config.routing import url from kallithea.lib.vcs.utils.lazy import LazyProperty from kallithea.model import meta from kallithea.model.meta import Session
--- a/kallithea/lib/base.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/lib/base.py Sat Sep 17 22:09:04 2016 +0200 @@ -38,13 +38,14 @@ import paste.auth.basic import paste.httpheaders -from pylons import config, tmpl_context as c, request, session, url +from pylons import config, tmpl_context as c, request, session from pylons.controllers import WSGIController from pylons.templating import render_mako as render # don't remove this import from pylons.i18n.translation import _ from kallithea import __version__, BACKENDS +from kallithea.config.routing import url from kallithea.lib.utils2 import str2bool, safe_unicode, AttributeDict, \ safe_str, safe_int from kallithea.lib import auth_modules
--- a/kallithea/lib/helpers.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/lib/helpers.py Sat Sep 17 22:09:04 2016 +0200 @@ -28,7 +28,6 @@ from beaker.cache import cache_region from pygments.formatters.html import HtmlFormatter from pygments import highlight as code_highlight -from pylons import url from pylons.i18n.translation import _, ungettext from webhelpers.html import literal, HTML, escape @@ -52,6 +51,7 @@ from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \ convert_boolean_attrs, NotGiven, _make_safe_id_component +from kallithea.config.routing import url from kallithea.lib.annotate import annotate_highlight from kallithea.lib.utils import repo_name_slug, get_custom_lexer from kallithea.lib.utils2 import str2bool, safe_unicode, safe_str, \ @@ -866,7 +866,7 @@ def gravatar_url(email_address, size=30, default=''): # doh, we need to re-import those to mock it later - from pylons import url + from kallithea.config.routing import url from pylons import tmpl_context as c if not c.visual.use_gravatar: return "" @@ -1290,7 +1290,7 @@ return '<b>%s</b>' % mention hash_ = match_obj.group('hash') if hash_ is not None and repo_name is not None: - from pylons import url # doh, we need to re-import url to mock it later + from kallithea.config.routing import url # doh, we need to re-import url to mock it later return '<a class="revision-link" href="%(url)s">%(hash)s</a>' % { 'url': url('changeset_home', repo_name=repo_name, revision=hash_), 'hash': hash_,
--- a/kallithea/tests/base.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/tests/base.py Sat Sep 17 22:09:04 2016 +0200 @@ -219,4 +219,3 @@ def checkSessionFlashRegex(self, response, regex, skip=0): self.checkSessionFlash(response, regex, skip=skip, _matcher=re.search) -
--- a/kallithea/tests/other/test_libs.py Fri Sep 09 15:34:08 2016 +0200 +++ b/kallithea/tests/other/test_libs.py Sat Sep 17 22:09:04 2016 +0200 @@ -66,6 +66,24 @@ '%s://example.com:8080' % proto), ] +class FakeUrlGenerator(object): + + def __init__(self, current_url=None, default_route=None, **routes): + """Initialize using specified 'current' URL template, + default route template, and all other aguments describing known + routes (format: route=template)""" + self.current_url = current_url + self.default_route = default_route + self.routes = routes + + def __call__(self, route_name, *args, **kwargs): + if route_name in self.routes: + return self.routes[route_name] % kwargs + + return self.default_route % kwargs + + def current(self, *args, **kwargs): + return self.current_url % kwargs class TestLibs(TestController): @@ -202,12 +220,6 @@ from kallithea.lib.helpers import gravatar_url _md5 = lambda s: hashlib.md5(s).hexdigest() - #mock pylons.url - class fake_url(object): - @classmethod - def current(cls, *args, **kwargs): - return 'https://example.com' - #mock pylons.tmpl_context def fake_tmpl_context(_url): _c = AttributeDict() @@ -217,11 +229,11 @@ return _c - - with mock.patch('pylons.url', fake_url): + fake_url = FakeUrlGenerator(current_url='https://example.com') + with mock.patch('kallithea.config.routing.url', fake_url): fake = fake_tmpl_context(_url='http://example.com/{email}') with mock.patch('pylons.tmpl_context', fake): - from pylons import url + from kallithea.config.routing import url assert url.current() == 'https://example.com' grav = gravatar_url(email_address='test@example.com', size=24) assert grav == 'http://example.com/test@example.com' @@ -283,7 +295,7 @@ def url_func(match_obj): _url = match_obj.groups()[0] - return tmpl % (url_ or '/some-url', _url) + return tmpl % (url_ or '/repo_name/changeset/%s' % _url, _url) return URL_PAT.sub(url_func, text) @parametrize('sample,expected', [ @@ -314,12 +326,9 @@ """ sometimes !"""), ]) def test_urlify_text(self, sample, expected): - def fake_url(self, *args, **kwargs): - return '/some-url' - expected = self._quick_url(expected) - - with mock.patch('pylons.url', fake_url): + fake_url = FakeUrlGenerator(changeset_home='/%(repo_name)s/changeset/%(revision)s') + with mock.patch('kallithea.config.routing.url', fake_url): from kallithea.lib.helpers import urlify_text assert urlify_text(sample, 'repo_name') == expected @@ -368,10 +377,12 @@ # tags are covered by test_tag_extractor ]) def test_urlify_test(self, sample, expected, url_): - from kallithea.lib.helpers import urlify_text expected = self._quick_url(expected, tmpl="""<a href="%s">%s</a>""", url_=url_) - assert urlify_text(sample, 'repo_name', stylize=True) == expected + fake_url = FakeUrlGenerator(changeset_home='/%(repo_name)s/changeset/%(revision)s') + with mock.patch('kallithea.config.routing.url', fake_url): + from kallithea.lib.helpers import urlify_text + assert urlify_text(sample, 'repo_name', stylize=True) == expected @parametrize('sample,expected', [ ("deadbeefcafe @mention, and http://foo.bar/ yo", @@ -381,8 +392,10 @@ """<a class="message-link" href="#the-link"> yo</a>"""), ]) def test_urlify_link(self, sample, expected): - from kallithea.lib.helpers import urlify_text - assert urlify_text(sample, 'repo_name', link_='#the-link') == expected + fake_url = FakeUrlGenerator(changeset_home='/%(repo_name)s/changeset/%(revision)s') + with mock.patch('kallithea.config.routing.url', fake_url): + from kallithea.lib.helpers import urlify_text + assert urlify_text(sample, 'repo_name', link_='#the-link') == expected @parametrize('test,expected', [ ("", None),