diff --git a/Makefile b/Makefile index 32530b4..361bc3e 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,8 @@ # Define Python and pip executables inside virtual environment PYTHON := venv/bin/python PIP := venv/bin/pip - -# Celery worker command CELERY := venv/bin/celery +FLASK := venv/bin/flask # Default target that runs the application all: run @@ -100,15 +99,15 @@ venv: # Run the application in debug mode run: venv - venv/bin/flask --app scipaperloader --debug run + $(FLASK) --app scipaperloader --debug run # Format code using Black and isort -format: +format: venv venv/bin/black . venv/bin/isort . # Check if code meets formatting standards -format-check: +format-check: venv venv/bin/black --check . venv/bin/isort --check . @@ -116,15 +115,15 @@ format-check: reformat: format lint # Check code for style issues using flake8 -lint: +lint: venv venv/bin/flake8 . # Run static type checking with mypy -mypy: +mypy: venv venv/bin/mypy scipaperloader # Run the test suite -test: +test: venv venv/bin/pytest # Build distribution package after running checks @@ -134,24 +133,61 @@ dist: format-check lint mypy test # Set up complete development environment dev: clean venv -# Start Celery worker for processing tasks -celery: venv +# Start Celery worker - PURGE FIRST +celery: venv redis + @echo "Purging Celery task queue before starting worker..." + # Purge the queue forcefully. Ignore errors if queue is empty/unreachable initially. + @-$(CELERY) -A celery_worker:celery purge -f + @echo "Starting Celery worker..." $(CELERY) -A celery_worker:celery worker --loglevel=info - + # Monitor Celery tasks with flower web interface celery-flower: venv $(PIP) install flower $(CELERY) -A celery_worker:celery flower --port=5555 # Run Celery beat scheduler for periodic tasks -celery-beat: venv - $(CELERY) -A celery_worker:celery beat --loglevel=info +celery-beat: venv redis + @echo "Starting Celery beat scheduler..." + # Ensure celerybeat-schedule file is removed for clean start if needed + @-rm -f celerybeat-schedule.db + $(CELERY) -A celery_worker:celery beat --loglevel=info --scheduler django_celery_beat.schedulers:DatabaseScheduler # Check if Redis is running, start if needed redis: - @redis-cli ping > /dev/null 2>&1 || (echo "Starting Redis server..." && redis-server --daemonize yes) + @if ! redis-cli ping > /dev/null 2>&1; then \ + echo "Starting Redis server..."; \ + redis-server --daemonize yes; \ + sleep 1; \ + else \ + echo "Redis is already running."; \ + fi # Run complete application stack (Flask app + Celery worker + Redis + Beat scheduler) run-all: redis @echo "Starting Flask, Celery worker and Beat scheduler..." - @$(MAKE) -j3 run celery celery-beat + # Run them in parallel. Ctrl+C will send SIGINT to make, which propagates. + # Use trap to attempt cleanup, but primary cleanup is purge on next start. + @trap '$(MAKE) stop-all;' INT TERM; \ + $(MAKE) -j3 run celery celery-beat & wait + +# Stop running Celery worker and beat gracefully +stop-celery: + @echo "Attempting graceful shutdown of Celery worker and beat..." + @-pkill -TERM -f "celery -A celery_worker:celery worker" || echo "Worker not found or already stopped." + @-pkill -TERM -f "celery -A celery_worker:celery beat" || echo "Beat not found or already stopped." + @sleep 1 # Give processes a moment to terminate + @echo "Purging remaining tasks from Celery queue..." + @-$(CELERY) -A celery_worker:celery purge -f || echo "Purge failed or queue empty." + +# Stop Flask development server +stop-flask: + @echo "Attempting shutdown of Flask development server..." + @-pkill -TERM -f "flask --app scipaperloader --debug run" || echo "Flask server not found or already stopped." + +# Stop all components potentially started by run-all +stop-all: stop-celery stop-flask + @echo "All components stopped." + +# Default target +all: run