# -*- mode: makefile-gmake -*- ## Définition des variables # Le nom de l'exécutable Python à utiliser (ex. python) PYTHON_BASENAME := python3 # Configuration de l'environnement virtuel VENV_DIR := .venv VENV_OPT := --system-site-packages # Définis les chemins et options des exécutables POETRY := $(VENV_DIR)/bin/poetry PYTHON := $(VENV_DIR)/bin/$(PYTHON_BASENAME) PIP := $(VENV_DIR)/bin/pip # Détermine l'environnement à utiliser. ifndef ENV ifdef DJANGO_SETTINGS_MODULE ENV = $(shell echo $(DJANGO_SETTINGS_MODULE) | cut -d. -f3) else DEFAULT_ENV := production ENV = $(shell \ sed -n '/^ENV/s/[^=]*=\(.*\)/\1/p' config.env 2> /dev/null \ | tail -n 1 | grep -Ee '^..*' || echo "$(DEFAULT_ENV)") endif endif # Définis EDITOR pour l'édition interactive. ifndef EDITOR ifdef VISUAL EDITOR := $(VISUAL) else EDITOR := vi endif endif # Définition des cibles ------------------------------------------------------- .DEFAULT_GOAL := help # Commentaire d'une cible : #-> interne ##-> aide production+dev ###-> aide dev .PHONY: help help: ## affiche cette aide ifeq ($(ENV), production) @perl -nle'print $& if m{^[a-zA-Z_-]+:[^#]*?## .*$$}' $(MAKEFILE_LIST) \ | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}' else @perl -nle'print $& if m{^[a-zA-Z_-]+:[^#]*?###? .*$$}' $(MAKEFILE_LIST) \ | sort | awk 'BEGIN {FS = ":.*?###? "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}' endif .PHONY: clean clean: clean-build clean-pyc clean-static ## nettoie tous les fichiers temporaires .PHONY: clean-build clean-build: ### nettoie les fichiers de construction du paquet rm -rf build/ rm -rf dist/ rm -rf *.egg-info .PHONY: clean-pyc clean-pyc: ### nettoie les fichiers temporaires python find fournée/ \ \( -name '*.pyc' -o -name '*.pyo' -o -name '*~' \) -exec rm -f {} + .PHONY: clean-static clean-static: ### nettoie les fichiers "static" collectés rm -rf var/static .PHONY: init init: create-venv config.env ## initialise l'environnement et l'application @$(MAKE) --no-print-directory update config.env: cp config.env.example config.env chmod go-rwx config.env $(EDITOR) config.env update: check-config install-deps migrate static ## mets à jour l'application et ses dépendances touch fournée/wsgi.py .PHONY: check check: check-config ## vérifie la configuration de l'instance $(PYTHON) manage.py check .PHONY: check-config check-config: @find . -maxdepth 1 -name config.env -perm /o+rwx -exec false {} + || \ { echo "\033[31mErreur :\033[0m les permissions de config.env ne sont pas bonnes, \ vous devriez au moins faire : chmod o-rwx config.env"; false; } .PHONY: install-deps install-deps: ## installe les dépendances de l'application ifeq ($(ENV), production) $(POETRY) install else $(POETRY) install --with dev endif .PHONY: migrate migrate: ## mets à jour le schéma de la base de données $(PYTHON) manage.py migrate .PHONY: static static: ## collecte les fichiers statiques ifeq ($(ENV), production) @echo "Collecte des fichiers statiques..." $(PYTHON) manage.py collectstatic --no-input --verbosity 0 endif ## Cibles liées à l'environnement virtuel .PHONY: create-venv create-venv: $(PYTHON) $(PYTHON): $(shell which $(PYTHON_BASENAME)) -m venv $(VENV_OPT) $(VENV_DIR) .PHONY: clear-venv clear-venv: ## supprime l'environnement virtuel -rm -rf $(VENV_DIR) ## Cibles pour le développement .PHONY: serve serve: ### démarre un serveur local pour l'application $(PYTHON) manage.py runserver .PHONY: test test: ### lance les tests de l'application $(PYTHON) -m pytest --cov --cov-report=term:skip-covered .PHONY: test-wip test-wip: #### lance les tests marqués 'wip' $(PYTHON) -m pytest -vv -m 'wip' --pdb .PHONY: test-failed test-failed: #### lance les tests qui ont échoué $(PYTHON) -m pytest --lf .PHONY: coverage coverage: test ### vérifie la couverture de code $(PYTHON) -m coverage html @echo open htmlcov/index.html .PHONY: lint lint: ### vérifie la syntaxe du code Python @$(PYTHON) -m ruff check @$(PYTHON) -m ruff format --check --quiet .PHONY: format format: ### formate le code Python $(PYTHON) -m ruff check --fix $(PYTHON) -m ruff format .PHONY: shell shell: ### lance un shell Python dans l'environnement ifeq ($(ENV), production) $(PYTHON) manage.py shell else $(PYTHON) manage.py shell_plus endif