From 65e6ae4f75a5c5396a9626b7285c212b28179543 Mon Sep 17 00:00:00 2001 From: Lasse Benninga Date: Thu, 7 May 2026 12:54:38 +0200 Subject: [PATCH 1/3] feat(task-3): replace Azure proof screenshot with Blob Storage upload Task 3 now asks students to upload their pipeline output (clean_sales.csv) to a private Azure Blob container via the portal's Storage Browser, instead of just screenshotting the resource group. Changes: - task-3/assets/ scaffold (screenshot + blob_url.txt placeholders) - .hyf/test.sh: grader checks for azure_blob_week2.png (10pts) + blob_url.txt containing a valid *.blob.core.windows.net URL (10pts) - README: updated Task 3 row and repo layout to match new deliverables --- .hyf/test.sh | 17 ++++++++++++----- README.md | 6 ++++-- task-3/{ => assets}/.gitkeep | 0 3 files changed, 16 insertions(+), 7 deletions(-) rename task-3/{ => assets}/.gitkeep (100%) diff --git a/.hyf/test.sh b/.hyf/test.sh index bacc5ca..fccc1a0 100755 --- a/.hyf/test.sh +++ b/.hyf/test.sh @@ -182,13 +182,20 @@ if [ -s task-2/AI_DEBUG.md ]; then fi fi -# --- Task 3: HYF Azure Proof (20 points) --- +# --- Task 3: Azure Blob Storage Upload (20 points) --- +# 10 points for the screenshot, +10 for a blob_url.txt containing a real +# Azure Storage URL (https://.blob.core.windows.net/...) task3=0 -task3_msg="missing task-3/azure_proof.png|jpg|jpeg" +task3_msg="missing task-3/assets/azure_blob_week2.png (or .jpg/.jpeg)" for ext in png jpg jpeg; do - if [ -s "task-3/azure_proof.$ext" ]; then - task3=20 - task3_msg="azure_proof.$ext present" + if [ -s "task-3/assets/azure_blob_week2.$ext" ]; then + task3=10 + task3_msg="screenshot present but missing task-3/assets/blob_url.txt with a valid Azure Storage URL" + if [ -s "task-3/assets/blob_url.txt" ] && \ + grep -qE "https://[a-z0-9]+\.blob\.core\.windows\.net/" task-3/assets/blob_url.txt; then + task3=20 + task3_msg="screenshot and blob URL both present" + fi break fi done diff --git a/README.md b/README.md index e94625a..b3eb652 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ cohort copies. |---|---|---|---| | **Task 1** — Cleaner Pipeline | `task-1/` | 60 | A modular Python pipeline with `config.py` (env-var loading), `models.py` (`Transaction` dataclass with `__post_init__` validation), `transforms.py` (4+ pure composable functions, no mutation), `pipeline.py` (orchestrator), and `tests/test_transforms.py` (4+ pytest tests). Reads `data/messy_sales.csv`, writes `output/clean_sales.csv`. | | **Task 2** — AI Debug Report | `task-2/` | 20 | Document one debugging session where you used an LLM to fix a bug. Fill in the four sections of `AI_DEBUG.md`. | -| **Task 3** — HYF Azure proof | `task-3/` | 20 | Confirm your HYF Azure tenant access still works. Screenshot proof at `task-3/azure_proof.png` (or `.jpg` / `.jpeg`) showing resource group + region + €0 cost. | +| **Task 3** — Azure Blob Upload | `task-3/` | 20 | Upload `task-1/output/clean_sales.csv` to a private Blob container in the HYF Azure storage account using the portal's Storage Browser. Save your screenshot as `task-3/assets/azure_blob_week2.png` and the blob URL in `task-3/assets/blob_url.txt`. | Total: 100 · Passing: 60. @@ -50,7 +50,9 @@ Total: 100 · Passing: 60. ├── task-2/ │ └── AI_DEBUG.md # fill in the four sections ├── task-3/ -│ └── azure_proof.png # add your screenshot here +│ └── assets/ +│ ├── azure_blob_week2.png # add your screenshot here (jpg/jpeg also accepted) +│ └── blob_url.txt # paste your Azure Storage blob URL here ├── .hyf/ │ └── test.sh # auto-grader (read it to see exactly what it checks) └── .github/workflows/ diff --git a/task-3/.gitkeep b/task-3/assets/.gitkeep similarity index 100% rename from task-3/.gitkeep rename to task-3/assets/.gitkeep From 5b83a4c1657faabf38536b05fa5e29881179282b Mon Sep 17 00:00:00 2001 From: Lasse Benninga Date: Thu, 7 May 2026 14:00:49 +0200 Subject: [PATCH 2/3] fix(grader): clarify screenshot prerequisite and fix Task 3 echo label - Reword header comment to make clear the screenshot is required (10pts) and blob_url.txt earns the remaining 10pts only when screenshot exists - Update echo label from 'Azure Proof' to 'Azure Blob Upload' --- .hyf/test.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.hyf/test.sh b/.hyf/test.sh index fccc1a0..88d3285 100755 --- a/.hyf/test.sh +++ b/.hyf/test.sh @@ -183,8 +183,9 @@ if [ -s task-2/AI_DEBUG.md ]; then fi # --- Task 3: Azure Blob Storage Upload (20 points) --- -# 10 points for the screenshot, +10 for a blob_url.txt containing a real -# Azure Storage URL (https://.blob.core.windows.net/...) +# Screenshot is required (10 pts); blob_url.txt with a valid Azure Storage +# URL earns the remaining 10 pts. Both checks live inside the screenshot +# branch — no screenshot means 0/20 regardless of blob_url.txt. task3=0 task3_msg="missing task-3/assets/azure_blob_week2.png (or .jpg/.jpeg)" for ext in png jpg jpeg; do @@ -213,6 +214,6 @@ EOF echo "Task 1 (Cleaner Pipeline): $task1/60 — $task1_msg" echo "Task 2 (AI Debug Report): $task2/20 — $task2_msg" -echo "Task 3 (Azure Proof): $task3/20 — $task3_msg" +echo "Task 3 (Azure Blob Upload): $task3/20 — $task3_msg" echo "----------------------------------------" echo "Total: $score/100 — pass=$pass (passing threshold: $PASSING)" From 2f6002d17018685d02e9e79238f33daba8f9a8aa Mon Sep 17 00:00:00 2001 From: Lasse Benninga Date: Thu, 7 May 2026 14:19:57 +0200 Subject: [PATCH 3/3] fix(grader): tighten URL regex, improve error messages, clarify extensions in README - Require container/blob path in blob URL regex so a bare storage account root URL does not satisfy the check - Split blob_url.txt check into missing vs present-but-invalid with distinct messages so students can diagnose failures accurately - Add jpg/jpeg to Task 3 table cell in README to match grader behaviour --- .hyf/test.sh | 16 +++++++++++----- README.md | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.hyf/test.sh b/.hyf/test.sh index 88d3285..c786914 100755 --- a/.hyf/test.sh +++ b/.hyf/test.sh @@ -191,11 +191,17 @@ task3_msg="missing task-3/assets/azure_blob_week2.png (or .jpg/.jpeg)" for ext in png jpg jpeg; do if [ -s "task-3/assets/azure_blob_week2.$ext" ]; then task3=10 - task3_msg="screenshot present but missing task-3/assets/blob_url.txt with a valid Azure Storage URL" - if [ -s "task-3/assets/blob_url.txt" ] && \ - grep -qE "https://[a-z0-9]+\.blob\.core\.windows\.net/" task-3/assets/blob_url.txt; then - task3=20 - task3_msg="screenshot and blob URL both present" + if [ -s "task-3/assets/blob_url.txt" ]; then + # Require at least / after the host so a bare + # storage-account root URL doesn't satisfy the check. + if grep -qE "https://[a-z0-9]+\.blob\.core\.windows\.net/[^/]+/[^/]+" task-3/assets/blob_url.txt; then + task3=20 + task3_msg="screenshot and blob URL both present" + else + task3_msg="blob_url.txt present but URL format is wrong — expected https://.blob.core.windows.net//" + fi + else + task3_msg="screenshot present but task-3/assets/blob_url.txt is missing" fi break fi diff --git a/README.md b/README.md index b3eb652..be26bf7 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ cohort copies. |---|---|---|---| | **Task 1** — Cleaner Pipeline | `task-1/` | 60 | A modular Python pipeline with `config.py` (env-var loading), `models.py` (`Transaction` dataclass with `__post_init__` validation), `transforms.py` (4+ pure composable functions, no mutation), `pipeline.py` (orchestrator), and `tests/test_transforms.py` (4+ pytest tests). Reads `data/messy_sales.csv`, writes `output/clean_sales.csv`. | | **Task 2** — AI Debug Report | `task-2/` | 20 | Document one debugging session where you used an LLM to fix a bug. Fill in the four sections of `AI_DEBUG.md`. | -| **Task 3** — Azure Blob Upload | `task-3/` | 20 | Upload `task-1/output/clean_sales.csv` to a private Blob container in the HYF Azure storage account using the portal's Storage Browser. Save your screenshot as `task-3/assets/azure_blob_week2.png` and the blob URL in `task-3/assets/blob_url.txt`. | +| **Task 3** — Azure Blob Upload | `task-3/` | 20 | Upload `task-1/output/clean_sales.csv` to a private Blob container in the HYF Azure storage account using the portal's Storage Browser. Save your screenshot as `task-3/assets/azure_blob_week2.png` (`.jpg`/`.jpeg` also accepted) and the blob URL in `task-3/assets/blob_url.txt`. | Total: 100 · Passing: 60.