[Python-modules-commits] [flask-restful] 02/03: New upstream version 0.3.6

Jonathan Carter highvoltage-guest at moszumanska.debian.org
Mon Jun 5 19:39:36 UTC 2017


This is an automated email from the git hooks/post-receive script.

highvoltage-guest pushed a commit to branch master
in repository flask-restful.

commit 7ef2956c0b79fb295ec7730ed25b139b0e025c91
Author: Jonathan Carter <jcarter at linux.com>
Date:   Mon Jun 5 21:39:17 2017 +0200

    New upstream version 0.3.6
---
 AUTHORS.md                            | 19 ++++++++-
 CHANGES.md                            | 11 ++++++
 CONTRIBUTING.md                       |  2 -
 README.md                             |  2 +-
 docs/conf.py                          |  7 ++--
 docs/extending.rst                    | 27 ++++++++++++-
 docs/fields.rst                       |  6 +--
 docs/intermediate-usage.rst           |  2 +-
 docs/reqparse.rst                     |  5 +--
 flask_restful/__init__.py             | 10 ++++-
 flask_restful/__version__.py          |  3 ++
 flask_restful/inputs.py               |  6 ++-
 flask_restful/representations/json.py |  3 +-
 flask_restful/reqparse.py             | 12 ++++--
 flask_restful/utils/__init__.py       |  4 ++
 setup.py                              | 22 ++++++++++-
 tests/test_api.py                     | 74 ++++++++++++++++++++++++++++++++++-
 tests/test_inputs.py                  | 24 ++++++++++++
 tests/test_reqparse.py                | 34 ++++++++++++++++
 tox.ini                               |  2 +-
 20 files changed, 245 insertions(+), 30 deletions(-)

diff --git a/AUTHORS.md b/AUTHORS.md
index a6d301a..bbcfb5c 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -3,7 +3,8 @@ Authors
 
 A huge thanks to all of our contributors:
 
-
+- Adam Chainz
+- Alec Nikolas Reiter
 - Alex Gaynor
 - Alex M
 - Alex Morken
@@ -12,9 +13,11 @@ A huge thanks to all of our contributors:
 - Anil Kulkarni
 - Antonio Dourado
 - Antonio Herraiz
+- Ares Ou
 - Artur Rodrigues
 - Axel Haustant
 - Belousow Makc
+- Benjamin Dopplinger
 - Bennett, Bryan
 - Bohan Zhang
 - Bryan Bennett
@@ -31,14 +34,16 @@ A huge thanks to all of our contributors:
 - Dimitris Theodorou
 - Doug Black
 - Evan Dale Aromin
+- Eyal Levin
+- Francesco Della Vedova
 - Frank Stratton
-- Frank Stratton ☺
 - Garret Raziel
 - Gary Belvin
 - Gilles Dartiguelongue
 - Giorgio Salluzzo
 - Guillaume BINET
 - Heston Liebowitz
+- Hu WQ
 - Jacob Magnusson
 - James Booth
 - James Ogura
@@ -64,12 +69,14 @@ A huge thanks to all of our contributors:
 - Malthe Borch
 - Marek Hlobil
 - Matt Wright
+- Max Mautner
 - Max Peterson
 - Maxim
 - Michael Hwang
 - Michael Newman
 - Miguel Grinberg
 - Mihai Tomescu
+- Neil Halelamien
 - Nicolas Harraudeau
 - Pavel Tyslyatsky
 - Petrus J.v.Rensburg
@@ -79,12 +86,16 @@ A huge thanks to all of our contributors:
 - Robert Warner
 - Rod Cloutier
 - Ryan Horn
+- Rémi Alvergnat
 - Sam Kimbrel
 - Samarth Shah
+- Sami Jaktholm
 - Sander Sink
 - Sasha Baranov
 - Saul Diez-Guerra
 - Sergey Romanov
+- Shreyans Sheth
+- Steven Leggett
 - Sven-Hendrik Haase
 - Usman Ehtesham Gul
 - Victor Neo
@@ -92,13 +103,17 @@ A huge thanks to all of our contributors:
 - Vladimir Pal
 - WooParadog
 - Yaniv Aknin
+- akash
 - bret barker
 - hachichaud
 - jbouzekri
