From 267eeabebacb870eb788ff241cb3188240c0c218 Mon Sep 17 00:00:00 2001 From: Marc Gibbons Date: Fri, 21 Oct 2016 15:34:36 -0400 Subject: [PATCH 1/3] Bump versions, make DRF 3.5 minimum requirement. --- README.md | 4 +--- docs/index.md | 2 +- requirements.txt | 10 +++++----- setup.py | 3 ++- tox.ini | 20 +++++++++++--------- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index c803d39f..7369e03b 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,6 @@ Full documentation: http://marcgibbons.github.io/django-rest-swagger/ -**Note:** you are viewing documentation for version 2, using Django REST Framework 3.4.1+ and CoreAPI. Documentation for previous versions is available [here](http://django-rest-swagger.readthedocs.io/en/stable-0.3.x/). - ## Installation @@ -53,7 +51,7 @@ urlpatterns = [ ## Requirements * Django 1.8+ -* Django REST framework 3.4.1+ +* Django REST framework 3.5.1+ * Python 2.7, 3.5 diff --git a/docs/index.md b/docs/index.md index aa3e1928..f0933d6d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ Swagger/OpenAPI Documentation Generator for Django REST Framework --- -**Note:** you are viewing documentation for version 2, using Django REST Framework 3.4+ and CoreAPI. Documentation for previous versions is available [here](http://django-rest-swagger.readthedocs.io/en/stable-0.3.x/). +**Note:** you are viewing documentation for version 2, using Django REST Framework 3.5+ and CoreAPI. Documentation for previous versions is available [here](http://django-rest-swagger.readthedocs.io/en/stable-0.3.x/). --- diff --git a/requirements.txt b/requirements.txt index a1a0be7f..24f95037 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,11 @@ -Django==1.10 -djangorestframework==3.4.7 +Django==1.10.2 +djangorestframework==3.5.1 coreapi==2.0.8 -openapi-codec==1.1.3 -simplejson==3.8.2 +openapi-codec==1.1.7 +simplejson==3.9.0 # Testing -tox==2.3.1 +tox==2.4.1 pylint==1.6.4 coverage==4.2 ipdb==0.10.1 diff --git a/setup.py b/setup.py index 45652681..a305c3ff 100644 --- a/setup.py +++ b/setup.py @@ -44,7 +44,8 @@ version=VERSION, install_requires=[ 'coreapi>=2.0.8', - 'openapi-codec>=1.1.5', + 'openapi-codec>=1.1.7', + 'djangorestframework>=3.5.1', 'simplejson' ], packages=['rest_framework_swagger'], diff --git a/tox.ini b/tox.ini index 885f6349..a4b6c736 100644 --- a/tox.ini +++ b/tox.ini @@ -1,26 +1,28 @@ [tox] -envlist = +skipsdist=True +envlist = latest - {py27,py35}-django{1.8,1.9,1.10}-drf{3.4} + {py27,py35}-django{18,19,110}-drf35 lint [testenv] commands = python runtests.py deps = coreapi - openapi-codec - simplejson coverage - drf3.4: djangorestframework>=3.4.3,<3.5 - django1.8: Django>=1.8,<1.9 - django1.9: Django>=1.9,<1.10 - django1.10: Django>=1.10,<1.11 mock + openapi-codec + simplejson + drf34: djangorestframework==3.4.7 + drf35: djangorestframework>=3.5.1,<3.6 + django18: Django>=1.8,<1.9 + django19: Django>=1.9,<1.10 + django110: Django>=1.10,<1.11 [testenv:latest] commands = coverage run runtests.py pip_pre = True -deps = +deps = Django coreapi openapi-codec From 0edee4cbd701608d44e67ba5caf3755b889ab669 Mon Sep 17 00:00:00 2001 From: Marc Gibbons Date: Fri, 21 Oct 2016 17:29:56 -0400 Subject: [PATCH 2/3] Use DRF get_schema_view shortcut released in 3.5 --- example_app/snippets/views.py | 3 +- rest_framework_swagger/views.py | 31 +++---------- tests/test_views.py | 81 ++++++++------------------------- tox.ini | 1 - 4 files changed, 26 insertions(+), 90 deletions(-) diff --git a/example_app/snippets/views.py b/example_app/snippets/views.py index 32d55182..3993f734 100644 --- a/example_app/snippets/views.py +++ b/example_app/snippets/views.py @@ -34,7 +34,8 @@ def highlight(self, request, *args, **kwargs): def perform_create(self, serializer): serializer.save(owner=self.request.user) - + + class UserViewSet(viewsets.ReadOnlyModelViewSet): """ This endpoint presents the users in the system. diff --git a/rest_framework_swagger/views.py b/rest_framework_swagger/views.py index 6780d4f5..80c6af29 100644 --- a/rest_framework_swagger/views.py +++ b/rest_framework_swagger/views.py @@ -1,9 +1,5 @@ -from rest_framework import exceptions -from rest_framework.permissions import AllowAny +from rest_framework import schemas from rest_framework.renderers import CoreJSONRenderer -from rest_framework.response import Response -from rest_framework.schemas import SchemaGenerator -from rest_framework.views import APIView from . import renderers @@ -11,28 +7,13 @@ def get_swagger_view(title=None, url=None): """ Returns schema view which renders Swagger/OpenAPI. - - (Replace with DRF get_schema_view shortcut in 3.5) """ - class SwaggerSchemaView(APIView): - _ignore_model_permissions = True - exclude_from_schema = True - permission_classes = [AllowAny] - renderer_classes = [ + return schemas.get_schema_view( + title=title, + url=url, + renderer_classes=[ CoreJSONRenderer, renderers.OpenAPIRenderer, renderers.SwaggerUIRenderer ] - - def get(self, request): - generator = SchemaGenerator(title=title, url=url) - schema = generator.get_schema(request=request) - - if not schema: - raise exceptions.ValidationError( - 'The schema generator did not return a schema Document' - ) - - return Response(schema) - - return SwaggerSchemaView.as_view() + ) diff --git a/tests/test_views.py b/tests/test_views.py index 35f1f678..9541f0fa 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1,7 +1,6 @@ from django.test import TestCase -from rest_framework.permissions import AllowAny +from rest_framework import schemas from rest_framework.renderers import CoreJSONRenderer -from rest_framework.request import Request from rest_framework.test import APIRequestFactory from rest_framework_swagger import renderers @@ -16,66 +15,22 @@ def setUp(self): self.factory = APIRequestFactory() self.view_class = self.sut().cls - def test_title_and_urlpassed_to_schema_generator(self): - title = 'Vandelay' - url = 'https://github.com/marcgibbons/django-rest-swagger' - view = self.sut(title=title, url=url) - - with patch('rest_framework_swagger.views.SchemaGenerator') as mock: - request = self.factory.get('/') - view(request=request) - - mock.assert_called_once_with(title=title, url=url) - - def test_ignore_model_permissions_true(self): - self.assertTrue(self.view_class._ignore_model_permissions) - - def test_exclude_from_schema(self): - self.assertTrue(self.view_class.exclude_from_schema) - - def test_renderer_classes(self): - self.assertListEqual( - [ - CoreJSONRenderer, - renderers.OpenAPIRenderer, - renderers.SwaggerUIRenderer - ], - self.view_class.renderer_classes - ) - - def test_permission_class(self): - self.assertListEqual( - [AllowAny], - self.view_class.permission_classes + def test_returns_get_schema_view(self): + title = 'Vandelay Industries API', + url = 'http://vandelay.industries' + renderer_classes = [ + CoreJSONRenderer, + renderers.OpenAPIRenderer, + renderers.SwaggerUIRenderer + ] + + with patch.object(schemas, 'get_schema_view') as mock: + result = self.sut(title=title, url=url) + + mock.assert_called_once_with( + title=title, + url=url, + renderer_classes=renderer_classes ) - def test_return_400_if_schema_is_none(self): - with patch('rest_framework_swagger.views.SchemaGenerator') as mock: - mock.return_value.get_schema.return_value = None - request = self.factory.get('/') - response = self.sut()(request=request) - - self.assertEqual(400, response.status_code) - self.assertEqual( - ['The schema generator did not return a schema Document'], - response.data - ) - - def test_response_is_result_of_schema_generator(self): - expected = 'My amazing schema' - with patch('rest_framework_swagger.views.SchemaGenerator') as mock: - mock.return_value.get_schema.return_value = expected - request = self.factory.get('/') - response = self.sut()(request=request) - - self.assertEqual(200, response.status_code) - self.assertEqual(expected, response.data) - - def test_schema_generator_instantiated_with_request(self): - with patch('rest_framework_swagger.views.SchemaGenerator') as mock: - request = self.factory.get('/') - self.sut()(request=request) - - call_args = mock.return_value.get_schema.call_args[1] - self.assertIn('request', call_args) - self.assertIsInstance(call_args['request'], Request) + self.assertEqual(mock.return_value, result) diff --git a/tox.ini b/tox.ini index a4b6c736..75f2e73b 100644 --- a/tox.ini +++ b/tox.ini @@ -13,7 +13,6 @@ deps = mock openapi-codec simplejson - drf34: djangorestframework==3.4.7 drf35: djangorestframework>=3.5.1,<3.6 django18: Django>=1.8,<1.9 django19: Django>=1.9,<1.10 From d7f2a0a37e8cb1ba20c39c954d74ebd6194d020a Mon Sep 17 00:00:00 2001 From: Marc Gibbons Date: Sat, 29 Oct 2016 09:22:37 -0400 Subject: [PATCH 3/3] Bump version to 2.1.0 --- rest_framework_swagger/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework_swagger/__init__.py b/rest_framework_swagger/__init__.py index 4b259db3..a33997dd 100644 --- a/rest_framework_swagger/__init__.py +++ b/rest_framework_swagger/__init__.py @@ -1 +1 @@ -__version__ = '2.0.7' +__version__ = '2.1.0'