Skip to content
Snippets Groups Projects
Verified Commit 3a8b7f84 authored by David Beniamine's avatar David Beniamine
Browse files

WIP generic api

parent 6ec1a2ad
No related branches found
No related tags found
1 merge request!2Draft:Generic api v1
import importlib
prefix = 'v1'
def add_resource(api, docs, name):
path = f'/{prefix}/{name}'
# To CamelCase
class_name = ''.join([x.capitalize() for x in name.split('_')])
mod_name = f'Mirador_backend.resources.{name}'
module = importlib.import_module(mod_name)
class_ = getattr(module, f'{class_name}Group')
api.add_resource(class_, f'{path}')
docs.register(class_)
class_ = getattr(module, f'{class_name}Item')
api.add_resource(class_, f'{path}/<int:id>')
docs.register(class_)
def register_api(api, docs):
add_resource(api, docs, 'mirador_resource')
from flask import Flask from flask import Flask
from flask_restful import Api from flask_restful import Api
from Mirador_backend.resources.mirador_resource import MiradorResource
from flask_restful_swagger import swagger from flask_restful_swagger import swagger
from apispec import APISpec from apispec import APISpec
from apispec.ext.marshmallow import MarshmallowPlugin from apispec.ext.marshmallow import MarshmallowPlugin
from flask_apispec.extension import FlaskApiSpec from flask_apispec.extension import FlaskApiSpec
from Mirador_backend.api import v1
app = Flask(__name__) app = Flask(__name__)
api = Api(app) api = Api(app)
docs = FlaskApiSpec(app) docs = FlaskApiSpec(app)
api.add_resource(MiradorResource, '/mirador_resource', '/mirador_resource/<int:id>') v1.register_api(api, docs)
docs.register(MiradorResource)
app.config.update({ app.config.update({
'APISPEC_SPEC': APISpec( 'APISPEC_SPEC': APISpec(
......
from apispec.ext.marshmallow import MarshmallowPlugin
from flask_apispec.extension import FlaskApiSpec
from marshmallow import Schema, fields
from apispec import APISpec
from flask_restful import Resource
from flask_restful_swagger import swagger
from flask_apispec.views import MethodResource
class ResourceGroup(MethodResource, Resource):
def get(self):
# TODO
return {'method': 'get', 'mode': 'group'}
def post(self):
# TODO
return {'method': 'post', 'mode': 'group'}
class ResourceItem(MethodResource, Resource):
def get(self, id):
# TODO
return {'method': 'get', 'id': id, 'mode': 'item'}
def post(self, id):
# TODO
return {'method': 'post', 'id': id, 'mode': 'item'}
def put(self, id):
# TODO
return {'method': 'put', 'id': id, 'mode': 'item'}
def patch(self, id):
# TODO
return {'method': 'patch', 'id': id, 'mode': 'item'}
def delete(self, id):
# TODO
return {'method': 'delete', 'id': id, 'mode': 'item'}
from flask_restful import Resource from Mirador_backend.resources.base import ResourceGroup, ResourceItem
from flask_restful_swagger import swagger
from apispec import APISpec
from marshmallow import Schema, fields
from apispec.ext.marshmallow import MarshmallowPlugin
from flask_apispec.extension import FlaskApiSpec
from flask_apispec.views import MethodResource
from flask_apispec import marshal_with, doc, use_kwargs from flask_apispec import marshal_with, doc, use_kwargs
class MRResponseSchema(Schema):
message = fields.Str(default='Success')
class MRRequestSchema(Schema):
class Meta:
fields = ('name', 'description') # TODO just an example
class MiradorResource(MethodResource,Resource):
@doc(description='Mirador resource i e, manifest and collection of IIIF resource', tags=['Mirador resource'])
@marshal_with(MRResponseSchema) # marshalling
def get(self, id=None):
return {'method': 'get', 'id': id}
@doc(description='Create Mirador resource i e, manifest and collection of IIIF resource', tags=['Mirador resource']) class MiradorResourceGroup(ResourceGroup):
@use_kwargs(MRRequestSchema, location=('json')) resourceDescription = 'Mirador resource i e, manifest and collection of IIIF resource'
def post(self): tags = ['Mirador resource']
return {'method': 'post'}
def put(self, id): doc(description=f'Get all {resourceDescription}', tags=tags)(ResourceGroup.get)
return {'method': 'put', 'id': id} doc(description=f'Create a {resourceDescription}', tags=tags)(ResourceGroup.post)
def patch(self, id):
return {'method': 'patch', 'id': id}
def delete(self, id): class MiradorResourceItem(ResourceItem):
return {'method': 'delete', 'id': id} pass
...@@ -4,8 +4,6 @@ from Mirador_backend.tests.tester import TestCase ...@@ -4,8 +4,6 @@ from Mirador_backend.tests.tester import TestCase
class MiradorResourceTest(TestCase): class MiradorResourceTest(TestCase):
base = '/mirador_resource'
def testGet(self): def testGet(self):
# TODO payload # TODO payload
payload = json.dumps({}) payload = json.dumps({})
......
...@@ -5,7 +5,7 @@ from Mirador_backend.app import app ...@@ -5,7 +5,7 @@ from Mirador_backend.app import app
class TestCase(unittest.TestCase): class TestCase(unittest.TestCase):
def setUp(self): def setUp(self):
self.base = '/mirador_resource' self.base = 'v1/mirador_resource'
self.app = app self.app = app
app.testing = True app.testing = True
self.client = app.test_client() self.client = app.test_client()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment