# Copyright (C) 2017 The Meme Factory, Inc.  http://www.meme.com/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Karl O. Pinc <kop@meme.com>

TARGETS =
EXTRA_TARGETS = README.html
SETUPTOOLS_STUFF = build dist src/enforcer.egg-info
PYTEST_STUFF = .cache tests/__pycache__
COVERAGE_STUFF = .coverage
TOX_STUFF = .tox

all: ${TARGETS}

help:
	@echo
	@echo 'Usage: make TARGET'
	@echo
	@echo 'TARGET is one of:'
	@echo 'README.html         Make html version of README.md'
	@echo 'run_tests           Run regression tests'
	@echo 'dist                Create sdist Python package in ./dist'
	@echo 'clean               Removed generated data'
	@echo
	@echo 'Less used TARGETS are:'
	@echo 'check               Quick run of regression tests,'
	@echo '                    only with the default python'
	@echo 'pudb                Run the python pudb debugger'
	@echo 'devel/check-manifest'
	@echo '                    Create a check-manifest venv'
	@echo 'check-manifest      Run check-manifest'
	@echo 'update_check-manifest'
	@echo '                    Upgrade check-manifest venv to latest'
	@echo '                    versions'

README.html: README.md
	# Attempt to enforce RST conventions in README.md,
	# although we don't know if it will render properly.
	rst2html --strict README.md > /dev/null
	markdown_py README.md > README.html



# Development related targets

# Re-create development environment when setup.py changes
devel: setup.py
	rm -rf devel
	mkdir devel

devel/check-manifest: devel
	[ -d devel/check-manifest ] \
	  || ( virtualenv devel/check-manifest ; \
	       devel/check-manifest/bin/pip install --upgrade pip ; \
	       devel/check-manifest/bin/pip install --upgrade setuptools ; \
	       devel/check-manifest/bin/pip install check-manifest )

update_check-manifest: devel/check-manifest
	devel/check-manifest/bin/pip -U

check-manifest: devel/check-manifest
	devel/check-manifest/bin/check-manifest

devel/testenv: devel
	[ -d devel/testenv ] \
	  || ( virtualenv devel/testenv ; \
	       devel/testenv/bin/pip install --upgrade pip ; \
	       devel/testenv/bin/pip install --upgrade setuptools ; \
	       devel/testenv/bin/pip install tox)

update_testenv: devel/testenv
	devel/testenv/bin/pip -U

.PHONY: run_tests
run_tests: devel/testenv
	devel/testenv/bin/tox --skip-missing-interpreters

.PHONY: dist
dist:
	rm -rf dist
	python setup.py sdist

devel/pytest: devel dist
	if [ ! -d devel/pytest ] ; then \
	   ( virtualenv devel/pytest ; \
	     devel/pytest/bin/pip install --upgrade pip ; \
	     devel/pytest/bin/pip install --upgrade setuptools ; \
	     devel/pytest/bin/pip install dist/enforcer-*.tar.gz ; \
	     devel/pytest/bin/pip install flake8 ; \
	     devel/pytest/bin/pip install pytest-cov ; ) \
	else \
	   ( devel/pytest/bin/pip uninstall -y enforcer ; \
	     devel/pytest/bin/pip install dist/enforcer-*.tar.gz ) ; \
	fi

.PHONY: check
check: devel/pytest
	devel/pytest/bin/flake8 .
	devel/pytest/bin/py.test --cov=enforcer tests

devel/pudb: devel dist
	if [ ! -d devel/pudb ] ; then \
	   ( virtualenv devel/pudb ; \
	     devel/pudb/bin/pip install --upgrade pip ; \
	     devel/pudb/bin/pip install --upgrade setuptools ; \
	     devel/pudb/bin/pip install dist/enforcer-*.tar.gz ; \
	     devel/pudb/bin/pip install pudb ; ) \
	else \
	   ( devel/pudb/bin/pip uninstall -y enforcer ; \
	     devel/pudb/bin/pip install dist/enforcer-*.tar.gz ) ; \
	fi

.PHONY: pudb
pudb: devel/pudb
	# echo 'import pudb; pu.db' | devel/pudb/bin/python
	devel/pudb/bin/python

# Expected targets
.PHONY: clean
clean:
	rm -rf ${TARGETS} ${EXTRA_TARGETS} ${SETUPTOOLS_STUFF} \
	       ${PYTEST_STUFF} ${COVERAGE_STUFF} ${TOX_STUFF} devel
