-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
170 lines (131 loc) · 5.41 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
### Defensive settings for make:
# https://tech.davis-hansson.com/p/make/
SHELL:=bash
.ONESHELL:
.SHELLFLAGS:=-xeu -o pipefail -O inherit_errexit -c
.SILENT:
.DELETE_ON_ERROR:
MAKEFLAGS+=--warn-undefined-variables
MAKEFLAGS+=--no-builtin-rules
# We like colors
# From: https://coderwall.com/p/izxssa/colored-makefile-for-golang-projects
RED=`tput setaf 1`
GREEN=`tput setaf 2`
RESET=`tput sgr0`
YELLOW=`tput setaf 3`
PLONE_VERSION=6.0-latest
# Python checks
PYTHON?=python3
# installed?
ifeq (, $(shell which $(PYTHON) ))
$(error "PYTHON=$(PYTHON) not found in $(PATH)")
endif
# version ok?
PYTHON_VERSION_MIN=3.8
PYTHON_VERSION_OK=$(shell $(PYTHON) -c "import sys; print((int(sys.version_info[0]), int(sys.version_info[1])) >= tuple(map(int, '$(PYTHON_VERSION_MIN)'.split('.'))))")
ifeq ($(PYTHON_VERSION_OK),0)
$(error "Need python $(PYTHON_VERSION) >= $(PYTHON_VERSION_MIN)")
endif
REPOSITORY_FOLDER=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
COMPOSE_FOLDER=${REPOSITORY_FOLDER}/tests
DOCS_DIR=${REPOSITORY_FOLDER}/docs
VENV_FOLDER=$(REPOSITORY_FOLDER)/.venv
BIN_FOLDER=$(VENV_FOLDER)/bin
GIT_FOLDER=$(REPOSITORY_FOLDER)/.git
all: build
# Add the following 'help' target to your Makefile
# And add help text after each target name starting with '\#\#'
.PHONY: help
help: ## This help message
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
$(BIN_FOLDER)/uv $(BIN_FOLDER)/uvx $(BIN_FOLDER)/tox:
@echo "$(GREEN)==> Setup Virtual Env$(RESET)"
$(PYTHON) -m venv .venv
$(BIN_FOLDER)/pip install -U "pip" "uv" "tox" "pre-commit"
if [ -d $(GIT_FOLDER) ]; then $(BIN_FOLDER)/pre-commit install; else echo "$(RED) Not installing pre-commit$(RESET)";fi
$(BIN_FOLDER)/fullrelease: $(BIN_FOLDER)/uv ## Install zest.releaser
@echo "$(GREEN)==> Install zest.releaser$(RESET)"
$(BIN_FOLDER)/uv pip install 'zest.releaser[recommended]' 'zestreleaser.towncrier'
instance/etc/zope.ini: $(BIN_FOLDER)/uvx ## Create instance configuration
@echo "$(GREEN)==> Create instance configuration$(RESET)"
$(BIN_FOLDER)/uvx cookiecutter -f --no-input --config-file instance.yaml gh:plone/cookiecutter-zope-instance
.PHONY: config
config: instance/etc/zope.ini
requirements-mxdev.txt constraints-mxdev.txt: $(BIN_FOLDER)/uvx ## Generate constraints file
@echo "$(GREEN)==> Generate constraints file$(RESET)"
@echo '-c https://dist.plone.org/release/$(PLONE_VERSION)/constraints.txt' > requirements.txt
$(BIN_FOLDER)/uvx mxdev -c mx.ini
$(BIN_FOLDER)/runwsgi: $(BIN_FOLDER)/uvx ## Install Plone
@echo "$(GREEN)==> Install Plone Build$(RESET)"
$(BIN_FOLDER)/uv pip install -r requirements-mxdev.txt
.PHONY: build-dev
build-dev: constraints-mxdev.txt config $(BIN_FOLDER)/runwsgi ## install Plone packages
.PHONY: install
install: build-dev ## Install Plone 6.0
.PHONY: build
build: build-dev ## Install Plone 6.0
.PHONY: clean
clean: ## Remove old virtualenv and creates a new one
@echo "$(RED)==> Cleaning environment and build$(RESET)"
rm -rf bin lib lib64 include share etc var inituser pyvenv.cfg .installed.cfg .tox $(VENV_FOLDER) .pytest_cache *-mxdev.txt
.PHONY: clean-data
clean-data: ## Remove instance data
@echo "$(RED)==> Cleaning instance and build$(RESET)"
rm -rf instance
.PHONY: start
start: $(BIN_FOLDER)/runwsgi ## Start a Plone instance on localhost:8080
PYTHONWARNINGS=ignore $(BIN_FOLDER)/runwsgi instance/etc/zope.ini
.PHONY: console
console: ## Start a zope console
PYTHONWARNINGS=ignore $(BIN_FOLDER)/zconsole debug instance/etc/zope.conf
.PHONY: format
format: $(BIN_FOLDER)/tox ## Format the codebase according to our standards
@echo "$(GREEN)==> Format codebase$(RESET)"
$(BIN_FOLDER)/tox -e format
.PHONY: lint
lint: ## check code style
$(BIN_FOLDER)/tox -e lint
# i18n
$(BIN_FOLDER)/i18ndude: $(BIN_FOLDER)/uvx
@echo "$(GREEN)==> Install translation tools$(RESET)"
$(BIN_FOLDER)/uv pip install i18ndude
.PHONY: i18n
i18n: $(BIN_FOLDER)/i18ndude ## Update locales
@echo "$(GREEN)==> Updating locales$(RESET)"
$(BIN_FOLDER)/python src/pas/plugins/keycloakgroups/locales/update.py
# Tests
.PHONY: test
test: $(BIN_FOLDER)/tox ## run tests
$(BIN_FOLDER)/tox -e test
.PHONY: test-coverage
test-coverage: $(BIN_FOLDER)/tox ## run tests with coverage
$(BIN_FOLDER)/tox -e coverage
# Keycloak
.PHONY: keycloak-start
keycloak-start: ## Start Keycloak stack
@echo "$(GREEN)==> Start keycloak stack$(RESET)"
@docker compose -f $(COMPOSE_FOLDER)/docker-compose.yml up -d
.PHONY: keycloak-status
keycloak-status: ## Check Keycloak stack status
@echo "$(GREEN)==> Check Keycloak stack status$(RESET)"
@docker compose -f $(COMPOSE_FOLDER)/docker-compose.yml ps
.PHONY: keycloak-stop
keycloak-stop: ## Stop Keycloak stack
@echo "$(GREEN)==> Stop Keycloak stack$(RESET)"
@docker compose -f $(COMPOSE_FOLDER)/docker-compose.yml down
# Docs
$(BIN_FOLDER)/sphinx-build: $(BIN_FOLDER)/pipx
$(BIN_FOLDER)/pip install -r requirements-docs.txt
.PHONY: docs-build
docs-build: $(BIN_FOLDER)/sphinx-build ## Build the documentation
$(BIN_FOLDER)/sphinx-build \
-b html $(DOCS_DIR) "$(DOCS_DIR)/_build/html"
.PHONY: docs-live
docs-live: $(BIN_FOLDER)/sphinx-build ## Rebuild Sphinx documentation on changes, with live-reload in the browser
$(BIN_FOLDER)/sphinx-autobuild \
--ignore "*.swp" \
-b html $(DOCS_DIR) "$(DOCS_DIR)/_build/html"
# Release Tasks
.PHONY: release
release: $(BIN_FOLDER)/fullrelease ## Release package to pypi.org
$(BIN_FOLDER)/fullrelease