forked from Shopify/product-taxonomy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
156 lines (128 loc) · 4.68 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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
.DEFAULT_GOAL := default
###############################################################################
# FORMATTING HELPERS
# Used throughout the makefile for pretty printing and toggling verbose output
ifeq ($(VERBOSE),1)
V=
VPIPE=
VARG=--verbose
else
V=@
VPIPE= >/dev/null
VARG=
endif
FMT = printf "\e[%sm>> %-21s\e[0;1m →\e[1;32m %s\e[0m\n"
GENERATE = $(FMT) "1;34" # bold blue
NUKE = $(FMT) "1;31" # bold red
ADVISORY = printf "\e[%sm!! %-21s\e[0;1m\n" "1;31" # bold red text with a !! prefix
RUN_CMD = printf "\e[%sm>> %-21s\e[0;1m\n" "1;34" # bold blue text with a >> prefix
###############################################################################
# INPUTS
CATEGORIES_DATA = $(shell find data/categories)
ATTRIBUTES_DATA = $(shell find data/attributes.yml)
VALUES_DATA = $(shell find data/values.yml)
MAPPINGS_DATA = $(shell find data/integrations/*/*/mappings)
###############################################################################
# TARGETS
# Many commands generate many files (that'll expand), and Make isn't great at
# targeting arbitrary numbers of outputs, so we'll use sentinels.
# DOCS
GENERATED_DOCS_PATH = docs/_data/unstable
DOCS_GENERATED_SENTINEL = tmp/.docs_generated_sentinel
# DIST
GENERATED_DIST_PATH = dist
DIST_GENERATED_SENTINEL = tmp/.dist_generated_sentinel
CATEGORIES_JSON = $(GENERATED_DIST_PATH)/categories.json
ATTRIBUTES_JSON = $(GENERATED_DIST_PATH)/attributes.json
MAPPINGS_JSON = $(GENERATED_DIST_PATH)/mappings.json
# DATA files to run application
LOCAL_DB = tmp/local.sqlite3
# CUE imports needed for schema validation
ATTRIBUTES_DATA_CUE = schema/attributes_data.cue
CATEGORIES_DATA_CUE = schema/categories_data.cue
MAPPINGS_DATA_CUE = schema/mappings_data.cue
###############################################################################
# COMMANDS
#
# BUILD commands and children
default: build
.PHONY: default
build: $(DIST_GENERATED_SENTINEL) \
$(DOCS_GENERATED_SENTINEL) \
$(CATEGORIES_DATA_CUE) \
$(ATTRIBUTES_DATA_CUE) \
$(MAPPINGS_DATA_CUE)
.PHONY: build
$(DOCS_GENERATED_SENTINEL): $(LOCAL_DB) $(CATEGORIES_DATA) $(ATTRIBUTES_DATA) $(VALUES_DATA)
@$(GENERATE) "Building Docs" "$(GENERATED_DOCS_PATH)/*"
$(V)./bin/generate_docs $(VARG)
$(V)touch $@
$(DIST_GENERATED_SENTINEL): $(LOCAL_DB) $(CATEGORIES_DATA) $(ATTRIBUTES_DATA) $(VALUES_DATA) $(MAPPINGS_DATA)
@$(GENERATE) "Building Distribution" "$(GENERATED_DIST_PATH)/*.[json|txt]"
$(V)bin/generate_dist $(VARG)
$(V)touch $@
#
# RELEASE
release: build
@$(RUN_CMD) "Preparing release"
$(V)bin/generate_release $(VARG)
.PHONY: release
#
# CLEAN
clean:
@$(NUKE) "Cleaning dev db" $(LOCAL_DB)
$(V)rm -f $(LOCAL_DB)*
@$(NUKE) "Cleaning Generated Docs" $(GENERATED_DOCS_PATH)
$(V)rm -f $(DOCS_GENERATED_SENTINEL)
$(V)rm -rf $(GENERATED_DOCS_PATH)
@$(NUKE) "Cleaning attribute data cuefiles" $(ATTRIBUTES_DATA_CUE)
$(V)rm -f $(ATTRIBUTES_DATA_CUE)
@$(NUKE) "Cleaning category data cuefiles" $(CATEGORIES_DATA_CUE)
$(V)rm -f $(CATEGORIES_DATA_CUE)
@$(NUKE) "Cleaning mapping data cuefiles" $(MAPPINGS_DATA_CUE)
$(V)rm -f $(MAPPINGS_DATA_CUE)
@$(NUKE) "Cleaning Generated Distribution Files" $(GENERATED_DIST_PATH)
$(V)rm -f $(DIST_GENERATED_SENTINEL)
$(V)rm -rf $(GENERATED_DIST_PATH)/*.json
$(V)rm -rf $(GENERATED_DIST_PATH)/*.txt
.PHONY: clean
#
# DOCS SERVER
server: $(DOCS_GENERATED_SENTINEL)
@$(RUN_CMD) "Running Server"
$(V)bundle exec jekyll serve --source docs --destination _site $(VARG)
.PHONY: server
#
# DATABASE SETUP
seed: $(LOCAL_DB)
.PHONY: seed
$(LOCAL_DB):
@$(GENERATE) "Seeding Database" $(LOCAL_DB)
$(V)bin/seed $(VARG)
#
# TESTS
test: unit_tests integration_tests vet_schema
.PHONY: test
unit_tests:
@$(RUN_CMD) "Running Unit Tests"
$(V)bin/rake test $(filter-out $@,$(MAKECMDGOALS))
.PHONY: unit_tests
integration_tests:
@$(RUN_CMD) "Running Integration Tests"
$(V)bin/rake test_integration $(filter-out $@,$(MAKECMDGOALS))
.PHONY: integration_tests
vet_schema: $(CATEGORIES_DATA_CUE) $(ATTRIBUTES_DATA_CUE) $(MAPPINGS_DATA_CUE)
@$(RUN_CMD) "Validating Schema"
$(V)cd schema && cue vet
$(V)echo "Done!"
.PHONY: vet_schema
# TODO: These two targets can be done together
$(CATEGORIES_DATA_CUE): $(DIST_GENERATED_SENTINEL)
@$(GENERATE) "Importing $(CATEGORIES_JSON)" $(CATEGORIES_DATA_CUE)
$(V)cue import $(CATEGORIES_JSON) -p product_taxonomy -f -o $(CATEGORIES_DATA_CUE)
$(ATTRIBUTES_DATA_CUE): $(DIST_GENERATED_SENTINEL)
@$(GENERATE) "Importing $(ATTRIBUTES_JSON)" $(ATTRIBUTES_DATA_CUE)
$(V)cue import $(ATTRIBUTES_JSON) -p product_taxonomy -f -o $(ATTRIBUTES_DATA_CUE)
$(MAPPINGS_DATA_CUE): $(DIST_GENERATED_SENTINEL)
@$(GENERATE) "Importing $(MAPPINGS_JSON)" $(MAPPINGS_DATA_CUE)
$(V)cue import $(MAPPINGS_JSON) -p product_taxonomy -f -o $(MAPPINGS_DATA_CUE)