benevalibre/Makefile

196 lignes
6.4 KiB
Makefile

# -*- mode: makefile-gmake -*-
## Définition des variables
# Le nom de l'exécutable Python à utiliser ou son chemin absolu
# (ex. : python ou python3).
PYTHON_EXE := python3
# S'il faut utiliser un environnement virtuel (y ou n).
USE_VENV := y
# Configuration de l'environnement virtuel.
VENV_DIR := venv
VENV_OPT := --system-site-packages
# Définis les chemins et options des exécutables.
PYTHON_EXE_BASENAME := $(shell basename $(PYTHON_EXE))
VENV_PYTHON := --python=$(PYTHON_EXE_BASENAME)
ifeq ($(USE_VENV), y)
PYTHON := $(VENV_DIR)/bin/$(PYTHON_EXE_BASENAME)
PIP := $(VENV_DIR)/bin/pip
else
PYTHON := $(shell which $(PYTHON_EXE))
PIP := $(shell which pip)
endif
# Détermine si black est présent.
USE_BLACK := $(shell $(PYTHON) -c 'import black; print("1")' 2>/dev/null)
# Détermine s'il faut charger le fichier de configuration.
ifneq ($(READ_CONFIG_FILE), 0)
READ_CONFIG_FILE := 1
else
READ_CONFIG_FILE := 0
endif
# Détermine l'environnement à utiliser.
DEFAULT_ENV := production
ifndef ENV
ifeq ($(READ_CONFIG_FILE), 1)
# Commence par chercher la dernière valeur de DJANGO_SETTINGS_MODULE,
# puis de ENV s'il n'y en a pas, ou utilise l'environnement par défaut.
ENV = $(shell \
sed -n -e '/^DJANGO_SETTINGS_MODULE/s/[^.]*\.settings\.\([^.]*\)/\1/p' \
-e '/^ENV/s/[^=]*=\(.*\)/\1/p' config.env 2> /dev/null \
| tail -n 1 | grep -Ee '^..*' || echo "$(DEFAULT_ENV)")
else
ifdef DJANGO_SETTINGS_MODULE
ENV = $(shell echo $(DJANGO_SETTINGS_MODULE) | cut -d. -f3)
else
ENV := $(DEFAULT_ENV)
endif # ifdef DJANGO_SETTINGS_MODULE
endif # ifeq READ_CONFIG_FILE
endif # ifndef ENV
# Définis EDITOR pour l'édition interactive.
ifndef EDITOR
ifdef VISUAL
EDITOR := $(VISUAL)
else
EDITOR := vi
endif
endif
# Définition des cibles -------------------------------------------------------
.PHONY: clean-pyc clean-build clear-venv help check check-config docs clean-docs release
.DEFAULT_GOAL := help
# Commentaire d'une cible : #-> interne ##-> aide production+dev ###-> aide dev
help: ## affiche cette aide
ifeq ($(ENV), production)
@perl -nle'print $& if m{^[a-zA-Z_-]+:[^#]*?## .*$$}' $(MAKEFILE_LIST) \
| sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-18s\033[0m %s\n", $$1, $$2}'
else
@perl -nle'print $& if m{^[a-zA-Z_-]+:[^#]*?###? .*$$}' $(MAKEFILE_LIST) \
| sort | awk 'BEGIN {FS = ":.*?###? "}; {printf "\033[36m%-18s\033[0m %s\n", $$1, $$2}'
endif
clean: clean-build clean-pyc ## nettoie tous les fichiers temporaires
clean-build: ### nettoie les fichiers de construction du paquet
rm -rf build/
rm -rf dist/
rm -rf *.egg-info
clean-pyc: ### nettoie les fichiers temporaires python
find benevalibre/ \
\( -name '*.pyc' -o -name '*.pyo' -o -name '*~' \) -exec rm -f {} +
init: create-venv config.env update ## initialise l'environnement et l'application
config.env:
ifeq ($(READ_CONFIG_FILE), 1)
cp config.env.example config.env
chmod go-rwx config.env
$(EDITOR) config.env
endif
update: check-config install-deps migrate static docs ## mets à jour l'application et ses dépendances
$(PYTHON) manage.py rendervariations --ignore-missing --replace \
'accounts.User.avatar' 'association.Association.logo'
touch benevalibre/wsgi.py
check: check-config ## vérifie la configuration de l'instance
$(PYTHON) manage.py check
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; }
install-deps: ## installe les dépendances de l'application
$(PIP) install --upgrade --requirement requirements/$(ENV).txt
migrate: ## mets à jour le schéma de la base de données
$(PYTHON) manage.py migrate
check-migrations: ## teste la cohérence des migrations et du code
$(PYTHON) manage.py makemigrations --check --noinput --dry-run
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
create-venv: $(PYTHON)
$(PYTHON):
ifeq ($(USE_VENV), y)
virtualenv $(VENV_OPT) $(VENV_PYTHON) $(VENV_DIR)
else
@echo "\033[31mErreur !\033[0m Impossible de trouver l'exécutable Python $(PYTHON)"
@exit 1
endif
clear-venv: ## supprime l'environnement virtuel
-rm -rf $(VENV_DIR)
## Cibles pour le développement
serve: ### démarre un serveur local pour l'application
$(PYTHON) manage.py runserver
test: ### lance les tests de l'application
$(PYTHON) -m pytest --cov --cov-report=term:skip-covered
test-wip: ### lance les tests marqués comme "wip"
$(PYTHON) -W ignore::DeprecationWarning -m pytest -v -m wip --pdb
dev-test: ### lance uniquement les derniers tests non passés
$(PYTHON) -m pytest --last-failed
cov: test ### vérifie la couverture de code
$(PYTHON) -m coverage html
@echo open htmlcov/index.html
lint: ### vérifie la syntaxe et le code python
@$(PYTHON) -m flake8 benevalibre \
|| echo "\033[31m[flake8]\033[0m Veuillez corriger les erreurs ci-dessus."
@$(PYTHON) -m isort --check benevalibre \
|| echo "\033[31m[isort]\033[0m Veuillez corriger l'ordre des imports avec : make fix-lint"
ifdef USE_BLACK
@$(PYTHON) -m black --check benevalibre
endif
fix-lint: ### corrige la syntaxe et ordonne les imports python
$(PYTHON) -m isort benevalibre
ifdef USE_BLACK
$(PYTHON) -m black benevalibre
endif
docs: ## construit la documentation
$(MAKE) -C docs/ html SPHINXBUILD=../$(VENV_DIR)/bin/sphinx-build
clean-docs: ## supprime la documentation (docs/build)
$(MAKE) -C docs/ clean SPHINXBUILD=../$(VENV_DIR)/bin/sphinx-build
release: ### prépare une nouvelle version
ifdef VERSION
@echo Upgrading to version: $(VERSION)
@$(eval CURR_VERSION=$(shell python -c "import benevalibre; print(benevalibre.__version__)"))
@$(eval DATE=$(shell date -I))
@csplit --quiet --suppress-matched --prefix .CHANGELOG.md. CHANGELOG.md '/## \[Current development\]/1'
@echo "" >> .CHANGELOG.md.00
@/bin/echo -e '## [$(VERSION)] - $(DATE)\n' >> .CHANGELOG.md.00
@git log --pretty=format:'- %s' v$(CURR_VERSION)...HEAD >> .CHANGELOG.md.00
@echo "" >> .CHANGELOG.md.00
@cat .CHANGELOG.md.* > CHANGELOG.md
@sed -i -e "s/\(__version__ =\) '.\+'/\1 '$(VERSION)'/" benevalibre/__init__.py
@rm -f .CHANGELOG.md.*
else
@echo Usage:
@echo VERSION=x.y.z make release
@exit 1
endif