Skip to content

Commit f7d5532

Browse files
Merge pull request #16 from DACCS-Climate/versioning
Versioning
2 parents 069c9ef + ea0ceac commit f7d5532

File tree

4 files changed

+236
-5
lines changed

4 files changed

+236
-5
lines changed

.bumpversion.cfg

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[bumpversion]
2+
current_version = 1.1.1
3+
commit = True
4+
tag = False
5+
tag_name = {new_version}
6+
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)
7+
serialize =
8+
{major}.{minor}.{patch}
9+
10+
[bumpversion:file:pyproject.toml]
11+
search = version = "{current_version}"
12+
replace = version = "{new_version}"
13+
14+
[bumpversion:file:Makefile]
15+
search = APP_VERSION := {current_version}
16+
replace = APP_VERSION := {new_version}
17+
18+
[bumpversion:file:RELEASE.txt]
19+
search = {current_version} 2024-02-13T17:59:20Z
20+
replace = {new_version} {utcnow:%Y-%m-%dT%H:%M:%SZ}

Makefile

Lines changed: 214 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,222 @@
1+
override SHELL := bash
2+
override APP_NAME := marble_client
3+
override APP_VERSION := 1.1.1
14

2-
upgrade-build-packages:
5+
# utility to remove comments after value of an option variable
6+
override clean_opt = $(shell echo "$(1)" | $(_SED) -r -e "s/[ '$'\t'']+$$//g")
7+
8+
override _SED := sed
9+
override OS_NAME := $(uname)
10+
ifeq ($(OS_NAME),Darwin)
11+
override _SED := gsed
12+
endif
13+
14+
# color codes and utility shortcuts
15+
COLOR ?= 1 ## Enable or disable use of colors in outputs (eg: 'COLOR=0' will disable them)
16+
COLOR := $(call clean_opt,$(COLOR))
17+
override ECHO := echo
18+
# all colors are undefined by default
19+
# only define items that have actual text on top of colors
20+
override _ERROR := "ERROR: "
21+
override _WARN := "WARN: "
22+
override _INFO := "INFO: "
23+
override _DEBUG := "DEBUG: "
24+
override _MAKE := "make"
25+
override _CONDA := "conda"
26+
override _NA := "\<n/a\>"
27+
ifneq ("$(COLOR)", "0")
28+
# must make sure that interpretation of backslash escapes is enabled (not default for all terminals)
29+
# must use the full path otherwise make confuses it with its own echo command
30+
# reference: https://misc.flogisoft.com/bash/tip_colors_and_formatting
31+
override ECHO := /bin/echo
32+
override _ESC := $(shell printf '\033')
33+
override _NORMAL := $(_ESC)[0m
34+
override _RED := $(_ESC)[31m
35+
override _GREEN := $(_ESC)[32m
36+
override _YELLOW := $(_ESC)[33m
37+
override _BLUE := $(_ESC)[34m
38+
override _MAGENTA := $(_ESC)[35m
39+
override _CYAN := $(_ESC)[36m
40+
override _DARK_GRAY := $(_ESC)[90m
41+
override _LIGHT_CYAN := $(_ESC)[96m
42+
override _BG_GRAY := $(_ESC)[100m
43+
override _BG_DARK_RED := $(_ESC)[48;5;52m
44+
override _BG_PURPLE := $(_ESC)[48;5;55m
45+
override _BG_LIGHT_PURPLE := $(_ESC)[48;5;60m
46+
override _ORANGE := $(_ESC)[38;5;166m
47+
override _LIGHT_ORANGE := $(_ESC)[38;5;214m
48+
# concepts
49+
override _ERROR := "$(_RED)$(_ERROR)$(_NORMAL)"
50+
override _WARN := "$(_YELLOW)$(_WARN)$(_NORMAL)"
51+
override _INFO := "$(_BLUE)$(_INFO)$(_NORMAL)"
52+
override _DEBUG := "$(_DARK_GRAY)$(_DEBUG)$(_NORMAL)"
53+
override _CMD := $(_ORANGE)
54+
override _MAKE := $(_CMD)$(_MAKE)$(_NORMAL)
55+
override _CONDA := $(_CMD)$(_CONDA)$(_NORMAL)
56+
override _NA := $(_YELLOW)$(_NA)$(_NORMAL)
57+
override _FILE := $(_LIGHT_CYAN)
58+
override _HEADER := $(_BG_DARK_RED)
59+
override _EXTENSION := $(_LIGHT_CYAN)
60+
override _UNKNOWN := $(_LIGHT_ORANGE)
61+
override _SECTION := $(_BG_GRAY)
62+
override _TARGET := $(_CYAN)
63+
override _OPTION := $(_MAGENTA)
64+
override _CONFIG := $(_GREEN)
65+
endif
66+
override MSG_D := $(ECHO) $(_DEBUG)
67+
override MSG_I := $(ECHO) $(_INFO)
68+
override MSG_W := $(ECHO) $(_WARN)
69+
override MSG_E := $(ECHO) $(_ERROR)
70+
71+
override TARGET_SIZE := 16
72+
override OPTION_SIZE = 16
73+
override OPTION_OFFSET = $(shell echo $$(($(OPTION_SIZE) + 3)))
74+
75+
76+
### Information Targets ###
77+
78+
.DEFAULT_GOAL := help
79+
80+
.PHONY: help
81+
help: ## Display usage message
82+
@-$(ECHO) "$(_HEADER)=== Makefile Help ===$(_NORMAL)"
83+
@-$(MSG_I) "For available target commands, call the following:"
84+
@-$(ECHO) " $(_MAKE) $(_TARGET)targets$(_NORMAL)"
85+
@-$(MSG_I) "For available options, call the following:"
86+
@-$(ECHO) " $(_MAKE) $(_OPTION)options$(_NORMAL)"
87+
88+
.PHONY: options
89+
options: ## Display configurable option details for execution of targets
90+
@$(ECHO) "$(_HEADER)=== Configurable Options [$(APP_NAME)] ===$(_NORMAL)\n"
91+
@$(MSG_I) "Use '$(_MAKE) $(_OPTION)OPTION$(_NORMAL)=<value> <$(_TARGET)target$(_NORMAL)>' \
92+
where <$(_OPTION)OPTION$(_NORMAL)> is one amongst below choices:\n"
93+
@grep -E '^\s*[a-zA-Z0-9_]+\s+\?\=.*$$' Makefile \
94+
| $(_SED) -r -e 's/\s*(.*)\s*\?\=[\s\t]*([^#]*[^#\s\t]+)?[\s\t]*(##\s+(.*))*$$/\1!!!\2!!!\3!!!\4/g' \
95+
| awk ' BEGIN {FS = "!!!"}; { \
96+
printf " $(_TARGET)%-$(OPTION_SIZE)s$(_NORMAL)%s%-$(OPTION_OFFSET)s[default:%s]\n", $$1, $$4, "\n", $$2 \
97+
}'
98+
99+
.PHONY: targets
100+
targets: ## Display available targets and descriptions
101+
@$(ECHO) "$(_HEADER)=== Makefile Targets [$(APP_NAME)] ===$(_NORMAL)"
102+
@grep -v -E '.*(\?|\:\=).*$$' Makefile | grep -E '\#\#.*$$' \
103+
| $(_SED) -r -e 's/([\sA-Za-z0-9\_\-]+)\:[\sA-Za-z0-9\_\-\.]+\s*\#{2,3}\s*(.*)\s*$$/\1!!!\2/g' \
104+
| awk ' BEGIN {FS = "(:|###)+.*?## "}; \
105+
/\#\#\#/ {printf "$(_SECTION)%s$(_NORMAL)\n", $$1;} \
106+
/:/ {printf " $(_TARGET)%-$(TARGET_SIZE)s$(_NORMAL) %s\n", $$1, $$2;} \
107+
'
108+
@$(ECHO) ""
109+
110+
111+
### Versioning Targets ###
112+
113+
# Bumpversion 'dry' config
114+
# if 'dry' is specified as target, any bumpversion call using 'BUMP_XARGS' will not apply changes
115+
BUMP_XARGS ?= --verbose --allow-dirty ## Extra arguments to pass down to version control utility
116+
BUMP_XARGS := $(call clean_opt,$(BUMP_XARGS))
117+
ifeq ($(filter dry, $(MAKECMDGOALS)), dry)
118+
BUMP_XARGS := $(BUMP_XARGS) --dry-run
119+
endif
120+
BUMP_CFG ?= .bumpversion.cfg ## Bump version configuration (default recommended)
121+
BUMP_CFG := $(call clean_opt,$(BUMP_CFG))
122+
BUMP_TOOL := bump2version
123+
BUMP_CMD := $(BUMP_TOOL) --config-file "$(BUMP_CFG)"
124+
125+
# guess the applicable semantic level update if provided via major|minor|patch targets
126+
# perform validation to avoid many combination provided simultaneously
127+
override BUMP_VERSION_INPUT := 1
128+
override BUMP_VERSION_LEVEL :=
129+
ifeq ($(filter major, $(MAKECMDGOALS)), major)
130+
ifeq ($(BUMP_VERSION_LEVEL),)
131+
override BUMP_VERSION_LEVEL := major
132+
override BUMP_VERSION_INPUT := 0
133+
else
134+
$(error "Cannot combine 'major|minor|patch' simultaneously!")
135+
endif
136+
endif
137+
ifeq ($(filter minor, $(MAKECMDGOALS)), minor)
138+
ifeq ($(BUMP_VERSION_LEVEL),)
139+
override BUMP_VERSION_LEVEL := minor
140+
override BUMP_VERSION_INPUT := 0
141+
else
142+
$(error "Cannot combine 'major|minor|patch' simultaneously!")
143+
endif
144+
endif
145+
ifeq ($(filter patch, $(MAKECMDGOALS)), patch)
146+
ifeq ($(BUMP_VERSION_LEVEL),)
147+
override BUMP_VERSION_LEVEL := patch
148+
override BUMP_VERSION_INPUT := 0
149+
else
150+
$(error "Cannot combine 'major|minor|patch' simultaneously!")
151+
endif
152+
endif
153+
ifneq ($(VERSION),)
154+
ifneq ($(BUMP_VERSION_LEVEL),)
155+
$(error "Cannot combine 'major|minor|patch' simultaneously with explicit VERSION input!")
156+
endif
157+
endif
158+
# when none was provided, use patch to directly apply the explicit 'VERSION' specified as input
159+
ifeq ($(BUMP_VERSION_LEVEL),)
160+
override BUMP_VERSION_LEVEL := --new-version "$(VERSION)" patch
161+
endif
162+
163+
.PHONY: dry
164+
dry: $(BUMP_CFG)
165+
@-$(ECHO) > /dev/null
166+
167+
.PHONY: patch
168+
patch: $(BUMP_CFG)
169+
@-$(ECHO) > /dev/null
170+
171+
.PHONY: minor
172+
minor: $(BUMP_CFG)
173+
@-$(ECHO) > /dev/null
174+
175+
.PHONY: major
176+
major: $(BUMP_CFG)
177+
@-$(ECHO) > /dev/null
178+
179+
180+
# run bumpversion with replacement of the release time value within its config for auto-update on future revisions
181+
.PHONY: bump
182+
bump: bump-check bump-install ## Bump version (call: make bump major|minor|patch)
183+
@-$(MSG_I) "Updating package version..."
184+
@[ $(BUMP_VERSION_INPUT) -eq 0 ] || [ "${VERSION}" ] || ( \
185+
$(MSG_E) "Argument 'VERSION' is not specified to bump version"; exit 1 \
186+
)
187+
@$(SHELL) -c ' \
188+
PRE_RELEASE_TIME=$$(head -n 1 RELEASE.txt | cut -d " " -f 2) && \
189+
$(BUMP_CMD) $(BUMP_XARGS) $(BUMP_VERSION_LEVEL) && \
190+
POST_RELEASE_TIME=$$(head -n 1 RELEASE.txt | cut -d " " -f 2) && \
191+
echo "Replace $${PRE_RELEASE_TIME} → $${POST_RELEASE_TIME}" && \
192+
$(_SED) -i "s/$${PRE_RELEASE_TIME}/$${POST_RELEASE_TIME}/g" $(BUMP_CFG) && \
193+
git add $(BUMP_CFG) && \
194+
git commit --amend --no-edit \
195+
'
196+
197+
.PHONY: bump-install
198+
bump-install: ## Installs bump2version if not detected in the environment
199+
@-$(SHELL) -c 'which "$(BUMP_TOOL)" &> /dev/null || pip install $(BUMP_TOOL)'
200+
201+
.PHONY: bump-check
202+
bump-check: ## Verifies that required bump2version configuration file is present
203+
@[ -f "$(BUMP_CFG)" ] || ( \
204+
$(MSG_E) "Missing required file [$(BUMP_CFG)]. Create a $(BUMP_CFG) file first."; \
205+
exit 1 \
206+
);
207+
208+
209+
### Development Targets ###
210+
211+
upgrade-build-packages: ## Installs build tools
3212
pip install --upgrade build
4213
pip install --upgrade twine
5214

6-
build: upgrade-build-packages
215+
build: upgrade-build-packages ## Build the distribution
7216
python -m build
8217

9-
upload:
218+
upload: build ## Upload the built distribution to PyPI
10219
twine upload dist/*
11220

12-
test-upload:
13-
twine upload --repository testpypi dist/*
221+
test-upload: build ## Upload the built distribution to the test PyPI
222+
twine upload --repository testpypi dist/*

RELEASE.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1.1.1 2024-02-13T17:59:20Z

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
platformdirs==4.2.0
22
python-dateutil==2.8.2
33
requests==2.31.0
4+
bump2version>=1.0.1

0 commit comments

Comments
 (0)