mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-05 06:00:58 +03:00
Merge branch 'main' into context_manager
This commit is contained in:
commit
0b6418d92b
|
@ -1,99 +0,0 @@
|
||||||
skip_commits:
|
|
||||||
files:
|
|
||||||
- ".github/**/*"
|
|
||||||
- ".gitmodules"
|
|
||||||
- "docs/**/*"
|
|
||||||
- "wheels/**/*"
|
|
||||||
|
|
||||||
version: '{build}'
|
|
||||||
clone_folder: c:\pillow
|
|
||||||
init:
|
|
||||||
- ECHO %PYTHON%
|
|
||||||
#- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
||||||
# Uncomment previous line to get RDP access during the build.
|
|
||||||
|
|
||||||
environment:
|
|
||||||
COVERAGE_CORE: sysmon
|
|
||||||
EXECUTABLE: python.exe
|
|
||||||
TEST_OPTIONS:
|
|
||||||
DEPLOY: YES
|
|
||||||
matrix:
|
|
||||||
- PYTHON: C:/Python313
|
|
||||||
ARCHITECTURE: x86
|
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
|
|
||||||
- PYTHON: C:/Python39-x64
|
|
||||||
ARCHITECTURE: AMD64
|
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
|
||||||
|
|
||||||
|
|
||||||
install:
|
|
||||||
- '%PYTHON%\%EXECUTABLE% --version'
|
|
||||||
- '%PYTHON%\%EXECUTABLE% -m pip install --upgrade pip'
|
|
||||||
- curl -fsSL -o pillow-test-images.zip https://github.com/python-pillow/test-images/archive/main.zip
|
|
||||||
- 7z x pillow-test-images.zip -oc:\
|
|
||||||
- xcopy /S /Y c:\test-images-main\* c:\pillow\tests\images
|
|
||||||
- curl -fsSL -o nasm-win64.zip https://raw.githubusercontent.com/python-pillow/pillow-depends/main/nasm-2.16.03-win64.zip
|
|
||||||
- 7z x nasm-win64.zip -oc:\
|
|
||||||
- choco install ghostscript --version=10.4.0
|
|
||||||
- path c:\nasm-2.16.03;C:\Program Files\gs\gs10.04.0\bin;%PATH%
|
|
||||||
- cd c:\pillow\winbuild\
|
|
||||||
- ps: |
|
|
||||||
c:\python39\python.exe c:\pillow\winbuild\build_prepare.py -v --depends=C:\pillow-depends\
|
|
||||||
c:\pillow\winbuild\build\build_dep_all.cmd
|
|
||||||
$host.SetShouldExit(0)
|
|
||||||
- path C:\pillow\winbuild\build\bin;%PATH%
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
- cd c:\pillow
|
|
||||||
- winbuild\build\build_env.cmd
|
|
||||||
- '%PYTHON%\%EXECUTABLE% -m pip install -v -C raqm=vendor -C fribidi=vendor .'
|
|
||||||
- '%PYTHON%\%EXECUTABLE% selftest.py --installed'
|
|
||||||
|
|
||||||
test_script:
|
|
||||||
- cd c:\pillow
|
|
||||||
- '%PYTHON%\%EXECUTABLE% -m pip install pytest pytest-cov pytest-timeout defusedxml ipython numpy olefile pyroma'
|
|
||||||
- c:\"Program Files (x86)"\"Windows Kits"\10\Debuggers\x86\gflags.exe /p /enable %PYTHON%\%EXECUTABLE%
|
|
||||||
- path %PYTHON%;%PATH%
|
|
||||||
- .ci\test.cmd
|
|
||||||
|
|
||||||
after_test:
|
|
||||||
- curl -Os https://uploader.codecov.io/latest/windows/codecov.exe
|
|
||||||
- .\codecov.exe --file coverage.xml --name %PYTHON% --flags AppVeyor
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
|
|
||||||
cache:
|
|
||||||
- '%LOCALAPPDATA%\pip\Cache'
|
|
||||||
|
|
||||||
artifacts:
|
|
||||||
- path: pillow\*.egg
|
|
||||||
name: egg
|
|
||||||
- path: pillow\*.whl
|
|
||||||
name: wheel
|
|
||||||
|
|
||||||
before_deploy:
|
|
||||||
- cd c:\pillow
|
|
||||||
- '%PYTHON%\%EXECUTABLE% -m pip wheel -v -C raqm=vendor -C fribidi=vendor .'
|
|
||||||
- ps: Get-ChildItem .\*.whl | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: S3
|
|
||||||
region: us-west-2
|
|
||||||
access_key_id: AKIAIRAXC62ZNTVQJMOQ
|
|
||||||
secret_access_key:
|
|
||||||
secure: Hwb6klTqtBeMgxAjRoDltiiqpuH8xbwD4UooDzBSiCWXjuFj1lyl4kHgHwTCCGqi
|
|
||||||
bucket: pillow-nightly
|
|
||||||
folder: win/$(APPVEYOR_BUILD_NUMBER)/
|
|
||||||
artifact: /.*egg|wheel/
|
|
||||||
on:
|
|
||||||
APPVEYOR_REPO_NAME: python-pillow/Pillow
|
|
||||||
branch: main
|
|
||||||
deploy: YES
|
|
||||||
|
|
||||||
|
|
||||||
# Uncomment the following lines to get RDP access after the build/test and block for
|
|
||||||
# up to the timeout limit (~1hr)
|
|
||||||
#
|
|
||||||
#on_finish:
|
|
||||||
#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
|
@ -3,8 +3,5 @@
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
python3 -m coverage erase
|
python3 -m coverage erase
|
||||||
if [ $(uname) == "Darwin" ]; then
|
|
||||||
export CPPFLAGS="-I/usr/local/miniconda/include";
|
|
||||||
fi
|
|
||||||
make clean
|
make clean
|
||||||
make install-coverage
|
make install-coverage
|
||||||
|
|
4
.github/CONTRIBUTING.md
vendored
4
.github/CONTRIBUTING.md
vendored
|
@ -9,7 +9,7 @@ Please send a pull request to the `main` branch. Please include [documentation](
|
||||||
- Fork the Pillow repository.
|
- Fork the Pillow repository.
|
||||||
- Create a branch from `main`.
|
- Create a branch from `main`.
|
||||||
- Develop bug fixes, features, tests, etc.
|
- Develop bug fixes, features, tests, etc.
|
||||||
- Run the test suite. You can enable GitHub Actions (https://github.com/MY-USERNAME/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests.
|
- Run the test suite. You can enable GitHub Actions (https://github.com/MY-USERNAME/Pillow/actions) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests.
|
||||||
- Create a pull request to pull the changes from your branch to the Pillow `main`.
|
- Create a pull request to pull the changes from your branch to the Pillow `main`.
|
||||||
|
|
||||||
### Guidelines
|
### Guidelines
|
||||||
|
@ -17,7 +17,7 @@ Please send a pull request to the `main` branch. Please include [documentation](
|
||||||
- Separate code commits from reformatting commits.
|
- Separate code commits from reformatting commits.
|
||||||
- Provide tests for any newly added code.
|
- Provide tests for any newly added code.
|
||||||
- Follow PEP 8.
|
- Follow PEP 8.
|
||||||
- When committing only documentation changes please include `[ci skip]` in the commit message to avoid running tests on AppVeyor.
|
- When committing only documentation changes please include `[ci skip]` in the commit message to avoid running extra tests.
|
||||||
- Include [release notes](https://github.com/python-pillow/Pillow/tree/main/docs/releasenotes) as needed or appropriate with your bug fixes, feature additions and tests.
|
- Include [release notes](https://github.com/python-pillow/Pillow/tree/main/docs/releasenotes) as needed or appropriate with your bug fixes, feature additions and tests.
|
||||||
|
|
||||||
## Reporting Issues
|
## Reporting Issues
|
||||||
|
|
1
.github/mergify.yml
vendored
1
.github/mergify.yml
vendored
|
@ -9,7 +9,6 @@ pull_request_rules:
|
||||||
- status-success=Windows Test Successful
|
- status-success=Windows Test Successful
|
||||||
- status-success=MinGW
|
- status-success=MinGW
|
||||||
- status-success=Cygwin Test Successful
|
- status-success=Cygwin Test Successful
|
||||||
- status-success=continuous-integration/appveyor/pr
|
|
||||||
actions:
|
actions:
|
||||||
merge:
|
merge:
|
||||||
method: merge
|
method: merge
|
||||||
|
|
14
.github/workflows/test-windows.yml
vendored
14
.github/workflows/test-windows.yml
vendored
|
@ -31,15 +31,20 @@ env:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: windows-latest
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ["pypy3.10", "3.9", "3.10", "3.11", "3.12", "3.13"]
|
python-version: ["pypy3.10", "3.10", "3.11", "3.12", "3.13", "3.14"]
|
||||||
|
architecture: ["x64"]
|
||||||
|
os: ["windows-latest"]
|
||||||
|
include:
|
||||||
|
# Test the oldest Python on 32-bit
|
||||||
|
- { python-version: "3.9", architecture: "x86", os: "windows-2019" }
|
||||||
|
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
|
|
||||||
name: Python ${{ matrix.python-version }}
|
name: Python ${{ matrix.python-version }} (${{ matrix.architecture }})
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Pillow
|
- name: Checkout Pillow
|
||||||
|
@ -67,6 +72,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
allow-prereleases: true
|
allow-prereleases: true
|
||||||
|
architecture: ${{ matrix.architecture }}
|
||||||
cache: pip
|
cache: pip
|
||||||
cache-dependency-path: ".github/workflows/test-windows.yml"
|
cache-dependency-path: ".github/workflows/test-windows.yml"
|
||||||
|
|
||||||
|
@ -78,7 +84,7 @@ jobs:
|
||||||
python3 -m pip install --upgrade pip
|
python3 -m pip install --upgrade pip
|
||||||
|
|
||||||
- name: Install CPython dependencies
|
- name: Install CPython dependencies
|
||||||
if: "!contains(matrix.python-version, 'pypy')"
|
if: "!contains(matrix.python-version, 'pypy') && matrix.architecture != 'x86'"
|
||||||
run: |
|
run: |
|
||||||
python3 -m pip install PyQt6
|
python3 -m pip install PyQt6
|
||||||
|
|
||||||
|
|
1
.github/workflows/test.yml
vendored
1
.github/workflows/test.yml
vendored
|
@ -42,6 +42,7 @@ jobs:
|
||||||
]
|
]
|
||||||
python-version: [
|
python-version: [
|
||||||
"pypy3.10",
|
"pypy3.10",
|
||||||
|
"3.14",
|
||||||
"3.13t",
|
"3.13t",
|
||||||
"3.13",
|
"3.13",
|
||||||
"3.12",
|
"3.12",
|
||||||
|
|
3
.github/workflows/wheels-test.ps1
vendored
3
.github/workflows/wheels-test.ps1
vendored
|
@ -11,6 +11,9 @@ if ("$venv" -like "*\cibw-run-*\pp*-win_amd64\*") {
|
||||||
$env:path += ";$pillow\winbuild\build\bin\"
|
$env:path += ";$pillow\winbuild\build\bin\"
|
||||||
& "$venv\Scripts\activate.ps1"
|
& "$venv\Scripts\activate.ps1"
|
||||||
& reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\python.exe" /v "GlobalFlag" /t REG_SZ /d "0x02000000" /f
|
& reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\python.exe" /v "GlobalFlag" /t REG_SZ /d "0x02000000" /f
|
||||||
|
if ("$venv" -like "*\cibw-run-*-win_amd64\*") {
|
||||||
|
& python -m pip install numpy
|
||||||
|
}
|
||||||
cd $pillow
|
cd $pillow
|
||||||
& python -VV
|
& python -VV
|
||||||
if (!$?) { exit $LASTEXITCODE }
|
if (!$?) { exit $LASTEXITCODE }
|
||||||
|
|
75
.github/workflows/wheels.yml
vendored
75
.github/workflows/wheels.yml
vendored
|
@ -42,62 +42,7 @@ env:
|
||||||
FORCE_COLOR: 1
|
FORCE_COLOR: 1
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-1-QEMU-emulated-wheels:
|
build-native-wheels:
|
||||||
if: github.event_name != 'schedule'
|
|
||||||
name: aarch64 ${{ matrix.python-version }} ${{ matrix.spec }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
python-version:
|
|
||||||
- pp310
|
|
||||||
- cp3{9,10,11}
|
|
||||||
- cp3{12,13}
|
|
||||||
spec:
|
|
||||||
- manylinux2014
|
|
||||||
- manylinux_2_28
|
|
||||||
- musllinux
|
|
||||||
exclude:
|
|
||||||
- { python-version: pp310, spec: musllinux }
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
- uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.x"
|
|
||||||
|
|
||||||
# https://github.com/docker/setup-qemu-action
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
|
|
||||||
- name: Install cibuildwheel
|
|
||||||
run: |
|
|
||||||
python3 -m pip install -r .ci/requirements-cibw.txt
|
|
||||||
|
|
||||||
- name: Build wheels
|
|
||||||
run: |
|
|
||||||
python3 -m cibuildwheel --output-dir wheelhouse
|
|
||||||
env:
|
|
||||||
# Build only the currently selected Linux architecture (so we can
|
|
||||||
# parallelise for speed).
|
|
||||||
CIBW_ARCHS: "aarch64"
|
|
||||||
# Likewise, select only one Python version per job to speed this up.
|
|
||||||
CIBW_BUILD: "${{ matrix.python-version }}-${{ matrix.spec == 'musllinux' && 'musllinux' || 'manylinux' }}*"
|
|
||||||
CIBW_ENABLE: cpython-prerelease
|
|
||||||
# Extra options for manylinux.
|
|
||||||
CIBW_MANYLINUX_AARCH64_IMAGE: ${{ matrix.spec }}
|
|
||||||
CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ${{ matrix.spec }}
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: dist-qemu-${{ matrix.python-version }}-${{ matrix.spec }}
|
|
||||||
path: ./wheelhouse/*.whl
|
|
||||||
|
|
||||||
build-2-native-wheels:
|
|
||||||
if: github.event_name != 'schedule' || github.repository_owner == 'python-pillow'
|
if: github.event_name != 'schedule' || github.repository_owner == 'python-pillow'
|
||||||
name: ${{ matrix.name }}
|
name: ${{ matrix.name }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
@ -132,6 +77,14 @@ jobs:
|
||||||
cibw_arch: x86_64
|
cibw_arch: x86_64
|
||||||
build: "*manylinux*"
|
build: "*manylinux*"
|
||||||
manylinux: "manylinux_2_28"
|
manylinux: "manylinux_2_28"
|
||||||
|
- name: "manylinux2014 and musllinux aarch64"
|
||||||
|
os: ubuntu-24.04-arm
|
||||||
|
cibw_arch: aarch64
|
||||||
|
- name: "manylinux_2_28 aarch64"
|
||||||
|
os: ubuntu-24.04-arm
|
||||||
|
cibw_arch: aarch64
|
||||||
|
build: "*manylinux*"
|
||||||
|
manylinux: "manylinux_2_28"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
@ -152,7 +105,9 @@ jobs:
|
||||||
env:
|
env:
|
||||||
CIBW_ARCHS: ${{ matrix.cibw_arch }}
|
CIBW_ARCHS: ${{ matrix.cibw_arch }}
|
||||||
CIBW_BUILD: ${{ matrix.build }}
|
CIBW_BUILD: ${{ matrix.build }}
|
||||||
CIBW_ENABLE: cpython-prerelease cpython-freethreading
|
CIBW_ENABLE: cpython-prerelease cpython-freethreading pypy
|
||||||
|
CIBW_MANYLINUX_AARCH64_IMAGE: ${{ matrix.manylinux }}
|
||||||
|
CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ${{ matrix.manylinux }}
|
||||||
CIBW_MANYLINUX_PYPY_X86_64_IMAGE: ${{ matrix.manylinux }}
|
CIBW_MANYLINUX_PYPY_X86_64_IMAGE: ${{ matrix.manylinux }}
|
||||||
CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux }}
|
CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux }}
|
||||||
CIBW_SKIP: pp39-*
|
CIBW_SKIP: pp39-*
|
||||||
|
@ -229,7 +184,7 @@ jobs:
|
||||||
CIBW_ARCHS: ${{ matrix.cibw_arch }}
|
CIBW_ARCHS: ${{ matrix.cibw_arch }}
|
||||||
CIBW_BEFORE_ALL: "{package}\\winbuild\\build\\build_dep_all.cmd"
|
CIBW_BEFORE_ALL: "{package}\\winbuild\\build\\build_dep_all.cmd"
|
||||||
CIBW_CACHE_PATH: "C:\\cibw"
|
CIBW_CACHE_PATH: "C:\\cibw"
|
||||||
CIBW_ENABLE: cpython-prerelease cpython-freethreading
|
CIBW_ENABLE: cpython-prerelease cpython-freethreading pypy
|
||||||
CIBW_SKIP: pp39-*
|
CIBW_SKIP: pp39-*
|
||||||
CIBW_TEST_SKIP: "*-win_arm64"
|
CIBW_TEST_SKIP: "*-win_arm64"
|
||||||
CIBW_TEST_COMMAND: 'docker run --rm
|
CIBW_TEST_COMMAND: 'docker run --rm
|
||||||
|
@ -275,7 +230,7 @@ jobs:
|
||||||
|
|
||||||
scientific-python-nightly-wheels-publish:
|
scientific-python-nightly-wheels-publish:
|
||||||
if: github.repository_owner == 'python-pillow' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
|
if: github.repository_owner == 'python-pillow' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
|
||||||
needs: [build-2-native-wheels, windows]
|
needs: [build-native-wheels, windows]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Upload wheels to scientific-python-nightly-wheels
|
name: Upload wheels to scientific-python-nightly-wheels
|
||||||
steps:
|
steps:
|
||||||
|
@ -292,7 +247,7 @@ jobs:
|
||||||
|
|
||||||
pypi-publish:
|
pypi-publish:
|
||||||
if: github.repository_owner == 'python-pillow' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
|
if: github.repository_owner == 'python-pillow' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
|
||||||
needs: [build-1-QEMU-emulated-wheels, build-2-native-wheels, windows, sdist]
|
needs: [build-native-wheels, windows, sdist]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Upload release to PyPI
|
name: Upload release to PyPI
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
version: 2
|
version: 2
|
||||||
|
|
||||||
|
sphinx:
|
||||||
|
configuration: docs/conf.py
|
||||||
|
|
||||||
formats: [pdf]
|
formats: [pdf]
|
||||||
|
|
||||||
build:
|
build:
|
||||||
|
|
|
@ -20,7 +20,6 @@ graft docs
|
||||||
graft _custom_build
|
graft _custom_build
|
||||||
|
|
||||||
# build/src control detritus
|
# build/src control detritus
|
||||||
exclude .appveyor.yml
|
|
||||||
exclude .clang-format
|
exclude .clang-format
|
||||||
exclude .coveragerc
|
exclude .coveragerc
|
||||||
exclude .editorconfig
|
exclude .editorconfig
|
||||||
|
|
|
@ -42,9 +42,6 @@ As of 2019, Pillow development is
|
||||||
<a href="https://github.com/python-pillow/Pillow/actions/workflows/test-docker.yml"><img
|
<a href="https://github.com/python-pillow/Pillow/actions/workflows/test-docker.yml"><img
|
||||||
alt="GitHub Actions build status (Test Docker)"
|
alt="GitHub Actions build status (Test Docker)"
|
||||||
src="https://github.com/python-pillow/Pillow/workflows/Test%20Docker/badge.svg"></a>
|
src="https://github.com/python-pillow/Pillow/workflows/Test%20Docker/badge.svg"></a>
|
||||||
<a href="https://ci.appveyor.com/project/python-pillow/Pillow"><img
|
|
||||||
alt="AppVeyor CI build status (Windows)"
|
|
||||||
src="https://img.shields.io/appveyor/build/python-pillow/Pillow/main.svg?label=Windows%20build"></a>
|
|
||||||
<a href="https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml"><img
|
<a href="https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml"><img
|
||||||
alt="GitHub Actions build status (Wheels)"
|
alt="GitHub Actions build status (Wheels)"
|
||||||
src="https://github.com/python-pillow/Pillow/workflows/Wheels/badge.svg"></a>
|
src="https://github.com/python-pillow/Pillow/workflows/Wheels/badge.svg"></a>
|
||||||
|
|
|
@ -9,7 +9,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th.
|
||||||
|
|
||||||
* [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154
|
* [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154
|
||||||
* [ ] Develop and prepare release in `main` branch.
|
* [ ] Develop and prepare release in `main` branch.
|
||||||
* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `main` branch.
|
* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) to confirm passing tests in `main` branch.
|
||||||
* [ ] Check that all the wheel builds pass the tests in the [GitHub Actions "Wheels" workflow](https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml) jobs by manually triggering them.
|
* [ ] Check that all the wheel builds pass the tests in the [GitHub Actions "Wheels" workflow](https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml) jobs by manually triggering them.
|
||||||
* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), update version identifier in `src/PIL/_version.py`
|
* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), update version identifier in `src/PIL/_version.py`
|
||||||
* [ ] Run pre-release check via `make release-test` in a freshly cloned repo.
|
* [ ] Run pre-release check via `make release-test` in a freshly cloned repo.
|
||||||
|
@ -38,7 +38,7 @@ Released as needed for security, installation or critical bug fixes.
|
||||||
git checkout -t remotes/origin/5.2.x
|
git checkout -t remotes/origin/5.2.x
|
||||||
```
|
```
|
||||||
* [ ] Cherry pick individual commits from `main` branch to release branch e.g. `5.2.x`, then `git push`.
|
* [ ] Cherry pick individual commits from `main` branch to release branch e.g. `5.2.x`, then `git push`.
|
||||||
* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in release branch e.g. `5.2.x`.
|
* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) to confirm passing tests in release branch e.g. `5.2.x`.
|
||||||
* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), update version identifier in `src/PIL/_version.py`
|
* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), update version identifier in `src/PIL/_version.py`
|
||||||
* [ ] Run pre-release check via `make release-test`.
|
* [ ] Run pre-release check via `make release-test`.
|
||||||
* [ ] Create tag for release e.g.:
|
* [ ] Create tag for release e.g.:
|
||||||
|
|
|
@ -322,16 +322,7 @@ def magick_command() -> list[str] | None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def on_appveyor() -> bool:
|
|
||||||
return "APPVEYOR" in os.environ
|
|
||||||
|
|
||||||
|
|
||||||
def on_github_actions() -> bool:
|
|
||||||
return "GITHUB_ACTIONS" in os.environ
|
|
||||||
|
|
||||||
|
|
||||||
def on_ci() -> bool:
|
def on_ci() -> bool:
|
||||||
# GitHub Actions and AppVeyor have "CI"
|
|
||||||
return "CI" in os.environ
|
return "CI" in os.environ
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ import fuzzers
|
||||||
import packaging
|
import packaging
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from PIL import Image, UnidentifiedImageError, features
|
from PIL import Image, features
|
||||||
from Tests.helper import skip_unless_feature
|
from Tests.helper import skip_unless_feature
|
||||||
|
|
||||||
if sys.platform.startswith("win32"):
|
if sys.platform.startswith("win32"):
|
||||||
|
@ -32,21 +32,17 @@ def test_fuzz_images(path: str) -> None:
|
||||||
fuzzers.fuzz_image(f.read())
|
fuzzers.fuzz_image(f.read())
|
||||||
assert True
|
assert True
|
||||||
except (
|
except (
|
||||||
|
# Known exceptions from Pillow
|
||||||
OSError,
|
OSError,
|
||||||
SyntaxError,
|
SyntaxError,
|
||||||
MemoryError,
|
MemoryError,
|
||||||
ValueError,
|
ValueError,
|
||||||
NotImplementedError,
|
NotImplementedError,
|
||||||
OverflowError,
|
OverflowError,
|
||||||
):
|
# Known Image.* exceptions
|
||||||
# Known exceptions that are through from Pillow
|
|
||||||
assert True
|
|
||||||
except (
|
|
||||||
Image.DecompressionBombError,
|
Image.DecompressionBombError,
|
||||||
Image.DecompressionBombWarning,
|
Image.DecompressionBombWarning,
|
||||||
UnidentifiedImageError,
|
|
||||||
):
|
):
|
||||||
# Known Image.* exceptions
|
|
||||||
assert True
|
assert True
|
||||||
finally:
|
finally:
|
||||||
fuzzers.disable_decompressionbomb_error()
|
fuzzers.disable_decompressionbomb_error()
|
||||||
|
|
|
@ -991,6 +991,11 @@ class TestImage:
|
||||||
else:
|
else:
|
||||||
assert im.getxmp() == {"xmpmeta": None}
|
assert im.getxmp() == {"xmpmeta": None}
|
||||||
|
|
||||||
|
def test_get_child_images(self) -> None:
|
||||||
|
im = Image.new("RGB", (1, 1))
|
||||||
|
with pytest.warns(DeprecationWarning):
|
||||||
|
assert im.get_child_images() == []
|
||||||
|
|
||||||
@pytest.mark.parametrize("size", ((1, 0), (0, 1), (0, 0)))
|
@pytest.mark.parametrize("size", ((1, 0), (0, 1), (0, 0)))
|
||||||
def test_zero_tobytes(self, size: tuple[int, int]) -> None:
|
def test_zero_tobytes(self, size: tuple[int, int]) -> None:
|
||||||
im = Image.new("RGB", size)
|
im = Image.new("RGB", size)
|
||||||
|
|
|
@ -278,6 +278,18 @@ class TestEmbeddable:
|
||||||
|
|
||||||
from setuptools.command import build_ext
|
from setuptools.command import build_ext
|
||||||
|
|
||||||
|
compiler = getattr(build_ext, "new_compiler")()
|
||||||
|
compiler.add_include_dir(sysconfig.get_config_var("INCLUDEPY"))
|
||||||
|
|
||||||
|
libdir = sysconfig.get_config_var("LIBDIR") or sysconfig.get_config_var(
|
||||||
|
"INCLUDEPY"
|
||||||
|
).replace("include", "libs")
|
||||||
|
compiler.add_library_dir(libdir)
|
||||||
|
try:
|
||||||
|
compiler.initialize()
|
||||||
|
except Exception:
|
||||||
|
pytest.skip("Compiler could not be initialized")
|
||||||
|
|
||||||
with open("embed_pil.c", "w", encoding="utf-8") as fh:
|
with open("embed_pil.c", "w", encoding="utf-8") as fh:
|
||||||
home = sys.prefix.replace("\\", "\\\\")
|
home = sys.prefix.replace("\\", "\\\\")
|
||||||
fh.write(
|
fh.write(
|
||||||
|
@ -305,13 +317,6 @@ int main(int argc, char* argv[])
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
compiler = getattr(build_ext, "new_compiler")()
|
|
||||||
compiler.add_include_dir(sysconfig.get_config_var("INCLUDEPY"))
|
|
||||||
|
|
||||||
libdir = sysconfig.get_config_var("LIBDIR") or sysconfig.get_config_var(
|
|
||||||
"INCLUDEPY"
|
|
||||||
).replace("include", "libs")
|
|
||||||
compiler.add_library_dir(libdir)
|
|
||||||
objects = compiler.compile(["embed_pil.c"])
|
objects = compiler.compile(["embed_pil.c"])
|
||||||
compiler.link_executable(objects, "embed_pil")
|
compiler.link_executable(objects, "embed_pil")
|
||||||
|
|
||||||
|
|
|
@ -6,12 +6,11 @@ Goals
|
||||||
|
|
||||||
The fork author's goal is to foster and support active development of PIL through:
|
The fork author's goal is to foster and support active development of PIL through:
|
||||||
|
|
||||||
- Continuous integration testing via `GitHub Actions`_ and `AppVeyor`_
|
- Continuous integration testing via `GitHub Actions`_
|
||||||
- Publicized development activity on `GitHub`_
|
- Publicized development activity on `GitHub`_
|
||||||
- Regular releases to the `Python Package Index`_
|
- Regular releases to the `Python Package Index`_
|
||||||
|
|
||||||
.. _GitHub Actions: https://github.com/python-pillow/Pillow/actions
|
.. _GitHub Actions: https://github.com/python-pillow/Pillow/actions
|
||||||
.. _AppVeyor: https://ci.appveyor.com/project/Python-pillow/pillow
|
|
||||||
.. _GitHub: https://github.com/python-pillow/Pillow
|
.. _GitHub: https://github.com/python-pillow/Pillow
|
||||||
.. _Python Package Index: https://pypi.org/project/pillow/
|
.. _Python Package Index: https://pypi.org/project/pillow/
|
||||||
|
|
||||||
|
|
|
@ -183,6 +183,16 @@ ExifTags.IFD.Makernote
|
||||||
``ExifTags.IFD.Makernote`` has been deprecated. Instead, use
|
``ExifTags.IFD.Makernote`` has been deprecated. Instead, use
|
||||||
``ExifTags.IFD.MakerNote``.
|
``ExifTags.IFD.MakerNote``.
|
||||||
|
|
||||||
|
Image.Image.get_child_images()
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. deprecated:: 11.2.0
|
||||||
|
|
||||||
|
``Image.Image.get_child_images()`` has been deprecated. and will be removed in Pillow
|
||||||
|
13 (2026-10-15). It will be moved to ``ImageFile.ImageFile.get_child_images()``. The
|
||||||
|
method uses an image's file pointer, and so child images could only be retrieved from
|
||||||
|
an :py:class:`PIL.ImageFile.ImageFile` instance.
|
||||||
|
|
||||||
Removed features
|
Removed features
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
|
|
@ -33,10 +33,6 @@ Pillow for enterprise is available via the Tidelift Subscription. `Learn more <h
|
||||||
:target: https://github.com/python-pillow/Pillow/actions/workflows/test-cygwin.yml
|
:target: https://github.com/python-pillow/Pillow/actions/workflows/test-cygwin.yml
|
||||||
:alt: GitHub Actions build status (Test Cygwin)
|
:alt: GitHub Actions build status (Test Cygwin)
|
||||||
|
|
||||||
.. image:: https://img.shields.io/appveyor/build/python-pillow/Pillow/main.svg?label=Windows%20build
|
|
||||||
:target: https://ci.appveyor.com/project/python-pillow/Pillow
|
|
||||||
:alt: AppVeyor CI build status (Windows)
|
|
||||||
|
|
||||||
.. image:: https://github.com/python-pillow/Pillow/workflows/Wheels/badge.svg
|
.. image:: https://github.com/python-pillow/Pillow/workflows/Wheels/badge.svg
|
||||||
:target: https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml
|
:target: https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml
|
||||||
:alt: GitHub Actions build status (Wheels)
|
:alt: GitHub Actions build status (Wheels)
|
||||||
|
|
|
@ -50,12 +50,10 @@ These platforms are built and tested for every change.
|
||||||
| Ubuntu Linux 24.04 LTS (Noble) | 3.12 | x86-64, ppc64le, |
|
| Ubuntu Linux 24.04 LTS (Noble) | 3.12 | x86-64, ppc64le, |
|
||||||
| | | s390x |
|
| | | s390x |
|
||||||
+----------------------------------+----------------------------+---------------------+
|
+----------------------------------+----------------------------+---------------------+
|
||||||
| Windows Server 2019 | 3.9 | x86-64 |
|
| Windows Server 2019 | 3.9 | x86 |
|
||||||
+----------------------------------+----------------------------+---------------------+
|
+----------------------------------+----------------------------+---------------------+
|
||||||
| Windows Server 2022 | 3.9, 3.10, 3.11, | x86-64 |
|
| Windows Server 2022 | 3.10, 3.11, 3.12, 3.13, | x86-64 |
|
||||||
| | 3.12, 3.13, PyPy3 | |
|
| | PyPy3 | |
|
||||||
| +----------------------------+---------------------+
|
|
||||||
| | 3.13 | x86 |
|
|
||||||
| +----------------------------+---------------------+
|
| +----------------------------+---------------------+
|
||||||
| | 3.12 (MinGW) | x86-64 |
|
| | 3.12 (MinGW) | x86-64 |
|
||||||
| +----------------------------+---------------------+
|
| +----------------------------+---------------------+
|
||||||
|
|
58
docs/releasenotes/11.2.0.rst
Normal file
58
docs/releasenotes/11.2.0.rst
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
11.2.0
|
||||||
|
------
|
||||||
|
|
||||||
|
Security
|
||||||
|
========
|
||||||
|
|
||||||
|
TODO
|
||||||
|
^^^^
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
:cve:`YYYY-XXXXX`: TODO
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
Backwards Incompatible Changes
|
||||||
|
==============================
|
||||||
|
|
||||||
|
TODO
|
||||||
|
^^^^
|
||||||
|
|
||||||
|
Deprecations
|
||||||
|
============
|
||||||
|
|
||||||
|
Image.Image.get_child_images()
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. deprecated:: 11.2.0
|
||||||
|
|
||||||
|
``Image.Image.get_child_images()`` has been deprecated. and will be removed in Pillow
|
||||||
|
13 (2026-10-15). It will be moved to ``ImageFile.ImageFile.get_child_images()``. The
|
||||||
|
method uses an image's file pointer, and so child images could only be retrieved from
|
||||||
|
an :py:class:`PIL.ImageFile.ImageFile` instance.
|
||||||
|
|
||||||
|
API Changes
|
||||||
|
===========
|
||||||
|
|
||||||
|
TODO
|
||||||
|
^^^^
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
API Additions
|
||||||
|
=============
|
||||||
|
|
||||||
|
TODO
|
||||||
|
^^^^
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
Other Changes
|
||||||
|
=============
|
||||||
|
|
||||||
|
TODO
|
||||||
|
^^^^
|
||||||
|
|
||||||
|
TODO
|
|
@ -14,6 +14,7 @@ expected to be backported to earlier versions.
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
|
11.2.0
|
||||||
11.1.0
|
11.1.0
|
||||||
11.0.0
|
11.0.0
|
||||||
10.4.0
|
10.4.0
|
||||||
|
|
|
@ -1539,6 +1539,12 @@ class Image:
|
||||||
self._exif._loaded = False
|
self._exif._loaded = False
|
||||||
self.getexif()
|
self.getexif()
|
||||||
|
|
||||||
|
def get_child_images(self) -> list[ImageFile.ImageFile]:
|
||||||
|
from . import ImageFile
|
||||||
|
|
||||||
|
deprecate("Image.Image.get_child_images", 13)
|
||||||
|
return ImageFile.ImageFile.get_child_images(self) # type: ignore[arg-type]
|
||||||
|
|
||||||
def getim(self) -> CapsuleType:
|
def getim(self) -> CapsuleType:
|
||||||
"""
|
"""
|
||||||
Returns a capsule that points to the internal image memory.
|
Returns a capsule that points to the internal image memory.
|
||||||
|
|
|
@ -222,8 +222,8 @@ class ImageFile(Image.Image):
|
||||||
ifds.append((ifd1, exif._info.next))
|
ifds.append((ifd1, exif._info.next))
|
||||||
|
|
||||||
offset = None
|
offset = None
|
||||||
assert self.fp is not None
|
|
||||||
for ifd, ifd_offset in ifds:
|
for ifd, ifd_offset in ifds:
|
||||||
|
assert self.fp is not None
|
||||||
current_offset = self.fp.tell()
|
current_offset = self.fp.tell()
|
||||||
if offset is None:
|
if offset is None:
|
||||||
offset = current_offset
|
offset = current_offset
|
||||||
|
@ -252,6 +252,7 @@ class ImageFile(Image.Image):
|
||||||
child_images.append(im)
|
child_images.append(im)
|
||||||
|
|
||||||
if offset is not None:
|
if offset is not None:
|
||||||
|
assert self.fp is not None
|
||||||
self.fp.seek(offset)
|
self.fp.seek(offset)
|
||||||
return child_images
|
return child_images
|
||||||
|
|
||||||
|
|
|
@ -2236,6 +2236,16 @@ class AppendingTiffWriter(io.BytesIO):
|
||||||
if tag in self.Tags:
|
if tag in self.Tags:
|
||||||
cur_pos = self.f.tell()
|
cur_pos = self.f.tell()
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
"fixIFD: %s (%d) - type: %s (%d) - type size: %d - count: %d",
|
||||||
|
TiffTags.lookup(tag).name,
|
||||||
|
tag,
|
||||||
|
TYPES.get(field_type, "unknown"),
|
||||||
|
field_type,
|
||||||
|
field_size,
|
||||||
|
count,
|
||||||
|
)
|
||||||
|
|
||||||
if is_local:
|
if is_local:
|
||||||
self._fixOffsets(count, field_size)
|
self._fixOffsets(count, field_size)
|
||||||
self.f.seek(cur_pos + fmt_size)
|
self.f.seek(cur_pos + fmt_size)
|
||||||
|
|
|
@ -47,6 +47,8 @@ def deprecate(
|
||||||
raise RuntimeError(msg)
|
raise RuntimeError(msg)
|
||||||
elif when == 12:
|
elif when == 12:
|
||||||
removed = "Pillow 12 (2025-10-15)"
|
removed = "Pillow 12 (2025-10-15)"
|
||||||
|
elif when == 13:
|
||||||
|
removed = "Pillow 13 (2026-10-15)"
|
||||||
else:
|
else:
|
||||||
msg = f"Unknown removal version: {when}. Update {__name__}?"
|
msg = f"Unknown removal version: {when}. Update {__name__}?"
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
|
@ -11,10 +11,11 @@ For more extensive info, see the [Windows build instructions](build.rst).
|
||||||
* Requires Microsoft Visual Studio 2017 or newer with C++ component.
|
* Requires Microsoft Visual Studio 2017 or newer with C++ component.
|
||||||
* Requires NASM for libjpeg-turbo, a required dependency when using this script.
|
* Requires NASM for libjpeg-turbo, a required dependency when using this script.
|
||||||
* Requires CMake 3.15 or newer (available as Visual Studio component).
|
* Requires CMake 3.15 or newer (available as Visual Studio component).
|
||||||
* Tested on Windows Server 2019 with Visual Studio 2019 Community and Visual Studio 2022 Community (AppVeyor).
|
* Tested on Windows Server 2022 with Visual Studio 2022 Enterprise and Windows Server
|
||||||
* Tested on Windows Server 2022 with Visual Studio 2022 Enterprise (GitHub Actions).
|
2019 with Visual Studio 2019 Enterprise (GitHub Actions).
|
||||||
|
|
||||||
|
Here's an example script to build on Windows:
|
||||||
|
|
||||||
The following is a simplified version of the script used on AppVeyor:
|
|
||||||
```
|
```
|
||||||
set PYTHON=C:\Python39\bin
|
set PYTHON=C:\Python39\bin
|
||||||
cd /D C:\Pillow\winbuild
|
cd /D C:\Pillow\winbuild
|
||||||
|
|
|
@ -6,7 +6,7 @@ Building Pillow on Windows
|
||||||
be sufficient.
|
be sufficient.
|
||||||
|
|
||||||
This page describes the steps necessary to build Pillow using the same
|
This page describes the steps necessary to build Pillow using the same
|
||||||
scripts used on GitHub Actions and AppVeyor CIs.
|
scripts used on GitHub Actions CI.
|
||||||
|
|
||||||
Prerequisites
|
Prerequisites
|
||||||
-------------
|
-------------
|
||||||
|
@ -112,7 +112,7 @@ directory.
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
|
|
||||||
The following is a simplified version of the script used on AppVeyor::
|
Here's an example script to build on Windows::
|
||||||
|
|
||||||
set PYTHON=C:\Python39\bin
|
set PYTHON=C:\Python39\bin
|
||||||
cd /D C:\Pillow\winbuild
|
cd /D C:\Pillow\winbuild
|
||||||
|
|
Loading…
Reference in New Issue
Block a user