Skip to content

Commit

Permalink
Fix Api.decorators not being applied to /schema
Browse files Browse the repository at this point in the history
The API schema can now be published by setting POTION_DECORATE_SCHEMA_ENDPOINTS to False
  • Loading branch information
lyschoening committed Jan 23, 2017
1 parent ed7cf2e commit f3e3079
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 14 deletions.
31 changes: 18 additions & 13 deletions flask_potion/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,24 +102,34 @@ def _init_app(self, app):
"""
app.config.setdefault('POTION_MAX_PER_PAGE', 100)
app.config.setdefault('POTION_DEFAULT_PER_PAGE', 20)
app.config.setdefault('POTION_DECORATE_SCHEMA_ENDPOINTS', True)

self._register_view(app,
rule=''.join((self.prefix, '/schema')),
view_func=self.output(self._schema_view),
view_func=self._schema_view,
endpoint='schema',
methods=['GET'])
methods=['GET'],
relation='describedBy')

for route, resource, view_func, endpoint, methods in self.views:
for route, resource, view_func, endpoint, methods, relation in self.views:
rule = route.rule_factory(resource)
self._register_view(app, rule, view_func, endpoint, methods)
self._register_view(app, rule, view_func, endpoint, methods, relation)

app.handle_exception = partial(self._exception_handler, app.handle_exception)
app.handle_user_exception = partial(self._exception_handler, app.handle_user_exception)

def _register_view(self, app, rule, view_func, endpoint, methods):
def _register_view(self, app, rule, view_func, endpoint, methods, relation):
decorate_view_func = relation != 'describedBy' or app.config['POTION_DECORATE_SCHEMA_ENDPOINTS']

if self.blueprint:
endpoint = '{}.{}'.format(self.blueprint.name, endpoint)

view_func = self.output(view_func)

if decorate_view_func:
for decorator in self.decorators:
view_func = decorator(view_func)

app.add_url_rule(rule,
view_func=view_func,
endpoint=endpoint,
Expand Down Expand Up @@ -180,15 +190,10 @@ def add_route(self, route, resource, endpoint=None, decorator=None):
if decorator:
view_func = decorator(view_func)

view = self.output(view_func)

for decorator in self.decorators:
view = decorator(view)

if self.app:
self.app.add_url_rule(rule, view_func=view, endpoint=endpoint, methods=methods)
if self.app and not self.blueprint:
self._register_view(self.app, rule, view_func, endpoint, methods, route.relation)
else:
self.views.append((route, resource, view, endpoint, methods))
self.views.append((route, resource, view_func, endpoint, methods, route.relation))

def add_resource(self, resource):
"""
Expand Down
48 changes: 47 additions & 1 deletion tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from functools import wraps

from flask_potion.routes import Route, ItemRoute
from flask_potion import Api, fields
from flask_potion.contrib.memory.manager import MemoryManager
from flask_potion.resource import ModelResource
from flask_potion.resource import ModelResource, Resource
from tests import BaseTestCase


Expand Down Expand Up @@ -80,6 +82,50 @@ def rating(self):
"/api/v1/book/{id}/rating"
}, {l['href'] for l in response.json['links']})

def test_schema_decoration(self):
def is_teapot(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
return '', 418, {}
return wrapper

api = Api(self.app, decorators=[is_teapot])

class FooResource(Resource):
class Meta:
name = 'foo'

api.add_resource(FooResource)

response = self.client.get("/schema")
self.assertEqual(response.status_code, 418)

response = self.client.get("/foo/schema")
self.assertEqual(response.status_code, 418)

def test_schema_decoration_disable(self):
def is_teapot(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
return '', 418, {}

return wrapper

self.app.config['POTION_DECORATE_SCHEMA_ENDPOINTS'] = False
api = Api(self.app, decorators=[is_teapot])

class FooResource(Resource):
class Meta:
name = 'foo'

api.add_resource(FooResource)

response = self.client.get("/schema")
self.assert200(response)

response = self.client.get("/foo/schema")
self.assert200(response)

def test_api_crud_resource(self):
class BookResource(ModelResource):
class Schema:
Expand Down

0 comments on commit f3e3079

Please sign in to comment.