Repository navigation
Expand file tree
/
Copy pathmakefile
More file actions
210 lines (173 loc) · 8.7 KB
/
Copy pathmakefile
File metadata and controls
210 lines (173 loc) · 8.7 KB
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
SHELL := /bin/bash
.SHELLFLAGS := -ec
.DEFAULT_GOAL := help
include docker/.env
export COMPOSE_PROJECT_NAME := $(if $(COMPOSE_PROJECT_NAME),$(COMPOSE_PROJECT_NAME),bag3d-dev)
define newline
endef
MANIFEST_ENV := $(shell python3 scripts/manifest_versions.py env | tr '\n' ';')
$(eval $(subst ;,$(newline),$(MANIFEST_ENV)))
export BAG3D_PIPELINE_VERSION BAG3D_TOOLS_IMAGE BAG3D_TOOLS_IMAGE_TAG BAG3D_CORE_IMAGE \
BAG3D_FLOORS_ESTIMATION_IMAGE BAG3D_PARTY_WALLS_IMAGE BAG3D_EXPORT_IMAGE \
BAG3D_DAGSTER_IMAGE
.PHONY: help \
docker_up docker_up_postgres docker_up_nobuild docker_dev docker_build docker_build_tools \
docker_restart docker_restart_containers docker_down docker_down_rm docker_prune_cache \
docker_volume_create docker_volume_create_data_postgresql docker_volume_create_data_pipeline \
docker_volume_create_dagster_home docker_volume_create_dagster_postgresql \
docker_volume_rm docker_volume_recreate \
test test_coverage test_report lint lint_fix \
local_install_uv local_venv local_dev \
sync_versions
help:
@echo "3dbag-pipeline - Available targets:"
@echo ""
@echo "Docker Management:"
@echo " docker_up Start all Docker services with build"
@echo " docker_up_postgres Start only PostgreSQL (faster for small tests)"
@echo " docker_up_nobuild Start services without rebuilding images"
@echo " docker_dev Start services with dev overrides"
@echo " docker_build Rebuild all Docker images without cache"
@echo " docker_build_tools Build the manifest-pinned tools image"
@echo " docker_restart Stop, recreate volumes, and start fresh"
@echo " docker_restart_containers Restart running containers (keep volumes)"
@echo " docker_down Stop all services"
@echo " docker_down_rm Stop and remove volumes/images"
@echo " docker_prune_cache Prune Docker builder cache"
@echo ""
@echo "Testing:"
@echo " test Run unit tests (fast, offline, no Docker)"
@echo " test_coverage Run tests with coverage report per package"
@echo " test_report Parse and summarize test results"
@echo ""
@echo "Code Quality:"
@echo " lint Check formatting, style, and types"
@echo " lint_fix Apply automatic formatting and fixes"
@echo ""
@echo "Development:"
@echo " local_install_uv Install uv package manager"
@echo " local_venv Create virtualenvs for all packages"
@echo " local_dev Start Dagster dev server locally (no Docker)"
@echo " sync_versions Synchronize package metadata from 3dbag-manifest.json"
@echo ""
docker_volume_create_data_postgresql:
docker volume create $(BAG3D_DOCKER_VOLUME_DATA_POSTGRESQL)
docker run -d --name $(TEMP_CONTAINER) --mount source=$(BAG3D_DOCKER_VOLUME_DATA_POSTGRESQL),target=/data busybox sleep infinity
docker exec $(TEMP_CONTAINER) mkdir -p /data/pgdata /data/pglog
docker rm -f $(TEMP_CONTAINER)
docker_volume_create_data_pipeline:
docker volume create $(BAG3D_DOCKER_VOLUME_DATA_PIPELINE)
docker_volume_create_dagster_home:
docker volume create $(BAG3D_DOCKER_VOLUME_DAGSTER_HOME)
docker run -d --name $(TEMP_CONTAINER) --mount source=$(BAG3D_DOCKER_VOLUME_DAGSTER_HOME),target=/opt/dagster/dagster_home busybox sleep infinity
docker cp docker/dagster/dagster.yaml $(TEMP_CONTAINER):/opt/dagster/dagster_home/
docker cp docker/dagster/workspace.yaml $(TEMP_CONTAINER):/opt/dagster/dagster_home/
docker rm -f $(TEMP_CONTAINER)
docker_volume_create_dagster_postgresql:
docker volume create $(BAG3D_DOCKER_VOLUME_DAGSTER_POSTGRESQL)
docker_volume_create: docker_volume_create_dagster_home docker_volume_create_dagster_postgresql docker_volume_create_data_postgresql docker_volume_create_data_pipeline
docker_volume_rm:
docker volume rm -f $(BAG3D_DOCKER_VOLUME_DATA_POSTGRESQL)
docker volume rm -f $(BAG3D_DOCKER_VOLUME_DATA_PIPELINE)
docker volume rm -f $(BAG3D_DOCKER_VOLUME_DAGSTER_HOME)
docker volume rm -f $(BAG3D_DOCKER_VOLUME_DAGSTER_POSTGRESQL)
docker_volume_recreate: docker_volume_rm docker_volume_create
docker_up_postgres:
docker compose -p $(COMPOSE_PROJECT_NAME) -f docker/compose.yaml up -d --wait data-postgresql
docker_up:
docker compose -p $(COMPOSE_PROJECT_NAME) -f docker/compose.yaml up -d
docker_up_nobuild:
docker compose -p $(COMPOSE_PROJECT_NAME) -f docker/compose.yaml up -d --no-build
docker_dev:
docker compose -p $(COMPOSE_PROJECT_NAME) -f docker/compose.yaml -f docker/compose.dev.yaml up -d
docker_build:
docker compose -p $(COMPOSE_PROJECT_NAME) -f docker/compose.yaml build --no-cache
docker_build_tools:
docker build \
$$(python3 scripts/manifest_versions.py build-args | sed 's/^/--build-arg /') \
--build-arg VERSION=$$(python3 scripts/manifest_versions.py value tools) \
--tag $(BAG3D_TOOLS_IMAGE_TAG) \
--file docker/tools/Dockerfile \
.
docker_restart: docker_down docker_volume_recreate docker_up
docker_restart_containers:
docker compose -p $(COMPOSE_PROJECT_NAME) -f docker/compose.yaml restart
docker_down:
docker compose -p $(COMPOSE_PROJECT_NAME) down --remove-orphans
docker_down_rm:
docker compose -p $(COMPOSE_PROJECT_NAME) down --volumes --remove-orphans --rmi local
docker_prune_cache:
docker builder prune --filter type=exec.cachemount
test:
@set -o pipefail; \
FAILED=0; \
uv --project packages/common run pytest packages/common/tests/ -v || FAILED=1; \
uv --project packages/core run pytest packages/core/tests/ -v || FAILED=1; \
uv --project packages/export run pytest packages/export/tests/ -v || FAILED=1; \
uv --project packages/floors_estimation run pytest packages/floors_estimation/tests/ -v || FAILED=1; \
uv --project packages/party_walls run pytest packages/party_walls/tests/ -v || FAILED=1; \
exit $$FAILED
test_coverage:
@set -o pipefail; \
FAILED=0; \
uv --project packages/common run coverage run --source=packages/common/src --data-file=.coverage.common -m pytest packages/common/tests/ -v || FAILED=1; \
uv --project packages/core run coverage run --source=packages/core/src --data-file=.coverage.core -m pytest packages/core/tests/ -v || FAILED=1; \
uv --project packages/export run coverage run --source=packages/export/src --data-file=.coverage.export -m pytest packages/export/tests/ -v || FAILED=1; \
uv --project packages/floors_estimation run coverage run --source=packages/floors_estimation/src --data-file=.coverage.floors_estimation -m pytest packages/floors_estimation/tests/ -v || FAILED=1; \
uv --project packages/party_walls run coverage run --source=packages/party_walls/src --data-file=.coverage.party_walls -m pytest packages/party_walls/tests/ -v || FAILED=1; \
echo ""; \
echo "=== Coverage per package ==="; \
echo ""; \
echo "--- common ---"; \
uv --project packages/common run coverage report --data-file=.coverage.common; \
echo ""; \
echo "--- core ---"; \
uv --project packages/core run coverage report --data-file=.coverage.core; \
echo ""; \
echo "--- export ---"; \
uv --project packages/export run coverage report --data-file=.coverage.export; \
echo ""; \
echo "--- floors_estimation ---"; \
uv --project packages/floors_estimation run coverage report --data-file=.coverage.floors_estimation; \
echo ""; \
echo "--- party_walls ---"; \
uv --project packages/party_walls run coverage report --data-file=.coverage.party_walls; \
exit $$FAILED
test_report:
python3 scripts/parse_test_log.py
lint:
@set -e; set -o pipefail; \
echo "Manifest version check"; \
python3 scripts/manifest_versions.py check; \
echo "Format check"; \
uv tool run ruff format --check ./packages; \
echo "Syntax and style"; \
uv tool run ruff check ./packages; \
FAILED=0; \
echo "Type check: common"; \
uv --project packages/common run pyright packages/common || FAILED=1; \
echo "Type check: core"; \
uv --project packages/core run pyright packages/core || FAILED=1; \
echo "Type check: export"; \
uv --project packages/export run pyright packages/export || FAILED=1; \
echo "Type check: floors_estimation"; \
uv --project packages/floors_estimation run pyright packages/floors_estimation || FAILED=1; \
echo "Type check: party_walls"; \
uv --project packages/party_walls run pyright packages/party_walls || FAILED=1; \
exit $$FAILED
lint_fix:
uv tool run ruff format ./packages
uv tool run ruff check --fix ./packages
local_install_uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
local_venv:
uv sync
uv --project packages/common sync
uv --project packages/core sync
uv --project packages/export sync
uv --project packages/floors_estimation sync
uv --project packages/party_walls sync
local_dev:
uv run dagster dev -w tests/dagster_home/workspace.yaml
sync_versions:
python3 scripts/manifest_versions.py sync