Holy black magic batman, move the query parameters to decorators and expose them through discovery.
This commit is contained in:
parent
b3e0dfae48
commit
978d68f0e0
5 changed files with 209 additions and 135 deletions
|
@ -1,5 +1,8 @@
|
|||
import logging
|
||||
|
||||
from flask import Blueprint, request
|
||||
from flask.ext.restful import Resource, abort
|
||||
from flask.ext.restful import Resource, abort, Api, reqparse
|
||||
from flask.ext.restful.utils.cors import crossdomain
|
||||
from flask.ext.login import current_user
|
||||
from calendar import timegm
|
||||
from email.utils import formatdate
|
||||
|
@ -13,8 +16,17 @@ from auth.permissions import (ReadRepositoryPermission,
|
|||
AdministerRepositoryPermission)
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
api_bp = Blueprint('api', __name__)
|
||||
api = Api(api_bp)
|
||||
api.decorators = [crossdomain(origin='*')]
|
||||
|
||||
api = Blueprint('api', __name__)
|
||||
|
||||
def resource(*urls, **kwargs):
|
||||
def wrapper(api_resource):
|
||||
api.add_resource(api_resource, *urls, **kwargs)
|
||||
return api_resource
|
||||
return wrapper
|
||||
|
||||
|
||||
def truthy_bool(param):
|
||||
|
@ -44,6 +56,41 @@ def method_metadata(func, name):
|
|||
nickname = partial(add_method_metadata, 'nickname')
|
||||
|
||||
|
||||
def query_parameter(name, help_str, type=reqparse.text_type,
|
||||
default=None, choices=(), required=False):
|
||||
def add_param(func):
|
||||
logger.debug('%s', func)
|
||||
if '__api_query_params' not in dir(func):
|
||||
func.__api_query_params = []
|
||||
func.__api_query_params.append({
|
||||
'name': name,
|
||||
'type': type,
|
||||
'help': help_str,
|
||||
'default': default,
|
||||
'choices': choices,
|
||||
'required': required,
|
||||
})
|
||||
return func
|
||||
return add_param
|
||||
|
||||
|
||||
def parse_args(func):
|
||||
@wraps(func)
|
||||
def wrapper(self, *args, **kwargs):
|
||||
if '__api_query_params' not in dir(func):
|
||||
logger.debug('No query params defined.')
|
||||
logger.debug('%s', func)
|
||||
abort(400)
|
||||
|
||||
parser = reqparse.RequestParser()
|
||||
for arg_spec in func.__api_query_params:
|
||||
parser.add_argument(**arg_spec)
|
||||
parsed_args = parser.parse_args()
|
||||
|
||||
return func(self, parsed_args, *args, **kwargs)
|
||||
return wrapper
|
||||
|
||||
|
||||
def parse_repository_name(func):
|
||||
@wraps(func)
|
||||
def wrapper(repository, *args, **kwargs):
|
||||
|
|
Reference in a new issue