Compare commits

...

12 commits
main ... 0.7.2

Author SHA1 Message Date
Armin Ronacher
3f5db33ece Bump version number to 0.7.2 2011-07-06 10:19:27 +02:00
Armin Ronacher
0be01db0bb Added changelog entry 2011-07-06 10:18:03 +02:00
Armin Ronacher
05a4e81edc Fixed an issue that broke url processors for blueprints. Added testcases
Signed-off-by: Armin Ronacher <armin.ronacher@active-4.com>
2011-07-06 10:17:06 +02:00
Armin Ronacher
3571bf223b Removed leftover from no longer supported blueprint template loading code.
Signed-off-by: Armin Ronacher <armin.ronacher@active-4.com>
2011-07-01 00:56:16 +02:00
Armin Ronacher
5e3cc7fdde In case we need another bugfix release 2011-06-29 18:37:45 +02:00
Armin Ronacher
9682d6b371 Bump version number to 0.7.1 2011-06-29 18:37:22 +02:00
Armin Ronacher
1033a9757d Another fix for the script 2011-06-29 18:37:08 +02:00
Armin Ronacher
c0a9ec43a1 Added release date for 0.7.1 2011-06-29 18:35:31 +02:00
Armin Ronacher
2295bd072e Fixed a bug in the release script 2011-06-29 18:35:11 +02:00
Armin Ronacher
988143b07b Worked around a werkzeug bug with redirects
Signed-off-by: Armin Ronacher <armin.ronacher@active-4.com>
2011-06-29 18:32:31 +02:00
Armin Ronacher
c84e1f7855 Bumped version number for this branch to 0.7.1 2011-06-28 23:37:03 +02:00
Armin Ronacher
381477f0ab Added changelog entry 2011-06-28 23:36:39 +02:00
8 changed files with 101 additions and 8 deletions

16
CHANGES
View file

@ -3,6 +3,22 @@ Flask Changelog
Here you can see the full list of changes between each Flask release.
Version 0.7.2
-------------
Bugfix release, released on July 6th 2011
- Fixed an issue with URL processors not properly working on
blueprints.
Version 0.7.1
-------------
Bugfix release, released on June 29th 2011
- Added missing future import that broke 2.5 compatibility.
- Fixed an infinite redirect issue with blueprints.
Version 0.7
-----------

View file

@ -10,7 +10,7 @@
:license: BSD, see LICENSE for more details.
"""
__version__ = '0.8-dev'
__version__ = '0.7.2'
# utilities we import from Werkzeug and Jinja2 that are unused
# in the module but are exported as public interface.

View file

@ -706,6 +706,12 @@ class Flask(_PackageBoundObject):
if 'OPTIONS' not in methods:
methods = tuple(methods) + ('OPTIONS',)
provide_automatic_options = True
# due to a werkzeug bug we need to make sure that the defaults are
# None if they are an empty dictionary. This should not be necessary
# with Werkzeug 0.7
options['defaults'] = options.get('defaults') or None
rule = self.url_rule_class(rule, methods=methods, **options)
rule.provide_automatic_options = provide_automatic_options
self.url_map.add(rule)

View file

@ -56,7 +56,7 @@ class BlueprintSetupState(object):
#: A dictionary with URL defaults that is added to each and every
#: URL that was defined with the blueprint.
self.url_defaults = dict(self.blueprint.url_defaults)
self.url_defaults = dict(self.blueprint.url_values_defaults)
self.url_defaults.update(self.options.get('url_defaults', ()))
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
@ -102,7 +102,7 @@ class Blueprint(_PackageBoundObject):
self.view_functions = {}
if url_defaults is None:
url_defaults = {}
self.url_defaults = url_defaults
self.url_values_defaults = url_defaults
def record(self, func):
"""Registers a function that is called when the blueprint is

View file

@ -117,8 +117,6 @@ def render_template(template_name, **context):
"""
ctx = _request_ctx_stack.top
ctx.app.update_template_context(context)
if template_name[:1] == ':':
template_name = ctx.request.blueprint + template_name
return _render(ctx.app.jinja_env.get_template(template_name),
context, ctx.app)

View file

@ -33,8 +33,8 @@ def parse_changelog():
if change_info:
break
match = re.match(r'^released on (\w+\s+\d+\w+\s+\d+)'
r'(?:, codename (.*))?(?i)', change_info)
match = re.search(r'released on (\w+\s+\d+\w+\s+\d+)'
r'(?:, codename (.*))?(?i)', change_info)
if match is None:
continue

View file

@ -86,7 +86,7 @@ def run_tests():
setup(
name='Flask',
version='0.8-dev',
version='0.7.2',
url='http://github.com/mitsuhiko/flask/',
license='BSD',
author='Armin Ronacher',

View file

@ -830,6 +830,37 @@ class BasicFunctionalityTestCase(unittest.TestCase):
rv = c.post('/accept', data={'myfile': 'foo' * 100})
assert rv.data == '42'
def test_url_processors(self):
app = flask.Flask(__name__)
@app.url_defaults
def add_language_code(endpoint, values):
if flask.g.lang_code is not None and \
app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
values.setdefault('lang_code', flask.g.lang_code)
@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
flask.g.lang_code = values.pop('lang_code', None)
@app.route('/<lang_code>/')
def index():
return flask.url_for('about')
@app.route('/<lang_code>/about')
def about():
return flask.url_for('something_else')
@app.route('/foo')
def something_else():
return flask.url_for('about', lang_code='en')
c = app.test_client()
self.assertEqual(c.get('/de/').data, '/de/about')
self.assertEqual(c.get('/de/about').data, '/foo')
self.assertEqual(c.get('/foo').data, '/en/about')
class JSONTestCase(unittest.TestCase):
@ -1309,6 +1340,33 @@ class BlueprintTestCase(unittest.TestCase):
self.assertEqual(c.get('/1/bar').data, u'23')
self.assertEqual(c.get('/2/bar').data, u'19')
def test_blueprint_url_processors(self):
bp = flask.Blueprint('frontend', __name__, url_prefix='/<lang_code>')
@bp.url_defaults
def add_language_code(endpoint, values):
values.setdefault('lang_code', flask.g.lang_code)
@bp.url_value_preprocessor
def pull_lang_code(endpoint, values):
flask.g.lang_code = values.pop('lang_code')
@bp.route('/')
def index():
return flask.url_for('.about')
@bp.route('/about')
def about():
return flask.url_for('.index')
app = flask.Flask(__name__)
app.register_blueprint(bp)
c = app.test_client()
self.assertEqual(c.get('/de/').data, '/de/about')
self.assertEqual(c.get('/de/about').data, '/de/')
def test_templates_and_static(self):
from blueprintapp import app
c = app.test_client()
@ -1364,6 +1422,21 @@ class BlueprintTestCase(unittest.TestCase):
self.assertEqual(c.get('/fe2').data.strip(), '/fe')
self.assertEqual(c.get('/be').data.strip(), '/fe')
def test_empty_url_defaults(self):
bp = flask.Blueprint('bp', __name__)
@bp.route('/', defaults={'page': 1})
@bp.route('/page/<int:page>')
def something(page):
return str(page)
app = flask.Flask(__name__)
app.register_blueprint(bp)
c = app.test_client()
self.assertEqual(c.get('/').data, '1')
self.assertEqual(c.get('/page/2').data, '2')
class SendfileTestCase(unittest.TestCase):