#!/usr/bin/env python import jwt import datetime from flask import Blueprint, jsonify, request from flask_autodoc import Autodoc login_api = Blueprint('loginApi', __name__) auto = Autodoc() @login_api.route('/login/spec') def login_doc(): """ Documentation for the /login route :return: """ return auto.html() @login_api.route('/login/register', methods=['POST']) @auto.doc() def register() -> tuple: """ Register a new user :return: """ # import here because of circular reference from keanu.models.users import User, UserFullName, PaymentInfo, Address if request.json is not None: new_user = User(username=request.json['username'],
from flask_cors import CORS from flask_autodoc import Autodoc # sql exceptions from sqlalchemy import exc # project imports from replyreminder.models import db, Person, Reminder from sendReminders import sendLoginButton, getPSID, getUserId # app setup app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URL'] CORS(app) db.init_app(app) auto = Autodoc(app) with app.app_context(): db.create_all() # parser args parser = reqparse.RequestParser() parser.add_argument('userid') parser.add_argument('account_linking_token') parser.add_argument('auth_token') parser.add_argument('gsid') parser.add_argument('psid') parser.add_argument('email') parser.add_argument('first_name') parser.add_argument('last_name') parser.add_argument('timezone')
''' A client that is very biased ''' import json import random import argparse import numpy as np from flask import Flask from flask_autodoc import Autodoc app = Flask("biasedplayer") doc = Autodoc(app) hands = ['rock', 'paper', 'scissors'] preferredHand = random.randint(0, 2) print("Player will always play {}".format(hands[preferredHand])) # -------------------------------------------------------------- @app.route('/hand/<opponent>') @doc.doc() def request_hand(opponent): ''' Let the player play a hand ''' return json.dumps({'hand': hands[preferredHand]})
def setUp(self): self.app = Flask(__name__) self.app.debug = True self.autodoc = Autodoc(self.app)
class TestAutodoc(unittest.TestCase): def setUp(self): self.app = Flask(__name__) self.app.debug = True self.autodoc = Autodoc(self.app) @staticmethod def thisFile(): """Returns the basename of __file__ without a trailing 'c'""" filename = os.path.basename(__file__) if filename.endswith('.pyc'): filename = filename[:-1] return filename def testGet(self): @self.app.route('/') @self.autodoc.doc() def index(): """Returns a hello world message""" return 'Hello World!' with self.app.app_context(): doc = self.autodoc.generate() self.assertTrue(len(doc) == 1) d = doc[0] self.assertIn('GET', d['methods']) self.assertNotIn('POST', d['methods']) self.assertEqual(d['rule'], '/') self.assertEqual(d['endpoint'], 'index') self.assertEqual(d['docstring'], 'Returns a hello world message') self.assertIsInstance(d['location']['line'], int) self.assertIn(self.thisFile(), d['location']['filename']) self.assertFalse(d['defaults']) def testPost(self): @self.app.route('/', methods=['POST']) @self.autodoc.doc() def index(): """Returns a hello world message""" return 'Hello World!' with self.app.app_context(): doc = self.autodoc.generate() self.assertTrue(len(doc) == 1) d = doc[0] self.assertIn('POST', d['methods']) self.assertNotIn('GET', d['methods']) self.assertEqual(d['rule'], '/') self.assertEqual(d['endpoint'], 'index') self.assertEqual(d['docstring'], 'Returns a hello world message') self.assertIsInstance(d['location']['line'], int) self.assertIn(self.thisFile(), d['location']['filename']) self.assertFalse(d['defaults']) def testParams(self): @self.app.route('/p1/p2', defaults={'param1': 'a', 'param2': 'b'}) @self.app.route('/p1/<string:param1>/p2/<int:param2>') @self.autodoc.doc() def ab(param1, param2): return 'param1=%s param2=%s' % (param1, param2) with self.app.app_context(): doc = self.autodoc.generate() self.assertTrue(len(doc) == 2) rules = [doc[i]['rule'] for i in range(len(doc))] self.assertTrue('/p1/p2' in rules) self.assertTrue('/p1/<string:param1>/p2/<int:param2>' in rules) for d in doc: self.assertEqual(d['endpoint'], 'ab') self.assertIsNone(d['docstring']) if '/p1/p2' in d['rule']: self.assertDictEqual(d['defaults'], { 'param2': 'b', 'param1': 'a' }) elif '/p1/<string:param1>/p2/<int:param2>' in d['rule']: self.assertFalse(d['defaults']) def testGroup(self): @self.app.route('/pri') @self.autodoc.doc('private') def pri(): return 'This is a private endpoint' @self.app.route('/pub') @self.autodoc.doc('public') def pub(): return 'This is a public endpoint' with self.app.app_context(): doc = self.autodoc.generate() self.assertTrue(len(doc) == 2) doc = self.autodoc.generate('all') self.assertTrue(len(doc) == 2) doc = self.autodoc.generate('private') self.assertTrue(len(doc) == 1) self.assertIn('/pri', doc[0]['rule']) doc = self.autodoc.generate('public') self.assertTrue(len(doc) == 1) self.assertIn('/pub', doc[0]['rule']) def testGroups(self): @self.app.route('/a') @self.autodoc.doc() def a(): return 'Hello world, a!' @self.app.route('/b') @self.autodoc.doc(groups=['group1', 'group2']) def b(): return 'Hello world, b!' @self.app.route('/c') @self.autodoc.doc('group2') def c(): return 'Hello world, c!' with self.app.app_context(): doc = self.autodoc.generate() self.assertTrue(len(doc) == 3) doc = self.autodoc.generate('all') self.assertTrue(len(doc) == 3) doc = self.autodoc.generate('group1') self.assertTrue(len(doc) == 1) self.assertIn('/b', doc[0]['rule']) doc = self.autodoc.generate('group2') self.assertTrue(len(doc) == 2) rules = [doc[i]['rule'] for i in range(len(doc))] self.assertIn('/b', rules) self.assertIn('/c', rules) doc = self.autodoc.generate(groups=['group2']) self.assertTrue(len(doc) == 2) rules = [doc[i]['rule'] for i in range(len(doc))] self.assertIn('/b', rules) self.assertIn('/c', rules) def testCustomParams(self): @self.app.route('/needsargs', methods=['GET']) @self.autodoc.doc('needs_getargs', getargs={ 'a': 'A Value', 'b': 'B Value' }) def getit(): return 'I need specific GET parameters.' @self.app.route('/noargs') @self.autodoc.doc(groups=['needs_json', 'noargs'], expected_type='application/json') def needjson(): return 'I do not need any parameters, but am picky about types.' with self.app.app_context(): doc = self.autodoc.generate('needs_getargs') self.assertTrue(len(doc) == 1) self.assertIn('getargs', doc[0]) self.assertEqual('B Value', doc[0]['getargs']['b']) doc = self.autodoc.generate('noargs') self.assertTrue(len(doc) == 1) self.assertNotIn('getargs', doc[0]) doc = self.autodoc.generate('needs_json') self.assertTrue(len(doc) == 1) self.assertIn('expected_type', doc[0]) self.assertEqual('application/json', doc[0]['expected_type']) def testOverrideParams(self): @self.app.route('/added') @self.autodoc.doc('add', args=['option']) def original(): return 'I make my own options.' @self.app.route('/modified', defaults={'option1': 1}) @self.app.route('/modified/<int:option1>') @self.autodoc.doc('modify', args=['option2'], defaults=[2]) def override_allowed(option1): return 'I modify my own options.' @self.app.route('/prohibited') @self.autodoc.doc('fail', rule='/not/supposed/to/be/here') def override_prohibited(): return 'I make my own rules.' with self.app.app_context(): doc = self.autodoc.generate('add') self.assertTrue(len(doc) == 1) self.assertIn('option', doc[0]['args']) doc = self.autodoc.generate('modify') args = [doc[i]['args'] for i in range(len(doc))] defaults = [doc[i]['defaults'] for i in range(len(doc))] self.assertNotIn(['option1'], args) self.assertNotIn([1], defaults) self.assertIn(['option2'], args) self.assertIn([2], defaults) doc = self.autodoc.generate('fail') self.assertTrue(len(doc) == 1) self.assertNotEqual('/not/supposed/to/be/here', doc[0]['rule']) self.assertEqual('/prohibited', doc[0]['rule']) def testHTML(self): @self.app.route('/') @self.autodoc.doc() def index(): """Returns a hello world message""" return 'Hello World!' with self.app.app_context(): doc = self.autodoc.html() self.assertIn('/', doc) self.assertIn('Returns a hello world message', doc) def testHTMLWithArgs(self): @self.app.route('/p1/p2', defaults={'param1': 'a', 'param2': 'b'}) @self.app.route('/p1/<string:param1>/p2/<int:param2>') @self.autodoc.doc() def ab(param1, param2): """Returns arguments This endpoint returns the value of the 2 parameters: - param1 - param2 """ return 'param1=%s param2=%s' % (param1, param2) with self.app.app_context(): doc = self.autodoc.html(title='hello') self.assertIn('/p1/p2', doc) if sys.version < '3': self.assertRegexpMatches( doc, '\/p1\/.*string:param1.*\/p2\/.*int:param2.*') else: self.assertRegex( doc, '\/p1\/.*string:param1.*\/p2\/.*int:param2.*') self.assertIn('Returns arguments', doc) def testLocation(self): line_no = inspect.stack()[0][2] + 2 # the doc() line @self.app.route('/location') @self.autodoc.doc() def location(): return 'location' with self.app.app_context(): doc = self.autodoc.generate() d = doc[0] self.assertIsInstance(d['location']['line'], int) self.assertEqual(d['location']['line'], line_no) self.assertIn(self.thisFile(), d['location']['filename']) def testNoLocation(self): @self.app.route('/location') @self.autodoc.doc(set_location=False) def location(): return 'location' with self.app.app_context(): doc = self.autodoc.generate() d = doc[0] self.assertIsNone(d['location']) def testRedecorate(self): @self.app.route('/redecorate') # add to "all" and "group1" @self.autodoc.doc('group1') def redecorate(): return 'redecorate' # add to "group2" self.app.view_functions['redecorate'] = self.autodoc.doc('group2')( redecorate) with self.app.app_context(): self.assertTrue(1 == len(self.autodoc.generate('all'))) self.assertTrue(1 == len(self.autodoc.generate('group1'))) self.assertTrue(1 == len(self.autodoc.generate('group2'))) self.assertFalse(1 == len(self.autodoc.generate('group3')))
from flask_mongoalchemy import MongoAlchemy from flask_autodoc import Autodoc from keanu.routes.login import login_api from keanu.routes.items import item_api flask_app = Flask(__name__) flask_app.config['MONGOALCHEMY_CONNECTION_STRING'] = os.getenv( 'DBURI', 'mongodb://localhost/kanaoreeves') flask_app.config['MONGOALCHEMY_DATABASE'] = 'kanaoreeves' flask_db = MongoAlchemy(flask_app) CORS(flask_app) flask_app.register_blueprint(login_api) flask_app.register_blueprint(item_api) auto = Autodoc(flask_app) @flask_app.route('/spec', methods=['GET']) def spec(): """ Spec for root endpoints :return: """ return auto.html() @flask_app.before_request def before_request() -> tuple: """ Checks if a token header in requests