+- jobou
+- johnrichter
 - justanr
 - k-funk
 - kelvinhammond
 - kenjones
+- kieran gorman
 - kumy
 - lyschoening
 - mailto1587
diff --git a/CHANGES.md b/CHANGES.md
index f79e8b2..171971a 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -3,6 +3,17 @@ Flask-RESTful Changelog
 
 Here you can see the full list of changes between each Flask-RESTful release.
 
+Version 0.3.6
+-------------
+
+Released May 31, 2017
+
+- `Argument.help` now supports unicode strings ([#564](https://github.com/flask-restful/flask-restful/pull/564))
+- Flags can now be passed to `inputs.regex` ([#621](https://github.com/flask-restful/flask-restful/pull/621))
+- Fix behavior of `action='append'` in conjunction with `location='json'` ([#645](https://github.com/flask-restful/flask-restful/pull/645))
+- `method_decorators` can be a `dict` to apply decorator behavior for only specific HTTP methods ([#532](https://github.com/flask-restful/flask-restful/pull/532))
+- JSON keys are no longer sorted by default in debug mode in python3 ([#680](https://github.com/flask-restful/flask-restful/pull/680))
+- Various small fixes and updates to documentation
 
 Version 0.3.5
 -------------
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 078d2ee..b6a9031 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,8 +6,6 @@ issue [pull requests](https://github.com/flask-restful/flask-restful/compare).
 New code must come with a set of unit tests (that pass!) before the pull request
 is merged.
 
-Please refrain from using force pushes to update pull requests.
-
 Reporting Bugs
 --------------
 
diff --git a/README.md b/README.md
index 4452bf4..5e27778 100644
--- a/README.md
+++ b/README.md
@@ -9,5 +9,5 @@ Flask-RESTful provides the building blocks for creating a great REST API.
 
 ## User Guide
 
-You'll find the user guide and all documentation [here](http://flask-restful.readthedocs.org/en/latest/)
+You'll find the user guide and all documentation [here](https://flask-restful.readthedocs.io/)
 
diff --git a/docs/conf.py b/docs/conf.py
index 86fafe6..56f28cd 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -51,11 +51,12 @@ copyright = u'{}, Kevin Burke, Kyle Conroy, Ryan Horn, Frank Stratton, Guillaume
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
-#
+from flask_restful.__version__ import __version__
+vparts = __version__.split('.')
 # The short X.Y version.
-version = '0.2'
+version = '.'.join(vparts[:2])
 # The full version, including alpha/beta/rc tags.
-release = '0.2.1'
+release = '.'.join(vparts)
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/docs/extending.rst b/docs/extending.rst
index 8888bc6..13710c4 100644
--- a/docs/extending.rst
+++ b/docs/extending.rst
@@ -21,7 +21,7 @@ mediatypes to your API, you’ll need to declare your supported representations
 on the :class:`~Api` object. ::
 
     app = Flask(__name__)
-    api = restful.Api(app)
+    api = Api(app)
 
     @api.representation('application/json')
     def output_json(data, code, headers=None):
@@ -130,7 +130,7 @@ To support other representations (xml, csv, html), you can use the
 :meth:`~Api.representation` decorator.  You need to have a reference to your
 API. ::
 
-    api = restful.Api(app)
+    api = Api(app)
 
     @api.representation('text/csv')
     def output_csv(data, code, headers=None):
@@ -189,6 +189,29 @@ instance, if you want to build custom authentication into every request. ::
     class Resource(restful.Resource):
         method_decorators = [authenticate]   # applies to all inherited resources
 
+Alternatively, you can specify a dictionary of iterables that map to HTTP methods
+and the decorators will only apply to matching requests.
+
+.. code-block:: python
+
+    def cache(f):
+        @wraps(f)
+        def cacher(*args, **kwargs):
+            # caching stuff
+        return cacher
+
+    class MyResource(restful.Resource):
+        method_decorators = {'get': [cache]}
+
+         def get(self, *args, **kwargs):
+            return something_interesting(*args, **kwargs)
+
+         def post(self, *args, **kwargs):
+            return create_something(*args, **kwargs)
+
+In this case, the caching decorator would only apply to the `GET` request and not
+the `POST` request.
+
 Since Flask-RESTful Resources are actually Flask view objects, you can also
 use standard `flask view decorators <http://flask.pocoo.org/docs/views/#decorating-views>`_.
 
diff --git a/docs/fields.rst b/docs/fields.rst
index 7fd8e96..58338a5 100644
--- a/docs/fields.rst
+++ b/docs/fields.rst
@@ -79,7 +79,7 @@ A lambda (or any callable) can also be specified as the ``attribute`` ::
         'address': fields.String,
     }
 
-Nested properties can also be accessed with ``attribute``:
+Nested properties can also be accessed with ``attribute`` ::
 
     fields = {
         'name': fields.String(attribute='people_list.0.person_dictionary.name'),
@@ -103,7 +103,7 @@ Custom Fields & Multiple Values
 -------------------------------
 
 Sometimes you have your own custom formatting needs.  You can subclass the
-:class`fields.Raw` class and implement the format function.  This is especially
+:class:`fields.Raw` class and implement the format function.  This is especially
 useful when an attribute stores multiple pieces of information. e.g. a
 bit-field whose individual bits represent distinct values.  You can use fields
 to multiplex a single attribute to multiple output values.
@@ -228,7 +228,7 @@ structures and render them appropriately. ::
     '{"billing_address": {"line 1": "123 fake street", "line 2": null, "state": "NY", "zip": "10468", "city": "New York"}, "name": "bob", "shipping_address": {"line 1": "555 nowhere", "line 2": null, "state": "NY", "zip": "10468", "city": "New York"}}'
 
 This example uses two ``Nested`` fields. The ``Nested`` constructor takes a
-dict of fields to render as sub-fields.input The important difference between
+dict of fields to render as sub-fields. The important difference between
 the ``Nested`` constructor and nested dicts (previous example), is the context
 for attributes. In this example, ``billing_address`` is a complex object that
 has its own fields and the context passed to the nested field is the sub-object
diff --git a/docs/intermediate-usage.rst b/docs/intermediate-usage.rst
index f4399a8..9ce30eb 100644
--- a/docs/intermediate-usage.rst
+++ b/docs/intermediate-usage.rst
@@ -261,7 +261,7 @@ So you could have a :class:`Resource`: ::
     from flask_restful import Resource
 
     class TodoNext(Resource):
-        def __init__(**kwargs):
+        def __init__(self, **kwargs):
             # smart_engine is a black box dependency
             self.smart_engine = kwargs['smart_engine']
 
diff --git a/docs/reqparse.rst b/docs/reqparse.rst
index 33d6323..086a5a0 100644
--- a/docs/reqparse.rst
+++ b/docs/reqparse.rst
@@ -8,7 +8,7 @@ Request Parsing
     The whole request parser part of Flask-RESTful is slated for removal and
     will be replaced by documentation on how to integrate with other packages
     that do the input/output stuff better
-    (such as `marshmallow <http://marshmallow.readthedocs.org>`_).
+    (such as `marshmallow <https://marshmallow.readthedocs.io>`_).
     This means that it will be maintained until 2.0 but consider it deprecated.
     Don't worry, if you have code using that now and wish to continue doing so,
     it's not going to go away any time too soon.
@@ -226,11 +226,10 @@ then the error message will be the value of ``help``.
 
 ``help`` may include an interpolation token, ``{error_msg}``, that will be
 replaced with the string representation of the type error. This allows the
-message to be customized while preserving the original error:
+message to be customized while preserving the original error ::
 
     from flask_restful import reqparse
 
-
     parser = reqparse.RequestParser()
     parser.add_argument(
         'foo',
diff --git a/flask_restful/__init__.py b/flask_restful/__init__.py
index 82a708a..e18d6f1 100644
--- a/flask_restful/__init__.py
+++ b/flask_restful/__init__.py
@@ -17,6 +17,7 @@ import sys
 from flask.helpers import _endpoint_from_view_func
 from types import MethodType
 import operator
+from collections import Mapping
 
 
 __all__ = ('Api', 'Resource', 'marshal', 'marshal_with', 'marshal_with_field', 'abort')
@@ -50,6 +51,7 @@ class Api(object):
 
     :param app: the Flask application object
     :type app: flask.Flask
+    :type app: flask.Blueprint
     :param prefix: Prefix all routes with a value, eg v1 or 2010-04-01
     :type prefix: str
     :param default_mediatype: The default media type to return
@@ -370,6 +372,7 @@ class Api(object):
 
         :param resource: the class name of your resource
         :type resource: :class:`Resource`
+
         :param urls: one or more url routes to match for the resource, standard
                      flask routing rules apply.  Any url variables will be
                      passed to the resource method as args.
@@ -581,7 +584,12 @@ class Resource(MethodView):
             meth = getattr(self, 'get', None)
         assert meth is not None, 'Unimplemented method %r' % request.method
 
-        for decorator in self.method_decorators:
+        if isinstance(self.method_decorators, Mapping):
+            decorators = self.method_decorators.get(request.method.lower(), [])
+        else:
+            decorators = self.method_decorators
+
+        for decorator in decorators:
             meth = decorator(meth)
 
         resp = meth(*args, **kwargs)
diff --git a/flask_restful/__version__.py b/flask_restful/__version__.py
new file mode 100644
index 0000000..ee19d4e
--- /dev/null
+++ b/flask_restful/__version__.py
@@ -0,0 +1,3 @@
+#!/usr/bin/env python
+
+__version__ = '0.3.6'
diff --git a/flask_restful/inputs.py b/flask_restful/inputs.py
index 2d2ad25..141fa9a 100644
--- a/flask_restful/inputs.py
+++ b/flask_restful/inputs.py
@@ -53,11 +53,13 @@ class regex(object):
 
     :param pattern: The regular expression the input must match
     :type pattern: str
+    :param flags: Flags to change expression behavior
+    :type flags: int
     """
 
-    def __init__(self, pattern):
+    def __init__(self, pattern, flags=0):
         self.pattern = pattern
-        self.re = re.compile(pattern)
+        self.re = re.compile(pattern, flags)
 
     def __call__(self, value):
         if not self.re.search(value):
diff --git a/flask_restful/representations/json.py b/flask_restful/representations/json.py
index f96189e..ccbe8b7 100644
--- a/flask_restful/representations/json.py
+++ b/flask_restful/representations/json.py
@@ -1,5 +1,6 @@
 from __future__ import absolute_import
 from flask import make_response, current_app
+from flask_restful.utils import PY3
 from json import dumps
 
 
@@ -13,7 +14,7 @@ def output_json(data, code, headers=None):
     # that was set.  We also set the "sort_keys" value.
     if current_app.debug:
         settings.setdefault('indent', 4)
-        settings.setdefault('sort_keys', True)
+        settings.setdefault('sort_keys', not PY3)
 
     # always end the json dumps with a new line
     # see https://github.com/mitsuhiko/flask/pull/1262
diff --git a/flask_restful/reqparse.py b/flask_restful/reqparse.py
index 07e42d9..8fe142e 100644
--- a/flask_restful/reqparse.py
+++ b/flask_restful/reqparse.py
@@ -1,4 +1,6 @@
 from copy import deepcopy
+
+import collections
 from flask import current_app, request
 from werkzeug.datastructures import MultiDict, FileStorage
 from werkzeug import exceptions
@@ -143,7 +145,7 @@ class Argument(object):
         """
         error_str = six.text_type(error)
         error_msg = self.help.format(error_msg=error_str) if self.help else error_str
-        msg = {self.name: "{0}".format(error_msg)}
+        msg = {self.name: error_msg}
 
         if current_app.config.get("BUNDLE_ERRORS", False) or bundle_errors:
             return error, msg
@@ -173,7 +175,9 @@ class Argument(object):
                 if hasattr(source, "getlist"):
                     values = source.getlist(name)
                 else:
-                    values = [source.get(name)]
+                    values = source.get(name)
+                    if not isinstance(values, collections.MutableSequence):
+                        values = [values]
 
                 for value in values:
                     if hasattr(value, "strip") and self.trim:
@@ -238,9 +242,9 @@ class RequestParser(object):
     """Enables adding and parsing of multiple arguments in the context of a
     single request. Ex::
 
-        from flask import request
+        from flask_restful import reqparse
 
-        parser = RequestParser()
+        parser = reqparse.RequestParser()
         parser.add_argument('foo')
         parser.add_argument('int_bar', type=int)
         args = parser.parse_args()
diff --git a/flask_restful/utils/__init__.py b/flask_restful/utils/__init__.py
index ffbae22..7d6baec 100644
--- a/flask_restful/utils/__init__.py
+++ b/flask_restful/utils/__init__.py
@@ -1,3 +1,5 @@
+import sys
+
 try:
     from collections import OrderedDict
 except ImportError:
@@ -5,6 +7,8 @@ except ImportError:
 
 from werkzeug.http import HTTP_STATUS_CODES
 
+PY3 = sys.version_info > (3,)
+
 
 def http_status_message(code):
     """Maps an HTTP status code to the textual status"""
diff --git a/setup.py b/setup.py
index f9fc494..b45dee6 100755
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,9 @@
 #!/usr/bin/env python
 
-from setuptools import setup, find_packages
+import re
 import sys
+from os import path
+from setuptools import setup, find_packages
 
 PY26 = sys.version_info[:2] == (2, 6,)
 
@@ -14,9 +16,24 @@ requirements = [
 if PY26:
     requirements.append('ordereddict')
 
+
+version_file = path.join(
+    path.dirname(__file__),
+    'flask_restful',
+    '__version__.py'
+)
+with open(version_file, 'r') as fp:
+    m = re.search(
+        r"^__version__ = ['\"]([^'\"]*)['\"]",
+        fp.read(),
+        re.M
+    )
+    version = m.groups(1)[0]
+
+
 setup(
     name='Flask-RESTful',
-    version='0.3.5',
+    version=version,
     license='BSD',
     url='https://www.github.com/flask-restful/flask-restful/',
     author='Twilio API Team',
@@ -32,6 +49,7 @@ setup(
         'Programming Language :: Python :: 3.3',
         'Programming Language :: Python :: 3.4',
         'Programming Language :: Python :: 3.5',
+        'Programming Language :: Python :: 3.6',
         'License :: OSI Approved :: BSD License',
     ],
     zip_safe=False,
diff --git a/tests/test_api.py b/tests/test_api.py
index bb8d362..26447ae 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -9,7 +9,7 @@ except:
     from unittest.mock import Mock
 import flask
 import werkzeug
-from werkzeug.exceptions import HTTPException, Unauthorized, BadRequest, NotFound
+from werkzeug.exceptions import HTTPException, Unauthorized, BadRequest, NotFound, _aborter
 from werkzeug.http import quote_etag, unquote_etag
 from flask_restful.utils import http_status_message, unpack
 import flask_restful
@@ -808,7 +808,7 @@ class APITestCase(unittest.TestCase):
                 flask_abort(304, etag='myETag')
 
         api.add_resource(Foo1, '/foo')
-        flask_abort.mapping.update({304: NotModified})
+        _aborter.mapping.update({304: NotModified})
 
         with app.test_client() as client:
             foo = client.get('/foo')
@@ -982,6 +982,76 @@ class APITestCase(unittest.TestCase):
         except AttributeError as ae:
             self.fail(ae.message)
 
+    def test_selectively_apply_method_decorators(self):
+        def upper_deco(f):
+            def upper(*args, **kwargs):
+                return f(*args, **kwargs).upper()
+            return upper
+
+        class TestResource(flask_restful.Resource):
+            method_decorators = {'get': [upper_deco]}
+
+            def get(self):
+                return 'get test'
+
+            def post(self):
+                return 'post test'
+
+        app = Flask(__name__)
+
+        with app.test_request_context('/', method='POST'):
+            r = TestResource().dispatch_request()
+            assert r == 'post test'
+
+        with app.test_request_context('/', method='GET'):
+            r = TestResource().dispatch_request()
+            assert r == 'GET TEST'
+
+    def test_apply_all_method_decorators_if_not_mapping(self):
+        def upper_deco(f):
+            def upper(*args, **kwargs):
+                return f(*args, **kwargs).upper()
+            return upper
+
+        class TestResource(flask_restful.Resource):
+            method_decorators = [upper_deco]
+
+            def get(self):
+                return 'get test'
+
+            def post(self):
+                return 'post test'
+
+        app = Flask(__name__)
+
+        with app.test_request_context('/', method='POST'):
+            r = TestResource().dispatch_request()
+            assert r == 'POST TEST'
+
+        with app.test_request_context('/', method='GET'):
+            r = TestResource().dispatch_request()
+            assert r == 'GET TEST'
+
+    def test_decorators_only_applied_at_dispatch(self):
+        def upper_deco(f):
+            def upper(*args, **kwargs):
+                return f(*args, **kwargs).upper()
+            return upper
+
+        class TestResource(flask_restful.Resource):
+            method_decorators = [upper_deco]
+
+            def get(self):
+                return 'get test'
+
+            def post(self):
+                return 'post test'
+
+        r = TestResource()
+
+        assert r.get() == 'get test'
+        assert r.post() == 'post test'
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_inputs.py b/tests/test_inputs.py
index dfd34e8..90a2fb0 100644
--- a/tests/test_inputs.py
+++ b/tests/test_inputs.py
@@ -140,6 +140,30 @@ def test_regex_bad_pattern():
     assert_raises(re.error, inputs.regex, '[')
 
 
+def test_regex_flags_good_input():
+    cases = (
+        'abcd',
+        'ABCabc',
+        'ABC',
+    )
+
+    case_insensitive = inputs.regex(r'^[A-Z]+$', re.IGNORECASE)
+
+    for value in cases:
+        yield assert_equal, case_insensitive(value), value
+
+
+def test_regex_flags_bad_input():
+    cases = (
+        'abcd',
+        'ABCabc'
+    )
+
+    case_sensitive = inputs.regex(r'^[A-Z]+$')
+
+    for value in cases:
+        yield assert_raises, ValueError, lambda: case_sensitive(value)
+
 
 class TypesTestCase(unittest.TestCase):
 
diff --git a/tests/test_reqparse.py b/tests/test_reqparse.py
index b0cb136..ce9ce30 100644
--- a/tests/test_reqparse.py
+++ b/tests/test_reqparse.py
@@ -30,6 +30,19 @@ class ReqParseTestCase(unittest.TestCase):
             abort.assert_called_with(400, message=expected)
 
     @patch('flask_restful.abort')
+    def test_help_with_unicode_error_msg(self, abort):
+        app = Flask(__name__)
+        with app.app_context():
+            parser = RequestParser()
+            parser.add_argument('foo', choices=('one', 'two'), help=u'Bad choice: {error_msg}')
+            req = Mock(['values'])
+            req.values = MultiDict([('foo', u'\xf0\x9f\x8d\x95')])
+            parser.parse_args(req)
+            expected = {'foo': u'Bad choice: \xf0\x9f\x8d\x95 is not a valid choice'}
+            abort.assert_called_with(400, message=expected)
+
+
+    @patch('flask_restful.abort')
     def test_help_no_error_msg(self, abort):
         app = Flask(__name__)
         with app.app_context():
@@ -289,6 +302,27 @@ class ReqParseTestCase(unittest.TestCase):
         args = parser.parse_args(req)
         self.assertEquals(args['foo'], ["bar"])
 
+    def test_parse_append_many(self):
+        req = Request.from_values("/bubble?foo=bar&foo=bar2")
+
+        parser = RequestParser()
+        parser.add_argument("foo", action="append"),
+
+        args = parser.parse_args(req)
+        self.assertEquals(args['foo'], ["bar", "bar2"])
+
+    def test_parse_append_many_location_json(self):
+        app = Flask(__name__)
+
+        parser = RequestParser()
+        parser.add_argument("foo", action='append', location="json")
+
+        with app.test_request_context('/bubble', method="post",
+                                      data=json.dumps({"foo": ["bar", "bar2"]}),
+                                      content_type='application/json'):
+            args = parser.parse_args()
+            self.assertEquals(args['foo'], ['bar', 'bar2'])
+
     def test_parse_dest(self):
         req = Request.from_values("/bubble?foo=bar")
 
diff --git a/tox.ini b/tox.ini
index a40c5b4..0a77e34 100644
--- a/tox.ini
+++ b/tox.ini
@@ -4,7 +4,7 @@
 # and then run "tox" from this directory.
 
 [tox]
-envlist = py26, py27, py33, py34
+envlist = py26, py27, py33, py34, py35, py36
 
 [testenv]
 usedevelop = true

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/flask-restful.git



More information about the Python-modules-commits mailing list