.PHONY: help install dev test test-billing test-e2e test-coverage e2e-setup lint format clean run migrate init-db reset-db all PYTHON := .venv/bin/python3 PIP := .venv/bin/pip PYTEST := .venv/bin/pytest BLACK := .venv/bin/black RUFF := .venv/bin/ruff MYWEBDAV := .venv/bin/mywebdav all: $(MYWEBDAV) --port 9004 help: @echo "MyWebdav Development Makefile" @echo "" @echo "Available commands:" @echo " make all Run the application on port 9004" @echo " make install Install all dependencies" @echo " make dev Install development dependencies" @echo " make run Run the application locally" @echo " make test Run all tests" @echo " make test-billing Run billing tests only" @echo " make test-e2e Run end-to-end tests (visible browser)" @echo " make test-coverage Run tests with coverage report" @echo " make e2e-setup Install Playwright and browsers" @echo " make lint Run linting checks" @echo " make format Format code with black" @echo " make migrate Run database migrations" @echo " make init-db Initialize database with default data" @echo " make reset-db Reset database (WARNING: deletes all data)" @echo " make clean Clean up temporary files" @echo " make setup Complete setup (env + install + init-db)" install: @echo "Installing dependencies..." python -m venv .venv $(PIP) install -e . $(PIP) install -r requirements.txt @echo "Dependencies installed successfully" dev: @echo "Installing development dependencies..." $(PIP) install pytest pytest-asyncio pytest-cov httpx black ruff stripe apscheduler dataset @echo "Development dependencies installed successfully" run: @echo "Starting MyWebdav application..." @echo "Access the application at http://localhost:8000" $(PYTHON) -m mywebdav.main test: @echo "Running all tests..." $(PYTEST) tests/ -v test-billing: @echo "Running billing tests..." $(PYTEST) tests/billing/ -v test-e2e: @echo "Running end-to-end tests with visible browser..." @echo "Make sure the application is running (make run in another terminal)" $(PYTEST) tests/e2e/ -v -s --tb=short e2e-setup: @echo "Installing Playwright and browsers..." $(PIP) install playwright .venv/bin/playwright install chromium @echo "Playwright setup complete" test-coverage: @echo "Running tests with coverage..." $(PYTEST) tests/ -v --cov=mywebdav --cov-report=html --cov-report=term @echo "Coverage report generated in htmlcov/index.html" lint: @echo "Running linting checks..." $(RUFF) check mywebdav/ @echo "Linting complete" format: @echo "Formatting code..." $(BLACK) mywebdav/ tests/ @echo "Code formatting complete" migrate: @echo "Running database migrations..." @echo "Tortoise ORM auto-generates schemas on startup" $(PYTHON) -c "from mywebdav.main import app; print('Database schema will be created on first run')" init-db: @echo "Initializing database with default data..." $(PYTHON) -c "import asyncio; \ from tortoise import Tortoise; \ from mywebdav.settings import settings; \ from mywebdav.billing.models import PricingConfig; \ from decimal import Decimal; \ async def init(): \ await Tortoise.init(db_url=settings.DATABASE_URL, modules={'models': ['mywebdav.models', 'mywebdav.billing.models']}); \ await Tortoise.generate_schemas(); \ count = await PricingConfig.all().count(); \ if count == 0: \ await PricingConfig.create(config_key='storage_per_gb_month', config_value=Decimal('0.0045'), description='Storage cost per GB per month', unit='per_gb_month'); \ await PricingConfig.create(config_key='bandwidth_egress_per_gb', config_value=Decimal('0.009'), description='Bandwidth egress cost per GB', unit='per_gb'); \ await PricingConfig.create(config_key='bandwidth_ingress_per_gb', config_value=Decimal('0.0'), description='Bandwidth ingress cost per GB (free)', unit='per_gb'); \ await PricingConfig.create(config_key='free_tier_storage_gb', config_value=Decimal('15'), description='Free tier storage in GB', unit='gb'); \ await PricingConfig.create(config_key='free_tier_bandwidth_gb', config_value=Decimal('15'), description='Free tier bandwidth in GB per month', unit='gb'); \ await PricingConfig.create(config_key='tax_rate_default', config_value=Decimal('0.0'), description='Default tax rate (0 = no tax)', unit='percentage'); \ print('Default pricing configuration created'); \ else: \ print('Pricing configuration already exists'); \ await Tortoise.close_connections(); \ asyncio.run(init())" @echo "Database initialized successfully" reset-db: @echo "WARNING: This will delete all data!" @read -p "Are you sure? (yes/no): " confirm && [ "$$confirm" = "yes" ] || exit 1 @rm -f mywebdav.db app/mywebdav.db storage/mywebdav.db @echo "Database reset complete. Run 'make init-db' to reinitialize" clean: @echo "Cleaning up temporary files..." find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true find . -type f -name "*.pyc" -delete find . -type f -name "*.pyo" -delete find . -type f -name "*.pyd" -delete find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true find . -type d -name ".ruff_cache" -exec rm -rf {} + 2>/dev/null || true rm -rf htmlcov/ rm -rf .coverage @echo "Cleanup complete" setup-env: @echo "Setting up environment file..." @if [ ! -f .env ]; then \ cp .env.example .env 2>/dev/null || \ echo "DATABASE_URL=sqlite:///app/mywebdav.db\nSECRET_KEY=$$(openssl rand -hex 32)\nSTRIPE_SECRET_KEY=\nSTRIPE_PUBLISHABLE_KEY=\nSTRIPE_WEBHOOK_SECRET=" > .env; \ echo ".env file created. Please update with your configuration."; \ else \ echo ".env file already exists"; \ fi setup: setup-env install dev init-db @echo "" @echo "Setup complete!" @echo "Next steps:" @echo " 1. Update .env with your configuration (especially Stripe keys)" @echo " 2. Run 'make run' or 'make all' to start the application" @echo " 3. Access the application at http://localhost:8000" docs: @echo "Generating API documentation..." @echo "API documentation available at http://localhost:8000/docs when running" @echo "ReDoc available at http://localhost:8000/redoc when running"