import re from flask.ext.restful import Api, Resource from flask.ext.restful.utils.cors import crossdomain from endpoints.api import api, method_metadata, nickname from endpoints.common import get_route_data from app import app discovery_api = Api(api) discovery_api.decorators = [crossdomain(origin='*')] param_regex = re.compile(r'<([\w]+:)?([\w]+)>') def swagger_route_data(): apis = [] models = {} for rule in app.url_map.iter_rules(): endpoint_method = app.view_functions[rule.endpoint] if 'view_class' in dir(endpoint_method): operations = [] method_names = list(rule.methods.difference(['HEAD', 'OPTIONS'])) for method_name in method_names: method = getattr(endpoint_method.view_class, method_name.lower(), None) parameters = [] for param in rule.arguments: parameters.append({ 'paramType': 'path', 'name': param, 'dataType': 'string', 'description': 'Param description.', 'required': True, }) req_schema_name = method_metadata(method, 'request_schema') if req_schema_name: parameters.append({ 'paramType': 'body', 'name': 'request_body', 'description': 'Request body contents.', 'dataType': req_schema_name, 'required': True, }) schema = endpoint_method.view_class.schemas[req_schema_name] models[req_schema_name] = schema if method is not None: operations.append({ 'method': method_name, 'nickname': method_metadata(method, 'nickname'), 'type': 'void', 'parameters': parameters, }) swagger_path = param_regex.sub(r'{\2}', rule.rule) apis.append({ 'path': swagger_path, 'description': 'Resource description.', 'operations': operations, }) swagger_data = { 'apiVersion': 'v1', 'swaggerVersion': '1.2', 'basePath': 'https://quay.io/', 'resourcePath': '/', 'apis': apis, 'models': models, } return swagger_data class DiscoveryResource(Resource): @nickname('discovery') def get(self): return swagger_route_data() discovery_api.add_resource(DiscoveryResource, '/v1/discovery')