diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml
index 06cac42..4fe030e 100644
--- a/.github/workflows/wheels.yml
+++ b/.github/workflows/wheels.yml
@@ -316,7 +316,7 @@ jobs:
wheelhouse/*.json
retention-days: 1
- commit:
+ release:
if: ${{ needs.meta.outputs.matrix != 'null' }}
needs: [meta, build]
@@ -327,7 +327,8 @@ jobs:
contents: write
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - name: Checkout main branch
+ uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
# Explicitly set ref to include commits from the meta job.
# https://github.com/actions/checkout/issues/439#issuecomment-830862188
@@ -335,37 +336,49 @@ jobs:
path: main
persist-credentials: true # Need credentials to push.
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - name: Checkout deployment branch
+ uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
- ref: wheelhouse
- path: wheelhouse
+ ref: pypi
+ path: pypi
persist-credentials: true # Need credentials to push.
- - name: Create directory
- run: |
- mkdir -p wheelhouse/${{ inputs.name }}
+ - name: Install uv
+ uses: astral-sh/setup-uv@2ddd2b9cb38ad8efd50337e8ab201519a34c9f24 # v7.1.1
+ with:
+ version-file: "pyproject.toml"
+ enable-cache: true
+ cache-dependency-glob: |
+ **/pyproject.toml
+ **/uv.lock
+
+ # - name: Create directory for wheels
+ # run: |
+ # mkdir wheelhouse
- - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
+ - name: Fetch wheels
+ uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
pattern: ${{ inputs.name }}-*
- path: wheelhouse/${{ inputs.name }}
+ path: wheelhouse
merge-multiple: true
- - name: Update index
+ - name: Bump project version
run: |
- main/tools/make_index wheelhouse/${{ inputs.name}}/ --package ${{ inputs.name }}
+ uv version --bump patch
+ echo "VERSION=$(uv version --short)" >>$GITHUB_ENV
- - name: Update build data
+ - name: Store build metadata
run: |
main/tools/store_info.py wheelhouse/${{ inputs.name }}/*.json --store main/build.json
rm wheelhouse/${{ inputs.name }}/*.json
- - name: Update version icons
+ - name: Update badges
run: |
main/tools/update_icons --store main/build.json --readme main/README.md
- - name: Commit wheels
- working-directory: wheelhouse
+ - name: Commit release data
+ working-directory: main
run: |
if [[ -z "$(git status --porcelain)" ]]; then
echo "No changes to commit"
@@ -374,11 +387,25 @@ jobs:
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git add .
- git commit -m "ci: Add wheels for ${{ inputs.name }}-${{ needs.meta.outputs.version }}"
- git push origin HEAD:wheelhouse
+ git commit -m "ci: Prepare release for ${{ inputs.name }}-${{ needs.meta.outputs.version }}"
+ git push origin HEAD:main
- - name: Commit build data
- working-directory: main
+ - name: Release wheels
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ NOTES=$(uv run main/tools/release_notes --store main/build.json \
+ --template main/templates/release.md)
+ gh release create "${VERSION}" --title "${VERSION}" --notes "${NOTES}" wheelhouse/*
+
+ - name: Generate index
+ run: |
+ # Wait 10s for release to get finished.
+ sleep 10
+ uv run main/tools/make_index2 pypi/${{ inputs.name}}/index.html
+
+ - name: Deploy index
+ working-directory: pypi
run: |
if [[ -z "$(git status --porcelain)" ]]; then
echo "No changes to commit"
@@ -386,9 +413,9 @@ jobs:
fi
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- git add build.json README.md
- git commit -m "ci: Store info for ${{ inputs.name }}-${{ needs.meta.outputs.version }}"
- git push origin HEAD:main
+ git add .
+ git commit -m "ci: Add wheels for ${{ inputs.name }}-${{ needs.meta.outputs.version }}"
+ git push origin HEAD:pypi
...
# vim: set tw=98:
diff --git a/pypi/simple/.nojekyll b/pypi/simple/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/pypi/simple/index.html b/pypi/simple/index.html
new file mode 100644
index 0000000..2f55bf4
--- /dev/null
+++ b/pypi/simple/index.html
@@ -0,0 +1,18 @@
+
+
+
+ Simple index
+
+
+Packages marked with (*) are custom compiled. The rest are unmodified dependencies and redirect to PyPI.
+intel-cmplr-lib-ur
+intel-openmp
+mkl
+mkl-service (*)
+numpy (*)
+scipy (*)
+tbb
+tcmlib
+umf
+
+
diff --git a/pypi/simple/intel-cmplr-lib-ur/index.html b/pypi/simple/intel-cmplr-lib-ur/index.html
new file mode 100644
index 0000000..1be1012
--- /dev/null
+++ b/pypi/simple/intel-cmplr-lib-ur/index.html
@@ -0,0 +1,35 @@
+
+
+
+
+ Links for intel-cmplr-lib-ur
+
+
+ Links for intel-cmplr-lib-ur
+intel_cmplr_lib_ur-2024.2.0-py2.py3-none-manylinux1_x86_64.whl
+intel_cmplr_lib_ur-2024.2.0-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2024.2.1-py2.py3-none-manylinux1_x86_64.whl
+intel_cmplr_lib_ur-2024.2.1-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.0.0-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.0.0-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.0.1-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.0.1-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.0.2-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.0.2-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.0.3-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.0.3-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.0.4-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.0.4-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.0.5-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.0.5-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.1.0-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.1.0-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.1.1-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.1.1-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.2.0-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.2.0-py2.py3-none-win_amd64.whl
+intel_cmplr_lib_ur-2025.2.1-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_cmplr_lib_ur-2025.2.1-py2.py3-none-win_amd64.whl
+
+
+
\ No newline at end of file
diff --git a/pypi/simple/intel-openmp/index.html b/pypi/simple/intel-openmp/index.html
new file mode 100644
index 0000000..577514a
--- /dev/null
+++ b/pypi/simple/intel-openmp/index.html
@@ -0,0 +1,147 @@
+
+
+
+
+ Links for intel-openmp
+
+
+ Links for intel-openmp
+intel_openmp-2018.0.0-py2.py3-none-macosx_10_12_intel.macosx_10_12_x86_64.whl
+intel_openmp-2018.0.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2018.0.0-py2.py3-none-win_amd64.whl
+intel_openmp-2018.0.3-py2.py3-none-macosx_10_12_intel.macosx_10_12_x86_64.whl
+intel_openmp-2018.0.3-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2018.0.3-py2.py3-none-win_amd64.whl
+intel_openmp-2019.0-py2.py3-none-macosx_10_12_intel.macosx_10_12_x86_64.whl
+intel_openmp-2019.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2019.0-py2.py3-none-win_amd64.whl
+intel_openmp-2020.0.133-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2021.1.1-py2.py3-none-macosx_10_15_x86_64.whl
+intel_openmp-2021.1.1-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2021.1.1-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2021.1.1-py2.py3-none-win32.whl
+intel_openmp-2021.1.1-py2.py3-none-win_amd64.whl
+intel_openmp-2021.1.2-py2.py3-none-macosx_10_15_x86_64.whl
+intel_openmp-2021.1.2-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2021.1.2-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2021.1.2-py2.py3-none-win32.whl
+intel_openmp-2021.1.2-py2.py3-none-win_amd64.whl
+intel_openmp-2021.2.0-py2.py3-none-macosx_10_15_x86_64.whl
+intel_openmp-2021.2.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2021.2.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2021.2.0-py2.py3-none-win32.whl
+intel_openmp-2021.2.0-py2.py3-none-win_amd64.whl
+intel_openmp-2021.3.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2021.3.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2021.3.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2021.3.0-py2.py3-none-win32.whl
+intel_openmp-2021.3.0-py2.py3-none-win_amd64.whl
+intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2021.4.0-py2.py3-none-win32.whl
+intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl
+intel_openmp-2022.0.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2022.0.0-py2.py3-none-win32.whl
+intel_openmp-2022.0.0-py2.py3-none-win_amd64.whl
+intel_openmp-2022.0.1-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2022.0.1-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2022.0.2-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2022.0.2-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2022.0.2-py2.py3-none-win32.whl
+intel_openmp-2022.0.2-py2.py3-none-win_amd64.whl
+intel_openmp-2022.0.3-py2.py3-none-win32.whl
+intel_openmp-2022.0.3-py2.py3-none-win_amd64.whl
+intel_openmp-2022.1.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2022.1.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2022.1.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2022.1.0-py2.py3-none-win32.whl
+intel_openmp-2022.1.0-py2.py3-none-win_amd64.whl
+intel_openmp-2022.2.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2022.2.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2022.2.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2022.2.0-py2.py3-none-win32.whl
+intel_openmp-2022.2.0-py2.py3-none-win_amd64.whl
+intel_openmp-2022.2.1-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2022.2.1-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2022.2.1-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2022.2.1-py2.py3-none-win32.whl
+intel_openmp-2022.2.1-py2.py3-none-win_amd64.whl
+intel_openmp-2023.0.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2023.0.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2023.0.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2023.1.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2023.1.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2023.1.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2023.1.0-py2.py3-none-win32.whl
+intel_openmp-2023.1.0-py2.py3-none-win_amd64.whl
+intel_openmp-2023.2.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+intel_openmp-2023.2.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2023.2.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2023.2.0-py2.py3-none-win32.whl
+intel_openmp-2023.2.0-py2.py3-none-win_amd64.whl
+intel_openmp-2023.2.2-py2.py3-none-win32.whl
+intel_openmp-2023.2.2-py2.py3-none-win_amd64.whl
+intel_openmp-2023.2.3-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2023.2.3-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2023.2.3-py2.py3-none-win32.whl
+intel_openmp-2023.2.3-py2.py3-none-win_amd64.whl
+intel_openmp-2023.2.4-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2023.2.4-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2023.2.4-py2.py3-none-win32.whl
+intel_openmp-2023.2.4-py2.py3-none-win_amd64.whl
+intel_openmp-2024.0.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2024.0.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2024.0.0-py2.py3-none-win32.whl
+intel_openmp-2024.0.0-py2.py3-none-win_amd64.whl
+intel_openmp-2024.0.1-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2024.0.1-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2024.0.1-py2.py3-none-win32.whl
+intel_openmp-2024.0.1-py2.py3-none-win_amd64.whl
+intel_openmp-2024.0.2-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2024.0.2-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2024.0.2-py2.py3-none-win32.whl
+intel_openmp-2024.0.2-py2.py3-none-win_amd64.whl
+intel_openmp-2024.0.3-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2024.0.3-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2024.0.3-py2.py3-none-win32.whl
+intel_openmp-2024.0.3-py2.py3-none-win_amd64.whl
+intel_openmp-2024.1.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2024.1.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2024.1.0-py2.py3-none-win32.whl
+intel_openmp-2024.1.0-py2.py3-none-win_amd64.whl
+intel_openmp-2024.1.2-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2024.1.2-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2024.1.2-py2.py3-none-win32.whl
+intel_openmp-2024.1.2-py2.py3-none-win_amd64.whl
+intel_openmp-2024.2.0-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2024.2.0-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2024.2.0-py2.py3-none-win32.whl
+intel_openmp-2024.2.0-py2.py3-none-win_amd64.whl
+intel_openmp-2024.2.1-py2.py3-none-manylinux1_i686.whl
+intel_openmp-2024.2.1-py2.py3-none-manylinux1_x86_64.whl
+intel_openmp-2024.2.1-py2.py3-none-win32.whl
+intel_openmp-2024.2.1-py2.py3-none-win_amd64.whl
+intel_openmp-2025.0.0-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.0.0-py2.py3-none-win_amd64.whl
+intel_openmp-2025.0.1-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.0.1-py2.py3-none-win_amd64.whl
+intel_openmp-2025.0.2-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.0.2-py2.py3-none-win_amd64.whl
+intel_openmp-2025.0.3-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.0.3-py2.py3-none-win_amd64.whl
+intel_openmp-2025.0.4-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.0.4-py2.py3-none-win_amd64.whl
+intel_openmp-2025.0.5-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.0.5-py2.py3-none-win_amd64.whl
+intel_openmp-2025.1.0-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.1.0-py2.py3-none-win_amd64.whl
+intel_openmp-2025.1.1-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.1.1-py2.py3-none-win_amd64.whl
+intel_openmp-2025.2.0-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.2.0-py2.py3-none-win_amd64.whl
+intel_openmp-2025.2.1-py2.py3-none-manylinux_2_28_x86_64.whl
+intel_openmp-2025.2.1-py2.py3-none-win_amd64.whl
+
+
+
\ No newline at end of file
diff --git a/pypi/simple/mkl-service/index.html b/pypi/simple/mkl-service/index.html
new file mode 100644
index 0000000..ba33308
--- /dev/null
+++ b/pypi/simple/mkl-service/index.html
@@ -0,0 +1,45 @@
+
+
+
+ Links for mkl-service
+
+
+ Links for mkl-service
+
+mkl_service-2.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 30-Apr-2025
+mkl_service-2.4.2-cp310-cp310-win_amd64.whl 0.1 MB 30-Apr-2025
+mkl_service-2.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 30-Apr-2025
+mkl_service-2.4.2-cp311-cp311-win_amd64.whl 0.1 MB 30-Apr-2025
+mkl_service-2.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 30-Apr-2025
+mkl_service-2.4.2-cp312-cp312-win_amd64.whl 0.1 MB 30-Apr-2025
+mkl_service-2.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 30-Apr-2025
+mkl_service-2.4.2-cp313-cp313-win_amd64.whl 0.1 MB 30-Apr-2025
+mkl_service-2.5.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 24-Jun-2025
+mkl_service-2.5.0-cp310-cp310-win_amd64.whl 0.1 MB 24-Jun-2025
+mkl_service-2.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 24-Jun-2025
+mkl_service-2.5.0-cp311-cp311-win_amd64.whl 0.1 MB 24-Jun-2025
+mkl_service-2.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 24-Jun-2025
+mkl_service-2.5.0-cp312-cp312-win_amd64.whl 0.1 MB 24-Jun-2025
+mkl_service-2.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 24-Jun-2025
+mkl_service-2.5.0-cp313-cp313-win_amd64.whl 0.1 MB 24-Jun-2025
+mkl_service-2.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 06-Jul-2025
+mkl_service-2.5.2-cp310-cp310-win_amd64.whl 0.1 MB 06-Jul-2025
+mkl_service-2.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 06-Jul-2025
+mkl_service-2.5.2-cp311-cp311-win_amd64.whl 0.1 MB 06-Jul-2025
+mkl_service-2.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 06-Jul-2025
+mkl_service-2.5.2-cp312-cp312-win_amd64.whl 0.1 MB 06-Jul-2025
+mkl_service-2.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 06-Jul-2025
+mkl_service-2.5.2-cp313-cp313-win_amd64.whl 0.1 MB 06-Jul-2025
+mkl_service-2.6.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp310-cp310-win_amd64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp311-cp311-win_amd64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp312-cp312-win_amd64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp313-cp313-win_amd64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl 0.1 MB 17-Oct-2025
+mkl_service-2.6.0-cp314-cp314-win_amd64.whl 0.1 MB 17-Oct-2025
+
+
+
diff --git a/pypi/simple/mkl/index.html b/pypi/simple/mkl/index.html
new file mode 100644
index 0000000..7a85306
--- /dev/null
+++ b/pypi/simple/mkl/index.html
@@ -0,0 +1,109 @@
+
+
+
+
+ Links for mkl
+
+
+ Links for mkl
+mkl-2018.0.0-py2.py3-none-macosx_10_12_intel.macosx_10_12_x86_64.whl
+mkl-2018.0.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2018.0.0-py2.py3-none-win_amd64.whl
+mkl-2018.0.3-py2.py3-none-macosx_10_12_intel.macosx_10_12_x86_64.whl
+mkl-2018.0.3-py2.py3-none-manylinux1_x86_64.whl
+mkl-2018.0.3-py2.py3-none-win_amd64.whl
+mkl-2019.0-py2.py3-none-macosx_10_12_intel.macosx_10_12_x86_64.whl
+mkl-2019.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2019.0-py2.py3-none-win_amd64.whl
+mkl-2021.1.1-py2.py3-none-macosx_10_15_x86_64.whl
+mkl-2021.1.1-py2.py3-none-manylinux1_i686.whl
+mkl-2021.1.1-py2.py3-none-manylinux1_x86_64.whl
+mkl-2021.1.1-py2.py3-none-win32.whl
+mkl-2021.1.1-py2.py3-none-win_amd64.whl
+mkl-2021.2.0-py2.py3-none-macosx_10_15_x86_64.whl
+mkl-2021.2.0-py2.py3-none-manylinux1_i686.whl
+mkl-2021.2.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2021.2.0-py2.py3-none-win32.whl
+mkl-2021.2.0-py2.py3-none-win_amd64.whl
+mkl-2021.3.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2021.3.0-py2.py3-none-manylinux1_i686.whl
+mkl-2021.3.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2021.3.0-py2.py3-none-win32.whl
+mkl-2021.3.0-py2.py3-none-win_amd64.whl
+mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl
+mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2021.4.0-py2.py3-none-win32.whl
+mkl-2021.4.0-py2.py3-none-win_amd64.whl
+mkl-2022.0.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2022.0.0-py2.py3-none-win32.whl
+mkl-2022.0.0-py2.py3-none-win_amd64.whl
+mkl-2022.0.1-py2.py3-none-manylinux1_i686.whl
+mkl-2022.0.1-py2.py3-none-manylinux1_x86_64.whl
+mkl-2022.0.2-py2.py3-none-manylinux1_i686.whl
+mkl-2022.0.2-py2.py3-none-manylinux1_x86_64.whl
+mkl-2022.0.2-py2.py3-none-win32.whl
+mkl-2022.0.2-py2.py3-none-win_amd64.whl
+mkl-2022.0.3-py2.py3-none-win32.whl
+mkl-2022.0.3-py2.py3-none-win_amd64.whl
+mkl-2022.1.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2022.1.0-py2.py3-none-manylinux1_i686.whl
+mkl-2022.1.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2022.1.0-py2.py3-none-win32.whl
+mkl-2022.1.0-py2.py3-none-win_amd64.whl
+mkl-2022.2.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2022.2.0-py2.py3-none-manylinux1_i686.whl
+mkl-2022.2.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2022.2.0-py2.py3-none-win32.whl
+mkl-2022.2.0-py2.py3-none-win_amd64.whl
+mkl-2022.2.1-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2022.2.1-py2.py3-none-manylinux1_i686.whl
+mkl-2022.2.1-py2.py3-none-manylinux1_x86_64.whl
+mkl-2022.2.1-py2.py3-none-win32.whl
+mkl-2022.2.1-py2.py3-none-win_amd64.whl
+mkl-2023.0.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2023.0.0-py2.py3-none-manylinux1_i686.whl
+mkl-2023.0.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2023.1.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2023.1.0-py2.py3-none-manylinux1_i686.whl
+mkl-2023.1.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2023.1.0-py2.py3-none-win32.whl
+mkl-2023.1.0-py2.py3-none-win_amd64.whl
+mkl-2023.2.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2023.2.0-py2.py3-none-manylinux1_i686.whl
+mkl-2023.2.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2023.2.0-py2.py3-none-win32.whl
+mkl-2023.2.0-py2.py3-none-win_amd64.whl
+mkl-2023.2.1-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2023.2.2-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+mkl-2024.0.0-py2.py3-none-manylinux1_i686.whl
+mkl-2024.0.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2024.0.0-py2.py3-none-win32.whl
+mkl-2024.0.0-py2.py3-none-win_amd64.whl
+mkl-2024.1.0-py2.py3-none-manylinux1_i686.whl
+mkl-2024.1.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2024.1.0-py2.py3-none-win32.whl
+mkl-2024.1.0-py2.py3-none-win_amd64.whl
+mkl-2024.2.0-py2.py3-none-manylinux1_i686.whl
+mkl-2024.2.0-py2.py3-none-manylinux1_x86_64.whl
+mkl-2024.2.0-py2.py3-none-win32.whl
+mkl-2024.2.0-py2.py3-none-win_amd64.whl
+mkl-2024.2.1-py2.py3-none-manylinux1_i686.whl
+mkl-2024.2.1-py2.py3-none-manylinux1_x86_64.whl
+mkl-2024.2.1-py2.py3-none-win32.whl
+mkl-2024.2.1-py2.py3-none-win_amd64.whl
+mkl-2024.2.2-py2.py3-none-manylinux1_i686.whl
+mkl-2024.2.2-py2.py3-none-manylinux1_x86_64.whl
+mkl-2024.2.2-py2.py3-none-win32.whl
+mkl-2024.2.2-py2.py3-none-win_amd64.whl
+mkl-2025.0.0-py2.py3-none-manylinux_2_28_x86_64.whl
+mkl-2025.0.0-py2.py3-none-win_amd64.whl
+mkl-2025.0.1-py2.py3-none-manylinux_2_28_x86_64.whl
+mkl-2025.0.1-py2.py3-none-win_amd64.whl
+mkl-2025.1.0-py2.py3-none-manylinux_2_28_x86_64.whl
+mkl-2025.1.0-py2.py3-none-win_amd64.whl
+mkl-2025.2.0-py2.py3-none-manylinux_2_28_x86_64.whl
+mkl-2025.2.0-py2.py3-none-win_amd64.whl
+
+
+
\ No newline at end of file
diff --git a/pypi/simple/numpy/index.html b/pypi/simple/numpy/index.html
new file mode 100644
index 0000000..762616a
--- /dev/null
+++ b/pypi/simple/numpy/index.html
@@ -0,0 +1,75 @@
+
+
+
+ Links for numpy
+
+
+ Links for numpy
+
+numpy-2.1.3-cp310-cp310-manylinux_2_35_x86_64.whl 7.9 MB 04-Apr-2025
+numpy-2.1.3-cp310-cp310-win_amd64.whl 6.0 MB 04-Apr-2025
+numpy-2.1.3-cp311-cp311-manylinux_2_35_x86_64.whl 7.9 MB 04-Apr-2025
+numpy-2.1.3-cp311-cp311-win_amd64.whl 6.0 MB 04-Apr-2025
+numpy-2.1.3-cp312-cp312-manylinux_2_35_x86_64.whl 7.7 MB 04-Apr-2025
+numpy-2.1.3-cp312-cp312-win_amd64.whl 5.7 MB 04-Apr-2025
+numpy-2.1.3-cp313-cp313-manylinux_2_35_x86_64.whl 7.7 MB 04-Apr-2025
+numpy-2.1.3-cp313-cp313-win_amd64.whl 5.7 MB 04-Apr-2025
+numpy-2.2.4-cp310-cp310-manylinux_2_35_x86_64.whl 8.0 MB 31-Mar-2025
+numpy-2.2.4-cp310-cp310-win_amd64.whl 6.0 MB 31-Mar-2025
+numpy-2.2.4-cp311-cp311-manylinux_2_35_x86_64.whl 8.0 MB 31-Mar-2025
+numpy-2.2.4-cp311-cp311-win_amd64.whl 6.0 MB 31-Mar-2025
+numpy-2.2.4-cp312-cp312-manylinux_2_35_x86_64.whl 7.7 MB 31-Mar-2025
+numpy-2.2.4-cp312-cp312-win_amd64.whl 5.7 MB 31-Mar-2025
+numpy-2.2.4-cp313-cp313-manylinux_2_35_x86_64.whl 7.7 MB 31-Mar-2025
+numpy-2.2.4-cp313-cp313-win_amd64.whl 5.7 MB 31-Mar-2025
+numpy-2.2.5-cp310-cp310-manylinux_2_35_x86_64.whl 8.0 MB 20-Apr-2025
+numpy-2.2.5-cp310-cp310-win_amd64.whl 6.0 MB 30-Apr-2025
+numpy-2.2.5-cp311-cp311-manylinux_2_35_x86_64.whl 8.0 MB 20-Apr-2025
+numpy-2.2.5-cp311-cp311-win_amd64.whl 6.0 MB 30-Apr-2025
+numpy-2.2.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.9 MB 30-Apr-2025
+numpy-2.2.5-cp312-cp312-win_amd64.whl 5.7 MB 30-Apr-2025
+numpy-2.2.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.9 MB 30-Apr-2025
+numpy-2.2.5-cp313-cp313-win_amd64.whl 5.7 MB 30-Apr-2025
+numpy-2.2.6-cp310-cp310-manylinux_2_35_x86_64.whl 7.9 MB 18-May-2025
+numpy-2.2.6-cp310-cp310-win_amd64.whl 6.0 MB 18-May-2025
+numpy-2.2.6-cp311-cp311-manylinux_2_35_x86_64.whl 7.9 MB 18-May-2025
+numpy-2.2.6-cp311-cp311-win_amd64.whl 6.0 MB 18-May-2025
+numpy-2.2.6-cp312-cp312-manylinux_2_35_x86_64.whl 7.7 MB 18-May-2025
+numpy-2.2.6-cp312-cp312-win_amd64.whl 5.7 MB 18-May-2025
+numpy-2.2.6-cp313-cp313-manylinux_2_35_x86_64.whl 7.7 MB 18-May-2025
+numpy-2.2.6-cp313-cp313-win_amd64.whl 5.7 MB 18-May-2025
+numpy-2.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 8.0 MB 10-Jun-2025
+numpy-2.3.0-cp311-cp311-win_amd64.whl 5.3 MB 09-Jun-2025
+numpy-2.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 09-Jun-2025
+numpy-2.3.0-cp312-cp312-win_amd64.whl 5.1 MB 09-Jun-2025
+numpy-2.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 09-Jun-2025
+numpy-2.3.0-cp313-cp313-win_amd64.whl 5.1 MB 09-Jun-2025
+numpy-2.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 8.0 MB 24-Jun-2025
+numpy-2.3.1-cp311-cp311-win_amd64.whl 6.1 MB 24-Jun-2025
+numpy-2.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 24-Jun-2025
+numpy-2.3.1-cp312-cp312-win_amd64.whl 5.8 MB 24-Jun-2025
+numpy-2.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 24-Jun-2025
+numpy-2.3.1-cp313-cp313-win_amd64.whl 5.8 MB 24-Jun-2025
+numpy-2.3.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 8.0 MB 27-Jul-2025
+numpy-2.3.2-cp311-cp311-win_amd64.whl 6.1 MB 27-Jul-2025
+numpy-2.3.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 27-Jul-2025
+numpy-2.3.2-cp312-cp312-win_amd64.whl 5.8 MB 27-Jul-2025
+numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 27-Jul-2025
+numpy-2.3.2-cp313-cp313-win_amd64.whl 5.8 MB 27-Jul-2025
+numpy-2.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 8.0 MB 14-Sep-2025
+numpy-2.3.3-cp311-cp311-win_amd64.whl 6.1 MB 14-Sep-2025
+numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 14-Sep-2025
+numpy-2.3.3-cp312-cp312-win_amd64.whl 5.8 MB 14-Sep-2025
+numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 14-Sep-2025
+numpy-2.3.3-cp313-cp313-win_amd64.whl 5.8 MB 14-Sep-2025
+numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 8.0 MB 16-Oct-2025
+numpy-2.3.4-cp311-cp311-win_amd64.whl 6.1 MB 16-Oct-2025
+numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 16-Oct-2025
+numpy-2.3.4-cp312-cp312-win_amd64.whl 5.8 MB 16-Oct-2025
+numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 16-Oct-2025
+numpy-2.3.4-cp313-cp313-win_amd64.whl 5.8 MB 16-Oct-2025
+numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 7.8 MB 17-Oct-2025
+numpy-2.3.4-cp314-cp314-win_amd64.whl 5.9 MB 17-Oct-2025
+
+
+
diff --git a/pypi/simple/scipy/index.html b/pypi/simple/scipy/index.html
new file mode 100644
index 0000000..5878ae8
--- /dev/null
+++ b/pypi/simple/scipy/index.html
@@ -0,0 +1,47 @@
+
+
+
+ Links for scipy
+
+
+ Links for scipy
+
+scipy-1.15.2-cp310-cp310-manylinux_2_35_x86_64.whl 27.5 MB 31-Mar-2025
+scipy-1.15.2-cp310-cp310-win_amd64.whl 45.6 MB 30-Apr-2025
+scipy-1.15.2-cp311-cp311-manylinux_2_35_x86_64.whl 27.5 MB 31-Mar-2025
+scipy-1.15.2-cp311-cp311-win_amd64.whl 45.6 MB 30-Apr-2025
+scipy-1.15.2-cp312-cp312-manylinux_2_28_x86_64.whl 27.9 MB 30-Apr-2025
+scipy-1.15.2-cp312-cp312-manylinux_2_35_x86_64.whl 27.2 MB 31-Mar-2025
+scipy-1.15.2-cp312-cp312-win_amd64.whl 45.3 MB 30-Apr-2025
+scipy-1.15.2-cp313-cp313-manylinux_2_28_x86_64.whl 27.9 MB 30-Apr-2025
+scipy-1.15.2-cp313-cp313-manylinux_2_35_x86_64.whl 27.1 MB 31-Mar-2025
+scipy-1.15.2-cp313-cp313-win_amd64.whl 45.3 MB 30-Apr-2025
+scipy-1.15.3-cp310-cp310-manylinux_2_35_x86_64.whl 27.5 MB 11-May-2025
+scipy-1.15.3-cp310-cp310-win_amd64.whl 45.6 MB 11-May-2025
+scipy-1.15.3-cp311-cp311-manylinux_2_35_x86_64.whl 27.5 MB 11-May-2025
+scipy-1.15.3-cp311-cp311-win_amd64.whl 45.6 MB 11-May-2025
+scipy-1.15.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 28.0 MB 10-Jun-2025
+scipy-1.15.3-cp312-cp312-win_amd64.whl 45.3 MB 11-May-2025
+scipy-1.15.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 27.9 MB 10-Jun-2025
+scipy-1.15.3-cp313-cp313-win_amd64.whl 45.3 MB 11-May-2025
+scipy-1.16.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.5 MB 22-Jun-2025
+scipy-1.16.0-cp311-cp311-win_amd64.whl 42.6 MB 22-Jun-2025
+scipy-1.16.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.3 MB 22-Jun-2025
+scipy-1.16.0-cp312-cp312-win_amd64.whl 42.4 MB 22-Jun-2025
+scipy-1.16.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.3 MB 22-Jun-2025
+scipy-1.16.0-cp313-cp313-win_amd64.whl 42.4 MB 22-Jun-2025
+scipy-1.16.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.6 MB 27-Jul-2025
+scipy-1.16.1-cp311-cp311-win_amd64.whl 42.7 MB 27-Jul-2025
+scipy-1.16.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.4 MB 27-Jul-2025
+scipy-1.16.1-cp312-cp312-win_amd64.whl 42.5 MB 27-Jul-2025
+scipy-1.16.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.4 MB 27-Jul-2025
+scipy-1.16.1-cp313-cp313-win_amd64.whl 42.5 MB 27-Jul-2025
+scipy-1.16.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.6 MB 14-Sep-2025
+scipy-1.16.2-cp311-cp311-win_amd64.whl 42.7 MB 14-Sep-2025
+scipy-1.16.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.4 MB 14-Sep-2025
+scipy-1.16.2-cp312-cp312-win_amd64.whl 42.6 MB 14-Sep-2025
+scipy-1.16.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl 25.4 MB 14-Sep-2025
+scipy-1.16.2-cp313-cp313-win_amd64.whl 42.5 MB 14-Sep-2025
+
+
+
diff --git a/pypi/simple/tbb/index.html b/pypi/simple/tbb/index.html
new file mode 100644
index 0000000..5d52e62
--- /dev/null
+++ b/pypi/simple/tbb/index.html
@@ -0,0 +1,101 @@
+
+
+
+
+ Links for tbb
+
+
+ Links for tbb
+tbb-2018.0.4-cp27-cp27m-win_amd64.whl
+tbb-2018.0.4-cp36-cp36m-win_amd64.whl
+tbb-2018.0.4-py2.py3-none-manylinux1_x86_64.whl
+tbb-2018.0.4.1-py2.py3-none-macosx_10_12_intel.macosx_10_12_x86_64.whl
+tbb-2019.0-py2-none-win_amd64.whl
+tbb-2019.0-py2.py3-none-macosx_10_12_intel.macosx_10_12_x86_64.whl
+tbb-2019.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2019.0-py3-none-win_amd64.whl
+tbb-2020.0.133-py2.py3-none-manylinux1_x86_64.whl
+tbb-2020.3.254-py2.py3-none-manylinux1_x86_64.whl
+tbb-2020.3.254-py3-none-win_amd64.whl
+tbb-2021.1.1-py2.py3-none-macosx_10_15_x86_64.whl
+tbb-2021.1.1-py2.py3-none-manylinux1_i686.whl
+tbb-2021.1.1-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.1.1-py3-none-win32.whl
+tbb-2021.1.1-py3-none-win_amd64.whl
+tbb-2021.2.0-py2.py3-none-macosx_10_15_x86_64.whl
+tbb-2021.2.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.2.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.2.0-py3-none-win32.whl
+tbb-2021.2.0-py3-none-win_amd64.whl
+tbb-2021.3.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.3.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.3.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.3.0-py3-none-win32.whl
+tbb-2021.3.0-py3-none-win_amd64.whl
+tbb-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.4.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.4.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.4.0-py3-none-win32.whl
+tbb-2021.4.0-py3-none-win_amd64.whl
+tbb-2021.5.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.5.0-py3-none-win32.whl
+tbb-2021.5.0-py3-none-win_amd64.whl
+tbb-2021.5.1-py2.py3-none-manylinux1_i686.whl
+tbb-2021.5.1-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.5.1-py3-none-win32.whl
+tbb-2021.5.1-py3-none-win_amd64.whl
+tbb-2021.5.2-py3-none-win32.whl
+tbb-2021.5.2-py3-none-win_amd64.whl
+tbb-2021.6.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.6.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.6.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.6.0-py3-none-win32.whl
+tbb-2021.6.0-py3-none-win_amd64.whl
+tbb-2021.7.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.7.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.7.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.7.0-py3-none-win32.whl
+tbb-2021.7.0-py3-none-win_amd64.whl
+tbb-2021.7.1-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.7.1-py2.py3-none-manylinux1_i686.whl
+tbb-2021.7.1-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.7.1-py3-none-win32.whl
+tbb-2021.7.1-py3-none-win_amd64.whl
+tbb-2021.8.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.8.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.8.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.9.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.9.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.9.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.9.0-py3-none-win32.whl
+tbb-2021.9.0-py3-none-win_amd64.whl
+tbb-2021.10.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl
+tbb-2021.10.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.10.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.10.0-py3-none-win32.whl
+tbb-2021.10.0-py3-none-win_amd64.whl
+tbb-2021.11.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.11.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.11.0-py3-none-win32.whl
+tbb-2021.11.0-py3-none-win_amd64.whl
+tbb-2021.12.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.12.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.12.0-py3-none-win32.whl
+tbb-2021.12.0-py3-none-win_amd64.whl
+tbb-2021.13.0-py2.py3-none-manylinux1_i686.whl
+tbb-2021.13.0-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.13.0-py3-none-win32.whl
+tbb-2021.13.0-py3-none-win_amd64.whl
+tbb-2021.13.1-py2.py3-none-manylinux1_i686.whl
+tbb-2021.13.1-py2.py3-none-manylinux1_x86_64.whl
+tbb-2021.13.1-py3-none-win32.whl
+tbb-2021.13.1-py3-none-win_amd64.whl
+tbb-2022.0.0-py2.py3-none-manylinux_2_28_x86_64.whl
+tbb-2022.0.0-py3-none-win_amd64.whl
+tbb-2022.1.0-py2.py3-none-manylinux_2_28_x86_64.whl
+tbb-2022.1.0-py3-none-win_amd64.whl
+tbb-2022.2.0-py2.py3-none-manylinux_2_28_x86_64.whl
+tbb-2022.2.0-py3-none-win_amd64.whl
+
+
+
\ No newline at end of file
diff --git a/pypi/simple/tcmlib/index.html b/pypi/simple/tcmlib/index.html
new file mode 100644
index 0000000..d59633f
--- /dev/null
+++ b/pypi/simple/tcmlib/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+ Links for tcmlib
+
+
+ Links for tcmlib
+tcmlib-1.2.0-py2.py3-none-manylinux_2_28_x86_64.whl
+tcmlib-1.2.0-py2.py3-none-win_amd64.whl
+tcmlib-1.3.0-py2.py3-none-manylinux_2_28_x86_64.whl
+tcmlib-1.3.0-py2.py3-none-win_amd64.whl
+tcmlib-1.4.0-py2.py3-none-manylinux_2_28_x86_64.whl
+tcmlib-1.4.0-py2.py3-none-win_amd64.whl
+
+
+
\ No newline at end of file
diff --git a/pypi/simple/umf/index.html b/pypi/simple/umf/index.html
new file mode 100644
index 0000000..5f77f2c
--- /dev/null
+++ b/pypi/simple/umf/index.html
@@ -0,0 +1,19 @@
+
+
+
+
+ Links for umf
+
+
+ Links for umf
+umf-0.9.0-py2.py3-none-manylinux_2_28_x86_64.whl
+umf-0.9.0-py2.py3-none-win_amd64.whl
+umf-0.9.1-py2.py3-none-manylinux_2_28_x86_64.whl
+umf-0.9.1-py2.py3-none-win_amd64.whl
+umf-0.10.0-py2.py3-none-manylinux_2_28_x86_64.whl
+umf-0.10.0-py2.py3-none-win_amd64.whl
+umf-0.11.0-py2.py3-none-manylinux_2_28_x86_64.whl
+umf-0.11.0-py2.py3-none-win_amd64.whl
+
+
+
\ No newline at end of file
diff --git a/templates/release.md b/templates/release.md
new file mode 100644
index 0000000..9d5ecc4
--- /dev/null
+++ b/templates/release.md
@@ -0,0 +1,12 @@
+Released on {date}.
+
+### Latest builds
+
+{latest}
+
+### Usage
+
+Attached below are *newly* built wheels only. Wheels for all packages and all versions can be
+[downloaded here](https://urob.github.io/numpy-mkl/). The [setup
+guide](https://github.com/urob/numpy-mkl#installation) explains how to automatically install the
+most compatible version using `pip` or `uv`.
diff --git a/tools/make_index2 b/tools/make_index2
new file mode 100755
index 0000000..7cfe026
--- /dev/null
+++ b/tools/make_index2
@@ -0,0 +1,131 @@
+#!/usr/bin/env python
+
+import argparse
+import re
+from datetime import datetime
+from pathlib import Path
+
+import requests
+
+REQUESTS_TIMEOUT = 45
+
+TEMPLATE = """
+
+
+ Links for %NAME%
+
+
+ Links for %NAME%
+
+%LINKS%
+
+
+
+"""
+
+PACKAGE_URL = (
+ '{name}'
+ '{pad} {size} {timestamp}'
+)
+
+
+class Wheel:
+ def __init__(self, asset):
+ self.asset = asset
+ self.name = asset['name']
+ self.url = asset['browser_download_url']
+ self.size = self.size()
+ self.sha256 = self.sha256sum()
+ self.timestamp = self.timestamp()
+
+ def __str__(self):
+ return PACKAGE_URL.format(
+ url=self.url,
+ name=self.name,
+ sha256=self.sha256,
+ size=self.size,
+ timestamp=self.timestamp,
+ pad=' ' * (width - len(self.name)),
+ )
+
+ def sha256sum(self):
+ digest = self.asset['digest'].split(':')
+ if digest[0] != 'sha256':
+ raise ValueError(f'Expected sha256 digest, got {digest[0]}')
+ return digest[1]
+
+ def size(self):
+ mb = self.asset['size'] / 1024**2
+ return f'{mb:4,.1f} MB'
+
+ def timestamp(self):
+ if self.name in old_wheels and self.sha256 == old_wheels[self.name]['sha256']:
+ print(f'No change in {self.name}, applying old timestamp')
+ return old_wheels[self.name]['timestamp']
+
+ created = datetime.fromisoformat(self.asset['created_at'])
+ return created.strftime('%d-%b-%Y')
+
+
+class ParseIndex:
+ def __init__(self, path):
+ self.wheels = dict(self.parse(path))
+
+ def parse(self, path):
+ # Remove duplicate {name} groups from PACKAGE_URL and convert to regex string.
+ pattern = re.sub(r'{name}', r'.*?', PACKAGE_URL, count=1)
+ regex = re.sub(r'{(.+?)}', r'(?P<\1>.*)', pattern)
+
+ lines = path.read_text().splitlines() if path.exists() else []
+ for line in lines:
+ if m := re.match(regex, line):
+ yield m['name'], m.groupdict()
+
+
+class Wheels:
+ def __init__(self, package):
+ self.package = package.replace('-', '_')
+ self.url = 'https://api.github.com/repos/urob/numpy-mkl/releases'
+
+ def fetch_releases(self):
+ response = requests.get(self.url, timeout=REQUESTS_TIMEOUT)
+ if (rc := response.status_code) != 200: # noqa: PLR2004
+ raise FetchReleaseDataError(f'Download failed with status code {rc}')
+ return response.json()
+
+ def get_wheels(self):
+ wheels = []
+ for release in self.fetch_releases():
+ assets = release['assets']
+ filtered = [
+ a
+ for a in assets
+ if a['name'].startswith(self.package) and a['name'].endswith('.whl')
+ ]
+ wheels += [Wheel(a) for a in filtered]
+ return sorted(wheels, key=lambda w: w.name)
+
+
+class FetchReleaseDataError(Exception):
+ pass
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='Create a custom Python package index')
+
+ parser.add_argument('indexfile', type=str, help='path to index')
+ parser.add_argument('-p', '--package', type=str, help='name of the package')
+
+ args = parser.parse_args()
+ indexfile = Path(args.indexfile).resolve()
+ package = args.package if args.package else indexfile.parent.name
+
+ old_wheels = ParseIndex(indexfile).wheels # Global: used in Wheel.timestamp.
+
+ wheels = Wheels(package).get_wheels()
+ names = [w.name for w in wheels]
+ width = len(max(names, key=len)) # Global: used in Wheel.__str__.
+
+ index = TEMPLATE.replace('%LINKS%', '\n'.join(str(w) for w in wheels))
+ index = index.replace('%NAME%', package)
+ indexfile.write_text(index)
diff --git a/tools/release_notes b/tools/release_notes
new file mode 100755
index 0000000..015723d
--- /dev/null
+++ b/tools/release_notes
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+
+import argparse
+import json
+import time
+from pathlib import Path
+
+from packaging.version import Version
+
+PACKAGES = ('numpy', 'scipy', 'mkl_service')
+
+ICONS = {
+ 'numpy': '[](https://urob.github.io/numpy-mkl/numpy/)',
+ 'scipy': '[](https://urob.github.io/numpy-mkl/scipy/)',
+ 'mkl_service': '[](https://urob.github.io/numpy-mkl/mkl-service/)',
+}
+
+
+def fetch_builds(path):
+ if isinstance(path, str):
+ path = Path(path)
+ store = json.loads(path.read_text()) if path.exists() else {}
+ return list(store.keys())
+
+
+def fetch_latest_build(package, builds):
+ versions = [_.split('-')[1] for _ in builds if _.startswith(package)]
+ return max(Version(_) for _ in versions)
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='Update version icons')
+ parser.add_argument('-s', '--store', required=True, type=str, help='store file')
+ parser.add_argument(
+ '-t', '--template', required=True, type=str, help='template file'
+ )
+
+ args = parser.parse_args()
+ builds = fetch_builds(Path(args.store))
+ template = Path(args.template).read_text()
+
+ latest = ''
+ for p in PACKAGES:
+ latest_ = fetch_latest_build(p, builds)
+ latest += f'- {p}: `{latest_}`\n'
+
+ notes = template.format(date=time.strftime('%Y-%m-%d'), latest=latest)
+ print(notes)