diff options
| author | Bryan Newbold <bnewbold@robocracy.org> | 2018-03-20 20:54:53 -0700 | 
|---|---|---|
| committer | Bryan Newbold <bnewbold@robocracy.org> | 2018-03-20 20:54:53 -0700 | 
| commit | 95e5a078f2cec66631e9b97e0c31b1e4daab3cff (patch) | |
| tree | 2b6b95240b44726938e82383097d18b6bfba904d | |
| parent | e75890052e6e7bc340d40c1c66992f4b10e03279 (diff) | |
| download | fatcat-95e5a078f2cec66631e9b97e0c31b1e4daab3cff.tar.gz fatcat-95e5a078f2cec66631e9b97e0c31b1e4daab3cff.zip | |
refactoring backend
| -rw-r--r-- | Pipfile | 7 | ||||
| -rw-r--r-- | Pipfile.lock | 22 | ||||
| -rw-r--r-- | fatcat/api.py | 166 | ||||
| -rw-r--r-- | fatcat/config.py | 2 | ||||
| -rw-r--r-- | fatcat/schema.py | 68 | 
5 files changed, 186 insertions, 79 deletions
| @@ -11,5 +11,10 @@ name = "pypi"  [packages] -sqlalchemy = "1.2"  flask = "*" +sqlalchemy = "*" + + +[requires] + +python_version = "3.5" diff --git a/Pipfile.lock b/Pipfile.lock index 62f57613..f161e7cf 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,23 +1,25 @@  {      "_meta": {          "hash": { -            "sha256": "24c6cfcf0485df83f3066606e51aa72a2a4978a7e67f4ae61e2aa59ad78ed982" +            "sha256": "fe78a27e3e59fb6689a6fe276f556286edf0daf058cd98af7f72b4088660809b"          },          "host-environment-markers": {              "implementation_name": "cpython", -            "implementation_version": "0", +            "implementation_version": "3.5.3",              "os_name": "posix",              "platform_machine": "x86_64",              "platform_python_implementation": "CPython", -            "platform_release": "4.9.0-4-amd64", +            "platform_release": "4.9.0-6-amd64",              "platform_system": "Linux", -            "platform_version": "#1 SMP Debian 4.9.51-1 (2017-09-28)", -            "python_full_version": "2.7.13", -            "python_version": "2.7", -            "sys_platform": "linux2" +            "platform_version": "#1 SMP Debian 4.9.82-1+deb9u2 (2018-02-21)", +            "python_full_version": "3.5.3", +            "python_version": "3.5", +            "sys_platform": "linux"          },          "pipfile-spec": 6, -        "requires": {}, +        "requires": { +            "python_version": "3.5" +        },          "sources": [              {                  "name": "pypi", @@ -62,9 +64,9 @@          },          "sqlalchemy": {              "hashes": [ -                "sha256:9ede7070d6fd18f28058be88296ed67893e2637465516d6a596cd9afea97b154" +                "sha256:249000654107a420a40200f1e0b555a79dfd4eff235b2ff60bc77714bd045f2d"              ], -            "version": "==1.2.1" +            "version": "==1.2.5"          },          "werkzeug": {              "hashes": [ diff --git a/fatcat/api.py b/fatcat/api.py new file mode 100644 index 00000000..6e8f9bdf --- /dev/null +++ b/fatcat/api.py @@ -0,0 +1,166 @@ + +import argparse +from flask import Flask, render_template, send_from_directory, request, \ +    url_for, abort, g, redirect, jsonify +from sqlalchemy import create_engine, MetaData, Table + +app = Flask(__name__) +app.config.from_pyfile('config.py') + +metadata = MetaData() + + +## SQL Schema ############################################################### + +import enum +from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, \ +    Enum + +# TODO: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/mixins.html + +class IdState(enum.Enum): +    normal = 1 +    redirect = 2 +    removed = 3 + +work_id = Table('work_id', metadata, +    Column('id', Integer, primary_key=True, autoincrement=False), +    Column('revision', ForeignKey('work_revision.id')), +    ) + +work_revision = Table('work_revision', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('previous', ForeignKey('work_revision.id'), nullable=True), +    Column('state', Enum(IdState)), +    Column('redirect_id', ForeignKey('work_id.id'), nullable=True), +    Column('edit_id', ForeignKey('edit.id')), + +    Column('title', String), +    Column('work_type', String), +    Column('date', String), +    ) + +release_id = Table('release_id', metadata, +    Column('id', Integer, primary_key=True, autoincrement=False), +    Column('revision', ForeignKey('release_revision.id')), +    ) + +release_revision = Table('release_revision', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('previous', ForeignKey('release_revision.id'), nullable=True), +    Column('state', Enum(IdState)), +    Column('redirect_id', ForeignKey('release_id.id'), nullable=True), +    Column('edit_id', ForeignKey('edit.id')), + +    Column('work', ForeignKey('work_id.id')), +    Column('container', ForeignKey('container_id.id')), +    Column('title', String), +    Column('license', String),          # TODO: oa status foreign key +    Column('release_type', String),     # TODO: foreign key +    Column('date', String),             # TODO: datetime +    Column('doi', String),              # TODO: identifier table +    ) + +creator_id = Table('creator_id', metadata, +    Column('id', Integer, primary_key=True, autoincrement=False), +    Column('revision', ForeignKey('creator_revision.id')), +    ) + +creator_revision = Table('creator_revision', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('previous', ForeignKey('creator_revision.id'), nullable=True), +    Column('state', Enum(IdState)), +    Column('redirect_id', ForeignKey('creator_id.id'), nullable=True), +    Column('edit_id', ForeignKey('edit.id')), + +    Column('name', String), +    Column('sortname', String), +    Column('orcid', String),            # TODO: identifier table +    ) + +work_contrib = Table('work_contrib', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('work_rev', ForeignKey('work_revision.id'), nullable=False), +    Column('creator_id', ForeignKey('creator_id.id'), nullable=False), +    ) + +release_contrib = Table('release_contrib', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('release_rev', ForeignKey('release_revision.id'), nullable=False), +    Column('creator_id', ForeignKey('creator_id.id'), nullable=False), +    ) + +container_id = Table('container_id', metadata, +    Column('id', Integer, primary_key=True, autoincrement=False), +    Column('revision', ForeignKey('container_revision.id')), +    ) + +container_revision = Table('container_revision', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('previous', ForeignKey('container_revision.id'), nullable=True), +    Column('state', Enum(IdState)), +    Column('redirect_id', ForeignKey('container_id.id'), nullable=True), +    Column('edit_id', ForeignKey('edit.id')), + +    Column('name', String), +    Column('container', ForeignKey('container_id.id')), +    Column('publisher', String),        # TODO: foreign key +    Column('sortname', String), +    Column('issn', String),             # TODO: identifier table +    ) + +edit = Table('edit', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('edit_group', ForeignKey('edit_group.id')), +    Column('editor', ForeignKey('editor.id')), +    ) + +edit_group = Table('edit_group', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    ) + +editor = Table('editor', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('username', String), +    ) + +changelog = Table('changelog', metadata, +    Column('id', Integer, primary_key=True, autoincrement=True), +    Column('edit_id', ForeignKey('edit.id')), +    Column('timestamp', Integer), +    ) + + +## API Methods ############################################################## + +@app.route('/health', methods=['GET']) +def health(): +    return jsonify({'ok': True}) + +## Entry Point ############################################################## + +def main(): +    parser = argparse.ArgumentParser() +    parser.add_argument('--debug', +        action='store_true', +        help="enable debugging interface") +    parser.add_argument('--host', +        default="127.0.0.1", +        help="listen on this host/IP") +    parser.add_argument('--port', +        type=int, +        default=8040, +        help="listen on this port") +    parser.add_argument('--database-uri', +        default="sqlite:///test.sqlite", +        help="sqlalchemy database string") +    args = parser.parse_args() + +    app.config['DATABASE_URI'] = args.database_uri +    engine = create_engine(app.config['DATABASE_URI'], convert_unicode=True) +    metadata.create_all(bind=engine) +    app.run(debug=args.debug, host=args.host, port=args.port) + + +if __name__ == '__main__': +    main() diff --git a/fatcat/config.py b/fatcat/config.py new file mode 100644 index 00000000..d4196230 --- /dev/null +++ b/fatcat/config.py @@ -0,0 +1,2 @@ + +DATABASE_URI = "sqlite:///test.sqlite" diff --git a/fatcat/schema.py b/fatcat/schema.py deleted file mode 100644 index cdc98ccf..00000000 --- a/fatcat/schema.py +++ /dev/null @@ -1,68 +0,0 @@ - -from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey - -metadata = MetaData() - -# TODO: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/mixins.html - -work_id = Table('work_id', metadata, -    Column('id', Integer, primary_key=True, autoincrement=False), -    Column('revision', ForeignKey('work_revision.id')), -    ) - -work_revision = Table('work_revision', metadata, -    Column('id', Integer, primary_key=True, autoincrement=True), -    Column('previous', ForeignKey('work_revision.id'), nullable=True), -    Column('state', enum('normal', 'redirect', 'removed')), -    Column('redirect_id', ForeignKey('work_id.id'), nullable=True)), -    Column('edit_id'), ForeignKey('edit.id')), - -    Column('title', String), -    Column('work_type', ForeignKey()), -    Column('date', String), -    Column('journal', String), -    Column('doi', String), -    ) - -creator_id = Table('creator_id', metadata, -    Column('id', Integer, primary_key=True, autoincrement=False), -    Column('revision', ForeignKey('creator_revision.id')), -    ) - -creator_revision = Table('creator_revision', metadata, -    Column('id', Integer, primary_key=True, autoincrement=True), -    Column('previous', ForeignKey('creator_revision.id'), optional=True), -    Column('state', enum('normal', 'redirect', 'removed')), -    Column('redirect_id', ForeignKey('creator_id.id'), optional=True)), -    Column('edit_id'), ForeignKey('edit.id')), - -    Column('name', String), -    Column('sortname', String), -    ) - -authorship = Table('authorship', metadata, -    Column('id', Integer, primary_key=True, autoincrement=True), -    Column('work_rev', ForeignKey('work_revision.id'), nullable=False), -    Column('creator_id', ForeignKey('creator_id.id'), nullable=False), -    ) - -edit = Table('edit', metadata, -    Column('id', Integer, primary_key=True, autoincrement=True), -    Column('edit_group', ForeignKey('edit_group.id')), -    Column('editor', ForeignKey('editor.id')), -    ) - -edit_group = Table('edit_group', metadata, -    Column('id', Integer, primary_key=True, autoincrement=True), -    ) - -editor = Table('editor', metadata, -    Column('id', Integer, primary_key=True, autoincrement=True), -    Column('username', String), -    ) - -changelog = Table('changelog', metadata, -    Column('id', Integer, primary_key=True, autoincrement=True), -    Column('edit_id', ForeignKey('edit.id')), -    Column('timestamp', Integer), -    ) | 
