From 72653c0d3ac5ea5265479e7e53ff39cfe62a00ce Mon Sep 17 00:00:00 2001 From: DavidRThrashJr <60800614+DavidRThrashJr@users.noreply.github.com> Date: Thu, 20 Feb 2020 03:35:03 -0500 Subject: [PATCH] Added support for multiple API versions (#533) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added support for multiple API versions Note that no changes were made to the api, the code was refactored to allow for new versions of the api to be created down the road. Here's what this would look like: +-- api/ +-- v1/ +-- __init__.py +-- resources.py +-- v1_1/ +-- __init__.py +-- resources.py +-- v2/ +-- __init__.py +-- resources.py +-- __init__.py +-- common.py * reformatted using black /Users/drthrash/PycharmProjects/ihatemoney/ihatemoney/api/v1/resources.py reformatted /Users/drthrash/PycharmProjects/ihatemoney/ihatemoney/api/common.py All done! ✨ 🍰 ✨ * Applying fix for unused import in init.py https://stackoverflow.com/questions/31079047/python-pep8-class-in-init-imported-but-not-used * Formatting changes recommended by black All done! ✨ 🍰 ✨ 1 file reformatted, 22 files left unchanged. --- ihatemoney/api/__init__.py | 0 ihatemoney/{api.py => api/common.py} | 26 ++------------------- ihatemoney/api/v1/__init__.py | 5 ++++ ihatemoney/api/v1/resources.py | 34 ++++++++++++++++++++++++++++ ihatemoney/run.py | 4 ++-- 5 files changed, 43 insertions(+), 26 deletions(-) create mode 100644 ihatemoney/api/__init__.py rename ihatemoney/{api.py => api/common.py} (86%) create mode 100644 ihatemoney/api/v1/__init__.py create mode 100644 ihatemoney/api/v1/resources.py diff --git a/ihatemoney/api/__init__.py b/ihatemoney/api/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ihatemoney/api.py b/ihatemoney/api/common.py similarity index 86% rename from ihatemoney/api.py rename to ihatemoney/api/common.py index 67c6cc183..728d2a8ef 100644 --- a/ihatemoney/api.py +++ b/ihatemoney/api/common.py @@ -1,7 +1,6 @@ # coding: utf8 -from flask import Blueprint, request, current_app -from flask_restful import Resource, Api, abort -from flask_cors import CORS +from flask import request, current_app +from flask_restful import Resource, abort from wtforms.fields.core import BooleanField from ihatemoney.models import db, Project, Person, Bill @@ -10,11 +9,6 @@ from functools import wraps -api = Blueprint("api", __name__, url_prefix="/api") -CORS(api) -restful_api = Api(api) - - def need_auth(f): """Check the request for basic authentication for a given project. @@ -195,19 +189,3 @@ def get(self, project): token = project.generate_token() return {"token": token}, 200 - - -restful_api.add_resource(ProjectsHandler, "/projects") -restful_api.add_resource(ProjectHandler, "/projects/") -restful_api.add_resource(TokenHandler, "/projects//token") -restful_api.add_resource(MembersHandler, "/projects//members") -restful_api.add_resource( - ProjectStatsHandler, "/projects//statistics" -) -restful_api.add_resource( - MemberHandler, "/projects//members/" -) -restful_api.add_resource(BillsHandler, "/projects//bills") -restful_api.add_resource( - BillHandler, "/projects//bills/" -) diff --git a/ihatemoney/api/v1/__init__.py b/ihatemoney/api/v1/__init__.py new file mode 100644 index 000000000..11afff7bc --- /dev/null +++ b/ihatemoney/api/v1/__init__.py @@ -0,0 +1,5 @@ +from .resources import api + +__all__ = [ + "api", +] diff --git a/ihatemoney/api/v1/resources.py b/ihatemoney/api/v1/resources.py new file mode 100644 index 000000000..821ba2bd5 --- /dev/null +++ b/ihatemoney/api/v1/resources.py @@ -0,0 +1,34 @@ +# coding: utf8 +from flask import Blueprint +from flask_restful import Api +from flask_cors import CORS + +from ihatemoney.api.common import ( + ProjectsHandler, + ProjectHandler, + TokenHandler, + MemberHandler, + ProjectStatsHandler, + MembersHandler, + BillHandler, + BillsHandler, +) + +api = Blueprint("api", __name__, url_prefix="/api") +CORS(api) +restful_api = Api(api) + +restful_api.add_resource(ProjectsHandler, "/projects") +restful_api.add_resource(ProjectHandler, "/projects/") +restful_api.add_resource(TokenHandler, "/projects//token") +restful_api.add_resource(MembersHandler, "/projects//members") +restful_api.add_resource( + ProjectStatsHandler, "/projects//statistics" +) +restful_api.add_resource( + MemberHandler, "/projects//members/" +) +restful_api.add_resource(BillsHandler, "/projects//bills") +restful_api.add_resource( + BillHandler, "/projects//bills/" +) diff --git a/ihatemoney/run.py b/ihatemoney/run.py index 6d1e03292..161761c09 100644 --- a/ihatemoney/run.py +++ b/ihatemoney/run.py @@ -8,7 +8,7 @@ from flask_migrate import Migrate, upgrade, stamp from werkzeug.middleware.proxy_fix import ProxyFix -from ihatemoney.api import api +from ihatemoney.api.v1 import api as apiv1 from ihatemoney.models import db from ihatemoney.utils import ( IhmJSONEncoder, @@ -132,7 +132,7 @@ def create_app( validate_configuration(app) app.register_blueprint(web_interface) - app.register_blueprint(api) + app.register_blueprint(apiv1) app.register_error_handler(404, page_not_found) # Configure the a, root="main"pplication