.PHONY: help install build test clean run-api run-backend run-client-simple run-client-hydra dev stop docker docs
RED := \033[0;31m
GREEN := \033[0;32m
YELLOW := \033[0;33m
BLUE := \033[0;34m
RESET := \033[0m
CARGO := cargo
NPM := npm
NODE := node
RUST_LOG ?= info
help:
@echo "$(BLUE)Magneto-Serge - Makefile$(RESET)"
@echo ""
@awk 'BEGIN {FS = ":.*##"; printf "Usage: make $(YELLOW)<target>$(RESET)\n"} /^[a-zA-Z_-]+:.*?##/ { printf " $(GREEN)%-20s$(RESET) %s\n", $$1, $$2 } /^##@/ { printf "\n$(BLUE)%s$(RESET)\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
install: install-rust install-backend install-client-simple install-client-hydra
@echo "$(GREEN)✓ Toutes les dépendances sont installées$(RESET)"
install-rust:
@echo "$(BLUE)Installation des dépendances Rust...$(RESET)"
@$(CARGO) fetch
@echo "$(GREEN)✓ Dépendances Rust installées$(RESET)"
install-backend:
@echo "$(BLUE)Installation des dépendances backend Node.js...$(RESET)"
@cd examples/nodejs-backend && $(NPM) install
@echo "$(GREEN)✓ Backend Node.js prêt$(RESET)"
install-client-simple:
@echo "$(BLUE)Installation du client Angular simple...$(RESET)"
@cd examples/angular-simple-client && $(NPM) install
@echo "$(GREEN)✓ Client Angular simple prêt$(RESET)"
install-client-hydra:
@echo "$(BLUE)Installation du client Angular Hydra...$(RESET)"
@cd examples/angular-client && $(NPM) install
@echo "$(GREEN)✓ Client Angular Hydra prêt$(RESET)"
build:
@echo "$(BLUE)Compilation du projet Rust...$(RESET)"
@$(CARGO) build
@echo "$(GREEN)✓ Compilation terminée$(RESET)"
build-release:
@echo "$(BLUE)Compilation release...$(RESET)"
@$(CARGO) build --release
@echo "$(GREEN)✓ Binaire release créé: target/release/magneto$(RESET)"
build-cli: build-release
@echo "$(BLUE)Installation du CLI magneto...$(RESET)"
@$(CARGO) install --path .
@echo "$(GREEN)✓ CLI installé: magneto$(RESET)"
build-all: build build-client-simple build-client-hydra
@echo "$(GREEN)✓ Tous les projets compilés$(RESET)"
build-client-simple:
@echo "$(BLUE)Build du client Angular simple...$(RESET)"
@cd examples/angular-simple-client && $(NPM) run build
@echo "$(GREEN)✓ Client simple compilé: examples/angular-simple-client/dist/$(RESET)"
build-client-hydra:
@echo "$(BLUE)Build du client Angular Hydra...$(RESET)"
@cd examples/angular-client && $(NPM) run build
@echo "$(GREEN)✓ Client Hydra compilé: examples/angular-client/dist/$(RESET)"
test:
@echo "$(BLUE)Lancement des tests...$(RESET)"
@$(CARGO) test
@echo "$(GREEN)✓ Tests réussis$(RESET)"
test-verbose:
@$(CARGO) test -- --nocapture
check:
@echo "$(BLUE)Vérification du code...$(RESET)"
@$(CARGO) check
@echo "$(GREEN)✓ Code valide$(RESET)"
clippy:
@echo "$(BLUE)Analyse avec clippy...$(RESET)"
@$(CARGO) clippy --all-features --all-targets -- -D warnings
@echo "$(GREEN)✓ Clippy OK$(RESET)"
fmt:
@echo "$(BLUE)Formatage du code...$(RESET)"
@$(CARGO) fmt
@echo "$(GREEN)✓ Code formaté$(RESET)"
fmt-check:
@$(CARGO) fmt -- --check
run-api: build
@echo "$(BLUE)Démarrage de l'API Magneto-Serge...$(RESET)"
@echo "$(YELLOW)API: http://localhost:8889$(RESET)"
@echo "$(YELLOW)OpenAPI: http://localhost:8889/openapi.json$(RESET)"
@echo "$(YELLOW)Health: http://localhost:8889/health$(RESET)"
@RUST_LOG=$(RUST_LOG) $(CARGO) run --bin magneto -- api
run-backend:
@echo "$(BLUE)Démarrage du backend Node.js...$(RESET)"
@echo "$(YELLOW)Backend: http://localhost:3000$(RESET)"
@cd examples/nodejs-backend && $(NPM) start
run-client-simple:
@echo "$(BLUE)Démarrage du client Angular simple...$(RESET)"
@echo "$(YELLOW)Client: http://localhost:4201$(RESET)"
@cd examples/angular-simple-client && $(NPM) start
run-client-hydra:
@echo "$(BLUE)Démarrage du client Angular Hydra...$(RESET)"
@echo "$(YELLOW)Client: http://localhost:4200$(RESET)"
@cd examples/angular-client && $(NPM) start
dev:
@echo "$(BLUE)╔════════════════════════════════════════════════════════╗$(RESET)"
@echo "$(BLUE)║ Démarrage de la stack complète Magneto-Serge ║$(RESET)"
@echo "$(BLUE)╚════════════════════════════════════════════════════════╝$(RESET)"
@echo ""
@echo "$(YELLOW)Cette commande nécessite plusieurs terminaux.$(RESET)"
@echo "$(YELLOW)Utilisez 'make dev-tmux' pour un démarrage automatique.$(RESET)"
@echo ""
@echo "$(GREEN)Lancement des services:$(RESET)"
@echo " 1. $(BLUE)API Magneto$(RESET) (port 8889)"
@echo " 2. $(BLUE)Backend Node.js$(RESET) (port 3000)"
@echo " 3. $(BLUE)Client Angular$(RESET) (port 4201)"
@echo ""
@$(MAKE) dev-tmux
dev-tmux:
@if command -v tmux >/dev/null 2>&1; then \
echo "$(BLUE)Lancement dans tmux...$(RESET)"; \
./scripts/start-dev.sh; \
else \
echo "$(RED)tmux n'est pas installé. Installation:$(RESET)"; \
echo " macOS: brew install tmux"; \
echo " Linux: sudo apt install tmux"; \
echo ""; \
echo "$(YELLOW)Ou lancez manuellement dans 3 terminaux:$(RESET)"; \
echo " Terminal 1: make run-api"; \
echo " Terminal 2: make run-backend"; \
echo " Terminal 3: make run-client-simple"; \
fi
dev-manual:
@echo "$(BLUE)╔════════════════════════════════════════════════════════╗$(RESET)"
@echo "$(BLUE)║ Instructions de démarrage manuel ║$(RESET)"
@echo "$(BLUE)╚════════════════════════════════════════════════════════╝$(RESET)"
@echo ""
@echo "$(GREEN)Terminal 1$(RESET) - API Magneto-Serge:"
@echo " $$ make run-api"
@echo ""
@echo "$(GREEN)Terminal 2$(RESET) - Backend Node.js:"
@echo " $$ make run-backend"
@echo ""
@echo "$(GREEN)Terminal 3$(RESET) - Client Angular:"
@echo " $$ make run-client-simple"
@echo ""
@echo "$(YELLOW)Puis ouvrez: http://localhost:4201$(RESET)"
example-record: build
@echo "$(BLUE)Démarrage du proxy en mode record...$(RESET)"
@echo "$(YELLOW)Configurez votre client HTTP:$(RESET)"
@echo " export http_proxy=http://localhost:8888"
@echo " export https_proxy=http://localhost:8888"
@echo ""
@$(CARGO) run --bin magneto -- record demo --port 8888
example-replay: build
@echo "$(BLUE)Démarrage du proxy en mode replay...$(RESET)"
@$(CARGO) run --bin magneto -- replay demo --port 8888
example-auto: build
@echo "$(BLUE)Démarrage du proxy en mode auto...$(RESET)"
@$(CARGO) run --bin magneto -- auto demo --port 8888
example-list: build
@$(CARGO) run --bin magneto -- list
docker-build:
@echo "$(BLUE)Build de l'image Docker...$(RESET)"
@docker build -t magneto-serge:latest .
@echo "$(GREEN)✓ Image Docker créée: magneto-serge:latest$(RESET)"
docker-build-alpine:
@echo "$(BLUE)Build de l'image Docker Alpine...$(RESET)"
@docker build -f Dockerfile.alpine -t magneto-serge:alpine -t tabou/magneto-serge:alpine .
@echo "$(GREEN)✓ Image Docker Alpine créée: magneto-serge:alpine$(RESET)"
docker-run:
@echo "$(BLUE)Démarrage du container Docker...$(RESET)"
@docker run -p 8889:8889 -p 8888:8888 magneto-serge:latest
docker-run-alpine:
@echo "$(BLUE)Démarrage du container Docker Alpine...$(RESET)"
@docker run -d --name magneto-serge \
-p 8889:8889 -p 3000:3000 -p 4201:4201 -p 8888:8888 \
-v $(PWD)/cassettes:/app/cassettes \
magneto-serge:alpine all
@echo "$(GREEN)✓ Container démarré$(RESET)"
@echo "$(YELLOW)API: http://localhost:8889$(RESET)"
@echo "$(YELLOW)Backend: http://localhost:3000$(RESET)"
@echo "$(YELLOW)Frontend: http://localhost:4201$(RESET)"
@echo "$(YELLOW)Proxy: http://localhost:8888$(RESET)"
docker-compose:
@echo "$(BLUE)Démarrage avec docker-compose...$(RESET)"
@docker-compose up -d
@echo "$(GREEN)✓ Stack démarrée$(RESET)"
@echo "$(YELLOW)API: http://localhost:8889$(RESET)"
@echo "$(YELLOW)Backend: http://localhost:3000$(RESET)"
@echo "$(YELLOW)Client: http://localhost:4201$(RESET)"
docker-compose-alpine:
@echo "$(BLUE)Démarrage avec docker-compose Alpine...$(RESET)"
@docker-compose -f docker-compose.alpine.yml up -d
@echo "$(GREEN)✓ Stack Alpine démarrée$(RESET)"
@echo "$(YELLOW)API: http://localhost:8889$(RESET)"
@echo "$(YELLOW)Backend: http://localhost:3000$(RESET)"
@echo "$(YELLOW)Frontend: http://localhost:4201$(RESET)"
@echo "$(YELLOW)Proxy: http://localhost:8888$(RESET)"
docker-stop:
@docker-compose down
docker-stop-alpine:
@docker-compose -f docker-compose.alpine.yml down
docker-push-alpine: docker-build-alpine
@echo "$(BLUE)Push de l'image sur Docker Hub...$(RESET)"
@docker tag magneto-serge:alpine tabou/magneto-serge:latest
@docker push tabou/magneto-serge:alpine
@docker push tabou/magneto-serge:latest
@echo "$(GREEN)✓ Image pushée sur Docker Hub$(RESET)"
docker-logs-alpine:
@docker logs -f magneto-serge
clean:
@echo "$(BLUE)Nettoyage des fichiers de build...$(RESET)"
@$(CARGO) clean
@echo "$(GREEN)✓ Build Rust nettoyé$(RESET)"
clean-all: clean clean-deps clean-clients
@echo "$(GREEN)✓ Nettoyage complet terminé$(RESET)"
clean-deps:
@echo "$(BLUE)Suppression de node_modules...$(RESET)"
@rm -rf examples/nodejs-backend/node_modules
@rm -rf examples/angular-simple-client/node_modules
@rm -rf examples/angular-client/node_modules
@echo "$(GREEN)✓ node_modules supprimés$(RESET)"
clean-clients:
@echo "$(BLUE)Nettoyage des builds Angular...$(RESET)"
@rm -rf examples/angular-simple-client/dist
@rm -rf examples/angular-simple-client/.angular
@rm -rf examples/angular-client/dist
@rm -rf examples/angular-client/.angular
@echo "$(GREEN)✓ Builds Angular nettoyés$(RESET)"
clean-cassettes:
@echo "$(YELLOW)⚠️ Suppression de toutes les cassettes...$(RESET)"
@rm -rf ~/.magneto/cassettes/*
@echo "$(GREEN)✓ Cassettes supprimées$(RESET)"
docs:
@echo "$(BLUE)Génération de la documentation...$(RESET)"
@$(CARGO) doc --no-deps --open
@echo "$(GREEN)✓ Documentation générée$(RESET)"
docs-api: run-api &
@sleep 2
@open http://localhost:8889/openapi.json
readme:
@echo "$(BLUE)╔════════════════════════════════════════════════════════╗$(RESET)"
@echo "$(BLUE)║ Documentation Magneto-Serge ║$(RESET)"
@echo "$(BLUE)╚════════════════════════════════════════════════════════╝$(RESET)"
@echo ""
@echo "$(GREEN)Documentation principale:$(RESET)"
@echo " • README.md - Documentation générale"
@echo " • QUICK_START.md - Guide de démarrage rapide"
@echo ""
@echo "$(GREEN)Exemples:$(RESET)"
@echo " • examples/README.md - Liste des exemples"
@echo " • examples/api_client.py - Client Python"
@echo " • examples/api_client.js - Client JavaScript"
@echo ""
@echo "$(GREEN)Clients Web:$(RESET)"
@echo " • examples/angular-simple-client/README.md - Client production"
@echo " • examples/angular-client/README.md - Client Hydra démo"
@echo " • examples/nodejs-backend/README.md - Backend Node.js"
@echo " • examples/nodejs-backend/ARCHITECTURE.md - Architecture détaillée"
status:
@echo "$(BLUE)╔════════════════════════════════════════════════════════╗$(RESET)"
@echo "$(BLUE)║ Statut des Services ║$(RESET)"
@echo "$(BLUE)╚════════════════════════════════════════════════════════╝$(RESET)"
@echo ""
@echo "$(YELLOW)API Magneto (8889):$(RESET)"
@curl -s http://localhost:8889/health | grep -q "ok" && echo " $(GREEN)✓ Running$(RESET)" || echo " $(RED)✗ Stopped$(RESET)"
@echo ""
@echo "$(YELLOW)Backend Node.js (3000):$(RESET)"
@curl -s http://localhost:3000/ > /dev/null && echo " $(GREEN)✓ Running$(RESET)" || echo " $(RED)✗ Stopped$(RESET)"
@echo ""
@echo "$(YELLOW)Client Angular (4201):$(RESET)"
@curl -s http://localhost:4201/ > /dev/null && echo " $(GREEN)✓ Running$(RESET)" || echo " $(RED)✗ Stopped$(RESET)"
ports:
@echo "$(BLUE)Ports utilisés par Magneto-Serge:$(RESET)"
@echo " $(YELLOW)8889$(RESET) - API Magneto-Serge"
@echo " $(YELLOW)8888$(RESET) - Proxy HTTP/HTTPS/WebSocket"
@echo " $(YELLOW)3000$(RESET) - Backend Node.js"
@echo " $(YELLOW)4201$(RESET) - Client Angular Simple"
@echo " $(YELLOW)4200$(RESET) - Client Angular Hydra"
version:
@echo "$(BLUE)Versions:$(RESET)"
@echo -n " Rust: " && rustc --version
@echo -n " Cargo: " && cargo --version
@echo -n " Node.js: " && node --version
@echo -n " NPM: " && npm --version
init:
@echo "$(BLUE)Initialisation de Magneto-Serge...$(RESET)"
@$(CARGO) run --bin magneto -- init
@echo "$(GREEN)✓ Configuration initialisée$(RESET)"
bench:
@echo "$(BLUE)Lancement des benchmarks...$(RESET)"
@$(CARGO) bench
watch:
@echo "$(BLUE)Mode watch activé (recompile automatiquement)$(RESET)"
@cargo watch -x build
ci: fmt-check clippy test
@echo "$(GREEN)✓ Tous les checks CI passent$(RESET)"
ci-build: build-release build-client-simple
@echo "$(GREEN)✓ Build CI terminé$(RESET)"
quick: install build
@echo "$(GREEN)✓ Projet prêt à l'emploi !$(RESET)"
@echo ""
@echo "$(YELLOW)Prochaines étapes:$(RESET)"
@echo " make dev-manual @echo " make dev-tmux
all: install build-all test
@echo "$(GREEN)✓ Projet complet prêt !$(RESET)"