diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml new file mode 100644 index 0000000..7f96440 --- /dev/null +++ b/.github/workflows/pypi-release.yml @@ -0,0 +1,149 @@ +name: PyPI Release + +on: + release: + types: [published] + workflow_dispatch: # Allow manual triggering + +permissions: + contents: read + actions: read + id-token: write + +jobs: + build-wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Set up Docker Buildx (Linux only) + if: runner.os == 'Linux' + uses: docker/setup-buildx-action@v3 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install cibuildwheel + + - name: Sync Python version + run: python scripts/sync_python_version.py + + + - name: Verify Docker (Linux only) + if: runner.os == 'Linux' + run: | + docker --version + docker info + echo "Docker is ready for cibuildwheel" + + - name: Build wheels + run: python -m cibuildwheel libCacheSim-python --output-dir wheelhouse + + - name: Upload wheels as artifacts + uses: actions/upload-artifact@v4 + with: + name: wheels-${{ matrix.os }} + path: wheelhouse/*.whl + + build-sdist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install build dependencies + run: | + python -m pip install --upgrade pip + python -m pip install build + + - name: Sync Python version + run: python scripts/sync_version.py + + - name: Build source distribution + run: python -m build --sdist . --outdir dist/ + + - name: Upload sdist as artifact + uses: actions/upload-artifact@v4 + with: + name: sdist + path: dist/*.tar.gz + + publish-to-pypi: + name: Publish to PyPI + needs: [build-wheels, build-sdist] + runs-on: ubuntu-latest + if: github.event_name == 'release' && github.event.action == 'published' + environment: + name: pypi + url: https://pypi.org/p/libcachesim + permissions: + id-token: write # IMPORTANT: this permission is mandatory for trusted publishing + + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: dist/ + + - name: Flatten artifacts directory + run: | + mkdir -p final-dist + find dist/ -name "*.whl" -exec cp {} final-dist/ \; + find dist/ -name "*.tar.gz" -exec cp {} final-dist/ \; + ls -la final-dist/ + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: final-dist/ + skip-existing: true + + publish-to-test-pypi: + name: Publish to TestPyPI + needs: [build-wheels, build-sdist] + runs-on: ubuntu-latest + if: github.event_name == 'workflow_dispatch' + environment: + name: testpypi + url: https://test.pypi.org/p/libcachesim + permissions: + id-token: write # IMPORTANT: this permission is mandatory for trusted publishing + + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: dist/ + + - name: Flatten artifacts directory + run: | + mkdir -p final-dist + find dist/ -name "*.whl" -exec cp {} final-dist/ \; + find dist/ -name "*.tar.gz" -exec cp {} final-dist/ \; + ls -la final-dist/ + + - name: Publish to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + packages-dir: final-dist/ + skip-existing: true \ No newline at end of file diff --git a/examples/plugin_cache/s3fifo.py b/examples/plugin_cache/s3fifo.py index 829710d..1207e23 100644 --- a/examples/plugin_cache/s3fifo.py +++ b/examples/plugin_cache/s3fifo.py @@ -171,12 +171,7 @@ def cache_remove_hook(cache, obj_id): cache.cache_remove(obj_id) def cache_free_hook(cache): - cache.small_fifo.clear() - cache.small_freq.clear() - cache.ghost_fifo.clear() - cache.ghost_freq.clear() - cache.main_fifo.clear() - cache.main_freq.clear() + pass cache = PluginCache( cache_size=1024, diff --git a/pyproject.toml b/pyproject.toml index e2fd470..ff8f222 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "scikit_build_core.build" [project] name = "libcachesim" -version = "0.3.2" +version = "0.3.3" description="Python bindings for libCacheSim" readme = "README.md" requires-python = ">=3.9" diff --git a/scripts/sync_version.py b/scripts/sync_version.py index 3cf035c..61dcb98 100644 --- a/scripts/sync_version.py +++ b/scripts/sync_version.py @@ -60,6 +60,10 @@ def update_pyproject_toml(version): if current_version == version: print(f"Python binding version already up to date: {version}") return False + # If the pyproject version is newer than version.txt, it is allowed. + if current_version > version: + print(f"Warning: pyproject version {current_version} is newer than version.txt {version}, skipping update") + return False # replace the version line with the new version pyproject_data = re.sub(r"version = \"(dev|[0-9]+\.[0-9]+\.[0-9]+)\"", f'version = "{version}"', pyproject_data)