# Wizamart Multi-Tenant E-Commerce Platform Makefile # Cross-platform compatible (Windows & Linux) .PHONY: install install-dev install-docs install-all dev test test-coverage lint format check docker-build docker-up docker-down clean help tailwind-install tailwind-dev tailwind-build tailwind-watch arch-check arch-check-file arch-check-object test-db-up test-db-down test-db-reset test-db-status celery-worker celery-beat celery-dev flower celery-status celery-purge # Detect OS ifeq ($(OS),Windows_NT) DETECTED_OS := Windows else DETECTED_OS := $(shell uname -s) endif # Set Python based on OS PYTHON := python PIP := pip # Set PYTHONPATH for scripts export PYTHONPATH := $(shell pwd) # ============================================================================= # INSTALLATION & SETUP # ============================================================================= install-all: $(PIP) install -r requirements.txt install-dev: install-all $(PIP) install -r requirements-dev.txt install-test: $(PIP) install -r requirements-test.txt install-docs: $(PIP) install -r requirements-docs.txt install-all: install install-dev install-test install-docs setup: install-all migrate-up init-prod @echo "✅ Development environment setup complete!" @echo "Run 'make dev' to start development server" # ============================================================================= # DEVELOPMENT SERVERS # ============================================================================= dev: $(PYTHON) -m uvicorn main:app --reload --host 0.0.0.0 --port 9999 # ============================================================================= # DATABASE MIGRATIONS # ============================================================================= migrate-create: ifeq ($(DETECTED_OS),Windows) @if "$(message)"=="" (echo Error: Please provide a message. Usage: make migrate-create message="your_description") else ($(PYTHON) -m alembic revision --autogenerate -m "$(message)") else @if [ -z "$(message)" ]; then \ echo "Error: Please provide a message. Usage: make migrate-create message=\"your_description\""; \ else \ $(PYTHON) -m alembic revision --autogenerate -m "$(message)"; \ fi endif migrate-create-manual: ifeq ($(DETECTED_OS),Windows) @if "$(message)"=="" (echo Error: Please provide a message. Usage: make migrate-create-manual message="your_description") else ($(PYTHON) -m alembic revision -m "$(message)") else @if [ -z "$(message)" ]; then \ echo "Error: Please provide a message. Usage: make migrate-create-manual message=\"your_description\""; \ else \ $(PYTHON) -m alembic revision -m "$(message)"; \ fi endif migrate-up: @echo "Running database migrations..." $(PYTHON) -m alembic upgrade head @echo "✅ Migrations completed successfully" migrate-down: @echo "Rolling back last migration..." $(PYTHON) -m alembic downgrade -1 @echo "✅ Rollback completed" migrate-status: @echo "Current migration status:" $(PYTHON) -m alembic current @echo "" @echo "Migration history:" $(PYTHON) -m alembic history --verbose migrate-squash: @echo "Squashing all migrations into a single initial migration..." $(PYTHON) scripts/squash_migrations.py # ============================================================================= # DATABASE INITIALIZATION & SEEDING # ============================================================================= # Production initialization - Run on first setup (production OR development) init-prod: @echo "🔧 Initializing production database..." @echo "" @echo "Step 0/5: Ensuring database exists (running migrations)..." @$(PYTHON) -m alembic upgrade head @echo "" @echo "Step 1/5: Creating admin user and platform settings..." $(PYTHON) scripts/init_production.py @echo "" @echo "Step 2/5: Initializing log settings..." $(PYTHON) scripts/init_log_settings.py @echo "" @echo "Step 3/5: Creating default CMS content pages..." $(PYTHON) scripts/create_default_content_pages.py @echo "" @echo "Step 4/5: Creating platform pages and landing..." $(PYTHON) scripts/create_platform_pages.py @echo "" @echo "Step 5/5: Seeding email templates..." $(PYTHON) scripts/seed_email_templates.py @echo "" @echo "✅ Production initialization completed" @echo "✨ Platform is ready for production OR development" # First-time installation - Complete setup with configuration validation install: @echo "🚀 WIZAMART PLATFORM INSTALLATION" @echo "==================================" $(PYTHON) scripts/install.py # Demo data seeding - Cross-platform using Python to set environment seed-demo: @echo "🎪 Seeding demo data (normal mode)..." ifeq ($(DETECTED_OS),Windows) @set SEED_MODE=normal&& $(PYTHON) scripts/seed_demo.py else SEED_MODE=normal $(PYTHON) scripts/seed_demo.py endif @echo "✅ Demo seeding completed" seed-demo-minimal: @echo "🎪 Seeding demo data (minimal mode - 1 vendor only)..." ifeq ($(DETECTED_OS),Windows) @set SEED_MODE=minimal&& $(PYTHON) scripts/seed_demo.py else SEED_MODE=minimal $(PYTHON) scripts/seed_demo.py endif @echo "✅ Minimal demo seeding completed" seed-demo-reset: @echo "⚠️ WARNING: This will DELETE ALL existing data!" ifeq ($(DETECTED_OS),Windows) @set SEED_MODE=reset&& $(PYTHON) scripts/seed_demo.py else SEED_MODE=reset $(PYTHON) scripts/seed_demo.py endif db-setup: migrate-up init-prod seed-demo @echo "" @echo "✅ Database setup complete!" @echo "✨ Run 'make dev' to start development server" db-reset: @echo "⚠️ WARNING: This will DELETE ALL existing data!" @echo "Rolling back all migrations..." $(PYTHON) -m alembic downgrade base || true @echo "Applying all migrations..." $(PYTHON) -m alembic upgrade head @echo "Initializing production data..." $(PYTHON) scripts/init_production.py @echo "Seeding demo data..." ifeq ($(DETECTED_OS),Windows) @set SEED_MODE=reset&& set FORCE_RESET=true&& $(PYTHON) scripts/seed_demo.py else SEED_MODE=reset FORCE_RESET=true $(PYTHON) scripts/seed_demo.py endif @echo "" @echo "✅ Database completely reset!" backup-db: @echo "Creating database backup..." @$(PYTHON) scripts/backup_database.py # Utility commands (usually not needed - init-prod handles these) create-cms-defaults: @echo "📄 Creating default CMS content pages..." $(PYTHON) scripts/create_default_content_pages.py @echo "✅ CMS defaults created" create-platform-pages: @echo "🏠 Creating platform pages and landing..." $(PYTHON) scripts/create_platform_pages.py @echo "✅ Platform pages created" init-logging: @echo "📝 Initializing log settings..." $(PYTHON) scripts/init_log_settings.py @echo "✅ Log settings initialized" # ============================================================================= # TEST DATABASE (PostgreSQL in Docker) # ============================================================================= test-db-up: @echo "Starting test database (PostgreSQL on port 5433)..." docker compose -f docker-compose.test.yml up -d @sleep 3 @echo "✅ Test database ready" test-db-down: @echo "Stopping test database..." docker compose -f docker-compose.test.yml down @echo "✅ Test database stopped" test-db-reset: @echo "Resetting test database..." docker compose -f docker-compose.test.yml down -v docker compose -f docker-compose.test.yml up -d @sleep 3 @echo "✅ Test database reset" test-db-status: @docker compose -f docker-compose.test.yml ps # ============================================================================= # TESTING # ============================================================================= test: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/ -v test-unit: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/ -v -m unit test-integration: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/ -v -m integration test-coverage: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/ --cov=app --cov=models --cov=utils --cov=middleware --cov-report=html --cov-report=term-missing test-fast: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/ -v -m "not slow" test-slow: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/ -v -m slow test-auth: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/test_auth.py -v test-products: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/test_products.py -v test-inventory: @docker compose -f docker-compose.test.yml up -d 2>/dev/null || true @sleep 2 TEST_DATABASE_URL="postgresql://test_user:test_password@localhost:5433/wizamart_test" \ $(PYTHON) -m pytest tests/test_inventory.py -v # ============================================================================= # CODE QUALITY # ============================================================================= format: @echo "Formatting code with ruff..." $(PYTHON) -m ruff format . lint: @echo "Linting code with ruff..." $(PYTHON) -m ruff check . --fix @echo "Type checking with mypy..." $(PYTHON) -m mypy . lint-strict: @echo "Linting (no auto-fix)..." $(PYTHON) -m ruff check . @echo "Type checking with mypy..." $(PYTHON) -m mypy . check: format lint verify-imports ci: lint-strict verify-imports test-coverage verify-imports: @echo "Verifying critical imports..." $(PYTHON) scripts/verify_critical_imports.py arch-check: @echo "Running architecture validation..." $(PYTHON) scripts/validate_architecture.py arch-check-file: ifeq ($(DETECTED_OS),Windows) @if "$(file)"=="" (echo Error: Please provide a file. Usage: make arch-check-file file="path/to/file.py") else ($(PYTHON) scripts/validate_architecture.py -f "$(file)") else @if [ -z "$(file)" ]; then \ echo "Error: Please provide a file. Usage: make arch-check-file file=\"path/to/file.py\""; \ else \ $(PYTHON) scripts/validate_architecture.py -f "$(file)"; \ fi endif arch-check-object: ifeq ($(DETECTED_OS),Windows) @if "$(name)"=="" (echo Error: Please provide an object name. Usage: make arch-check-object name="company") else ($(PYTHON) scripts/validate_architecture.py -o "$(name)") else @if [ -z "$(name)" ]; then \ echo "Error: Please provide an object name. Usage: make arch-check-object name=\"company\""; \ else \ $(PYTHON) scripts/validate_architecture.py -o "$(name)"; \ fi endif qa: format lint arch-check test-coverage docs-check @echo "Quality assurance checks completed!" # ============================================================================= # DOCUMENTATION # ============================================================================= docs-serve: @echo "Starting documentation server..." $(PYTHON) -m mkdocs serve --dev-addr=0.0.0.0:9991 docs-build: @echo "Building documentation..." $(PYTHON) -m mkdocs build --clean --strict docs-deploy: @echo "Deploying documentation..." $(PYTHON) -m mkdocs gh-deploy --clean docs-clean: ifeq ($(DETECTED_OS),Windows) @if exist site rmdir /s /q site else @rm -rf site endif @echo "Documentation build files cleaned!" docs-check: @echo "Checking documentation for issues..." $(PYTHON) -m mkdocs build --strict --verbose # ============================================================================= # FRONTEND / TAILWIND CSS (Standalone CLI - No Node.js Required) # ============================================================================= # Tailwind CLI binary location TAILWIND_CLI := $(HOME)/.local/bin/tailwindcss tailwind-install: @echo "Installing Tailwind CSS standalone CLI..." @mkdir -p $(HOME)/.local/bin @curl -sLO https://github.com/tailwindlabs/tailwindcss/releases/latest/download/tailwindcss-linux-x64 @chmod +x tailwindcss-linux-x64 @mv tailwindcss-linux-x64 $(TAILWIND_CLI) @echo "Tailwind CLI installed: $$($(TAILWIND_CLI) --help | head -1)" tailwind-dev: @echo "Building Tailwind CSS (development)..." $(TAILWIND_CLI) -i static/admin/css/tailwind.css -o static/admin/css/tailwind.output.css $(TAILWIND_CLI) -i static/vendor/css/tailwind.css -o static/vendor/css/tailwind.output.css $(TAILWIND_CLI) -i static/shop/css/tailwind.css -o static/shop/css/tailwind.output.css $(TAILWIND_CLI) -i static/platform/css/tailwind.css -o static/platform/css/tailwind.output.css @echo "Tailwind CSS built (admin + vendor + shop + platform)" tailwind-build: @echo "Building Tailwind CSS (production - minified)..." $(TAILWIND_CLI) -i static/admin/css/tailwind.css -o static/admin/css/tailwind.output.css --minify $(TAILWIND_CLI) -i static/vendor/css/tailwind.css -o static/vendor/css/tailwind.output.css --minify $(TAILWIND_CLI) -i static/shop/css/tailwind.css -o static/shop/css/tailwind.output.css --minify $(TAILWIND_CLI) -i static/platform/css/tailwind.css -o static/platform/css/tailwind.output.css --minify @echo "Tailwind CSS built and minified for production" tailwind-watch: @echo "Watching Tailwind CSS for changes..." @echo "Note: This watches admin CSS only. Run in separate terminal." $(TAILWIND_CLI) -i static/admin/css/tailwind.css -o static/admin/css/tailwind.output.css --watch # ============================================================================= # CELERY / TASK QUEUE # ============================================================================= celery-worker: @echo "Starting Celery worker..." celery -A app.core.celery_config worker --loglevel=info -Q default,long_running,scheduled celery-beat: @echo "Starting Celery beat scheduler..." celery -A app.core.celery_config beat --loglevel=info celery-dev: @echo "Starting Celery worker + beat (development mode)..." celery -A app.core.celery_config worker --loglevel=info -B -Q default,long_running,scheduled flower: @echo "Starting Flower monitoring dashboard on http://localhost:5555..." celery -A app.core.celery_config flower --port=5555 --basic-auth=admin:admin celery-status: @echo "Celery worker status:" celery -A app.core.celery_config inspect active celery-purge: @echo "Purging all pending tasks..." celery -A app.core.celery_config purge -f # ============================================================================= # DOCKER # ============================================================================= docker-build: docker compose build docker-up: docker compose up -d docker-down: docker compose down docker-restart: docker-down docker-up # ============================================================================= # DEPLOYMENT # ============================================================================= deploy-staging: migrate-up docker compose -f docker-compose.staging.yml up -d deploy-prod: migrate-up docker compose -f docker-compose.prod.yml up -d # ============================================================================= # UTILITIES # ============================================================================= clean: ifeq ($(DETECTED_OS),Windows) @if exist htmlcov rmdir /s /q htmlcov @if exist .pytest_cache rmdir /s /q .pytest_cache @if exist .coverage del .coverage @if exist .mypy_cache rmdir /s /q .mypy_cache @for /d /r . %%d in (__pycache__) do @if exist "%%d" rmdir /s /q "%%d" @del /s /q *.pyc 2>nul || echo No .pyc files found else @find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true @find . -type f -name "*.pyc" -delete 2>/dev/null || true @rm -rf htmlcov .pytest_cache .coverage .mypy_cache 2>/dev/null || true endif @echo "Cleaned up build artifacts" verify-setup: @echo "Running setup verification..." @$(PYTHON) scripts/verify_setup.py check-env: @echo "Checking Python environment..." @echo "Detected OS: $(DETECTED_OS)" @echo "" @echo "Python version:" @$(PYTHON) --version @echo "" ifeq ($(DETECTED_OS),Windows) @echo "Python location:" @where $(PYTHON) else @echo "Python location:" @which $(PYTHON) endif @echo "" @echo "Virtual environment active:" @$(PYTHON) -c "import sys; print('YES' if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix) else 'NO')" @echo "" @echo "Python executable:" @$(PYTHON) -c "import sys; print(sys.executable)" # ============================================================================= # HELP # ============================================================================= help: @echo "Wizamart Platform Development Commands" @echo "" @echo "=== SETUP ===" @echo " install - Install production dependencies" @echo " install-test - Install test dependencies only" @echo " install-dev - Install development dependencies" @echo " install-all - Install all dependencies" @echo " setup - Complete development setup" @echo "" @echo "=== DEVELOPMENT ===" @echo " dev - Start API development server" @echo "" @echo "=== DATABASE ===" @echo " migrate-create message=\"msg\" - Create new migration" @echo " migrate-up - Apply pending migrations" @echo " migrate-down - Rollback last migration" @echo " migrate-status - Show migration status" @echo " install - First-time setup (validates config + migrate + init)" @echo " init-prod - Initialize platform (admin, CMS, pages, emails)" @echo " seed-demo - Seed demo data (3 companies + vendors)" @echo " seed-demo-minimal - Seed minimal demo (1 company + vendor)" @echo " seed-demo-reset - DELETE ALL demo data and reseed" @echo " db-setup - Full dev setup (migrate + init-prod + seed-demo)" @echo " backup-db - Backup database" @echo "" @echo "=== TESTING (PostgreSQL) ===" @echo " test-db-up - Start test PostgreSQL database" @echo " test-db-down - Stop test database" @echo " test-db-reset - Reset test database" @echo " test - Run all tests (auto-starts DB)" @echo " test-coverage - Run tests with coverage" @echo " test-fast - Run fast tests only" @echo "" @echo "=== CODE QUALITY ===" @echo " format - Format code with ruff" @echo " lint - Lint and auto-fix with ruff + mypy" @echo " lint-strict - Lint without auto-fix + mypy" @echo " verify-imports - Verify critical imports haven't been removed" @echo " arch-check - Validate architecture patterns" @echo " arch-check-file file=\"path\" - Check a single file" @echo " arch-check-object name=\"company\" - Check all files for an entity" @echo " check - Format + lint + verify imports" @echo " ci - Full CI pipeline (strict)" @echo " qa - Quality assurance (includes arch-check)" @echo "" @echo "=== DOCUMENTATION ===" @echo " docs-serve - Start documentation server" @echo " docs-build - Build documentation" @echo "" @echo "=== FRONTEND / TAILWIND (No Node.js Required) ===" @echo " tailwind-install - Install Tailwind standalone CLI" @echo " tailwind-dev - Build Tailwind CSS (development)" @echo " tailwind-build - Build Tailwind CSS (production, minified)" @echo " tailwind-watch - Watch and rebuild on changes" @echo "" @echo "=== CELERY / TASK QUEUE ===" @echo " celery-worker - Start Celery worker" @echo " celery-beat - Start Celery beat scheduler" @echo " celery-dev - Start worker + beat together (dev)" @echo " flower - Start Flower monitoring (localhost:5555)" @echo " celery-status - Show active worker tasks" @echo " celery-purge - Purge all pending tasks" @echo "" @echo "=== DOCKER ===" @echo " docker-build - Build Docker containers" @echo " docker-up - Start Docker containers" @echo " docker-down - Stop Docker containers" @echo "" @echo "=== UTILITIES ===" @echo " clean - Clean build artifacts" @echo " check-env - Check Python environment and OS" @echo "" @echo "=== DAILY WORKFLOW ===" @echo " make setup # Initial setup" @echo " make dev # Start development" @echo " make migrate-create message=\"feature\" # Create migration" @echo " make migrate-up # Apply migration" @echo " make test # Run tests" help-db: @echo "=== DATABASE COMMANDS ===" @echo "" @echo "MIGRATIONS:" @echo " migrate-create message=\"description\" - Create auto-generated migration" @echo " migrate-create-manual message=\"desc\" - Create empty migration template" @echo " migrate-up - Apply all pending migrations" @echo " migrate-down - Rollback last migration" @echo " migrate-status - Show current status and history" @echo "" @echo "FIRST-TIME INSTALLATION:" @echo "──────────────────────────────────────────────────────────" @echo " install - Complete installation wizard:" @echo " - Validates .env configuration" @echo " - Checks Stripe, Email, Security settings" @echo " - Runs database migrations" @echo " - Initializes all platform data" @echo " - Provides configuration report" @echo "" @echo "PLATFORM INITIALIZATION (Production + Development):" @echo "──────────────────────────────────────────────────────────" @echo " init-prod - Complete platform setup (5 steps):" @echo " 1. Create admin user + settings" @echo " 2. Initialize log settings" @echo " 3. Create CMS defaults" @echo " 4. Create platform pages" @echo " 5. Seed email templates" @echo "" @echo "DEMO DATA (Development Only - NEVER in production):" @echo "──────────────────────────────────────────────────────────" @echo " seed-demo - Create 3 demo companies + vendors + data" @echo " seed-demo-minimal - Create 1 demo company + vendor only" @echo " seed-demo-reset - DELETE ALL demo data and reseed (DANGEROUS!)" @echo "" @echo "UTILITY COMMANDS (Advanced - usually not needed):" @echo "──────────────────────────────────────────────────────────" @echo " create-cms-defaults - Re-create CMS pages only" @echo " create-platform-pages - Re-create platform pages only" @echo " init-logging - Re-initialize logging only" @echo "" @echo "QUICK WORKFLOWS:" @echo "──────────────────────────────────────────────────────────" @echo " db-setup - Full dev setup (migrate + init-prod + seed-demo)" @echo " db-reset - Nuclear reset (rollback + init-prod + reseed)" @echo "" @echo "TYPICAL FIRST-TIME SETUP (Development):" @echo "──────────────────────────────────────────────────────────" @echo " 1. cp .env.example .env # Configure environment" @echo " 2. make install # Validates config + initializes platform" @echo " 3. make seed-demo # Add demo data (optional)" @echo " 4. make dev # Start development server" @echo "" @echo "PRODUCTION SETUP:" @echo "──────────────────────────────────────────────────────────" @echo " 1. Configure .env with production values:" @echo " - DATABASE_URL (PostgreSQL recommended)" @echo " - JWT_SECRET_KEY (use: openssl rand -hex 32)" @echo " - STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY" @echo " - Email provider settings (SMTP/SendGrid/Mailgun/SES)" @echo " - ADMIN_PASSWORD (strong password)" @echo " 2. make install # Validates + initializes" @echo " 3. DO NOT run seed-demo in production!"