Skip to content

Commit 30640b0

Browse files
feat(taskfiles): Add task to download and extract a ZIP file; Add taskfile testing infrastructure and tests for new task. (#39)
1 parent d22183f commit 30640b0

File tree

5 files changed

+193
-1
lines changed

5 files changed

+193
-1
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/.task
2+
/build

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Testing
2+
3+
To run all tests:
4+
5+
```bash
6+
task test
7+
```
8+
9+
To clean up any test output:
10+
11+
```bash
12+
task clean
13+
```

exports/taskfiles/utils/remote.yaml

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ tasks:
5151
exit 1
5252
fi
5353
54-
# Runs curl to download the tar file from the given URL and extracts its contents.
54+
# Uses curl to download a tar file from the given URL and extracts its contents.
5555
#
5656
# @param {string} OUTPUT_DIR Directory in which to extract the tar file.
5757
# @param {string} URL
@@ -123,3 +123,65 @@ tasks:
123123
vars:
124124
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
125125
INCLUDE_PATTERNS: ["{{.OUTPUT_DIR}}"]
126+
127+
# Uses curl to download a zip file from the given URL and extracts its contents.
128+
#
129+
# @param {string} OUTPUT_DIR Directory in which to extract the zip file.
130+
# @param {string} URL
131+
# @param {string} FILE_SHA256 Content hash to verify the downloaded zip file against.
132+
# @param {string} [CHECKSUM_FILE={{.OUTPUT_DIR}}.md5] File path to store the checksum of the
133+
# downloaded zip file.
134+
# @param {string[]} [EXCLUDE_PATTERNS] Path wildcard patterns that should not be extracted.
135+
# @param {string[]} [INCLUDE_PATTERNS] Path wildcard patterns to extract.
136+
# @param {string} [ZIP_FILE={{.OUTPUT_DIR}}.zip] Path where the zip file should be stored.
137+
download-and-extract-zip:
138+
internal: true
139+
label: "{{.TASK}}-{{.OUTPUT_DIR}}"
140+
vars:
141+
# Paths
142+
CHECKSUM_FILE: >-
143+
{{default (printf "%s.md5" .OUTPUT_DIR) .CHECKSUM_FILE}}
144+
ZIP_FILE: >-
145+
{{default (printf "%s.zip" .OUTPUT_DIR) .ZIP_FILE}}
146+
147+
# Path patterns
148+
EXCLUDE_PATTERNS:
149+
ref: "default (list) .EXCLUDE_PATTERNS"
150+
INCLUDE_PATTERNS:
151+
ref: "default (list) .INCLUDE_PATTERNS"
152+
153+
requires:
154+
vars: ["FILE_SHA256", "OUTPUT_DIR", "URL"]
155+
sources: ["{{.TASKFILE}}", "{{.ZIP_FILE}}"]
156+
generates: ["{{.CHECKSUM_FILE}}"]
157+
deps:
158+
- task: "curl"
159+
vars:
160+
FILE_SHA256: "{{.FILE_SHA256}}"
161+
OUTPUT_FILE: "{{.ZIP_FILE}}"
162+
URL: "{{.URL}}"
163+
- task: "checksum:validate"
164+
vars:
165+
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
166+
INCLUDE_PATTERNS: ["{{.OUTPUT_DIR}}"]
167+
cmds:
168+
- |-
169+
rm -rf "{{.OUTPUT_DIR}}"
170+
mkdir -p "{{.OUTPUT_DIR}}"
171+
# NOTE: Options in the unzip command must be in a specific order. See the docs for details.
172+
- >-
173+
unzip
174+
-q
175+
"{{.ZIP_FILE}}"
176+
{{- range .INCLUDE_PATTERNS}}
177+
"{{.}}"
178+
{{- end}}
179+
{{- range .EXCLUDE_PATTERNS}}
180+
-x "{{.}}"
181+
{{- end}}
182+
-d "{{.OUTPUT_DIR}}"
183+
# This command must be last
184+
- task: "checksum:compute"
185+
vars:
186+
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
187+
INCLUDE_PATTERNS: ["{{.OUTPUT_DIR}}"]

taskfile.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
version: "3"
2+
3+
includes:
4+
tests: "./taskfiles/tests.yaml"
5+
6+
set: ["u", "pipefail"]
7+
shopt: ["globstar"]
8+
9+
vars:
10+
G_OUTPUT_DIR: "{{.ROOT_DIR}}/build"
11+
12+
tasks:
13+
clean:
14+
cmds:
15+
- "rm -rf '{{.G_OUTPUT_DIR}}'"
16+
17+
test:
18+
cmds:
19+
- task: "tests:download-and-extract-zip-basic"

taskfiles/tests.yaml

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
version: "3"
2+
3+
includes:
4+
remote: "../exports/taskfiles/utils/remote.yaml"
5+
6+
vars:
7+
G_EXTRACTED_ZIP_CODEOWNERS_PATH: "yscope-dev-utils-main/.github/CODEOWNERS"
8+
G_EXTRACTED_ZIP_LICENSE_PATH: "yscope-dev-utils-main/LICENSE"
9+
G_EXTRACTED_ZIP_PULL_REQUEST_TEMPLATE_PATH: >-
10+
yscope-dev-utils-main/.github/PULL_REQUEST_TEMPLATE.md
11+
G_TEST_ZIP_FILE_SHA256: "2c9a21f83484e004c41c28be759451dbdc787190eb044365ba58f7bb846418f6"
12+
G_TEST_ZIP_FILE_URL: "https://github.com/y-scope/yscope-dev-utils/archive/refs/heads/main.zip"
13+
14+
tasks:
15+
default:
16+
cmds:
17+
- task: "download-and-extract-zip-test-basic"
18+
- task: "download-and-extract-zip-test-exclusions"
19+
- task: "download-and-extract-zip-test-inclusions"
20+
21+
download-and-extract-zip-test-basic:
22+
vars:
23+
OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}"
24+
cmds:
25+
- task: "download-and-extract-zip-test-cleaner"
26+
vars:
27+
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
28+
- task: "remote:download-and-extract-zip"
29+
vars:
30+
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
31+
URL: "{{.G_TEST_ZIP_FILE_URL}}"
32+
FILE_SHA256: "{{.G_TEST_ZIP_FILE_SHA256}}"
33+
34+
# Test that an expected file exists
35+
- "diff -q '{{.OUTPUT_DIR}}/{{.G_EXTRACTED_ZIP_LICENSE_PATH}}' '{{.ROOT_DIR}}/LICENSE'"
36+
37+
# Test that the output files are in the expected locations
38+
- "test -e '{{.OUTPUT_DIR}}.md5'"
39+
- "test -e '{{.OUTPUT_DIR}}.zip'"
40+
41+
download-and-extract-zip-test-exclusions:
42+
vars:
43+
OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}"
44+
cmds:
45+
- task: "download-and-extract-zip-test-cleaner"
46+
vars:
47+
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
48+
- task: "remote:download-and-extract-zip"
49+
vars:
50+
EXCLUDE_PATTERNS:
51+
- "*/CODEOWNERS"
52+
- "{{.G_EXTRACTED_ZIP_PULL_REQUEST_TEMPLATE_PATH}}"
53+
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
54+
URL: "{{.G_TEST_ZIP_FILE_URL}}"
55+
FILE_SHA256: "{{.G_TEST_ZIP_FILE_SHA256}}"
56+
57+
# Test that the excluded files don't exist
58+
- "test ! -e '{{.OUTPUT_DIR}}/{{.G_EXTRACTED_ZIP_CODEOWNERS_PATH}}'"
59+
- "test ! -e '{{.OUTPUT_DIR}}/{{.G_EXTRACTED_ZIP_PULL_REQUEST_TEMPLATE_PATH}}'"
60+
61+
# Test that other files do exist
62+
- "test -e '{{.OUTPUT_DIR}}/{{.G_EXTRACTED_ZIP_LICENSE_PATH}}'"
63+
64+
download-and-extract-zip-test-inclusions:
65+
vars:
66+
OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}"
67+
cmds:
68+
- task: "download-and-extract-zip-test-cleaner"
69+
vars:
70+
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
71+
- task: "remote:download-and-extract-zip"
72+
vars:
73+
INCLUDE_PATTERNS:
74+
- "*/CODEOWNERS"
75+
- "{{.G_EXTRACTED_ZIP_PULL_REQUEST_TEMPLATE_PATH}}"
76+
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
77+
URL: "{{.G_TEST_ZIP_FILE_URL}}"
78+
FILE_SHA256: "{{.G_TEST_ZIP_FILE_SHA256}}"
79+
80+
# Test that only the included files exist
81+
- "test ! -e '{{.OUTPUT_DIR}}/{{.G_EXTRACTED_ZIP_LICENSE_PATH}}'"
82+
- "test -e '{{.OUTPUT_DIR}}/{{.G_EXTRACTED_ZIP_CODEOWNERS_PATH}}'"
83+
- "test -e '{{.OUTPUT_DIR}}/{{.G_EXTRACTED_ZIP_PULL_REQUEST_TEMPLATE_PATH}}'"
84+
85+
# Cleans up the files output by download-and-extract-zip (assuming their default paths weren't
86+
# changed).
87+
#
88+
# @param {string} OUTPUT_DIR Output directory passed to download-and-extract-zip.
89+
download-and-extract-zip-test-cleaner:
90+
internal: true
91+
requires:
92+
vars: ["OUTPUT_DIR"]
93+
cmds:
94+
- "rm -rf '{{.OUTPUT_DIR}}'"
95+
- "rm -f '{{.OUTPUT_DIR}}.md5'"
96+
- "rm -f '{{.OUTPUT_DIR}}.zip'"

0 commit comments

Comments
 (0)