From bc248a2b036dc0454644b618578382fc4a8651c3 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:24:37 -0400 Subject: [PATCH 01/14] ci: update action versions to latest --- .github/workflows/build-test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index 6b77cc5..4371776 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -16,9 +16,9 @@ jobs: runs-on: ${{ matrix.os }} name: Build and test with Python ${{ matrix.python-version }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Setup python - uses: actions/setup-python@v2 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ matrix.python-version }} - run: | From aa94f6911136c3b1c84c424f0fb5e0cc56ba85ab Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:27:07 -0400 Subject: [PATCH 02/14] ci: update to ubuntu 22.04 --- .github/workflows/build-test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index 4371776..ce6f485 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: python-version: [ '2.7', '3.5', '3.6', '3.7', '3.10' ] - os: ['ubuntu-20.04', 'ubuntu-latest'] + os: ['ubuntu-22.04', 'ubuntu-latest'] exclude: - python-version: 3.5 os: ubuntu-latest From 403d93507f16fe07bd68dff52763fe8f566c80e8 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:28:57 -0400 Subject: [PATCH 03/14] ci: exclude versions not on 24.04 --- .github/workflows/build-test.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index ce6f485..59cec36 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -9,10 +9,14 @@ jobs: python-version: [ '2.7', '3.5', '3.6', '3.7', '3.10' ] os: ['ubuntu-22.04', 'ubuntu-latest'] exclude: + - python-version: 2.7 + os: ubuntu-latest - python-version: 3.5 os: ubuntu-latest - python-version: 3.6 os: ubuntu-latest + - python-version: 3.7 + os: ubuntu-latest runs-on: ${{ matrix.os }} name: Build and test with Python ${{ matrix.python-version }} steps: From c8ec907c584b1318cf1ac202fbab5b79e6939fbe Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:29:58 -0400 Subject: [PATCH 04/14] ci: add 20.04 back in --- .github/workflows/build-test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index 59cec36..53a75ee 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: python-version: [ '2.7', '3.5', '3.6', '3.7', '3.10' ] - os: ['ubuntu-22.04', 'ubuntu-latest'] + os: ['ubuntu-20.04', 'ubuntu-22.04', 'ubuntu-latest'] exclude: - python-version: 2.7 os: ubuntu-latest From 7f2a5d108c0b3a5b8eed410ef0ad56bd10ee43b4 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:37:08 -0400 Subject: [PATCH 05/14] ci: add Python 3.11-3.14 and restructure test matrix Modern Pythons (3.10-3.14) now run on all three OSes via the python-version x os matrix, while the legacy Pythons (2.7, 3.5, 3.6, 3.7) are added on ubuntu-20.04 only via include, since setup-python cannot provide them on newer runners. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build-test.yaml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index 53a75ee..54929e4 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -6,17 +6,14 @@ jobs: build: strategy: matrix: - python-version: [ '2.7', '3.5', '3.6', '3.7', '3.10' ] + python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ] os: ['ubuntu-20.04', 'ubuntu-22.04', 'ubuntu-latest'] - exclude: - - python-version: 2.7 - os: ubuntu-latest - - python-version: 3.5 - os: ubuntu-latest - - python-version: 3.6 - os: ubuntu-latest - - python-version: 3.7 - os: ubuntu-latest + # Old Pythons are only available on ubuntu-20.04, so add them there only. + include: + - { python-version: '2.7', os: ubuntu-20.04 } + - { python-version: '3.5', os: ubuntu-20.04 } + - { python-version: '3.6', os: ubuntu-20.04 } + - { python-version: '3.7', os: ubuntu-20.04 } runs-on: ${{ matrix.os }} name: Build and test with Python ${{ matrix.python-version }} steps: From 181d9a23c3c4413e15d7db362c93f7078c598670 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:40:45 -0400 Subject: [PATCH 06/14] ci: include OS in job display name Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build-test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index 54929e4..cdf8d95 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -15,7 +15,7 @@ jobs: - { python-version: '3.6', os: ubuntu-20.04 } - { python-version: '3.7', os: ubuntu-20.04 } runs-on: ${{ matrix.os }} - name: Build and test with Python ${{ matrix.python-version }} + name: Build and test with Python ${{ matrix.python-version }} on ${{ matrix.os }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Setup python From a733a67b9a504a4690bed746bb9f56734442154c Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:44:49 -0400 Subject: [PATCH 07/14] ci: split workflow into modern and legacy Python jobs Separate the matrix into a modern job (Python 3.10-3.14 on 22.04 and latest) and a legacy job (Python 2.7-3.7 on ubuntu-20.04), each with fail-fast disabled so one failure does not cancel the others. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build-test.yaml | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index cdf8d95..9f0db79 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -3,19 +3,32 @@ name: Build and Test C++ and Python on: [push, pull_request] jobs: - build: + modern: strategy: + fail-fast: false matrix: python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ] - os: ['ubuntu-20.04', 'ubuntu-22.04', 'ubuntu-latest'] - # Old Pythons are only available on ubuntu-20.04, so add them there only. - include: - - { python-version: '2.7', os: ubuntu-20.04 } - - { python-version: '3.5', os: ubuntu-20.04 } - - { python-version: '3.6', os: ubuntu-20.04 } - - { python-version: '3.7', os: ubuntu-20.04 } + os: ['ubuntu-22.04', 'ubuntu-latest'] runs-on: ${{ matrix.os }} - name: Build and test with Python ${{ matrix.python-version }} on ${{ matrix.os }} + name: Modern Python ${{ matrix.python-version }} on ${{ matrix.os }} + steps: + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - name: Setup python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: ${{ matrix.python-version }} + - run: | + python -m pip install -r requirements.txt . + python test.py + yes | python -m pip uninstall dash-hash + + legacy: + strategy: + fail-fast: false + matrix: + python-version: [ '2.7', '3.5', '3.6', '3.7' ] + runs-on: ubuntu-20.04 + name: Legacy Python ${{ matrix.python-version }} on ubuntu-20.04 steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Setup python From c7949ec2d49896822b8044a9a2d836c9f4ba364c Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:49:28 -0400 Subject: [PATCH 08/14] ci: consolidate into single build job and drop oldest Pythons Merge the modern and legacy jobs back into one build job covering Python 3.7 and 3.10-3.14 on ubuntu-22.04 and latest, dropping 2.7, 3.5, 3.6 and the ubuntu-20.04 runner. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build-test.yaml | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index 9f0db79..e9ceb68 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -3,32 +3,14 @@ name: Build and Test C++ and Python on: [push, pull_request] jobs: - modern: + build: strategy: fail-fast: false matrix: - python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ] + python-version: [ '3.7', '3.10', '3.11', '3.12', '3.13', '3.14' ] os: ['ubuntu-22.04', 'ubuntu-latest'] runs-on: ${{ matrix.os }} - name: Modern Python ${{ matrix.python-version }} on ${{ matrix.os }} - steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - - name: Setup python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: ${{ matrix.python-version }} - - run: | - python -m pip install -r requirements.txt . - python test.py - yes | python -m pip uninstall dash-hash - - legacy: - strategy: - fail-fast: false - matrix: - python-version: [ '2.7', '3.5', '3.6', '3.7' ] - runs-on: ubuntu-20.04 - name: Legacy Python ${{ matrix.python-version }} on ubuntu-20.04 + name: Python ${{ matrix.python-version }} on ${{ matrix.os }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Setup python From 2158f99ac62eab9e2ced96bd911ad6adb1ae63ff Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:50:44 -0400 Subject: [PATCH 09/14] ci: only test 3.7 on 22.04 --- .github/workflows/build-test.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index e9ceb68..39911a1 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -7,8 +7,10 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ '3.7', '3.10', '3.11', '3.12', '3.13', '3.14' ] + python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ] os: ['ubuntu-22.04', 'ubuntu-latest'] + include: + - { python-version: '3.7', os: ubuntu-22.04 } runs-on: ${{ matrix.os }} name: Python ${{ matrix.python-version }} on ${{ matrix.os }} steps: From 5765eec16333606bfb20c2dc3fdec3ab549d01ea Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:54:47 -0400 Subject: [PATCH 10/14] docs: update supported Python version to 3.7+ Align the README with CI, which no longer tests 2.7, 3.5 or 3.6. Also drop the $ prompts from command examples for easier copy-paste. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c63f5d1..ba35182 100644 --- a/README.md +++ b/README.md @@ -3,24 +3,23 @@ dash_hash (python) v1.4.0 Python module for Dash's X11 hashing. - Install ------- -Python 3.5+ or 2.7+ and the associated development package (e.g., `python3-dev`) is required as well as a gcc. +Python 3.7+ and the associated development package (e.g., `python3-dev`) is required as well as gcc. - $ pip3 install -r requirements.txt . + pip3 install -r requirements.txt . Test ------- After installation, test hash. - $ python3 test.py + python3 test.py Uninstall ------- - $ pip3 uninstall dash_hash + pip3 uninstall dash_hash Credits ------- From dcf1e99472cd581658af29fd02490b527fd47612 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:55:11 -0400 Subject: [PATCH 11/14] ci: rename workflow and add manual trigger Rename the workflow to reflect that it builds a Python C extension rather than a standalone C++ project, and add workflow_dispatch so it can be run manually. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build-test.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index 39911a1..eab48df 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -1,6 +1,9 @@ -name: Build and Test C++ and Python +name: Build and Test Python C Extension -on: [push, pull_request] +on: + push: + pull_request: + workflow_dispatch: jobs: build: From 32df5fae9442aa16b8bb36408fb0e06e35585246 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 8 Jun 2026 15:57:04 -0400 Subject: [PATCH 12/14] ci: add weekly scheduled run Run the workflow every Monday at 08:17 UTC to catch breakage from new runner images or dependency updates between commits. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build-test.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index eab48df..7c5f918 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -3,6 +3,8 @@ name: Build and Test Python C Extension on: push: pull_request: + schedule: + - cron: '17 8 * * 1' workflow_dispatch: jobs: From 9ada8eaa2eafdef1a98ccebaa561d2f03d0ebe16 Mon Sep 17 00:00:00 2001 From: thephez Date: Tue, 9 Jun 2026 16:14:36 -0400 Subject: [PATCH 13/14] ci: test EOL Python 2.7, 3.5, 3.6 via Docker images actions/setup-python no longer publishes these builds for the available runner images, so test them inside the official python:X.Y-buster images, which ship a working interpreter and gcc. The C extension already has Python 2 build branches. Restore the README's supported-version note to 3.5+/2.7+ accordingly. --- .github/workflows/build-test.yaml | 20 ++++++++++++++++++++ README.md | 7 ++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index 7c5f918..d3e02b3 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -28,3 +28,23 @@ jobs: python -m pip install -r requirements.txt . python test.py yes | python -m pip uninstall dash-hash + + legacy: + # Python 2.7/3.5/3.6 are no longer published by actions/setup-python for + # the available runner images, so they are tested inside the official EOL + # Docker images, which still ship a working interpreter and gcc. + strategy: + fail-fast: false + matrix: + image: [ 'python:2.7-buster', 'python:3.5-buster', 'python:3.6-buster' ] + runs-on: ubuntu-latest + container: ${{ matrix.image }} + name: ${{ matrix.image }} + steps: + # buster's glibc (2.28) is new enough to run checkout's bundled Node, so + # the same pinned version as the build job can be used here. + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - run: | + python -m pip install . + python test.py + yes | python -m pip uninstall dash-hash diff --git a/README.md b/README.md index ba35182..1909ca0 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,20 @@ Python module for Dash's X11 hashing. Install ------- -Python 3.7+ and the associated development package (e.g., `python3-dev`) is required as well as gcc. +Python 3.5+ or 2.7+ and the associated development package (e.g., `python3-dev`) is required as well as gcc. pip3 install -r requirements.txt . Test -------- +---- After installation, test hash. python3 test.py Uninstall -------- +--------- + pip3 uninstall dash_hash Credits From 88773d2b21a059f78e6ccc9896cef558ceb20d9e Mon Sep 17 00:00:00 2001 From: thephez Date: Tue, 9 Jun 2026 16:23:14 -0400 Subject: [PATCH 14/14] ci: also test Python 3.8 and 3.9 These are still published by actions/setup-python for the current runners, so add them to the modern build matrix to close the 3.7-to-3.10 gap. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build-test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index d3e02b3..9677453 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ] + python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14' ] os: ['ubuntu-22.04', 'ubuntu-latest'] include: - { python-version: '3.7', os: ubuntu-22.04 }