From 07581b2404924fe1833f596cfa09caf69868ad5b Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Wed, 12 May 2010 01:32:29 +0200 Subject: [PATCH 0001/3625] HEAD is 0.5-dev --- CHANGES | 5 +++++ setup.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 5c645435..ee8dd002 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,11 @@ Flask Changelog Here you can see the full list of changes between each Flask release. +Version 0.5 +----------- + +Release date to be announced + Version 0.2 ----------- diff --git a/setup.py b/setup.py index 462cb6c7..ed922027 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ from setuptools import setup setup( name='Flask', - version='0.2', + version='0.5', url='http://github.com/mitsuhiko/flask/', license='BSD', author='Armin Ronacher', From f4269b1fe7fe4c17a99bc7ca0dddafd17bed14e9 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Wed, 12 May 2010 02:06:40 +0200 Subject: [PATCH 0002/3625] Updated logo in the PDF docs --- docs/logo.pdf | Bin 28884 -> 23915 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/logo.pdf b/docs/logo.pdf index 49c5060e2563a6a47986c7a4694f04e859c31dc4..bd820c24728485ddc545e791da2a64d7794b6e6e 100644 GIT binary patch delta 23395 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 DL#nf| delta 28378 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 Date: Wed, 12 May 2010 02:34:22 +0200 Subject: [PATCH 0003/3625] Fixed typo --- flask.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask.py b/flask.py index 5af32ea8..dcf26b32 100644 --- a/flask.py +++ b/flask.py @@ -1113,7 +1113,7 @@ class Flask(_PackageBoundObject): with app.request_context(environ): do_something_with(request) - :params environ: a WSGI environment + :param environ: a WSGI environment """ return _RequestContext(self, environ) From 93a8ca02822d07cd9f13495f53d27ab22e9adf3a Mon Sep 17 00:00:00 2001 From: Ron DuPlain Date: Wed, 12 May 2010 09:18:42 +0800 Subject: [PATCH 0004/3625] Fixed some minor typos throughout docs. --- docs/becomingbig.rst | 4 ++-- docs/design.rst | 6 +++--- docs/foreword.rst | 6 +++--- docs/installation.rst | 2 +- docs/quickstart.rst | 16 ++++++++-------- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/becomingbig.rst b/docs/becomingbig.rst index 02344720..fcffe7c2 100644 --- a/docs/becomingbig.rst +++ b/docs/becomingbig.rst @@ -25,7 +25,7 @@ In that case, it makes a lot of sense to use dotted names for the URL endpoints. Here are some suggestions for how Flask can be modified to better -accomodate large-scale applications: +accommodate large-scale applications: - implement dotted names for URL endpoints - get rid of the decorator function registering which causes a lot @@ -33,7 +33,7 @@ accomodate large-scale applications: also requires that the whole application is imported when the system initializes or certain URLs will not be available right away. A better solution would be to have one module with all URLs in there and - specifing the target functions explicitly or by name and importing + specifying the target functions explicitly or by name and importing them when needed. - switch to explicit request object passing. This requires more typing (because you now have something to pass around) but it makes it a diff --git a/docs/design.rst b/docs/design.rst index c4fd32dd..b2a56cf5 100644 --- a/docs/design.rst +++ b/docs/design.rst @@ -51,7 +51,7 @@ possible without hacks if the object were created ahead of time for you based on a class that is not exposed to you. But there is another very important reason why Flask depends on an -explicit instanciation of that class: the package name. Whenever you +explicit instantiation of that class: the package name. Whenever you create a Flask instance you usually pass it `__name__` as package name. Flask depends on that information to properly load resources relative to your module. With Python's outstanding support for reflection it can @@ -125,7 +125,7 @@ advantage. Flask is a framework that takes advantage of the work already done by Werkzeug to properly interface WSGI (which can be a complex task at times). Thanks to recent developments in the Python package -infrastructure, packages with depencencies are no longer an issue and +infrastructure, packages with dependencies are no longer an issue and there are very few reasons against having libraries that depend on others. @@ -140,7 +140,7 @@ isn't that a bad idea? Yes it is usually not such a bright idea to use thread locals. They cause troubles for servers that are not based on the concept of threads and make large applications harder to maintain. However Flask is just not designed -for large applications or asyncronous servers. Flask wants to make it +for large applications or asynchronous servers. Flask wants to make it quick and easy to write a traditional web application. Also see the :ref:`becomingbig` section of the documentation for some diff --git a/docs/foreword.rst b/docs/foreword.rst index deeff8ca..8abd4549 100644 --- a/docs/foreword.rst +++ b/docs/foreword.rst @@ -68,15 +68,15 @@ up in situations where we think "well, this is just far fetched, how could that possibly be exploited" and then an intelligent guy comes along and figures a way out to exploit that application. And don't think, your application is not important enough for hackers to take notice. Depending -ont he kind of attack, chances are there are automated botnets out there -trying to figure out how to fill your database with viagra adverisments. +on the kind of attack, chances are there are automated botnets out there +trying to figure out how to fill your database with viagra advertisements. So always keep that in mind when doing web development. Target Audience --------------- -Is Flask for you? Is your application small-ish (less than 4000 lines of +Is Flask for you? If your application small-ish (less than 4000 lines of Python code) and does not depend on too complex database structures, Flask is the Framework for you. It was designed from the ground up to be easy to use, based on established principles, good intentions and on top of two diff --git a/docs/installation.rst b/docs/installation.rst index f2f4905f..deedb12b 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -122,7 +122,7 @@ Get the git checkout in a new virtualenv and run in develop mode:: ... Finished processing dependencies for Flask -This will pull in the depdenencies and activate the git head as current +This will pull in the dependencies and activate the git head as current version. Then you just have to ``git pull origin`` to get the latest version. diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 59e36bcc..4fc0b68e 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -83,7 +83,7 @@ you enable the debug support the server will reload itself on code changes and also provide you with a helpful debugger if things go wrong. There are two ways to enable debugging. Either set that flag on the -applciation object:: +application object:: app.debug = True app.run() @@ -139,7 +139,7 @@ likely he will like the page and come back next time. To add variable parts to a URL you can mark these special sections as ````. Such a part is then passed as keyword argument to -your function. Optionally a converter can be specifed by specifying a +your function. Optionally a converter can be specified by specifying a rule with ````. Here some nice examples:: @app.route('/user/') @@ -186,8 +186,8 @@ parameter. Here some examples: >>> with app.test_request_context(): ... print url_for('index') ... print url_for('login') -... print url_for('profile', username='John Doe') ... print url_for('login', next='/') +... print url_for('profile', username='John Doe') ... / /login @@ -319,7 +319,7 @@ Here's a simple example of how to render a template:: Flask will look for templates in the `templates` folder. So if your application is a module, that folder is next to that module, if it's a -pacakge it's actually inside your package: +package it's actually inside your package: **Case 1**: a module:: @@ -484,7 +484,7 @@ We recommend accessing URL parameters with `get` or by catching the `KeyError` because users might change the URL and presenting them a 400 bad request page in that case is a bit user unfriendly. -For a full list of methods and attribtues on that object, head over to the +For a full list of methods and attributes on that object, head over to the :class:`~flask.request` documentation. @@ -493,7 +493,7 @@ File Uploads Obviously you can handle uploaded files with Flask just as easy. Just make sure not to forget to set the ``enctype="multipart/form-data"`` -attribtue on your HTML form, otherwise the browser will not transmit your +attribute on your HTML form, otherwise the browser will not transmit your files at all. Uploaded files are stored in memory or at a temporary location on the @@ -576,7 +576,7 @@ you want to customize the error page, you can use the Note the ``404`` after the :func:`~flask.render_template` call. This tells Flask that the status code of that page should be 404 which means -not found. By default 200 is assumed which translats to: all went well. +not found. By default 200 is assumed which translates to: all went well. .. _sessions: @@ -586,7 +586,7 @@ Sessions Besides the request object there is also a second object called :class:`~flask.session` that allows you to store information specific to a user from one request to the next. This is implemented on top of cookies -for you and signes the cookies cryptographically. What this means is that +for you and signs the cookies cryptographically. What this means is that the user could look at the contents of your cookie but not modify it, unless he knows the secret key used for signing. From a5a41d40aaa9f6ed70b487133ddaf48ceb3d054f Mon Sep 17 00:00:00 2001 From: Zhao Xiaohong Date: Thu, 13 May 2010 14:42:03 +0800 Subject: [PATCH 0005/3625] Fix typo. --- flask.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask.py b/flask.py index dcf26b32..6f8a21fc 100644 --- a/flask.py +++ b/flask.py @@ -85,7 +85,7 @@ class Response(ResponseBase): :meth:`~flask.Flask.make_response` will take care of that for you. If you want to replace the response object used you can subclass this and - set :attr:`~flask.Flask.request_class` to your subclass. + set :attr:`~flask.Flask.response_class` to your subclass. """ default_mimetype = 'text/html' From 693e4449f87950c764a928690f4437fd6b1b4d7d Mon Sep 17 00:00:00 2001 From: Zhao Xiaohong Date: Thu, 13 May 2010 15:22:03 +0800 Subject: [PATCH 0006/3625] Fix typo. --- flask.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flask.py b/flask.py index 6f8a21fc..084b6593 100644 --- a/flask.py +++ b/flask.py @@ -562,7 +562,7 @@ class Module(_PackageBoundObject): return f def context_processor(self, f): - """Like :meth:`Flask.context_processor` but for a modul. This + """Like :meth:`Flask.context_processor` but for a module. This function is only executed for requests handled by a module. """ self._record(lambda s: s.app.template_context_processors @@ -601,7 +601,7 @@ class Flask(_PackageBoundObject): app = Flask(__name__) """ - #: the class that is used for request objects. See :class:`~flask.request` + #: the class that is used for request objects. See :class:`~flask.Request` #: for more information. request_class = Request From 35ed617fe41b184288892f733ce07d94391b76b1 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Mon, 17 May 2010 00:37:55 +0200 Subject: [PATCH 0007/3625] Added support for flashing categories. This fixes #35. --- CHANGES | 2 ++ flask.py | 33 +++++++++++++++++++++++++++++---- tests/flask_tests.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index ee8dd002..3a7d696d 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,8 @@ Version 0.5 Release date to be announced +- added support for categories for flashed messages. + Version 0.2 ----------- diff --git a/flask.py b/flask.py index 084b6593..d745027d 100644 --- a/flask.py +++ b/flask.py @@ -217,24 +217,49 @@ def get_template_attribute(template_name, attribute): attribute) -def flash(message): +def flash(message, category='message'): """Flashes a message to the next request. In order to remove the flashed message from the session and to display it to the user, the template has to call :func:`get_flashed_messages`. + .. versionchanged: 0.5 + `category` parameter added. + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string and be used as category. """ - session.setdefault('_flashes', []).append(message) + session.setdefault('_flashes', []).append((category, message)) -def get_flashed_messages(): +def get_flashed_messages(with_categories=False): """Pulls all flashed messages from the session and returns them. Further calls in the same request to the function will return - the same messages. + the same messages. By default just the messages are returned, + but when `with_categories` is set to `True`, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Example usage: + + .. sourcecode:: html+jinja + + {% for category, msg in get_flashed_messages(with_categories=true) %} +

{{ msg }} + {% endfor %} + + .. versionchanged:: 0.5 + `with_categories` parameter added. + + :param with_categories: set to `True` to also receive categories. """ flashes = _request_ctx_stack.top.flashes if flashes is None: _request_ctx_stack.top.flashes = flashes = session.pop('_flashes', []) + if not with_categories: + return [x[1] for x in flashes] return flashes diff --git a/tests/flask_tests.py b/tests/flask_tests.py index c7cebb9c..f5dd12bb 100644 --- a/tests/flask_tests.py +++ b/tests/flask_tests.py @@ -157,6 +157,35 @@ class BasicFunctionalityTestCase(unittest.TestCase): assert flask.session.modified assert list(flask.get_flashed_messages()) == ['Zap', 'Zip'] + def test_extended_flashing(self): + app = flask.Flask(__name__) + app.secret_key = 'testkey' + + @app.route('/') + def index(): + flask.flash(u'Hello World') + flask.flash(u'Hello World', 'error') + flask.flash(flask.Markup(u'Testing'), 'warning') + return '' + + @app.route('/test') + def test(): + messages = flask.get_flashed_messages(with_categories=True) + assert len(messages) == 3 + assert messages[0] == ('message', u'Hello World') + assert messages[1] == ('error', u'Hello World') + assert messages[2] == ('warning', flask.Markup(u'Testing')) + return '' + messages = flask.get_flashed_messages() + assert len(messages) == 3 + assert messages[0] == u'Hello World' + assert messages[1] == u'Hello World' + assert messages[2] == flask.Markup(u'Testing') + + c = app.test_client() + c.get('/') + c.get('/test') + def test_request_processing(self): app = flask.Flask(__name__) evts = [] From 931dcc4c80331d372d70d7a0a5c8e6d49223e2bf Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Mon, 17 May 2010 01:41:57 +0200 Subject: [PATCH 0008/3625] Fixed a doc bug and added distribtue docs. --- docs/installation.rst | 2 + docs/patterns/distribute.rst | 160 +++++++++++++++++++++++++++++++++++ docs/patterns/flashing.rst | 38 +++++++++ docs/patterns/index.rst | 1 + flask.py | 2 +- 5 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 docs/patterns/distribute.rst diff --git a/docs/installation.rst b/docs/installation.rst index deedb12b..6b4f955a 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -19,6 +19,8 @@ lighttpd, on Google's App Engine or whatever you have in mind). So how do you get all that on your computer in no time? The most kick-ass method is virtualenv, so let's look at that first. +.. _virtualenv: + virtualenv ---------- diff --git a/docs/patterns/distribute.rst b/docs/patterns/distribute.rst new file mode 100644 index 00000000..c4f6625d --- /dev/null +++ b/docs/patterns/distribute.rst @@ -0,0 +1,160 @@ +Deploying with Distribute +========================= + +`distribute`_, formerly setuptools, is an extension library that is +commonly used to (like the name says) distribute Python libraries and +extensions. It extends distutils, a basic module installation system +shipped with Python to also support various more complex constructs that +make larger applications easier to distribute: + +- **support for dependencies**: a library or application can declare a + list of other libraries it depends on which will be installed + automatically for you. +- **package registry**: setuptools registers your package with your + Python installation. This makes it possible to query information + provided by one package from another package. The best known feature of + this system is the entry point support which allows one package to + declare an "entry point" another package can hook into to extend the + other package. +- **installation manager**: `easy_install`, which comes with distribute + can install other libraries for you. You can also use `pip`_ which + sooner or later will replace `easy_install` which does more than just + installing packages for you. + +Flask itself, and all the libraries you can find on the cheeseshop will +are distributed with either distribute, the older setuptools or distutils. + +In this case we assume your application is called +`yourapplication.py` and you are not using a module, but a `package +`_. Distributing resources with standard modules is +not supported by `distribute`_ so we will not bother with it. If you have +not yet converted your application into a package, head over to the +:ref:`larger-applications` pattern to see how this can be done. + +Basic Setup Script +------------------ + +Because you have Flask running, you either have setuptools or distribute +available on your system anyways. If you do not, fear not, there is a +script to install it for you: `distribute_setup.py`_. Just download and +run with your Python interpreter. + +Standard disclaimer applies: :ref:`you better use a virtualenv +`. + +Your setup code always goes into a file named `setup.py` next to your +application. The name of the file is only convention, but because +everybody will look for a file with that name, you better not change it. + +Yes, even if you are using `distribute`, you are importing from a package +called `setuptools`. `distribute` is fully backwards compatible with +`setuptools`, so it also uses the same import name. + +A basic `setup.py` file for a Flask application looks like this:: + + from setuptools import setup + + setup( + name='Your Application', + version='1.0', + long_description=__doc__, + packages=['yourapplication'], + include_package_data=True, + zip_safe=False, + install_requires=['Flask'] + ) + +Please keep in mind that you have to list subpackages explicitly. If you +want distribute to lookup the packages for you automatically, you can use +the `find_packages` function:: + + from setuptools import setup, find_packages + + setup( + ... + packages=find_packages() + ) + +Most parameters to the `setup` function should be self explanatory, +`include_package_data` and `zip_safe` might not be. +`include_package_data` tells distribute to look for a `MANIFEST.in` file +and install all the entries that match as package data. We will use this +to distribute the static files and templates along with the Python module +(see :ref:`distributing-resources`). The `zip_safe` flag can be used to +force or prevent zip Archive creation. In general you probably don't want +your packages to be installed as zip files because some tools do not +support them and they make debugging a lot harder. + + +.. _distributing-resources: + +Distributing Resources +---------------------- + +If you try to install the package you just created, you will notice that +folders like `static` or `templates` are not installed for you. The +reason for this is that distribute does not know which files to add for +you. What you should do, is to create a `MANIFEST.in` file next to your +`setup.py` file. This file lists all the files that should be added to +your tarball:: + + recursive-include yourapplication/templates + recursive-include yourapplication/static + +Don't forget that even if you enlist them in your `MANIFEST.in` file, they +won't be installed for you unless you set the `include_package_data` +parameter of the `setup` function to `True`! + + +Declaring Dependencies +---------------------- + +Dependencies are declared in the `install_requires` parameter as list. +Each item in that list is the name of a package that should be pulled from +PyPI on installation. By default it will always use the most recent +version, but you can also provide minimum and maximum version +requirements. Here some examples:: + + install_requires=[ + 'Flask>=0.2', + 'SQLAlchemy>=0.6', + 'BrokenPackage>=0.7,<=1.0' + ] + +I mentioned earlier that dependencies are pulled from PyPI. What if you +want to depend on a package that cannot be found on PyPI and won't be +because it is an internal package you don't want to share with anyone? +Just still do as if there was a PyPI entry for it and provide a list of +alternative locations where distribute should look for tarballs:: + + dependency_links=['http://example.com/yourfiles'] + +Make sure that page has a directory listing and the links on the page are +pointing to the actual tarballs with their correct filenames as this is +how distribute will find the files. If you have an internal company +server that contains the packages, provide the URL to that server there. + + +Installing / Developing +----------------------- + +To install your application (ideally into a virtualenv) just run the +`setup.py` script with the `install` parameter. It will install your +application into the virtualenv's site-packages folder and also download +and install all dependencies:: + + $ python setup.py install + +If you are developing on the package and also want the requirements to be +installed, you can use the `develop` command instead:: + + $ python setup.py develop + +This has the advantage of just installing a link to the site-packages +folder instead of copying the data over. You can then continue to work on +the code without having to run `install` again after each change. + + +.. _distribute: http://pypi.python.org/pypi/distribute +.. _pip: http://pypi.python.org/pypi/pip +.. _distribute_setup.py: http://python-distribute.org/distribute_setup.py diff --git a/docs/patterns/flashing.rst b/docs/patterns/flashing.rst index fca9a9e1..16d8d371 100644 --- a/docs/patterns/flashing.rst +++ b/docs/patterns/flashing.rst @@ -11,6 +11,9 @@ possible to record a message at the end of a request and access it next request and only next request. This is usually combined with a layout template that does this. +Simple Flashing +--------------- + So here a full example:: from flask import flash, redirect, url_for, render_template @@ -79,3 +82,38 @@ And of course the login template:

{% endblock %} + +Flashing With Categories +------------------------ + +.. versionadded:: 0.5 + +It is also possible to provide categories when flashing a message. The +default category if nothing is provided is ``'message'``. Alternative +categories can be used to give the user better feedback. For example +error messages could be displayed with a red background. + +To flash a message with a different category, just use the second argument +to the :func:`~flask.flash` function:: + + flash(u'Invalid password provided', 'error') + +Inside the template you then have to tell the +:func:`~flask.get_flashed_messages` function to also return the +categories. The loop looks slighty different in that situation then: + +.. sourcecode:: html+jinja + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} +

    + {% for category, message in messages %} +
  • {{ message }}
  • + {% endfor %} +
+ {% endif %} + {% endwith %} + +This is just one example of how to render these flashed messages. One +might also use the category to add a prefix such as +``Error:`` to the message. diff --git a/docs/patterns/index.rst b/docs/patterns/index.rst index 9678e3be..ec3011f6 100644 --- a/docs/patterns/index.rst +++ b/docs/patterns/index.rst @@ -17,6 +17,7 @@ Snippet Archives `_. :maxdepth: 2 packages + distribute sqlite3 sqlalchemy fileuploads diff --git a/flask.py b/flask.py index d745027d..6fa3f7e3 100644 --- a/flask.py +++ b/flask.py @@ -230,7 +230,7 @@ def flash(message, category='message'): are recommended: ``'message'`` for any kind of message, ``'error'`` for errors, ``'info'`` for information messages and ``'warning'`` for warnings. However any - kind of string and be used as category. + kind of string can be used as category. """ session.setdefault('_flashes', []).append((category, message)) From b18560fcaa1739c81ff273951ebc6fa3c96fda2b Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Mon, 17 May 2010 01:51:16 +0200 Subject: [PATCH 0009/3625] s/will// --- docs/patterns/distribute.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/patterns/distribute.rst b/docs/patterns/distribute.rst index c4f6625d..76d4462a 100644 --- a/docs/patterns/distribute.rst +++ b/docs/patterns/distribute.rst @@ -21,7 +21,7 @@ make larger applications easier to distribute: sooner or later will replace `easy_install` which does more than just installing packages for you. -Flask itself, and all the libraries you can find on the cheeseshop will +Flask itself, and all the libraries you can find on the cheeseshop are distributed with either distribute, the older setuptools or distutils. In this case we assume your application is called From c6e6792cd52022add8455fc792b2ca73c62d3d65 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Mon, 17 May 2010 02:01:23 +0200 Subject: [PATCH 0010/3625] Added MANIFEST.in. This fixes #39 --- MANIFEST.in | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..aee76e91 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +include Makefile CHANGES LICENSE AUTHORS +recursive-include tests * +recursive-include docs * +prune docs/_build/doctrees From 8c26bec55c13804a01c11931263c9e9e4dab4afb Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Mon, 17 May 2010 12:10:45 +0200 Subject: [PATCH 0011/3625] Added links to downloadable docs in the docs --- docs/_templates/sidebarintro.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html index b8381d7d..c281d3a9 100644 --- a/docs/_templates/sidebarintro.html +++ b/docs/_templates/sidebarintro.html @@ -5,6 +5,11 @@ not stable yet, but if you have some feedback, let me know.

+

Download Documentation

+

Useful Links