From 5935cf20a9075efe4b87b3295c2938051257cc59 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 12:10:22 -0600 Subject: [PATCH 01/36] ci: support Netlify via Makefile & .gitignore --- .gitignore | 2 ++ Makefile | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/.gitignore b/.gitignore index dda9fa43..62661783 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ site/ # python .python-version +# python: only for Netlify, which does not support pyproject.toml yet +requirements.txt # ide .vs diff --git a/Makefile b/Makefile index a4ca235d..6bf19f74 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,17 @@ # WARNING: Using `docker-compose` is deprecated DOCKER_COMPOSE_CMD := $(shell if command -v docker-compose > /dev/null; then echo "docker-compose"; else echo "docker compose"; fi) + +requirements.txt: poetry.lock + pip install --user poetry-plugin-export \ + && poetry export -f requirements.txt --output requirements.txt \ + && pip uninstall --yes poetry-plugin-export + + +.PHONY: install +install: poetry.lock + poetry install --sync + .PHONY: build build: $(DOCKER_COMPOSE_CMD) -f ./docker-compose.yml build From 6195348caee9641e8563fa21250b5806862915d3 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:10:46 -0600 Subject: [PATCH 02/36] ci: netlify workflows (UNTESTED) --- .github/workflows/netlify-create-branch.yml | 80 +++++++++++++++++++++ .github/workflows/netlify-delete-branch.yml | 40 +++++++++++ 2 files changed, 120 insertions(+) create mode 100644 .github/workflows/netlify-create-branch.yml create mode 100644 .github/workflows/netlify-delete-branch.yml diff --git a/.github/workflows/netlify-create-branch.yml b/.github/workflows/netlify-create-branch.yml new file mode 100644 index 00000000..f7c73426 --- /dev/null +++ b/.github/workflows/netlify-create-branch.yml @@ -0,0 +1,80 @@ +name: Create Netlify Preview Branch + +on: + pull_request: + types: [opened, synchronize, reopened] + push: + branches: + - fix/GH-61-netlify-auto-deploy + +env: + DEPLOY_BRANCH_PREFIX: "netlify" + +jobs: + update-preview-branch: + runs-on: ubuntu-latest + + steps: + - name: Checkout main branch + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + + - name: Install Poetry + uses: python-poetry/install@v1 + + - name: Generate requirements.txt + run: make requirements.txt + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Determine source and deploy branch names + id: branches + run: | + if [ "${{ github.event_name }}" = "pull_request" ]; then + SOURCE_BRANCH="${{ github.head_ref }}" + else + SOURCE_BRANCH="${{ github.ref_name }}" + fi + DEPLOY_BRANCH="${{ env.DEPLOY_BRANCH_PREFIX }}/${SOURCE_BRANCH}" + + echo "source_branch=${SOURCE_BRANCH}" >> $GITHUB_OUTPUT + echo "deploy_branch=${DEPLOY_BRANCH}" >> $GITHUB_OUTPUT + + - name: Create/update deploy branch + run: | + DEPLOY_BRANCH="${{ steps.branches.outputs.deploy_branch }}" + + git checkout -B "${DEPLOY_BRANCH}" + git add -f requirements.txt + git commit -m "Add requirements.txt for Netlify deployment [skip ci]" + git push origin "${DEPLOY_BRANCH}" --force + + - name: Comment on PR with deploy info + if: github.event_name == 'pull_request' + uses: actions/github-script@v7 + with: + script: | + const deployBranch = '${{ steps.branches.outputs.deploy_branch }}'; + const body = `### 🚀 Netlify Deploy Branch Created + + **Deploy branch:** \`${deployBranch}\` + + Configure Netlify to deploy from this branch to get a preview for this PR. + + The branch will be automatically updated with each commit to this PR.`; + + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: body + }); diff --git a/.github/workflows/netlify-delete-branch.yml b/.github/workflows/netlify-delete-branch.yml new file mode 100644 index 00000000..0a0bbfc6 --- /dev/null +++ b/.github/workflows/netlify-delete-branch.yml @@ -0,0 +1,40 @@ +name: Delete Netlify Preview Branches + +on: + pull_request: + types: [closed] + +env: + DEPLOY_BRANCH_PREFIX: "netlify-deploy" + +jobs: + cleanup: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Determine branch to delete + id: branch + run: | + if [ "${{ github.event_name }}" = "pull_request" ]; then + SOURCE_BRANCH="${{ github.head_ref }}" + else + SOURCE_BRANCH="${{ github.event.ref }}" + fi + DEPLOY_BRANCH="${{ env.DEPLOY_BRANCH_PREFIX }}/${SOURCE_BRANCH}" + + echo "deploy_branch=${DEPLOY_BRANCH}" >> $GITHUB_OUTPUT + + - name: Delete deploy branch + run: | + DEPLOY_BRANCH="${{ steps.branch.outputs.deploy_branch }}" + + # Delete remote branch if it exists + if git ls-remote --exit-code --heads origin "${DEPLOY_BRANCH}"; then + git push origin --delete "${DEPLOY_BRANCH}" + echo "Deleted deploy branch: ${DEPLOY_BRANCH}" + else + echo "Deploy branch does not exist: ${DEPLOY_BRANCH}" + fi \ No newline at end of file From 4b5a6f33f923b20777e77ad0e0d19e57717a5891 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:36:25 -0600 Subject: [PATCH 03/36] ci: validation workflow (UNTESTED) --- .github/workflows/validate-requirements.yml | 32 +++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/validate-requirements.yml diff --git a/.github/workflows/validate-requirements.yml b/.github/workflows/validate-requirements.yml new file mode 100644 index 00000000..420c6133 --- /dev/null +++ b/.github/workflows/validate-requirements.yml @@ -0,0 +1,32 @@ +name: Validate `requirements.txt` + +on: + pull_request: + push: + +jobs: + check-requirements: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Check if requirements.txt was modified unexpectedly + run: | + # Get author of last commit + AUTHOR=$(git log -1 --pretty=format:'%an') + + # Check if requirements.txt was modified in last commit + if git diff --name-only HEAD~1 HEAD | grep -q "^requirements.txt$"; then + if [ "$AUTHOR" != "github-actions[bot]" ]; then + echo "❌ ERROR: You may NOT edit `requirements.txt`" + echo "To pin dependencies, use `poetry add `." + echo "Please remove your changes to requirements.txt, so the robot can maintain it." + exit 1 + fi + fi + + echo "✅ SUCCESS: `requirements.txt` not modified unexpectedly" From 83a742aa38c7c64c1f2166f2a7d8e6644cd3e396 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:51:04 -0600 Subject: [PATCH 04/36] ci: update reqs workflow (UNTESTED) --- .github/workflows/update-requirements.txt | 52 +++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/update-requirements.txt diff --git a/.github/workflows/update-requirements.txt b/.github/workflows/update-requirements.txt new file mode 100644 index 00000000..766cabd9 --- /dev/null +++ b/.github/workflows/update-requirements.txt @@ -0,0 +1,52 @@ +# .github/workflows/update-requirements.yml +name: Update requirements.txt + +on: + pull_request: + types: [opened, synchronize, reopened] + push: + branches: + - main + +permissions: + contents: write + +jobs: + update-requirements: + runs-on: ubuntu-latest + + # Skip if the last commit was from the bot (prevent infinite loops) + if: github.event.head_commit.author.name != 'github-actions[bot]' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref || github.ref_name }} + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + + - name: Install Poetry + run: pip install poetry + + - name: Generate requirements.txt + run: make requirements + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Commit requirements.txt if changed + run: | + git add -f requirements.txt + if git diff --staged --quiet; then + echo "No changes to requirements.txt" + else + git commit -m "chore: auto-update requirements.txt [bot]" + git push + fi From 66544513ed743fb65840d674bb892dd983c41fc2 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:53:16 -0600 Subject: [PATCH 05/36] ci: delete netlify workflows (NEW APPROACH COMING) --- .github/workflows/netlify-create-branch.yml | 80 --------------------- .github/workflows/netlify-delete-branch.yml | 40 ----------- 2 files changed, 120 deletions(-) delete mode 100644 .github/workflows/netlify-create-branch.yml delete mode 100644 .github/workflows/netlify-delete-branch.yml diff --git a/.github/workflows/netlify-create-branch.yml b/.github/workflows/netlify-create-branch.yml deleted file mode 100644 index f7c73426..00000000 --- a/.github/workflows/netlify-create-branch.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Create Netlify Preview Branch - -on: - pull_request: - types: [opened, synchronize, reopened] - push: - branches: - - fix/GH-61-netlify-auto-deploy - -env: - DEPLOY_BRANCH_PREFIX: "netlify" - -jobs: - update-preview-branch: - runs-on: ubuntu-latest - - steps: - - name: Checkout main branch - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.13' - - - name: Install Poetry - uses: python-poetry/install@v1 - - - name: Generate requirements.txt - run: make requirements.txt - - - name: Configure Git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Determine source and deploy branch names - id: branches - run: | - if [ "${{ github.event_name }}" = "pull_request" ]; then - SOURCE_BRANCH="${{ github.head_ref }}" - else - SOURCE_BRANCH="${{ github.ref_name }}" - fi - DEPLOY_BRANCH="${{ env.DEPLOY_BRANCH_PREFIX }}/${SOURCE_BRANCH}" - - echo "source_branch=${SOURCE_BRANCH}" >> $GITHUB_OUTPUT - echo "deploy_branch=${DEPLOY_BRANCH}" >> $GITHUB_OUTPUT - - - name: Create/update deploy branch - run: | - DEPLOY_BRANCH="${{ steps.branches.outputs.deploy_branch }}" - - git checkout -B "${DEPLOY_BRANCH}" - git add -f requirements.txt - git commit -m "Add requirements.txt for Netlify deployment [skip ci]" - git push origin "${DEPLOY_BRANCH}" --force - - - name: Comment on PR with deploy info - if: github.event_name == 'pull_request' - uses: actions/github-script@v7 - with: - script: | - const deployBranch = '${{ steps.branches.outputs.deploy_branch }}'; - const body = `### 🚀 Netlify Deploy Branch Created - - **Deploy branch:** \`${deployBranch}\` - - Configure Netlify to deploy from this branch to get a preview for this PR. - - The branch will be automatically updated with each commit to this PR.`; - - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: body - }); diff --git a/.github/workflows/netlify-delete-branch.yml b/.github/workflows/netlify-delete-branch.yml deleted file mode 100644 index 0a0bbfc6..00000000 --- a/.github/workflows/netlify-delete-branch.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Delete Netlify Preview Branches - -on: - pull_request: - types: [closed] - -env: - DEPLOY_BRANCH_PREFIX: "netlify-deploy" - -jobs: - cleanup: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Determine branch to delete - id: branch - run: | - if [ "${{ github.event_name }}" = "pull_request" ]; then - SOURCE_BRANCH="${{ github.head_ref }}" - else - SOURCE_BRANCH="${{ github.event.ref }}" - fi - DEPLOY_BRANCH="${{ env.DEPLOY_BRANCH_PREFIX }}/${SOURCE_BRANCH}" - - echo "deploy_branch=${DEPLOY_BRANCH}" >> $GITHUB_OUTPUT - - - name: Delete deploy branch - run: | - DEPLOY_BRANCH="${{ steps.branch.outputs.deploy_branch }}" - - # Delete remote branch if it exists - if git ls-remote --exit-code --heads origin "${DEPLOY_BRANCH}"; then - git push origin --delete "${DEPLOY_BRANCH}" - echo "Deleted deploy branch: ${DEPLOY_BRANCH}" - else - echo "Deploy branch does not exist: ${DEPLOY_BRANCH}" - fi \ No newline at end of file From 571bcc844cd0df37b39762f5cab9ddce4333308d Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:55:12 -0600 Subject: [PATCH 06/36] ci: update reqs workflow (ALLOW TEST) --- .github/workflows/update-requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-requirements.txt b/.github/workflows/update-requirements.txt index 766cabd9..ff754eb7 100644 --- a/.github/workflows/update-requirements.txt +++ b/.github/workflows/update-requirements.txt @@ -6,7 +6,8 @@ on: types: [opened, synchronize, reopened] push: branches: - - main + - epic/v3 + - fix/GH-61-netlify-auto-deploy permissions: contents: write From 896422c4b5d39382d63eb7a5414eba02569b4656 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:56:36 -0600 Subject: [PATCH 07/36] ci: fix workflow name --- .../{update-requirements.txt => update-requirements.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{update-requirements.txt => update-requirements.yml} (100%) diff --git a/.github/workflows/update-requirements.txt b/.github/workflows/update-requirements.yml similarity index 100% rename from .github/workflows/update-requirements.txt rename to .github/workflows/update-requirements.yml From 3c62815fdf2e1a074e67d09d6f3f860b75593b83 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:57:55 -0600 Subject: [PATCH 08/36] fix: workflow typos --- .github/workflows/update-requirements.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/update-requirements.yml b/.github/workflows/update-requirements.yml index ff754eb7..35feb736 100644 --- a/.github/workflows/update-requirements.yml +++ b/.github/workflows/update-requirements.yml @@ -1,5 +1,4 @@ -# .github/workflows/update-requirements.yml -name: Update requirements.txt +name: Update `requirements.txt` on: pull_request: @@ -35,7 +34,7 @@ jobs: run: pip install poetry - name: Generate requirements.txt - run: make requirements + run: make requirements.txt - name: Configure Git run: | From c2f6cdfd33baf09d300684b1e3803f224a052ccd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 9 Dec 2025 19:58:20 +0000 Subject: [PATCH 09/36] chore: auto-update requirements.txt [bot] --- requirements.txt | 243 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..df45f168 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,243 @@ +babel==2.17.0 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ + --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 +click==8.3.1 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \ + --hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 +colorama==0.4.6 ; python_version >= "3.10" and python_version < "3.13" and platform_system == "Windows" \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +ghp-import==2.1.0 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 \ + --hash=sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343 +jinja2==3.1.6 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 +markdown==3.3.7 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874 \ + --hash=sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621 +markupsafe==3.0.3 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ + --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \ + --hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \ + --hash=sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19 \ + --hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf \ + --hash=sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c \ + --hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175 \ + --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \ + --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \ + --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \ + --hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab \ + --hash=sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26 \ + --hash=sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1 \ + --hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce \ + --hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218 \ + --hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634 \ + --hash=sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695 \ + --hash=sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad \ + --hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73 \ + --hash=sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c \ + --hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe \ + --hash=sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa \ + --hash=sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559 \ + --hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa \ + --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \ + --hash=sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758 \ + --hash=sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f \ + --hash=sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8 \ + --hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d \ + --hash=sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c \ + --hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 \ + --hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a \ + --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \ + --hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9 \ + --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \ + --hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc \ + --hash=sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2 \ + --hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4 \ + --hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354 \ + --hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50 \ + --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \ + --hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9 \ + --hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b \ + --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \ + --hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115 \ + --hash=sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e \ + --hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485 \ + --hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f \ + --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \ + --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \ + --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \ + --hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d \ + --hash=sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b \ + --hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a \ + --hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 \ + --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \ + --hash=sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d \ + --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \ + --hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287 \ + --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \ + --hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f \ + --hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 \ + --hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed \ + --hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b \ + --hash=sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c \ + --hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 \ + --hash=sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8 \ + --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \ + --hash=sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6 \ + --hash=sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e \ + --hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d \ + --hash=sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d \ + --hash=sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 \ + --hash=sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7 \ + --hash=sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419 \ + --hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 \ + --hash=sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1 \ + --hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5 \ + --hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d \ + --hash=sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42 \ + --hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe \ + --hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda \ + --hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e \ + --hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737 \ + --hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523 \ + --hash=sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591 \ + --hash=sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc \ + --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ + --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 +mergedeep==1.3.4 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8 \ + --hash=sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307 +mkdocs-exclude-search==0.6.6 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:2b4b941d1689808db533fe4a6afba75ce76c9bab8b21d4e31efc05fd8c4e0a4f \ + --hash=sha256:3cdff1b9afdc1b227019cd1e124f401453235b92153d60c0e5e651a76be4f044 +mkdocs-include-markdown-plugin==5.1.0 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:4a1b8d79a0e1b6fd357ca8013a6d1701c755ada4acb74ee97b0642d1afe6756e \ + --hash=sha256:e9ca188ab1d86f5fc4a6b96ce8c85acf6e25f114897868041056ec7945f29f65 +mkdocs-tacc==1.0.0 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:5d9f1d4a4b871526f74e92bda8eb52584ece817d1eef5d4064ef40fe6adcf99d \ + --hash=sha256:cbd107eab1ff1659bc164c84f17055f367097a0b3dfe2ec3b41ef34850f7181c +mkdocs==1.4.3 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:5955093bbd4dd2e9403c5afaf57324ad8b04f16886512a3ee6ef828956481c57 \ + --hash=sha256:6ee46d309bda331aac915cd24aab882c179a933bd9e77b80ce7d2eaaa3f689dd +packaging==25.0 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f +pymdown-extensions==10.4 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:bc46f11749ecd4d6b71cf62396104b4a200bad3498cb0f5dad1b8502fe461a35 \ + --hash=sha256:cfc28d6a09d19448bcbf8eee3ce098c7d17ff99f7bd3069db4819af181212037 +python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 +pyyaml-env-tag==1.1 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04 \ + --hash=sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff +pyyaml==6.0.3 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 +six==1.17.0 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 +watchdog==6.0.0 ; python_version >= "3.10" and python_version < "3.13" \ + --hash=sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a \ + --hash=sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2 \ + --hash=sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f \ + --hash=sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c \ + --hash=sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c \ + --hash=sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c \ + --hash=sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0 \ + --hash=sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13 \ + --hash=sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134 \ + --hash=sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa \ + --hash=sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e \ + --hash=sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379 \ + --hash=sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a \ + --hash=sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11 \ + --hash=sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282 \ + --hash=sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b \ + --hash=sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f \ + --hash=sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c \ + --hash=sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112 \ + --hash=sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948 \ + --hash=sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881 \ + --hash=sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860 \ + --hash=sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3 \ + --hash=sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 \ + --hash=sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26 \ + --hash=sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26 \ + --hash=sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e \ + --hash=sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8 \ + --hash=sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c \ + --hash=sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2 From b9248169483913fca3d5c51a621afd3a0906692c Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:00:04 -0600 Subject: [PATCH 10/36] refactor: workflows --- .github/workflows/{update-requirements.yml => update-reqs.yml} | 2 +- .../workflows/{validate-requirements.yml => validate-reqs.yml} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{update-requirements.yml => update-reqs.yml} (97%) rename .github/workflows/{validate-requirements.yml => validate-reqs.yml} (96%) diff --git a/.github/workflows/update-requirements.yml b/.github/workflows/update-reqs.yml similarity index 97% rename from .github/workflows/update-requirements.yml rename to .github/workflows/update-reqs.yml index 35feb736..e0bdd6e6 100644 --- a/.github/workflows/update-requirements.yml +++ b/.github/workflows/update-reqs.yml @@ -1,4 +1,4 @@ -name: Update `requirements.txt` +name: Update requirements.txt on: pull_request: diff --git a/.github/workflows/validate-requirements.yml b/.github/workflows/validate-reqs.yml similarity index 96% rename from .github/workflows/validate-requirements.yml rename to .github/workflows/validate-reqs.yml index 420c6133..c42769fb 100644 --- a/.github/workflows/validate-requirements.yml +++ b/.github/workflows/validate-reqs.yml @@ -1,4 +1,4 @@ -name: Validate `requirements.txt` +name: Validate requirements.txt on: pull_request: From dd5856a83ff76a4aed32c69e85f190aa0cf80b91 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:18:59 -0600 Subject: [PATCH 11/36] build: this branch --- .github/workflows/build-pprd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-pprd.yml b/.github/workflows/build-pprd.yml index 2612c86c..3ab682d3 100644 --- a/.github/workflows/build-pprd.yml +++ b/.github/workflows/build-pprd.yml @@ -6,7 +6,7 @@ on: - pprd - epic/v3 - any/branch-you-want - - fix/docs_dir-not-set + - fix/GH-61-netlify-auto-deploy jobs: docker: From c662bd06d4c29614e9f030dfd532695c71aa34a4 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:36:54 -0600 Subject: [PATCH 12/36] test: attempt change reqs, expect validation error --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index df45f168..7bd8a20a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ + babel==2.17.0 ; python_version >= "3.10" and python_version < "3.13" \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 From 6ab8e0225abab7fb61ab5700428749e07eeaf315 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:38:37 -0600 Subject: [PATCH 13/36] fix: unepxcted syntax in workflows --- .github/workflows/validate-reqs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/validate-reqs.yml b/.github/workflows/validate-reqs.yml index c42769fb..6e724921 100644 --- a/.github/workflows/validate-reqs.yml +++ b/.github/workflows/validate-reqs.yml @@ -22,8 +22,8 @@ jobs: # Check if requirements.txt was modified in last commit if git diff --name-only HEAD~1 HEAD | grep -q "^requirements.txt$"; then if [ "$AUTHOR" != "github-actions[bot]" ]; then - echo "❌ ERROR: You may NOT edit `requirements.txt`" - echo "To pin dependencies, use `poetry add `." + echo "❌ ERROR: You may NOT edit 'requirements.txt'" + echo "To pin dependencies, use 'poetry add '." echo "Please remove your changes to requirements.txt, so the robot can maintain it." exit 1 fi From 54bc97e01a51654ebec9229db224136ef28713d4 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:46:04 -0600 Subject: [PATCH 14/36] Revert "test: attempt change reqs, expect validation error" This reverts commit c662bd06d4c29614e9f030dfd532695c71aa34a4. --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7bd8a20a..df45f168 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ - babel==2.17.0 ; python_version >= "3.10" and python_version < "3.13" \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 From 7bef77ceaeaa0395f554674cbff1df0eefb628cf Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:50:09 -0600 Subject: [PATCH 15/36] docs: reword [skip ci] --- .github/workflows/validate-reqs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-reqs.yml b/.github/workflows/validate-reqs.yml index 6e724921..fe902176 100644 --- a/.github/workflows/validate-reqs.yml +++ b/.github/workflows/validate-reqs.yml @@ -24,7 +24,7 @@ jobs: if [ "$AUTHOR" != "github-actions[bot]" ]; then echo "❌ ERROR: You may NOT edit 'requirements.txt'" echo "To pin dependencies, use 'poetry add '." - echo "Please remove your changes to requirements.txt, so the robot can maintain it." + echo "Please remove your changes to requirements.txt, so robot can maintain it." exit 1 fi fi From a650f7c5420cc7fde3bf1dc664995017554db0a0 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:57:30 -0600 Subject: [PATCH 16/36] increase Python version support --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6f9ec7c3..fd3f5b6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ maintainers = [ { name = "TACC ACI WMA", email = "wma-portals@tacc.utexas.edu" } ] readme = "README.md" -requires-python = ">=3.10,<3.13" +requires-python = ">=3.10,<4.0" dependencies = [ "mkdocs-tacc[all] (>=1.0.0,<2.0.0)", "mkdocs-exclude-search (>=0.6.6,<0.7.0)", From e84c576acd4135c4defbd2e026106e969c888ecc Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:09:04 -0600 Subject: [PATCH 17/36] ci: get python version from pyproject.toml --- .github/workflows/update-reqs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-reqs.yml b/.github/workflows/update-reqs.yml index e0bdd6e6..b4e8a953 100644 --- a/.github/workflows/update-reqs.yml +++ b/.github/workflows/update-reqs.yml @@ -28,7 +28,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version-file: 'pyproject.toml' - name: Install Poetry run: pip install poetry From 4bd0b65a20e2c4e21a8f54ea5aff043d769dcb27 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:11:10 -0600 Subject: [PATCH 18/36] Revert "increase Python version support" This reverts commit a650f7c5420cc7fde3bf1dc664995017554db0a0. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fd3f5b6a..6f9ec7c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ maintainers = [ { name = "TACC ACI WMA", email = "wma-portals@tacc.utexas.edu" } ] readme = "README.md" -requires-python = ">=3.10,<4.0" +requires-python = ">=3.10,<3.13" dependencies = [ "mkdocs-tacc[all] (>=1.0.0,<2.0.0)", "mkdocs-exclude-search (>=0.6.6,<0.7.0)", From a9f5d468b775c218aa5480aa00be867d411ef767 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:31:46 -0600 Subject: [PATCH 19/36] test: new PR triggering Netlify preview server (#242) * delete unused workflow * ci: remove branch that will be merged soon --- .github/workflows/build-pprd.yml | 1 - .github/workflows/build-preview.yml | 39 ----------------------------- .github/workflows/update-reqs.yml | 1 - 3 files changed, 41 deletions(-) delete mode 100644 .github/workflows/build-preview.yml diff --git a/.github/workflows/build-pprd.yml b/.github/workflows/build-pprd.yml index 3ab682d3..6cf9834e 100644 --- a/.github/workflows/build-pprd.yml +++ b/.github/workflows/build-pprd.yml @@ -6,7 +6,6 @@ on: - pprd - epic/v3 - any/branch-you-want - - fix/GH-61-netlify-auto-deploy jobs: docker: diff --git a/.github/workflows/build-preview.yml b/.github/workflows/build-preview.yml deleted file mode 100644 index ee139b8f..00000000 --- a/.github/workflows/build-preview.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: ❌ DS User Guide Previews - -on: - workflow_dispatch: - push: - branches: - - '*' - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v2 - with: - push: true - tags: designsafeci/ds-use-case-template:latest - - - name: Post build status in slack - id: slack - uses: slackapi/slack-github-action@v1.18.0 - with: - # This data can be any valid JSON from a previous step in the GitHub Action - payload: | - { - "build_status": "${{ job.status }}" - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/update-reqs.yml b/.github/workflows/update-reqs.yml index b4e8a953..95a217f3 100644 --- a/.github/workflows/update-reqs.yml +++ b/.github/workflows/update-reqs.yml @@ -6,7 +6,6 @@ on: push: branches: - epic/v3 - - fix/GH-61-netlify-auto-deploy permissions: contents: write From c07c3e0cf3fa7fce1abc0cbe8f361f84a50ec996 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:36:34 -0600 Subject: [PATCH 20/36] docs: explain workflows --- .github/workflows/update-reqs.yml | 2 ++ .github/workflows/validate-reqs.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/update-reqs.yml b/.github/workflows/update-reqs.yml index 95a217f3..f12cfcd2 100644 --- a/.github/workflows/update-reqs.yml +++ b/.github/workflows/update-reqs.yml @@ -1,3 +1,5 @@ +# Netlify requires requirements.txt (humans do not) +# SEE: validate-reqs.yml name: Update requirements.txt on: diff --git a/.github/workflows/validate-reqs.yml b/.github/workflows/validate-reqs.yml index fe902176..ad15b359 100644 --- a/.github/workflows/validate-reqs.yml +++ b/.github/workflows/validate-reqs.yml @@ -1,3 +1,5 @@ +# Humans should not manage requirements.txt (bots do) +# SEE: update-reqs.yml name: Validate requirements.txt on: From 1bce2663b4e778aa7645fdddf55967e626ac9b24 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:39:05 -0600 Subject: [PATCH 21/36] chore: delete unnecessary Make command --- Makefile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Makefile b/Makefile index 6bf19f74..b4707b08 100644 --- a/Makefile +++ b/Makefile @@ -8,10 +8,6 @@ requirements.txt: poetry.lock && pip uninstall --yes poetry-plugin-export -.PHONY: install -install: poetry.lock - poetry install --sync - .PHONY: build build: $(DOCKER_COMPOSE_CMD) -f ./docker-compose.yml build From 67a209c8dbe4ce65cc5459680e6bfc4299b8b346 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:54:56 -0600 Subject: [PATCH 22/36] docs: TESTING --- TESTING.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/TESTING.md b/TESTING.md index c1b39cd0..39446edd 100644 --- a/TESTING.md +++ b/TESTING.md @@ -1,24 +1,31 @@ # How to Test -## Local Server +- [On Free Machine](#preview-server) +- [On Your Machine](#ad-hoc-server) +- [On Our Machine](#test-server) -> [!WARNING] -> Testing is manual and requires using a command prompt. +## On Free Machine + +> [!TIP] +> Create a pull request; automatically get a remote preview server. -You can [test with **PIP** or **Poetry** or **Docker** or **Make**](https://tacc.github.io/mkdocs-tacc/test/#test-locally) as a client. +## On Your Machine -## Remote Server +> [!NOTE] +> Run a server manually or programatically on your machine. -> [!WARNING] -> Your test may be overridden by others working on the same test server. +You can [test with **PIP** or **Poetry** or **Docker** or **Make**](https://tacc.github.io/mkdocs-tacc/test/#test-locally). -Deploy to our test server: +## On Our Machine + +> [!WARNING] +> Only authorized contributors may deploy to our test server. 0. Have a branch with changes ready to deploy. -1. On your branch, edit the [pre-prod workflow config](./.github/workflows/build-pprd.yml) `branches:` list. +1. On your branch, edit the [pre-prod workflow config](./.github/workflows/build-pprd.yml) `branches:` list to include your branch. 2. Commit the change to trigger the workflow. 3. Wait for [GitHub action](https://github.com/DesignSafe-CI/ds-user-guide/actions) to complete. 4. Load https://pprd.designsafe-ci.org/user-guide/. -> [!TIP] -> In the future, we will offer a dedicated test server. Task is pending [issue #61](https://github.com/DesignSafe-CI/DS-User-Guide/issues/61). +> [!CAUTION] +> Others can override your test by deploying to this server. From 2b5e5280a7a97a61e65b7992dd23edfb6915204f Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:58:31 -0600 Subject: [PATCH 23/36] fix: TESTING.md ToC --- TESTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TESTING.md b/TESTING.md index 39446edd..5a5ab2d4 100644 --- a/TESTING.md +++ b/TESTING.md @@ -1,8 +1,8 @@ # How to Test -- [On Free Machine](#preview-server) -- [On Your Machine](#ad-hoc-server) -- [On Our Machine](#test-server) +- [On Free Machine](#on-free-machine) +- [On Your Machine](#on-your-machine) +- [On Our Machine](#on-our-machine) ## On Free Machine From 33edca1beabadaeee9745127623ab7613abe8368 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:59:37 -0600 Subject: [PATCH 24/36] ci: validate this branch --- .github/workflows/update-reqs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/update-reqs.yml b/.github/workflows/update-reqs.yml index f12cfcd2..8d48d016 100644 --- a/.github/workflows/update-reqs.yml +++ b/.github/workflows/update-reqs.yml @@ -8,6 +8,7 @@ on: push: branches: - epic/v3 + - fix/GH-61-netlify-auto-deploy permissions: contents: write From 2e9d1f960c5e06611b16c641805dffb87e9982c8 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:59:52 -0600 Subject: [PATCH 25/36] test: change reqs --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index df45f168..7bd8a20a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ + babel==2.17.0 ; python_version >= "3.10" and python_version < "3.13" \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 From d5658175b4ea730ffd8cb6ab5e41a045f1e67e36 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:16:26 -0600 Subject: [PATCH 26/36] ci: skip update-reqs if nothing updated --- .github/workflows/update-reqs.yml | 39 +++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-reqs.yml b/.github/workflows/update-reqs.yml index 8d48d016..3113eac9 100644 --- a/.github/workflows/update-reqs.yml +++ b/.github/workflows/update-reqs.yml @@ -1,6 +1,6 @@ # Netlify requires requirements.txt (humans do not) # SEE: validate-reqs.yml -name: Update requirements.txt +name: Check/Update requirements.txt on: pull_request: @@ -14,12 +14,47 @@ permissions: contents: write jobs: - update-requirements: + check-requirements: runs-on: ubuntu-latest + outputs: + needs_update: ${{ steps.check.outputs.needs_update }} # Skip if the last commit was from the bot (prevent infinite loops) if: github.event.head_commit.author.name != 'github-actions[bot]' + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref || github.ref_name }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version-file: 'pyproject.toml' + + - name: Install Poetry + run: pip install poetry + + - name: Check if requirements.txt needs update + id: check + run: | + output=$(make requirements.txt 2>&1) + echo "$output" + + # Check if make indicates the file is up to date + if echo "$output" | grep -qi "up to date\|up-to-date\|already up to date"; then + echo "needs_update=false" >> $GITHUB_OUTPUT + echo "::notice::requirements.txt is already up to date" + else + echo "needs_update=true" >> $GITHUB_OUTPUT + fi + + update-requirements: + runs-on: ubuntu-latest + needs: check-requirements + if: needs.check-requirements.outputs.needs_update == 'true' + steps: - name: Checkout code uses: actions/checkout@v4 From be416b3175a8fb0a7590de3eb495807729068630 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:16:40 -0600 Subject: [PATCH 27/36] ci: prettier output for validate-reqs --- .github/workflows/validate-reqs.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/validate-reqs.yml b/.github/workflows/validate-reqs.yml index ad15b359..15124eb1 100644 --- a/.github/workflows/validate-reqs.yml +++ b/.github/workflows/validate-reqs.yml @@ -24,11 +24,11 @@ jobs: # Check if requirements.txt was modified in last commit if git diff --name-only HEAD~1 HEAD | grep -q "^requirements.txt$"; then if [ "$AUTHOR" != "github-actions[bot]" ]; then - echo "❌ ERROR: You may NOT edit 'requirements.txt'" - echo "To pin dependencies, use 'poetry add '." - echo "Please remove your changes to requirements.txt, so robot can maintain it." + echo "::error::You may NOT edit 'requirements.txt'" + echo "::warning::Undo your changes to requirements.txt, so robot can maintain it." + echo "::notice::To pin dependencies, use 'poetry add '." exit 1 fi fi - echo "✅ SUCCESS: `requirements.txt` not modified unexpectedly" + echo "`requirements.txt` unchanged" From 744fb03b6c9b30ccbc7677f4c8c72582dbbba76e Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:36:05 -0600 Subject: [PATCH 28/36] refactor: requiremnts workflows --- .../workflows/{update-reqs.yml => reqs-sync.yml} | 15 +++++++-------- .../{validate-reqs.yml => reqs-validate.yml} | 5 ++--- 2 files changed, 9 insertions(+), 11 deletions(-) rename .github/workflows/{update-reqs.yml => reqs-sync.yml} (88%) rename .github/workflows/{validate-reqs.yml => reqs-validate.yml} (92%) diff --git a/.github/workflows/update-reqs.yml b/.github/workflows/reqs-sync.yml similarity index 88% rename from .github/workflows/update-reqs.yml rename to .github/workflows/reqs-sync.yml index 3113eac9..2b53ad53 100644 --- a/.github/workflows/update-reqs.yml +++ b/.github/workflows/reqs-sync.yml @@ -1,6 +1,5 @@ # Netlify requires requirements.txt (humans do not) -# SEE: validate-reqs.yml -name: Check/Update requirements.txt +name: Sync requirements.txt with pyproject.toml on: pull_request: @@ -14,10 +13,10 @@ permissions: contents: write jobs: - check-requirements: + detect-delta: runs-on: ubuntu-latest outputs: - needs_update: ${{ steps.check.outputs.needs_update }} + has_change: ${{ steps.detect.outputs.has_change }} # Skip if the last commit was from the bot (prevent infinite loops) if: github.event.head_commit.author.name != 'github-actions[bot]' @@ -37,7 +36,7 @@ jobs: run: pip install poetry - name: Check if requirements.txt needs update - id: check + id: detect run: | output=$(make requirements.txt 2>&1) echo "$output" @@ -50,10 +49,10 @@ jobs: echo "needs_update=true" >> $GITHUB_OUTPUT fi - update-requirements: + commit-delta: runs-on: ubuntu-latest - needs: check-requirements - if: needs.check-requirements.outputs.needs_update == 'true' + needs: detect-delta + if: needs.detect-delta.outputs.has_change == 'true' steps: - name: Checkout code diff --git a/.github/workflows/validate-reqs.yml b/.github/workflows/reqs-validate.yml similarity index 92% rename from .github/workflows/validate-reqs.yml rename to .github/workflows/reqs-validate.yml index 15124eb1..a6b0b2f8 100644 --- a/.github/workflows/validate-reqs.yml +++ b/.github/workflows/reqs-validate.yml @@ -1,13 +1,12 @@ # Humans should not manage requirements.txt (bots do) -# SEE: update-reqs.yml -name: Validate requirements.txt +name: Validate requirements.txt not changed by human on: pull_request: push: jobs: - check-requirements: + reject-drift: runs-on: ubuntu-latest steps: From 789a9b4a4f028d4a0837373d1810e8187de9c007 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:39:33 -0600 Subject: [PATCH 29/36] fix; workflow bugs --- .github/workflows/reqs-sync.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/reqs-sync.yml b/.github/workflows/reqs-sync.yml index 2b53ad53..e9a060e9 100644 --- a/.github/workflows/reqs-sync.yml +++ b/.github/workflows/reqs-sync.yml @@ -35,18 +35,18 @@ jobs: - name: Install Poetry run: pip install poetry - - name: Check if requirements.txt needs update + - name: Detect whether requirements.txt has change id: detect run: | output=$(make requirements.txt 2>&1) echo "$output" - # Check if make indicates the file is up to date + # Check whether Make output suggests file is up to date if echo "$output" | grep -qi "up to date\|up-to-date\|already up to date"; then - echo "needs_update=false" >> $GITHUB_OUTPUT - echo "::notice::requirements.txt is already up to date" + echo "has_change=false" >> $GITHUB_OUTPUT + echo "::notice::requirements.txt seems up to date" else - echo "needs_update=true" >> $GITHUB_OUTPUT + echo "has_change=true" >> $GITHUB_OUTPUT fi commit-delta: From 310a40bcce527f27b7998ffa82c05e4d9bee3409 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:52:58 -0600 Subject: [PATCH 30/36] refactor: simpplify reqs-validate --- .github/workflows/reqs-validate.yml | 31 ++++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/.github/workflows/reqs-validate.yml b/.github/workflows/reqs-validate.yml index a6b0b2f8..306cc1f2 100644 --- a/.github/workflows/reqs-validate.yml +++ b/.github/workflows/reqs-validate.yml @@ -9,25 +9,32 @@ jobs: reject-drift: runs-on: ubuntu-latest + # Skip if the last commit was from the bot (prevent unnecessary check) + if: github.event.head_commit.author.name != 'github-actions[bot]' + steps: - name: Checkout code uses: actions/checkout@v4 with: - fetch-depth: 2 + fetch-depth: 0 # full history - name: Check if requirements.txt was modified unexpectedly run: | - # Get author of last commit - AUTHOR=$(git log -1 --pretty=format:'%an') + # For PRs, check against base branch + # For pushes, check last commit + if [ "${{ github.event_name }}" = "pull_request" ]; then + BASE_REF="${{ github.event.pull_request.base.sha }}" + COMPARE_RANGE="$BASE_REF...HEAD" + else + COMPARE_RANGE="HEAD~1..HEAD" + fi - # Check if requirements.txt was modified in last commit - if git diff --name-only HEAD~1 HEAD | grep -q "^requirements.txt$"; then - if [ "$AUTHOR" != "github-actions[bot]" ]; then - echo "::error::You may NOT edit 'requirements.txt'" - echo "::warning::Undo your changes to requirements.txt, so robot can maintain it." - echo "::notice::To pin dependencies, use 'poetry add '." - exit 1 - fi + # If requirements.txt modified in that range + if git diff --name-only $COMPARE_RANGE | grep -q "^requirements.txt$"; then + echo "::error::You may NOT edit 'requirements.txt'" + echo "::warning::Undo your changes to requirements.txt, so robot can maintain it." + echo "::notice::To pin dependencies, use 'poetry add '." + exit 1 fi - echo "`requirements.txt` unchanged" + echo "'requirements.txt' unchanged (or only changed by bot)" From 8b4f182b9715d0b963283a6281d002fd60753296 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:58:20 -0600 Subject: [PATCH 31/36] fix: reqs change reverted manually --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7bd8a20a..df45f168 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ - babel==2.17.0 ; python_version >= "3.10" and python_version < "3.13" \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 From ce0ef753e4479b5649cf9acc162c10dc5da3bce2 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:10:58 -0600 Subject: [PATCH 32/36] fix: do not run workflows twice --- .github/workflows/reqs-sync.yml | 4 ---- .github/workflows/reqs-validate.yml | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/reqs-sync.yml b/.github/workflows/reqs-sync.yml index e9a060e9..658ff349 100644 --- a/.github/workflows/reqs-sync.yml +++ b/.github/workflows/reqs-sync.yml @@ -4,10 +4,6 @@ name: Sync requirements.txt with pyproject.toml on: pull_request: types: [opened, synchronize, reopened] - push: - branches: - - epic/v3 - - fix/GH-61-netlify-auto-deploy permissions: contents: write diff --git a/.github/workflows/reqs-validate.yml b/.github/workflows/reqs-validate.yml index 306cc1f2..af99b8c1 100644 --- a/.github/workflows/reqs-validate.yml +++ b/.github/workflows/reqs-validate.yml @@ -3,7 +3,7 @@ name: Validate requirements.txt not changed by human on: pull_request: - push: + types: [opened, synchronize, reopened] jobs: reject-drift: From 3c9ecbf9207b2aa9c83d7e1d3013bbe7b32fc986 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:18:22 -0600 Subject: [PATCH 33/36] fix: limit excess workflow runs --- .github/workflows/reqs-sync.yml | 1 + .github/workflows/reqs-validate.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/reqs-sync.yml b/.github/workflows/reqs-sync.yml index 658ff349..8914ca1d 100644 --- a/.github/workflows/reqs-sync.yml +++ b/.github/workflows/reqs-sync.yml @@ -3,6 +3,7 @@ name: Sync requirements.txt with pyproject.toml on: pull_request: + paths: ['pyproject.toml'] types: [opened, synchronize, reopened] permissions: diff --git a/.github/workflows/reqs-validate.yml b/.github/workflows/reqs-validate.yml index af99b8c1..c690aa80 100644 --- a/.github/workflows/reqs-validate.yml +++ b/.github/workflows/reqs-validate.yml @@ -3,6 +3,7 @@ name: Validate requirements.txt not changed by human on: pull_request: + paths: ['requirements.txt'] types: [opened, synchronize, reopened] jobs: From 6529e3186309d5c2e007849c53289df9959e8b17 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:22:22 -0600 Subject: [PATCH 34/36] refactor: rename workflows and jobs --- .../{reqs-validate.yml => requirements-validate.yml} | 2 +- .github/workflows/{reqs-sync.yml => requirments-sync.yml} | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename .github/workflows/{reqs-validate.yml => requirements-validate.yml} (97%) rename .github/workflows/{reqs-sync.yml => requirments-sync.yml} (93%) diff --git a/.github/workflows/reqs-validate.yml b/.github/workflows/requirements-validate.yml similarity index 97% rename from .github/workflows/reqs-validate.yml rename to .github/workflows/requirements-validate.yml index c690aa80..de140da0 100644 --- a/.github/workflows/reqs-validate.yml +++ b/.github/workflows/requirements-validate.yml @@ -7,7 +7,7 @@ on: types: [opened, synchronize, reopened] jobs: - reject-drift: + reject-requirements-drift: runs-on: ubuntu-latest # Skip if the last commit was from the bot (prevent unnecessary check) diff --git a/.github/workflows/reqs-sync.yml b/.github/workflows/requirments-sync.yml similarity index 93% rename from .github/workflows/reqs-sync.yml rename to .github/workflows/requirments-sync.yml index 8914ca1d..2c38f60f 100644 --- a/.github/workflows/reqs-sync.yml +++ b/.github/workflows/requirments-sync.yml @@ -10,7 +10,7 @@ permissions: contents: write jobs: - detect-delta: + detect-requirements-delta: runs-on: ubuntu-latest outputs: has_change: ${{ steps.detect.outputs.has_change }} @@ -46,10 +46,10 @@ jobs: echo "has_change=true" >> $GITHUB_OUTPUT fi - commit-delta: + commit-requirements-delta: runs-on: ubuntu-latest - needs: detect-delta - if: needs.detect-delta.outputs.has_change == 'true' + needs: detect-requirements-delta + if: needs.detect-requirements-delta.outputs.has_change == 'true' steps: - name: Checkout code From fbf1e28c2a6d9e4ecb691b473aa0769c91d3f49b Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:22:45 -0600 Subject: [PATCH 35/36] test: change requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index df45f168..7bd8a20a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ + babel==2.17.0 ; python_version >= "3.10" and python_version < "3.13" \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 From 824e99aca95bca39d3cb0a4bc90026b16698e303 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:25:44 -0600 Subject: [PATCH 36/36] Revert "test: change requirements" This reverts commit fbf1e28c2a6d9e4ecb691b473aa0769c91d3f49b. --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7bd8a20a..df45f168 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ - babel==2.17.0 ; python_version >= "3.10" and python_version < "3.13" \ --hash=sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d \ --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2