diff --git a/.gitignore b/.gitignore index 4844be8e..5c012aaa 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ dist *.egg *.egg-info _mailinglist +.tox diff --git a/CHANGES b/CHANGES index c1f50998..a195fd1f 100644 --- a/CHANGES +++ b/CHANGES @@ -3,10 +3,16 @@ Flask Changelog Here you can see the full list of changes between each Flask release. +Version 0.7 +----------- + +Release date to be announced, codename to be selected + + Version 0.6 ----------- -Release date to be announced, codename to be decided. +Released on July 27th 2010, codename Whisky - after request functions are now called in reverse order of registration. diff --git a/MANIFEST.in b/MANIFEST.in index 166311d4..3fef8b5b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,5 @@ include Makefile CHANGES LICENSE AUTHORS +recursive-include artwork * recursive-include tests * recursive-include examples * recursive-include docs * diff --git a/Makefile b/Makefile index 8055e8ef..ab0a8d97 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,9 @@ all: clean-pyc test test: python setup.py test +tox-test: + PYTHONDONTWRITEBYTECODE= tox + ext-test: python tests/flaskext_test.py --browse diff --git a/docs/_themes b/docs/_themes deleted file mode 160000 index 3d964b66..00000000 --- a/docs/_themes +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3d964b660442e23faedf801caed6e3c7bd42d5c9 diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index c2a6d2f7..44633b33 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -314,8 +314,10 @@ extension to be approved you have to follow these guidelines: link to the documentation, website (if there is one) and there must be a link to automatically install the development version (``PackageName==dev``). -9. The ``zip_safe`` flag in the setup scrip must be set to ``False``, +9. The ``zip_safe`` flag in the setup script must be set to ``False``, even if the extension would be safe for zipping. +10. An extension currently has to support Python 2.5, 2.6 as well as + Python 2.7 .. _Flask Extension Wizard: diff --git a/docs/foreword.rst b/docs/foreword.rst index 3a7521d4..308de9c5 100644 --- a/docs/foreword.rst +++ b/docs/foreword.rst @@ -40,8 +40,8 @@ was implemented in Flask itself. There are currently extensions for object relational mappers, form validation, upload handling, various open authentication technologies and more. -However Flask is not much code and built in a very solid foundation and -with that very easy to adapt for large applications. If you are +However Flask is not much code and it is built on a very solid foundation +and with that it is very easy to adapt for large applications. If you are interested in that, check out the :ref:`becomingbig` chapter. If you are curious about the Flask design principles, head over to the diff --git a/docs/styleguide.rst b/docs/styleguide.rst index 1387d4a6..ec699052 100644 --- a/docs/styleguide.rst +++ b/docs/styleguide.rst @@ -31,7 +31,7 @@ Continuing long statements: .order_by(MyModel.name.desc()) \ .limit(10) - If you break in a statement with parentheses or brances, align to the + If you break in a statement with parentheses or braces, align to the braces:: this_is_a_very_long(function_call, 'with many parameters', @@ -105,8 +105,8 @@ Yoda statements are a nogo: pass Comparisons: - - against arbitary types: ``==`` and ``!=`` - - against singletones with ``is`` and ``is not`` (eg: ``foo is not + - against arbitrary types: ``==`` and ``!=`` + - against singletons with ``is`` and ``is not`` (eg: ``foo is not None``) - never compare something with `True` or `False` (for example never do ``foo == False``, do ``not foo`` instead) @@ -125,7 +125,7 @@ Naming Conventions - Class names: ``CamelCase``, with acronyms kept uppercase (``HTTPWriter`` and not ``HttpWriter``) - Variable names: ``lowercase_with_underscores`` -- Method and functin names: ``lowercase_with_underscores`` +- Method and function names: ``lowercase_with_underscores`` - Constants: ``UPPERCASE_WITH_UNDERSCORES`` - precompiled regular expressions: ``name_re`` @@ -151,9 +151,9 @@ Docstrings Docstring conventions: All docstrings are formatted with reStructuredText as understood by Sphinx. Depending on the number of lines in the docstring, they are - layed out differently. If it's just one line, the closing tripple + layed out differently. If it's just one line, the closing triple quote is on the same line as the opening, otherwise the text is on - the same line as the opening quote and the tripple quote that closes + the same line as the opening quote and the triple quote that closes the string on its own line:: def foo(): diff --git a/extreview/approved.rst b/extreview/approved.rst index 526a181a..78299933 100644 --- a/extreview/approved.rst +++ b/extreview/approved.rst @@ -42,3 +42,83 @@ Flask-Creole Notes: Flask-Markdown and this should share API, consider that when approving Flask-Markdown + + +Flask-Genshi +------------ + +:First Approval: 2010-07-26 +:Last Review: 2010-07-26 +:Approved Version: 0.3.1 +:Approved License: BSD + +Notes: This is the first template engine extension. When others come +around it would be a good idea to decide on a common interface. + + +Flask-Script +------------ + +:First Approval: 2010-07-26 +:Last Review: 2010-07-26 +:Approved Version: 0.3 +:Approved License: BSD + +Notes: Flask-Actions has some overlap. Consider that when approving +Flask-Actions or similar packages. + + +Flask-CouchDB +------------- + +:First Approval: 2010-07-26 +:Last Review: 2010-07-26 +:Approved Version: 0.2.1 +:Approved License: MIT + +There is also Flask-CouchDBKit. Both are fine because they are doing +different things, but the latter is not yet approved. + + +Flask-Testing +------------- + +:First Approval: 2010-07-27 +:Last Review: 2010-07-27 +:Approved Version: 0.2.3 +:Approved License: BSD + +All fine. + + +Flask-WTF +--------- + +:First Approval: 2010-07-27 +:Last Review: 2010-07-27 +:Approved Version: 0.2.3 +:Approved License: BSD + +All fine. + + +Flask-Themes +------------ + +:First Approval: 2010-07-27 +:Last Review: 2010-07-27 +:Approved Version: 0.1.2 +:Approved License: MIT + +All fine. + + +Flask-Uploads +------------- + +:First Approval: 2010-07-27 +:Last Review: 2010-07-27 +:Approved Version: 0.1.2 +:Approved License: MIT + +All fine. diff --git a/extreview/listed.rst b/extreview/listed.rst index a54c8a77..7510c8ac 100644 --- a/extreview/listed.rst +++ b/extreview/listed.rst @@ -6,17 +6,6 @@ extension is on the list of extensions on the website. It does not contain extensions that are approved. -Flask-CouchDB -------------- - -:Last-Review: 2010-07-25 -:Reviewed version: 0.2 - -Would be fine for approval, but the test suite is not part of the sdist -package (missing entry in MANIFEST.in) and the test suite does not respond -to either "make test" or "python setup.py test". - - Flask-CouchDBKit ---------------- @@ -43,19 +32,6 @@ Name is not following Flask extension naming rules. Considered for unlisting. -Flask-Genshi ------------- - -:Last-Review: 2010-07-25 -:Reviewed Version: 0.3 - -Would be fine for approval, but the test suite is not part of the sdist -package (missing entry in MANIFEST.in) and the test suite does not respond -to either "make test" or "python setup.py test". Furthermore the long -description is empty. The zip_safe flag is not set to False which is a -requirement for approved extensions. - - flask-lesscss ------------- @@ -70,22 +46,6 @@ Considered for unlisting, improved version should release as as a testsuite. -flask-mail ----------- - -:Last-Review: 2010-07-25 -:Reviewed Version: 0.3.1 - -Would be fine for approval, but the test suite is not part of the sdist -package (missing entry in MANIFEST.in) and the test suite does not respond -to either "make test" or "python setup.py test". Furthermore the long -description in the package index is a little bit too short. - -Package name should be changed to Flask-Mail with the approval to be -consistent, this might also be the change to improve the API if necessary, -but I don't see any big design problems there. - - Flask-OAuth ----------- @@ -104,64 +64,6 @@ Flask-OpenID Short long description, missing tests. -Flask-Script ------------- - -:Last-Review: 2010-07-25 -:Reviewed Version: 0.2 - -Would be fine for approval, but the test suite is not part of the sdist -package (missing entry in MANIFEST.in) and the test suite does not respond -to either "make test" or "python setup.py test". - -The upcoming 0.3 release looks promising, could need a longer "long -description" in the package index though. - - -Flask-Testing -------------- - -:Last-Review: 2010-07-25 -:Reviewed Version: 0.2 - -Would be fine for approval, but the test suite is not part of the sdist -package (missing entry in MANIFEST.in) and the test suite does not respond -to either "make test" or "python setup.py test". - - -Flask-Themes ------------- - -:Last-Review: 2010-07-25 -:Reviewed Version: 0.1 - -Would be fine for approval, but the test suite is not part of the sdist -package (missing entry in MANIFEST.in) and the test suite does not respond -to either "make test" or "python setup.py test". - - -Flask-Uploads -------------- - -:Last-Review: 2010-07-25 -:Reviewed Version: 0.1 - -Would be fine for approval, but the test suite is not part of the sdist -package (missing entry in MANIFEST.in) and the test suite does not respond -to either "make test" or "python setup.py test". - - -Flask-WTF ---------- - -:Last-Review: 2010-07-25 -:Reviewed Version: 0.2.1 - -Would be fine for approval, but the test suite is not part of the sdist -package (missing entry in MANIFEST.in) and the test suite does not respond -to either "make test" or "python setup.py test". - - Flask-XML-RPC ------------- diff --git a/setup.py b/setup.py index b97a33f7..78bd25d0 100644 --- a/setup.py +++ b/setup.py @@ -50,7 +50,7 @@ def run_tests(): setup( name='Flask', - version='0.6', + version='0.7', url='http://github.com/mitsuhiko/flask/', license='BSD', author='Armin Ronacher', diff --git a/tests/flaskext_test.py b/tests/flaskext_test.py index c7eb37df..9dc9ad67 100644 --- a/tests/flaskext_test.py +++ b/tests/flaskext_test.py @@ -27,13 +27,20 @@ from setuptools.archive_util import unpack_archive flask_svc_url = 'http://flask.pocoo.org/extensions/' + +# OS X has awful paths when using mkstemp or gettempdir(). I don't +# care about security or clashes here, so pick something that is +# actually rememberable. if sys.platform == 'darwin': _tempdir = '/private/tmp' else: _tempdir = tempfile.gettempdir() tdir = _tempdir + '/flaskext-test' -flaskdir = os.path.abspath(os.path.join(os.path.dirname(__file__), - '..')) +flaskdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) + + +# virtualenv hack *cough* +os.environ['PYTHONDONTWRITEBYTECODE'] = '' RESULT_TEMPATE = u'''\ @@ -74,6 +81,9 @@ RESULT_TEMPATE = u'''\ Author License Outcome + {%- for iptr, _ in results[0].logs|dictsort %} + {{ iptr }} + {%- endfor %} @@ -85,6 +95,9 @@ RESULT_TEMPATE = u'''\ {{ result.author }} {{ result.license }} {{ outcome }} + {%- for iptr, _ in result.logs|dictsort %} + see log + {%- endfor %} {%- endfor %} @@ -93,7 +106,8 @@ RESULT_TEMPATE = u'''\

Detailed test logs for all tests on all platforms: {%- for result in results %} {%- for iptr, log in result.logs|dictsort %} -

{{ result.name }} - {{ result.version }} [{{ iptr }}]

+

+ {{ result.name }} - {{ result.version }} [{{ iptr }}]

{{ log }}
{%- endfor %} {%- endfor %} @@ -186,14 +200,16 @@ tox_template = """[tox] envlist=%(env)s [testenv] -deps=%(deps)s +deps= + %(deps)s + py commands=bash flaskext-runtest.sh {envlogdir}/test.log downloadcache=%(cache)s """ def create_tox_ini(checkout_path, interpreters, flask_dep): - tox_path = os.path.join(checkout_path, 'tox.ini') + tox_path = os.path.join(checkout_path, 'tox-flask-test.ini') if not os.path.exists(tox_path): with open(tox_path, 'w') as f: f.write(tox_template % { @@ -201,6 +217,7 @@ def create_tox_ini(checkout_path, interpreters, flask_dep): 'cache': tdir, 'deps': flask_dep }) + return tox_path def iter_extensions(only_approved=True): @@ -228,23 +245,20 @@ def test_extension(name, interpreters, flask_dep): # if there is a tox.ini, remove it, it will cause troubles # for us. Remove it if present, we are running tox ourselves # afterall. - toxini = os.path.join(checkout_path, 'tox.ini') - if os.path.isfile(toxini): - os.remove(toxini) create_tox_ini(checkout_path, interpreters, flask_dep) - rv = subprocess.call(['tox'], cwd=checkout_path) + rv = subprocess.call(['tox', '-c', 'tox-flask-test.ini'], cwd=checkout_path) return TestResult(name, checkout_path, rv, interpreters) -def run_tests(interpreters, only_approved=True): +def run_tests(extensions, interpreters): results = {} create_tdir() log('Packaging Flask') flask_dep = package_flask() log('Running extension tests') log('Temporary Environment: %s', tdir) - for name in iter_extensions(only_approved): + for name in extensions: log('Testing %s', name) result = test_extension(name, interpreters, flask_dep) if result.success: @@ -272,10 +286,21 @@ def main(): help='run against all extensions, not just approved') parser.add_argument('--browse', dest='browse', action='store_true', help='show browser with the result summary') + parser.add_argument('--env', dest='env', default='py25,py26,py27', + help='the tox environments to run against') + parser.add_argument('--extension=', dest='extension', default=None, + help='tests a single extension') args = parser.parse_args() - results = run_tests(['py26'], not args.all) - filename = render_results(results, not args.all) + if args.extension is not None: + only_approved = False + extensions = [args.extension] + else: + only_approved = not args.all + extensions = iter_extensions(only_approved) + + results = run_tests(extensions, [x.strip() for x in args.env.split(',')]) + filename = render_results(results, only_approved) if args.browse: import webbrowser webbrowser.open('file:///' + filename.lstrip('/')) diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..15911b4c --- /dev/null +++ b/tox.ini @@ -0,0 +1,5 @@ +[tox] +envlist=py25,py26,py27 + +[testenv] +commands=make test