diff --git a/.github/workflows/python_actions.yml b/.github/workflows/python_actions.yml index 9ca637d..d7e6790 100644 --- a/.github/workflows/python_actions.yml +++ b/.github/workflows/python_actions.yml @@ -8,14 +8,14 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@v4 + - uses: actions/setup-python@v4 with: - python-version: 3.8 + python-version: '3.12' - name: Install dependencies run: | - python -m pip install --upgrade wheel setuptools==57 pip + python -m pip install --upgrade wheel pip pip install -U -r requirements.txt pip install -U -r dev-requirements.txt diff --git a/biblib/app.py b/biblib/app.py index c513433..1a33f28 100644 --- a/biblib/app.py +++ b/biblib/app.py @@ -12,6 +12,7 @@ from flask_discoverer import Discoverer from flask_mail import Mail from adsmutils import ADSFlask +from biblib.cli import register_commands def create_app(**config): """ @@ -70,6 +71,9 @@ def create_app(**config): methods=['GET'] ) + # Register CLI commands + register_commands(app) + return app diff --git a/biblib/manage.py b/biblib/manage.py index e7f9d44..d2c8eb7 100644 --- a/biblib/manage.py +++ b/biblib/manage.py @@ -1,16 +1,16 @@ """ -Alembic migration management file +Legacy manage.py interface - maintains backward compatibility +This file provides the same command interface without Flask-Script dependency """ from datetime import datetime from dateutil.relativedelta import relativedelta import os import sys +import argparse PROJECT_HOME = os.path.abspath( os.path.join(os.path.dirname(__file__), '..')) sys.path.append(PROJECT_HOME) from flask import current_app -from flask_script import Manager, Command, Option -from flask_migrate import Migrate, MigrateCommand from biblib.models import Base, User, Permissions, Library, Notes from biblib.app import create_app from sqlalchemy import create_engine, desc @@ -20,7 +20,7 @@ # Load the app with the factory app = create_app() -class DeleteStaleUsers(Command): +class DeleteStaleUsers: """ Compares the users that exist within the API to those within the microservice and deletes any stale users that no longer exist. The logic @@ -65,7 +65,7 @@ def run(app=app): session.rollback() current_app.logger.info('Deleted {} stale users: {}'.format(len(removal_list), removal_list)) -class DeleteObsoleteVersionsTime(Command): +class DeleteObsoleteVersionsTime: """ Clears obsolete library and notes versions older than chosen time. """ @@ -101,7 +101,7 @@ def run(app=app, n_years=None): .format(error)) session.rollback() -class DeleteObsoleteVersionsNumber(Command): +class DeleteObsoleteVersionsNumber: """ Limits number of revisions saved per entity to n_revisions. """ @@ -136,12 +136,24 @@ def run(app=app, n_revisions=None): DeleteObsoleteVersionsNumber.limit_revisions(session, Notes, n_revisions) - -# Setup the command line arguments using Flask-Script -manager = Manager(app) -manager.add_command('syncdb', DeleteStaleUsers()) -manager.add_command('clean_versions_time', DeleteObsoleteVersionsTime()) -manager.add_command('clean_versions_number', DeleteObsoleteVersionsNumber()) +def main(): + """ + Command line interface that mimics Flask-Script behavior + """ + parser = argparse.ArgumentParser(description='Biblib Management Commands') + parser.add_argument('command', choices=['syncdb', 'clean_versions_time', 'clean_versions_number'], + help='Command to run') + parser.add_argument('--n_years', type=int, help='Number of years for time-based cleanup') + parser.add_argument('--n_revisions', type=int, help='Number of revisions to keep') + + args = parser.parse_args() + + if args.command == 'syncdb': + DeleteStaleUsers().run(app=app) + elif args.command == 'clean_versions_time': + DeleteObsoleteVersionsTime().run(app=app, n_years=args.n_years) + elif args.command == 'clean_versions_number': + DeleteObsoleteVersionsNumber().run(app=app, n_revisions=args.n_revisions) if __name__ == '__main__': - manager.run() + main() \ No newline at end of file diff --git a/dev-requirements.txt b/dev-requirements.txt index 99994b8..3cafcd8 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,14 +1,14 @@ Flask-Testing==0.8.1 -httpretty==0.9.7 +httpretty==1.1.4 testing.postgresql==1.3.0 -pytest==6.2.1 +pytest==7.4.4 pytest-cache==1.0 -pytest-cov==2.10.1 +pytest-cov==4.0.0 pytest-pep8==1.0.6 -coveralls==2.2.0 -fake-factory==0.5.3 -factory-boy==2.6.0 -freezegun==1.2.2 -httmock==1.2.3 -mock==1.3.0 +coveralls==3.3.1 +Faker==22.0.0 +factory-boy==3.3.0 +freezegun==1.4.0 +httmock==1.4.0 +mock==5.1.0 diff --git a/requirements.txt b/requirements.txt index 1411b05..39e99f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,13 @@ -git+https://github.com/adsabs/ADSMicroserviceUtils.git@v1.1.9 -Flask-Migrate==2.0.2 -Flask-Script==2.0.5 -alembic==1.5.3 -psycopg2==2.8.6 -sqlalchemy-continuum==1.3.12 +git+https://github.com/adsabs/ADSMicroserviceUtils.git@v1.4.0 +# git+https://github.com/femalves/ADSMicroserviceUtils.git@94dba88 +Flask-Migrate==4.0.5 +Flask-Script==2.0.6 +alembic==1.13.1 +psycopg2-binary==2.9.9 +sqlalchemy-continuum==1.4.2 Flask-Mail==0.9.1 Flask-Email==1.4.4 -Jinja2==2.11.3 -markupsafe<=2.0.1 -itsdangerous<=2.0.1 -werkzeug<=2.0.3 +Jinja2==3.1.2 +markupsafe==2.1.3 +itsdangerous==2.1.2 +werkzeug==3.0.1