Holy black magic batman, move the query parameters to decorators and expose them through discovery.

This commit is contained in:
jakedt 2014-03-11 12:57:33 -04:00
parent b3e0dfae48
commit 978d68f0e0
5 changed files with 209 additions and 135 deletions

View file

@ -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):