-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
140 lines (106 loc) · 5.01 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
#################################################################################
# GLOBALS #
#################################################################################
PROJECT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
POETRY := $(shell command -v poetry 2> /dev/null)
POETRY_ENV_DIR := $(shell $(POETRY) env info -p)
POETRY_RUN := $(POETRY) run
PROJECT_NAME = milton_maps
PYTHON_VERSION = 3.10
SHELL := /bin/bash
#################################################################################
# COMMANDS #
#################################################################################
.PHONY: check_poetry
check_poetry:
@if [ -z $(POETRY) ]; then echo "Poetry could not be found. See https://python-poetry.rg/docs/ for installation instructions"; exit 2; fi
@echo $(POETRY)
poetry.lock: pyproject.toml
$(POETRY) lock --no-update
.PHONY: environment
environment: poetry.lock check_poetry ## Install Python Dependencies
$(POETRY) install
clean-environment: ## Delete project virtual environment
$(POETRY) env remove $(POETRY_ENV_DIR)/bin/python
.PHONY: git
git: ## DVC is designed to run inside a git repository. Initialize a git repository if not done already
@git status >/dev/null 2>&1; \
if [[ $$? -ne 0 ]]; then \
git init; \
git add --all; \
git commit -m "Initial commit"; \
else \
echo "Git repo already initialized, skipping..."; \
fi
.PHONY: pre-commit-hooks
pre-commit-hooks: check_poetry ## Install pre-commit hooks
$(POETRY_RUN) pre-commit install --hook-type pre-push --hook-type post-checkout --hook-type pre-commit
.PHONY: initialize
initialize: git environment pre-commit-hooks ## Initialize project environment, dbt profiles, and pre-commit hooks
.PHONY: test
test: check_poetry ## Run tests
$(POETRY_RUN) pytest
.PHONY: clean
clean: ## Delete all compiled Python files
find . -type f -name "*.py[co]" -delete
find . -type d -name "__pycache__" -delete
.PHONY: lint
lint: check_poetry ## Lint using flake8 and brunette (use `make format` to do formatting)
$(POETRY_RUN) flake8 milton_maps
$(POETRY_RUN) brunette --check --config pyproject.toml milton_maps
.PHONY: format
format: check_poetry ## Format source code with brunette
$(POETRY_RUN) brunette --config pyproject.toml milton_maps
#################################################################################
# Automated documentation generation #
#################################################################################
.PHONY: docs
docs: check_poetry clean-docs ## Build all project documentation
$(POETRY_RUN) sphinx-apidoc -o docs/ milton_maps
$(POETRY_RUN) $(MAKE) -C docs clean
$(POETRY_RUN) $(MAKE) -C docs html
.PHONY: clean-docs
clean-docs: ## Remove auto-generated document elements
rm -f docs/milton_maps.rst || \
rm -f docs/modules.rst || true
.PHONY: start-doc-server stop-doc-server
server.pid:
$(POETRY_RUN) python -m http.server -d docs/_build/html > server.log 2>&1 & echo $$! > $@
start-doc-server: server.pid ## Serve documentation website over http
@echo Documentation is being served at http://localhost:8000
@echo Run "make stop-server" to stop the server.
stop-doc-server: ## Shut down documentation server
test -f server.pid && kil `cat server.pid` && rm server.pid || true
#################################################################################
# Self Documenting Commands #
#################################################################################
.DEFAULT_GOAL := help
define BROWSER_PYSCRIPT
import os, webbrowser, sys
from urllib.request import pathname2url
webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1])))
endef
export BROWSER_PYSCRIPT
define PRINT_HELP_PYSCRIPT
import re, sys
for line in sys.stdin:
match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line)
if match:
target, help = match.groups()
print("%-20s %s" % (target, help))
endef
export PRINT_HELP_PYSCRIPT
help:
@python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST)
refresh-raw-data: refresh-openspace-data refresh-propertytax-data refresh-municipal-boundary-data refresh-massdot-road-data ## Refresh all raw data
refresh-openspace-data: check_poetry ## Refresh openspace data from MassGIS
$(POETRY_RUN) dvc update data/raw/openspace.zip.dvc
refresh-propertytax-data: check_poetry ## Refresh property tax data from MassGIS
$(POETRY_RUN) dvc update data/raw/L3_SHP_M189_MILTON.zip.dvc; \
$(POETRY_RUN) dvc update data/raw/L3_SHP_M243_QUINCY.zip.dvc; \
$(POETRY_RUN) dvc update data/raw/M189_parcels_gdb.zip.dvc; \
$(POETRY_RUN) dvc update data/raw/M243_parcels_gdb.zip.dvc;
refresh-municipal-boundary-data: check_poetry ## Refresh municipal boundary data from MassGIS
$(POETRY_RUN) dvc update data/raw/townssurvey_shp.zip.dvc
refresh-massdot-road-data: check_poetry ## Refresh MassDOT road data from MassGIS
$(POETRY_RUN) dvc update data/raw/MassDOT_Roads_SHP.zip.dvc