# ANTLR tool version. Must equal the antlr4-python3-runtime pin in
# pyproject.toml: the generated parser checks the runtime version.
ANTLR_VERSION = 4.13.2
PARSER = ocl/parser/OclExpressionParser.py

grammars: ocl-grammar

ocl-grammar: $(PARSER)

# Requires Java 11+ on PATH (or JAVA_HOME) and the `antlr4` wrapper
# (pip install antlr4-tools).
$(PARSER): OclExpression.g4
	antlr4 -v $(ANTLR_VERSION) -visitor -listener -Dlanguage=Python3 OclExpression.g4 -o ocl/parser
	printf '%s\n' \
	  'from .OclExpressionParser import OclExpressionParser' \
	  'from .OclExpressionLexer import OclExpressionLexer' \
	  'from .OclExpressionVisitor import OclExpressionVisitor' \
	  'from .OclExpressionListener import OclExpressionListener' \
	  > ocl/parser/__init__.py

clean:
	rm -rf ocl/parser
	rm -rf dist build *.egg-info

test: test-ocl

test-ocl:
	python3 -m pytest -m safe -vv tests/*.py

# Build sdist + wheel into dist/. Refuses to package a missing or stale
# parser (regenerate with `make grammars`). SOURCE_DATE_EPOCH makes the
# archives reproducible for a given commit.
dist: check-parser
	rm -rf dist build *.egg-info
	SOURCE_DATE_EPOCH=$$(git log -1 --format=%ct) python3 -m build

check-parser:
	@test -f $(PARSER) || { echo "error: $(PARSER) missing - run 'make grammars'"; exit 1; }
	@test ! OclExpression.g4 -nt $(PARSER) || { echo "error: $(PARSER) is older than OclExpression.g4 - run 'make grammars'"; exit 1; }
	@grep -q 'ANTLR $(ANTLR_VERSION)' $(PARSER) || { echo "error: $(PARSER) was not generated by ANTLR $(ANTLR_VERSION)"; exit 1; }

# Validate the built archives: metadata/README rendering and wheel layout.
check-dist:
	python3 -m twine check --strict dist/*
	check-wheel-contents dist/*.whl

.PHONY: grammars ocl-grammar clean test test-ocl dist check-parser check-dist
