164 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
# JupyterHub Notebook Viewer - Development Commands
 | 
						|
 | 
						|
# Default recipe
 | 
						|
default:
 | 
						|
    @just --list
 | 
						|
 | 
						|
# Set up development environment
 | 
						|
setup:
 | 
						|
    @echo "Setting up development environment..."
 | 
						|
    mkdir -p shared notebooks templates
 | 
						|
    [ ! -f .env ] && cp .env.example .env || true
 | 
						|
    @echo "✓ Development environment ready"
 | 
						|
 | 
						|
# Start development server
 | 
						|
dev:
 | 
						|
    @echo "Starting development server..."
 | 
						|
    python app.py
 | 
						|
 | 
						|
# Start development server with auto-reload (using nix shell)
 | 
						|
dev-nix:
 | 
						|
    nix develop --command dev-server
 | 
						|
 | 
						|
# Run tests
 | 
						|
test:
 | 
						|
    @echo "Running tests..."
 | 
						|
    python -m pytest tests/ -v || python -c "import app; print('Basic import test passed')"
 | 
						|
 | 
						|
# Run tests in nix environment
 | 
						|
test-nix:
 | 
						|
    nix develop --command run-tests
 | 
						|
 | 
						|
# Build Docker image
 | 
						|
docker-build:
 | 
						|
    docker build -t jupyterhub-notebook-viewer .
 | 
						|
 | 
						|
# Start with Docker Compose
 | 
						|
docker-up:
 | 
						|
    docker-compose up
 | 
						|
 | 
						|
# Start with Docker Compose in background
 | 
						|
docker-up-daemon:
 | 
						|
    docker-compose up -d
 | 
						|
 | 
						|
# Start with Docker Compose and rebuild
 | 
						|
docker-rebuild:
 | 
						|
    docker-compose up --build
 | 
						|
 | 
						|
# Start with nginx proxy
 | 
						|
docker-proxy:
 | 
						|
    docker-compose --profile with-proxy up
 | 
						|
 | 
						|
# Stop Docker services
 | 
						|
docker-down:
 | 
						|
    docker-compose down
 | 
						|
 | 
						|
# View Docker logs
 | 
						|
docker-logs:
 | 
						|
    docker-compose logs -f
 | 
						|
 | 
						|
# Clean Docker resources
 | 
						|
docker-clean:
 | 
						|
    docker-compose down -v
 | 
						|
    docker system prune -f
 | 
						|
 | 
						|
# Install Python dependencies
 | 
						|
install:
 | 
						|
    pip install -r requirements.txt
 | 
						|
 | 
						|
# Format code
 | 
						|
format:
 | 
						|
    black app.py
 | 
						|
    isort app.py
 | 
						|
 | 
						|
# Lint code
 | 
						|
lint:
 | 
						|
    flake8 app.py
 | 
						|
    pylint app.py
 | 
						|
 | 
						|
# Generate requirements.txt
 | 
						|
freeze:
 | 
						|
    pip freeze > requirements.txt
 | 
						|
 | 
						|
# Create sample notebook
 | 
						|
sample-notebook:
 | 
						|
    @mkdir -p shared
 | 
						|
    @cat > shared/sample.ipynb << 'EOF'
 | 
						|
    {
 | 
						|
     "cells": [
 | 
						|
      {
 | 
						|
       "cell_type": "markdown",
 | 
						|
       "metadata": {},
 | 
						|
       "source": [
 | 
						|
        "# Sample Notebook\n\nThis is a sample Jupyter notebook."
 | 
						|
       ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
       "cell_type": "code",
 | 
						|
       "execution_count": null,
 | 
						|
       "metadata": {},
 | 
						|
       "outputs": [],
 | 
						|
       "source": [
 | 
						|
        "print('Hello World!')\nimport numpy as np\nprint(f'NumPy version: {np.__version__}')"
 | 
						|
       ]
 | 
						|
      }
 | 
						|
     ],
 | 
						|
     "metadata": {
 | 
						|
      "kernelspec": {
 | 
						|
       "display_name": "Python 3",
 | 
						|
       "language": "python",
 | 
						|
       "name": "python3"
 | 
						|
      }
 | 
						|
     },
 | 
						|
     "nbformat": 4,
 | 
						|
     "nbformat_minor": 4
 | 
						|
    }
 | 
						|
    EOF
 | 
						|
    @echo "✓ Sample notebook created in shared/sample.ipynb"
 | 
						|
 | 
						|
# Check environment configuration
 | 
						|
check-env:
 | 
						|
    @echo "Environment Configuration:"
 | 
						|
    @echo "========================="
 | 
						|
    @grep -E '^[A-Z_]' .env 2>/dev/null || echo "No .env file found"
 | 
						|
    @echo ""
 | 
						|
    @echo "Current Python: $(which python)"
 | 
						|
    @echo "Flask available: $(python -c 'import flask; print(flask.__version__)' 2>/dev/null || echo 'Not installed')"
 | 
						|
    @echo "Shared directory: ${JUPYTERHUB_SHARED_DIR:-./shared}"
 | 
						|
 | 
						|
# Show application logs
 | 
						|
logs:
 | 
						|
    tail -f app.log 2>/dev/null || echo "No log file found"
 | 
						|
 | 
						|
# Clean temporary files
 | 
						|
clean:
 | 
						|
    rm -rf __pycache__/
 | 
						|
    rm -rf .pytest_cache/
 | 
						|
    rm -rf *.pyc
 | 
						|
    rm -rf .coverage
 | 
						|
    rm -rf htmlcov/
 | 
						|
    rm -rf dist/
 | 
						|
    rm -rf build/
 | 
						|
    rm -rf *.egg-info/
 | 
						|
 | 
						|
# Security scan
 | 
						|
security:
 | 
						|
    safety check -r requirements.txt || echo "Safety not installed, skipping security scan"
 | 
						|
    bandit -r . -f json || echo "Bandit not installed, skipping security scan"
 | 
						|
 | 
						|
# Performance test
 | 
						|
perf:
 | 
						|
    @echo "Running performance test..."
 | 
						|
    ab -n 100 -c 10 http://localhost:5000/ || echo "Apache Bench not available"
 | 
						|
 | 
						|
# Health check
 | 
						|
health:
 | 
						|
    curl -f http://localhost:5000/ || echo "Application not responding"
 | 
						|
 | 
						|
# Generate documentation
 | 
						|
docs:
 | 
						|
    @echo "Generating documentation..."
 | 
						|
    mkdir -p docs
 | 
						|
    @echo "# JupyterHub Notebook Viewer\n\nGenerated documentation\n" > docs/README.md
 | 
						|
    @echo "✓ Documentation generated in docs/"
 |