.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"