diff --git a/.github/actions/setup-environment-action/action.yml b/.github/actions/setup-environment-action/action.yml index f4e17cd80d35..2bf889430ca3 100644 --- a/.github/actions/setup-environment-action/action.yml +++ b/.github/actions/setup-environment-action/action.yml @@ -48,7 +48,7 @@ runs: steps: - name: Install Python if: ${{ inputs.python-version != '' }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ inputs.python-version == 'default' && '3.10' || inputs.python-version }} cache: ${{ inputs.python-cache && 'pip' || 'none' }} diff --git a/.github/workflows/beam_PostCommit_Python.yml b/.github/workflows/beam_PostCommit_Python.yml index b13452996126..d73bcabc2711 100644 --- a/.github/workflows/beam_PostCommit_Python.yml +++ b/.github/workflows/beam_PostCommit_Python.yml @@ -61,7 +61,7 @@ jobs: matrix: job_name: ['beam_PostCommit_Python'] job_phrase: ['Run Python PostCommit'] - python_version: ['3.10', '3.11', '3.12', '3.13'] + python_version: ['3.10', '3.11', '3.12', '3.13','3.14'] os: [[self-hosted, ubuntu-20.04, highmem22]] if: | github.event_name == 'workflow_dispatch' || diff --git a/.github/workflows/beam_PostCommit_Python_Arm.yml b/.github/workflows/beam_PostCommit_Python_Arm.yml index d387e3d2d46b..8c09b8290909 100644 --- a/.github/workflows/beam_PostCommit_Python_Arm.yml +++ b/.github/workflows/beam_PostCommit_Python_Arm.yml @@ -60,7 +60,7 @@ jobs: matrix: job_name: [beam_PostCommit_Python_Arm] job_phrase: [Run Python PostCommit Arm] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] if: | github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PostCommit_Python_Dependency.yml b/.github/workflows/beam_PostCommit_Python_Dependency.yml index 03e51bbbd95b..1243c096086d 100644 --- a/.github/workflows/beam_PostCommit_Python_Dependency.yml +++ b/.github/workflows/beam_PostCommit_Python_Dependency.yml @@ -59,7 +59,7 @@ jobs: matrix: job_name: ['beam_PostCommit_Python_Dependency'] job_phrase: ['Run Python PostCommit Dependency'] - python_version: ['3.10','3.13'] + python_version: ['3.10','3.14'] timeout-minutes: 360 if: | github.event_name == 'workflow_dispatch' || diff --git a/.github/workflows/beam_PostCommit_Python_Examples_Direct.yml b/.github/workflows/beam_PostCommit_Python_Examples_Direct.yml index fc4531c705cd..e01a5acdb467 100644 --- a/.github/workflows/beam_PostCommit_Python_Examples_Direct.yml +++ b/.github/workflows/beam_PostCommit_Python_Examples_Direct.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_Examples_Direct"] job_phrase: ["Run Python Examples_Direct"] - python_version: ['3.10','3.11','3.12', '3.13'] + python_version: ['3.10','3.11','3.12', '3.13','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_Examples_Flink.yml b/.github/workflows/beam_PostCommit_Python_Examples_Flink.yml index 2be8d99b3dfa..f7668e6b7d36 100644 --- a/.github/workflows/beam_PostCommit_Python_Examples_Flink.yml +++ b/.github/workflows/beam_PostCommit_Python_Examples_Flink.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_Examples_Flink"] job_phrase: ["Run Python Examples_Flink"] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_Examples_Spark.yml b/.github/workflows/beam_PostCommit_Python_Examples_Spark.yml index bda615c447ee..0b21876faaa4 100644 --- a/.github/workflows/beam_PostCommit_Python_Examples_Spark.yml +++ b/.github/workflows/beam_PostCommit_Python_Examples_Spark.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_Examples_Spark"] job_phrase: ["Run Python Examples_Spark"] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_ValidatesContainer_Dataflow.yml b/.github/workflows/beam_PostCommit_Python_ValidatesContainer_Dataflow.yml index 5358b4e07b44..a77192419de0 100644 --- a/.github/workflows/beam_PostCommit_Python_ValidatesContainer_Dataflow.yml +++ b/.github/workflows/beam_PostCommit_Python_ValidatesContainer_Dataflow.yml @@ -65,7 +65,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_ValidatesContainer_Dataflow"] job_phrase: ["Run Python Dataflow ValidatesContainer"] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_ValidatesContainer_Dataflow_With_RC.yml b/.github/workflows/beam_PostCommit_Python_ValidatesContainer_Dataflow_With_RC.yml index fc4287dac923..945f90befba5 100644 --- a/.github/workflows/beam_PostCommit_Python_ValidatesContainer_Dataflow_With_RC.yml +++ b/.github/workflows/beam_PostCommit_Python_ValidatesContainer_Dataflow_With_RC.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_ValidatesContainer_Dataflow_With_RC"] job_phrase: ["Run Python RC Dataflow ValidatesContainer"] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Dataflow.yml b/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Dataflow.yml index 07b2a659cd08..6bd2fb495e98 100644 --- a/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Dataflow.yml +++ b/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Dataflow.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_ValidatesRunner_Dataflow"] job_phrase: ["Run Python Dataflow ValidatesRunner"] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Flink.yml b/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Flink.yml index 51006c079b7e..b93a431768cd 100644 --- a/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Flink.yml +++ b/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Flink.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_ValidatesRunner_Flink"] job_phrase: ["Run Python Flink ValidatesRunner"] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Samza.yml b/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Samza.yml index ba965598aa0e..23c1335b0e95 100644 --- a/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Samza.yml +++ b/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Samza.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_ValidatesRunner_Samza"] job_phrase: ["Run Python Samza ValidatesRunner"] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Spark.yml b/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Spark.yml index c3e5b3cdc014..84d7cfb95b43 100644 --- a/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Spark.yml +++ b/.github/workflows/beam_PostCommit_Python_ValidatesRunner_Spark.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_Python_ValidatesRunner_Spark"] job_phrase: ["Run Python Spark ValidatesRunner"] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_Python_Xlang_Gcp_Dataflow.yml b/.github/workflows/beam_PostCommit_Python_Xlang_Gcp_Dataflow.yml index cf2dddc5e140..66c00afbcec2 100644 --- a/.github/workflows/beam_PostCommit_Python_Xlang_Gcp_Dataflow.yml +++ b/.github/workflows/beam_PostCommit_Python_Xlang_Gcp_Dataflow.yml @@ -76,7 +76,7 @@ jobs: with: python-version: | 3.10 - 3.13 + 3.14 - name: run PostCommit Python Xlang Gcp Dataflow script uses: ./.github/actions/gradle-command-self-hosted-action with: diff --git a/.github/workflows/beam_PostCommit_Python_Xlang_Gcp_Direct.yml b/.github/workflows/beam_PostCommit_Python_Xlang_Gcp_Direct.yml index 4e939993d983..48f26c3b92fd 100644 --- a/.github/workflows/beam_PostCommit_Python_Xlang_Gcp_Direct.yml +++ b/.github/workflows/beam_PostCommit_Python_Xlang_Gcp_Direct.yml @@ -76,7 +76,7 @@ jobs: with: python-version: | 3.10 - 3.13 + 3.14 - name: Install docker compose run: | sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose diff --git a/.github/workflows/beam_PostCommit_Python_Xlang_IO_Dataflow.yml b/.github/workflows/beam_PostCommit_Python_Xlang_IO_Dataflow.yml index de06b49cfdaf..a777993a3fca 100644 --- a/.github/workflows/beam_PostCommit_Python_Xlang_IO_Dataflow.yml +++ b/.github/workflows/beam_PostCommit_Python_Xlang_IO_Dataflow.yml @@ -75,7 +75,7 @@ jobs: with: python-version: | 3.10 - 3.13 + 3.14 - name: run PostCommit Python Xlang IO Dataflow script uses: ./.github/actions/gradle-command-self-hosted-action with: diff --git a/.github/workflows/beam_PostCommit_Python_Xlang_IO_Direct.yml b/.github/workflows/beam_PostCommit_Python_Xlang_IO_Direct.yml index 6d112eae4961..8da87fd4330c 100644 --- a/.github/workflows/beam_PostCommit_Python_Xlang_IO_Direct.yml +++ b/.github/workflows/beam_PostCommit_Python_Xlang_IO_Direct.yml @@ -75,7 +75,7 @@ jobs: with: python-version: | 3.10 - 3.13 + 3.14 - name: run PostCommit Python Xlang IO Direct script uses: ./.github/actions/gradle-command-self-hosted-action with: diff --git a/.github/workflows/beam_PostCommit_TransformService_Direct.yml b/.github/workflows/beam_PostCommit_TransformService_Direct.yml index 44fe474235ae..bd9e4491a27e 100644 --- a/.github/workflows/beam_PostCommit_TransformService_Direct.yml +++ b/.github/workflows/beam_PostCommit_TransformService_Direct.yml @@ -62,7 +62,7 @@ jobs: matrix: job_name: ["beam_PostCommit_TransformService_Direct"] job_phrase: ["Run TransformService_Direct PostCommit"] - python_version: ['3.10','3.13'] + python_version: ['3.10','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_XVR_Direct.yml b/.github/workflows/beam_PostCommit_XVR_Direct.yml index cca4898fb011..ab400aa3839b 100644 --- a/.github/workflows/beam_PostCommit_XVR_Direct.yml +++ b/.github/workflows/beam_PostCommit_XVR_Direct.yml @@ -62,7 +62,7 @@ jobs: matrix: job_name: ["beam_PostCommit_XVR_Direct"] job_phrase: ["Run XVR_Direct PostCommit"] - python_version: ['3.10','3.13'] + python_version: ['3.10','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_XVR_Flink.yml b/.github/workflows/beam_PostCommit_XVR_Flink.yml index 8d0893eb2d78..2266c51ed7c3 100644 --- a/.github/workflows/beam_PostCommit_XVR_Flink.yml +++ b/.github/workflows/beam_PostCommit_XVR_Flink.yml @@ -63,7 +63,7 @@ jobs: matrix: job_name: ["beam_PostCommit_XVR_Flink"] job_phrase: ["Run XVR_Flink PostCommit"] - python_version: ['3.10','3.13'] + python_version: ['3.10','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_XVR_JavaUsingPython_Dataflow.yml b/.github/workflows/beam_PostCommit_XVR_JavaUsingPython_Dataflow.yml index 9a367497c4fd..07b09833c84e 100644 --- a/.github/workflows/beam_PostCommit_XVR_JavaUsingPython_Dataflow.yml +++ b/.github/workflows/beam_PostCommit_XVR_JavaUsingPython_Dataflow.yml @@ -62,7 +62,7 @@ jobs: matrix: job_name: ["beam_PostCommit_XVR_JavaUsingPython_Dataflow"] job_phrase: ["Run XVR_JavaUsingPython_Dataflow PostCommit"] - python_version: ['3.10','3.13'] + python_version: ['3.10','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_XVR_PythonUsingJava_Dataflow.yml b/.github/workflows/beam_PostCommit_XVR_PythonUsingJava_Dataflow.yml index 1ef993eb44fa..ac51aa515968 100644 --- a/.github/workflows/beam_PostCommit_XVR_PythonUsingJava_Dataflow.yml +++ b/.github/workflows/beam_PostCommit_XVR_PythonUsingJava_Dataflow.yml @@ -62,7 +62,7 @@ jobs: matrix: job_name: ["beam_PostCommit_XVR_PythonUsingJava_Dataflow"] job_phrase: ["Run XVR_PythonUsingJava_Dataflow PostCommit"] - python_version: ['3.10','3.13'] + python_version: ['3.10','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_XVR_Samza.yml b/.github/workflows/beam_PostCommit_XVR_Samza.yml index fe63772400bb..be171cd8ad6a 100644 --- a/.github/workflows/beam_PostCommit_XVR_Samza.yml +++ b/.github/workflows/beam_PostCommit_XVR_Samza.yml @@ -62,7 +62,7 @@ jobs: matrix: job_name: ["beam_PostCommit_XVR_Samza"] job_phrase: ["Run XVR_Samza PostCommit"] - python_version: ['3.10','3.13'] + python_version: ['3.10','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PostCommit_XVR_Spark3.yml b/.github/workflows/beam_PostCommit_XVR_Spark3.yml index d465c6e13be7..95935e3f5435 100644 --- a/.github/workflows/beam_PostCommit_XVR_Spark3.yml +++ b/.github/workflows/beam_PostCommit_XVR_Spark3.yml @@ -62,7 +62,7 @@ jobs: matrix: job_name: ["beam_PostCommit_XVR_Spark3"] job_phrase: ["Run XVR_Spark3 PostCommit"] - python_version: ['3.10','3.13'] + python_version: ['3.10','3.14'] steps: - uses: actions/checkout@v4 - name: Setup repository diff --git a/.github/workflows/beam_PreCommit_Portable_Python.yml b/.github/workflows/beam_PreCommit_Portable_Python.yml index 47f393206f77..948592284d16 100644 --- a/.github/workflows/beam_PreCommit_Portable_Python.yml +++ b/.github/workflows/beam_PreCommit_Portable_Python.yml @@ -82,7 +82,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Portable_Python'] job_phrase: ['Run Portable_Python PreCommit'] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PreCommit_Prism_Python.yml b/.github/workflows/beam_PreCommit_Prism_Python.yml index 5f3f1d9fa477..562c49a78e84 100644 --- a/.github/workflows/beam_PreCommit_Prism_Python.yml +++ b/.github/workflows/beam_PreCommit_Prism_Python.yml @@ -76,7 +76,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Prism_Python'] job_phrase: ['Run Prism_Python PreCommit'] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PreCommit_Python.yml b/.github/workflows/beam_PreCommit_Python.yml index 4115034a8a19..6471080e73b1 100644 --- a/.github/workflows/beam_PreCommit_Python.yml +++ b/.github/workflows/beam_PreCommit_Python.yml @@ -81,7 +81,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Python'] job_phrase: ['Run Python PreCommit'] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PreCommit_PythonDocker.yml b/.github/workflows/beam_PreCommit_PythonDocker.yml index 119939619d59..8210ac97225e 100644 --- a/.github/workflows/beam_PreCommit_PythonDocker.yml +++ b/.github/workflows/beam_PreCommit_PythonDocker.yml @@ -64,7 +64,7 @@ jobs: matrix: job_name: ["beam_PreCommit_PythonDocker"] job_phrase: ["Run PythonDocker PreCommit"] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PreCommit_Python_Dataframes.yml b/.github/workflows/beam_PreCommit_Python_Dataframes.yml index 0c1ba5dd2ad7..a7afb84076c2 100644 --- a/.github/workflows/beam_PreCommit_Python_Dataframes.yml +++ b/.github/workflows/beam_PreCommit_Python_Dataframes.yml @@ -64,7 +64,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Python_Dataframes'] job_phrase: ['Run Python_Dataframes PreCommit'] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PreCommit_Python_Examples.yml b/.github/workflows/beam_PreCommit_Python_Examples.yml index b91207557790..d5f9d012bf9a 100644 --- a/.github/workflows/beam_PreCommit_Python_Examples.yml +++ b/.github/workflows/beam_PreCommit_Python_Examples.yml @@ -65,7 +65,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Python_Examples'] job_phrase: ['Run Python_Examples PreCommit'] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PreCommit_Python_Integration.yml b/.github/workflows/beam_PreCommit_Python_Integration.yml index 70993f58ce5d..5339536ae476 100644 --- a/.github/workflows/beam_PreCommit_Python_Integration.yml +++ b/.github/workflows/beam_PreCommit_Python_Integration.yml @@ -64,7 +64,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Python_Integration'] job_phrase: ['Run Python_Integration PreCommit'] - python_version: ['3.10', '3.13'] + python_version: ['3.10', '3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PreCommit_Python_ML.yml b/.github/workflows/beam_PreCommit_Python_ML.yml index cecb2e65506a..12ec46cf03df 100644 --- a/.github/workflows/beam_PreCommit_Python_ML.yml +++ b/.github/workflows/beam_PreCommit_Python_ML.yml @@ -65,7 +65,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Python_ML'] job_phrase: ['Run Python_ML PreCommit'] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] # Run on both self-hosted and GitHub-hosted runners. # Some tests (marked require_docker_in_docker) can't run on Beam's # self-hosted runners due to Docker-in-Docker environment constraint. diff --git a/.github/workflows/beam_PreCommit_Python_Runners.yml b/.github/workflows/beam_PreCommit_Python_Runners.yml index a8364265f93e..3895c088c299 100644 --- a/.github/workflows/beam_PreCommit_Python_Runners.yml +++ b/.github/workflows/beam_PreCommit_Python_Runners.yml @@ -64,7 +64,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Python_Runners'] job_phrase: ['Run Python_Runners PreCommit'] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_PreCommit_Python_Transforms.yml b/.github/workflows/beam_PreCommit_Python_Transforms.yml index 88f7db3c5b08..7fbbc6b9b90f 100644 --- a/.github/workflows/beam_PreCommit_Python_Transforms.yml +++ b/.github/workflows/beam_PreCommit_Python_Transforms.yml @@ -65,7 +65,7 @@ jobs: matrix: job_name: ['beam_PreCommit_Python_Transforms'] job_phrase: ['Run Python_Transforms PreCommit'] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] if: | github.event_name == 'push' || github.event_name == 'pull_request_target' || diff --git a/.github/workflows/beam_Python_ValidatesContainer_Dataflow_ARM.yml b/.github/workflows/beam_Python_ValidatesContainer_Dataflow_ARM.yml index d0cccde4aa38..24c841dce503 100644 --- a/.github/workflows/beam_Python_ValidatesContainer_Dataflow_ARM.yml +++ b/.github/workflows/beam_Python_ValidatesContainer_Dataflow_ARM.yml @@ -54,7 +54,7 @@ jobs: matrix: job_name: [beam_Python_ValidatesContainer_Dataflow_ARM] job_phrase: [Run Python ValidatesContainer Dataflow ARM] - python_version: ['3.10','3.11','3.12','3.13'] + python_version: ['3.10','3.11','3.12','3.13','3.14'] if: | github.event_name == 'push' || (github.event_name == 'schedule' && github.repository == 'apache/beam') || diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml index 7bbbb1a2e3db..504ea45ac729 100644 --- a/.github/workflows/build_wheels.yml +++ b/.github/workflows/build_wheels.yml @@ -49,7 +49,7 @@ jobs: env: EVENT_NAME: ${{ github.event_name }} # Keep in sync with py_version matrix value below - if changed, change that as well. - PY_VERSIONS_FULL: "cp310-* cp311-* cp312-* cp313-*" + PY_VERSIONS_FULL: "cp310-* cp311-* cp312-* cp313-* cp314-*" outputs: gcp-variables-set: ${{ steps.check_gcp_variables.outputs.gcp-variables-set }} py-versions-full: ${{ steps.set-py-versions.outputs.py-versions-full }} @@ -92,7 +92,7 @@ jobs: - name: Install python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.11' - name: Get tag id: get_tag run: | @@ -228,7 +228,7 @@ jobs: {"os": "ubuntu-20.04", "runner": "ubuntu-22.04", "python": "${{ needs.check_env_variables.outputs.py-versions-test }}", arch: "aarch64" } ] # Keep in sync (remove asterisks) with PY_VERSIONS_FULL env var above - if changed, change that as well. - py_version: ["cp310-", "cp311-", "cp312-", "cp313-"] + py_version: ["cp310-", "cp311-", "cp312-", "cp313-", "cp314-"] steps: - name: Download python source distribution from artifacts uses: actions/download-artifact@v5 @@ -244,13 +244,13 @@ jobs: - name: Install Python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.11' - uses: docker/setup-qemu-action@v3 if: ${{matrix.os_python.arch == 'aarch64'}} name: Set up QEMU - name: Install cibuildwheel # note: sync cibuildwheel version with gradle task sdks:python:bdistPy* steps - run: pip install cibuildwheel==2.23.3 setuptools + run: pip install cibuildwheel==3.3.1 setuptools - name: Build wheel # Only build wheel if it is one of the target versions for this platform, otherwise no-op if: ${{ contains(matrix.os_python.python, matrix.py_version) }} diff --git a/.github/workflows/python_dependency_tests.yml b/.github/workflows/python_dependency_tests.yml index 02e01c3166be..352fd8db5a04 100644 --- a/.github/workflows/python_dependency_tests.yml +++ b/.github/workflows/python_dependency_tests.yml @@ -30,6 +30,7 @@ jobs: { "py_ver": "3.11", "py_env": "py311" }, { "py_ver": "3.12", "py_env": "py312" }, { "py_ver": "3.13", "py_env": "py313" }, + { "py_ver": "3.14", "py_env": "py314" }, ] steps: - name: Checkout code diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index a32402717bc4..3c75f6a01266 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -97,6 +97,7 @@ jobs: { "py_ver": "3.11", "tox_env": "py311" }, { "py_ver": "3.12", "tox_env": "py312" }, { "py_ver": "3.13", "tox_env": "py313" }, + { "py_ver": "3.14", "tox_env": "py314" }, ] steps: - name: Checkout code @@ -133,7 +134,7 @@ jobs: fail-fast: false matrix: os: [[self-hosted, ubuntu-20.04, main], macos-latest, windows-latest] - python: ["3.10", "3.11", "3.12", "3.13"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/.github/workflows/update_python_dependencies.yml b/.github/workflows/update_python_dependencies.yml index 2336f9e27cd2..fc26674fe787 100644 --- a/.github/workflows/update_python_dependencies.yml +++ b/.github/workflows/update_python_dependencies.yml @@ -60,6 +60,7 @@ jobs: 3.11 3.12 3.13 + 3.14 java-version: default go-version: default disable-cache: true diff --git a/build.gradle.kts b/build.gradle.kts index 3ae49afa3908..5fa344a9b148 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -494,6 +494,7 @@ tasks.register("pythonPreCommit") { dependsOn(":sdks:python:test-suites:tox:py311:preCommitPy311") dependsOn(":sdks:python:test-suites:tox:py312:preCommitPy312") dependsOn(":sdks:python:test-suites:tox:py313:preCommitPy313") + dependsOn(":sdks:python:test-suites:tox:py314:preCommitPy314") } tasks.register("pythonPreCommitIT") { @@ -510,6 +511,7 @@ tasks.register("pythonDockerBuildPreCommit") { dependsOn(":sdks:python:container:py311:docker") dependsOn(":sdks:python:container:py312:docker") dependsOn(":sdks:python:container:py313:docker") + dependsOn(":sdks:python:container:py314:docker") } tasks.register("pythonLintPreCommit") { @@ -820,14 +822,21 @@ tasks.register("python313PostCommit") { dependsOn(":sdks:python:test-suites:portable:py313:postCommitPy313") } +tasks.register("python314PostCommit") { + dependsOn(":sdks:python:test-suites:dataflow:py314:postCommitIT") + dependsOn(":sdks:python:test-suites:direct:py314:postCommitIT") + dependsOn(":sdks:python:test-suites:direct:py314:hdfsIntegrationTest") + dependsOn(":sdks:python:test-suites:portable:py314:postCommitPy314") +} + tasks.register("portablePythonPreCommit") { dependsOn(":sdks:python:test-suites:portable:py310:preCommitPy310") - dependsOn(":sdks:python:test-suites:portable:py313:preCommitPy313") + dependsOn(":sdks:python:test-suites:portable:py314:preCommitPy314") } tasks.register("pythonSparkPostCommit") { dependsOn(":sdks:python:test-suites:portable:py310:sparkValidatesRunner") - dependsOn(":sdks:python:test-suites:portable:py313:sparkValidatesRunner") + dependsOn(":sdks:python:test-suites:portable:py314:sparkValidatesRunner") } tasks.register("websitePreCommit") { diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 774674b545ed..55b0c19027c0 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -3103,7 +3103,7 @@ class BeamModulePlugin implements Plugin { // Set min/max python versions used for containers and supported versions. project.ext.minPythonVersion = 10 - project.ext.maxPythonVersion = 13 + project.ext.maxPythonVersion = 14 def setupVirtualenv = project.tasks.register('setupVirtualenv') { doLast { diff --git a/gradle.properties b/gradle.properties index c5fbb2f9003c..d93676480d4b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -41,4 +41,4 @@ docker_image_default_repo_prefix=beam_ # supported flink versions flink_versions=1.17,1.18,1.19,1.20,2.0 # supported python versions -python_versions=3.10,3.11,3.12,3.13 +python_versions=3.10,3.11,3.12,3.13,3.14 diff --git a/sdks/python/apache_beam/__init__.py b/sdks/python/apache_beam/__init__.py index 9906c95aee14..0e2acbe46748 100644 --- a/sdks/python/apache_beam/__init__.py +++ b/sdks/python/apache_beam/__init__.py @@ -70,7 +70,7 @@ import warnings if sys.version_info.major == 3: - if sys.version_info.minor <= 9 or sys.version_info.minor >= 14: + if sys.version_info.minor <= 9 or sys.version_info.minor >= 15: warnings.warn( 'This version of Apache Beam has not been sufficiently tested on ' 'Python %s.%s. You may encounter bugs or missing features.' % diff --git a/sdks/python/apache_beam/runners/dataflow/internal/apiclient.py b/sdks/python/apache_beam/runners/dataflow/internal/apiclient.py index 164ace532b23..29cb36071488 100644 --- a/sdks/python/apache_beam/runners/dataflow/internal/apiclient.py +++ b/sdks/python/apache_beam/runners/dataflow/internal/apiclient.py @@ -84,7 +84,9 @@ _LOGGER = logging.getLogger(__name__) -_PYTHON_VERSIONS_SUPPORTED_BY_DATAFLOW = ['3.10', '3.11', '3.12', '3.13'] +_PYTHON_VERSIONS_SUPPORTED_BY_DATAFLOW = [ + '3.10', '3.11', '3.12', '3.13', '3.14' +] class Environment(object): diff --git a/sdks/python/apache_beam/runners/dataflow/internal/apiclient_test.py b/sdks/python/apache_beam/runners/dataflow/internal/apiclient_test.py index b767cef86b2e..66b1c8e1e5bb 100644 --- a/sdks/python/apache_beam/runners/dataflow/internal/apiclient_test.py +++ b/sdks/python/apache_beam/runners/dataflow/internal/apiclient_test.py @@ -1066,7 +1066,7 @@ def test_interpreter_version_check_passes_py310(self): @mock.patch( 'apache_beam.runners.dataflow.internal.apiclient.sys.version_info', - (3, 14, 0)) + (3, 15, 0)) @mock.patch( 'apache_beam.runners.dataflow.internal.apiclient.' 'beam_version.__version__', diff --git a/sdks/python/build.gradle b/sdks/python/build.gradle index 970020da8605..88ea39ae7821 100644 --- a/sdks/python/build.gradle +++ b/sdks/python/build.gradle @@ -220,7 +220,7 @@ platform_identifiers_map.each { platform, idsuffix -> args '-c', ". ${envdir}/bin/activate && " + // note: sync cibuildwheel version with GitHub Action // .github/workflows/build_wheel.yml:build_wheels "Install cibuildwheel" step - "pip install cibuildwheel==2.23.3 setuptools && " + + "pip install cibuildwheel==3.3.1 setuptools && " + "cibuildwheel --print-build-identifiers --platform ${platform} --archs ${archs} && " + "cibuildwheel --output-dir ${buildDir} --platform ${platform} --archs ${archs} " } diff --git a/sdks/python/conftest.py b/sdks/python/conftest.py index fe5d03fd66c3..92d90769fb15 100644 --- a/sdks/python/conftest.py +++ b/sdks/python/conftest.py @@ -29,7 +29,7 @@ from apache_beam.options import pipeline_options from apache_beam.testing.test_pipeline import TestPipeline -MAX_SUPPORTED_PYTHON_VERSION = (3, 13) +MAX_SUPPORTED_PYTHON_VERSION = (3, 14) def pytest_addoption(parser): diff --git a/sdks/python/container/common.gradle b/sdks/python/container/common.gradle index 0fb460d9d6b5..da2871ab72bb 100644 --- a/sdks/python/container/common.gradle +++ b/sdks/python/container/common.gradle @@ -46,23 +46,24 @@ def generatePythonRequirements = tasks.register("generatePythonRequirements") { "${pipExtraOptions}" } // Generate versions for ML dependencies - exec { - executable 'sh' - args '-c', "cd ${rootDir} && ${runScriptsPath} " + - "${project.ext.pythonVersion} " + - "${files(configurations.sdkSourceTarball.files).singleFile} " + - "base_image_requirements.txt " + + // Skip for 3.14 since there isn't a tensorflow release that supports it + // yet. + if ("${project.ext.pythonVersion}" != "3.14") { + exec { + executable 'sh' + args '-c', "cd ${rootDir} && ${runScriptsPath} " + + "${project.ext.pythonVersion} " + + "${files(configurations.sdkSourceTarball.files).singleFile} " + + "base_image_requirements.txt " + "container/ml " + "[gcp,dataframe,test,ml_cpu,tfrecord,yaml] " + "${pipExtraOptions}" } + } // TODO(https://github.com/apache/beam/issues/36637) - // Skip generating Python 3.13 requirements for now since not all 3.13 - // wheels are available/buildable. - // Also skip 3.9 because there are some dependency version conflicts. This - // is fine since 3.9 will be EoL by the next release, and we can remove - // this condition once we remove support entirely. - if ("${project.ext.pythonVersion}" != "3.13" && "${project.ext.pythonVersion}" != "3.9") { + // Skip generating Python 3.13 and 3.14 requirements for now since not all 3.13 + // and 3.14 wheels are available/buildable. + if ("${project.ext.pythonVersion}" != "3.13" && "${project.ext.pythonVersion}" != "3.14") { // GPU requirements not used for any containers directly due to // licensing, but can be picked up by customers or other consumers for // use. diff --git a/sdks/python/container/distroless/py314/build.gradle b/sdks/python/container/distroless/py314/build.gradle new file mode 100644 index 000000000000..d46fab79259e --- /dev/null +++ b/sdks/python/container/distroless/py314/build.gradle @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id 'base' + id 'org.apache.beam.module' +} +applyDockerNature() +applyPythonNature() + +pythonVersion = '3.13' + +apply from: "../common.gradle" \ No newline at end of file diff --git a/sdks/python/container/ml/py314/build.gradle b/sdks/python/container/ml/py314/build.gradle new file mode 100644 index 000000000000..ef5c50189205 --- /dev/null +++ b/sdks/python/container/ml/py314/build.gradle @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id 'base' + id 'org.apache.beam.module' +} +applyDockerNature() +applyPythonNature() + +pythonVersion = '3.14' + +apply from: "../common.gradle" \ No newline at end of file diff --git a/sdks/python/container/py312/base_image_requirements.txt b/sdks/python/container/py312/base_image_requirements.txt index f2c9ce2786f2..b5f6a391701a 100644 --- a/sdks/python/container/py312/base_image_requirements.txt +++ b/sdks/python/container/py312/base_image_requirements.txt @@ -196,4 +196,4 @@ wheel==0.45.1 wrapt==2.0.1 yarl==1.22.0 zipp==3.23.0 -zstandard==0.25.0 +zstandard==0.25.0 \ No newline at end of file diff --git a/sdks/python/container/py313/base_image_requirements.txt b/sdks/python/container/py313/base_image_requirements.txt index 6a919da4bc93..be34b42bca13 100644 --- a/sdks/python/container/py313/base_image_requirements.txt +++ b/sdks/python/container/py313/base_image_requirements.txt @@ -192,4 +192,4 @@ wheel==0.45.1 wrapt==2.0.1 yarl==1.22.0 zipp==3.23.0 -zstandard==0.25.0 +zstandard==0.25.0 \ No newline at end of file diff --git a/sdks/python/container/py314/base_image_requirements.txt b/sdks/python/container/py314/base_image_requirements.txt new file mode 100644 index 000000000000..5e8436d89eda --- /dev/null +++ b/sdks/python/container/py314/base_image_requirements.txt @@ -0,0 +1,194 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Autogenerated requirements file for Apache Beam py314 container image. +# Run ./gradlew :sdks:python:container:generatePythonRequirementsAll to update. +# Do not edit manually, adjust ../base_image_requirements_manual.txt or +# Apache Beam's setup.py instead, and regenerate the list. +# You will need Python interpreters for all versions supported by Beam, see: +# https://s.apache.org/beam-python-dev-wiki +# Reach out to a committer if you need help. + +aiofiles==25.1.0 +aiohappyeyeballs==2.6.1 +aiohttp==3.13.3 +aiosignal==1.4.0 +annotated-types==0.7.0 +anyio==4.12.1 +asn1crypto==1.5.1 +attrs==25.4.0 +beartype==0.22.9 +beautifulsoup4==4.14.3 +betterproto==2.0.0b6 +bs4==0.0.2 +build==1.4.0 +cachetools==6.2.6 +certifi==2026.1.4 +cffi==2.0.0 +charset-normalizer==3.4.4 +click==8.3.1 +cloud-sql-python-connector==1.20.0 +crcmod==1.7 +cryptography==46.0.4 +Cython==3.2.4 +dill==0.3.1.1 +distro==1.9.0 +dnspython==2.8.0 +docker==7.1.0 +docstring_parser==0.17.0 +envoy_data_plane==1.0.3 +execnet==2.1.2 +fastavro==1.12.1 +fasteners==0.20 +freezegun==1.5.5 +frozenlist==1.8.0 +future==1.0.0 +google-api-core==2.29.0 +google-apitools==0.5.35 +google-auth==2.49.0.dev0 +google-auth-httplib2==0.2.1 +google-cloud-aiplatform==1.135.0 +google-cloud-bigquery==3.40.0 +google-cloud-bigquery-storage==2.36.0 +google-cloud-bigtable==2.35.0 +google-cloud-build==3.35.0 +google-cloud-core==2.5.0 +google-cloud-datastore==2.23.0 +google-cloud-dlp==3.34.0 +google-cloud-kms==3.10.0 +google-cloud-language==2.19.0 +google-cloud-monitoring==2.29.0 +google-cloud-pubsub==2.34.0 +google-cloud-recommendations-ai==0.10.18 +google-cloud-resource-manager==1.16.0 +google-cloud-secret-manager==2.26.0 +google-cloud-spanner==3.62.0 +google-cloud-storage==2.19.0 +google-cloud-videointelligence==2.18.0 +google-cloud-vision==3.12.0 +google-crc32c==1.8.0 +google-genai==1.61.0 +google-resumable-media==2.8.0 +googleapis-common-protos==1.72.0 +greenlet==3.3.1 +grpc-google-iam-v1==0.14.3 +grpc-interceptor==0.15.4 +grpcio==1.76.0 +grpcio-status==1.76.0 +grpcio-tools==1.76.0 +grpclib==0.4.9 +guppy3==3.1.6 +h11==0.16.0 +h2==4.3.0 +hpack==4.1.0 +httpcore==1.0.9 +httplib2==0.31.2 +httpx==0.28.1 +hyperframe==6.1.0 +hypothesis==6.148.3 +idna==3.11 +importlib_metadata==8.7.1 +iniconfig==2.3.0 +jaraco.classes==3.4.0 +jaraco.context==6.1.0 +jaraco.functools==4.4.0 +jeepney==0.9.0 +Jinja2==3.1.6 +joblib==1.5.3 +jsonpickle==3.4.2 +jsonschema==4.26.0 +jsonschema-specifications==2025.9.1 +keyring==25.7.0 +keyrings.google-artifactregistry-auth==1.1.2 +MarkupSafe==3.0.3 +mmh3==5.2.0 +mock==5.2.0 +more-itertools==10.8.0 +multidict==6.7.1 +nltk==3.9.2 +numpy==2.4.2 +oauth2client==4.1.3 +objsize==0.7.1 +opentelemetry-api==1.39.1 +opentelemetry-resourcedetector-gcp==1.11.0a0 +opentelemetry-sdk==1.39.1 +opentelemetry-semantic-conventions==0.60b1 +oracledb==3.4.2 +orjson==3.11.7 +packaging==26.0 +pandas==2.2.3 +parameterized==0.9.0 +pg8000==1.31.5 +pip==26.0 +pluggy==1.6.0 +propcache==0.4.1 +proto-plus==1.27.1 +protobuf==6.33.5 +psycopg2-binary==2.9.11 +pyarrow==23.0.0 +pyarrow-hotfix==0.7 +pyasn1==0.6.2 +pyasn1_modules==0.4.2 +pycparser==3.0 +pydantic==2.12.5 +pydantic_core==2.41.5 +Pygments==2.19.2 +PyHamcrest==2.1.0 +pymilvus==2.6.8 +pymongo==4.16.0 +PyMySQL==1.1.2 +pyparsing==3.3.2 +pyproject_hooks==1.2.0 +pytest==8.4.2 +pytest-timeout==2.4.0 +pytest-xdist==3.8.0 +python-dateutil==2.9.0.post0 +python-dotenv==1.2.1 +python-tds==1.17.1 +pytz==2025.2 +PyYAML==6.0.3 +referencing==0.37.0 +regex==2026.1.15 +requests==2.32.5 +requests-mock==1.12.1 +rpds-py==0.30.0 +rsa==4.9.1 +scikit-learn==1.7.2 +scipy==1.17.0 +scramp==1.4.8 +SecretStorage==3.5.0 +setuptools==80.10.2 +six==1.17.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +soupsieve==2.8.3 +SQLAlchemy==2.0.46 +sqlalchemy_pytds==1.0.2 +sqlparse==0.5.5 +tenacity==8.5.0 +testcontainers==4.14.1 +threadpoolctl==3.6.0 +tqdm==4.67.3 +typing-inspection==0.4.2 +typing_extensions==4.15.0 +tzdata==2025.3 +urllib3==2.6.3 +virtualenv-clone==0.5.7 +websockets==15.0.1 +wheel==0.46.3 +wrapt==2.1.1 +yarl==1.22.0 +zipp==3.23.0 +zstandard==0.25.0 diff --git a/sdks/python/container/py314/build.gradle b/sdks/python/container/py314/build.gradle new file mode 100644 index 000000000000..347007449195 --- /dev/null +++ b/sdks/python/container/py314/build.gradle @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id 'base' + id 'org.apache.beam.module' +} +applyDockerNature() +applyPythonNature() + +pythonVersion = '3.14' + +apply from: "../common.gradle" \ No newline at end of file diff --git a/sdks/python/container/run_generate_requirements.sh b/sdks/python/container/run_generate_requirements.sh index 1e9c6f5c3647..4c7eea0b7398 100755 --- a/sdks/python/container/run_generate_requirements.sh +++ b/sdks/python/container/run_generate_requirements.sh @@ -31,8 +31,8 @@ # https://s.apache.org/beam-python-dev-wiki if [[ $# -lt 2 ]]; then - printf "Example usage: \n$> ./sdks/python/container/run_generate_requirements.sh 3.8 " - printf "\n\where 3.8 is the Python major.minor version." + printf "Example usage: \n$> ./sdks/python/container/run_generate_requirements.sh 3.10 " + printf "\n\where 3.10 is the Python major.minor version." exit 1 fi diff --git a/sdks/python/setup.py b/sdks/python/setup.py index 0e27d99deb3b..fa4d9a7cf8ff 100644 --- a/sdks/python/setup.py +++ b/sdks/python/setup.py @@ -145,7 +145,8 @@ def cythonize(*args, **kwargs): pyarrow_dependency = [''] else: pyarrow_dependency = [ - 'pyarrow>=3.0.0,<19.0.0', + 'pyarrow>=3.0.0,<19.0.0; python_version <= "3.13"', + 'pyarrow>=22.0.0,<24.0.0; python_version >= "3.14"', # NOTE(https://github.com/apache/beam/issues/29392): We can remove this # once Beam increases the pyarrow lower bound to a version that fixes CVE. # (lower bound >= 14.0.1) @@ -295,7 +296,7 @@ def get_portability_package_data(): python_requires = '>=3.10' -if sys.version_info.major == 3 and sys.version_info.minor >= 14: +if sys.version_info.major == 3 and sys.version_info.minor >= 15: warnings.warn( 'This version of Apache Beam has not been sufficiently tested on ' 'Python %s.%s. You may encounter bugs or missing features.' % @@ -626,6 +627,7 @@ def get_portability_package_data(): 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', + 'Programming Language :: Python :: 3.14', # When updating version classifiers, also update version warnings # above and in apache_beam/__init__.py. 'Topic :: Software Development :: Libraries', diff --git a/sdks/python/test-suites/dataflow/py314/build.gradle b/sdks/python/test-suites/dataflow/py314/build.gradle new file mode 100644 index 000000000000..0e66cd269df0 --- /dev/null +++ b/sdks/python/test-suites/dataflow/py314/build.gradle @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +apply plugin: org.apache.beam.gradle.BeamModulePlugin +applyPythonNature() + +// Required to setup a Python 3 virtualenv and task names. +pythonVersion = '3.14' +apply from: "../common.gradle" \ No newline at end of file diff --git a/sdks/python/test-suites/direct/py314/build.gradle b/sdks/python/test-suites/direct/py314/build.gradle new file mode 100644 index 000000000000..48cb4fba8fc9 --- /dev/null +++ b/sdks/python/test-suites/direct/py314/build.gradle @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { id 'org.apache.beam.module' } +applyPythonNature() + +// Required to setup a Python 3 virtualenv and task names. +pythonVersion = '3.14' +apply from: '../common.gradle' \ No newline at end of file diff --git a/sdks/python/test-suites/gradle.properties b/sdks/python/test-suites/gradle.properties index fcdd6f17eeaf..6cadc5e57b44 100644 --- a/sdks/python/test-suites/gradle.properties +++ b/sdks/python/test-suites/gradle.properties @@ -23,34 +23,34 @@ # dataflow test-suites # (TODO): https://github.com/apache/beam/issues/21971 # Add python 3.10 to dataflow test-suites -dataflow_precommit_it_task_py_versions=3.10,3.13 +dataflow_precommit_it_task_py_versions=3.10,3.14 dataflow_mongodbio_it_task_py_versions=3.10 dataflow_chicago_taxi_example_task_py_versions=3.10 # TODO: Enable following tests after making sure we have enough capacity. -dataflow_validates_runner_batch_tests=3.10,3.13 -dataflow_validates_runner_streaming_tests=3.10,3.13 -dataflow_examples_postcommit_py_versions=3.13 +dataflow_validates_runner_batch_tests=3.10,3.14 +dataflow_validates_runner_streaming_tests=3.10,3.14 +dataflow_examples_postcommit_py_versions=3.14 # TFX_BSL is not yet supported on Python 3.10. dataflow_cloudml_benchmark_tests_py_versions=3.10 # direct runner test-suites -direct_mongodbio_it_task_py_versions=3.13 +direct_mongodbio_it_task_py_versions=3.14 # flink runner test-suites -flink_validates_runner_precommit_py_versions=3.13 -flink_validates_runner_postcommit_py_versions=3.10,3.13 -flink_examples_postcommit_py_versions=3.10,3.13 +flink_validates_runner_precommit_py_versions=3.14 +flink_validates_runner_postcommit_py_versions=3.10,3.14 +flink_examples_postcommit_py_versions=3.10,3.14 # samza runner test-suites -samza_validates_runner_postcommit_py_versions=3.10,3.13 +samza_validates_runner_postcommit_py_versions=3.10,3.14 # spark runner test-suites -spark_examples_postcommit_py_versions=3.10,3.13 +spark_examples_postcommit_py_versions=3.10,3.14 # prism runner test-suites -prism_validates_runner_precommit_py_versions=3.13 -prism_validates_runner_postcommit_py_versions=3.10,3.13 -prism_examples_postcommit_py_versions=3.10,3.13 +prism_validates_runner_precommit_py_versions=3.14 +prism_validates_runner_postcommit_py_versions=3.10,3.14 +prism_examples_postcommit_py_versions=3.10,3.14 # cross language postcommit python test suites -cross_language_validates_py_versions=3.10,3.13 +cross_language_validates_py_versions=3.10,3.14 diff --git a/sdks/python/test-suites/portable/py314/build.gradle b/sdks/python/test-suites/portable/py314/build.gradle new file mode 100644 index 000000000000..a5262bb7e0fd --- /dev/null +++ b/sdks/python/test-suites/portable/py314/build.gradle @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +apply plugin: org.apache.beam.gradle.BeamModulePlugin +applyPythonNature() + +addPortableWordCountTasks() + +// Required to setup a Python 3 virtualenv and task names. +pythonVersion = '3.14' +apply from: "../common.gradle" \ No newline at end of file diff --git a/sdks/python/test-suites/tox/py314/build.gradle b/sdks/python/test-suites/tox/py314/build.gradle new file mode 100644 index 000000000000..cf05b96223d5 --- /dev/null +++ b/sdks/python/test-suites/tox/py314/build.gradle @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Unit tests for Python 3.14 + */ + +plugins { id 'org.apache.beam.module' } +applyPythonNature() + +// Required to setup a Python 3 virtualenv and task names. +pythonVersion = '3.14' + +project.tasks.register("postCommitPyDep") {} + +apply from: "../common.gradle" + diff --git a/sdks/python/tox.ini b/sdks/python/tox.ini index 093c5212e607..852a228f1a68 100644 --- a/sdks/python/tox.ini +++ b/sdks/python/tox.ini @@ -17,7 +17,7 @@ [tox] # new environments will be excluded by default unless explicitly added to envlist. -envlist = py310,py311,py312,py313,py310-{cloud,cloudcoverage,dask},py311-{cloud,dask},py312-{cloud,dask},py313-{cloud,dask},docs,lint,mypy,whitespacelint +envlist = py310,py311,py312,py313,py314,py310-{cloud,cloudcoverage,dask},py311-{cloud,dask},py312-{cloud,dask},py313-{cloud,dask},py314-{cloud,dask},docs,lint,mypy,whitespacelint toxworkdir = {toxinidir}/target/{env:ENV_NAME:.tox} [pycodestyle] @@ -67,7 +67,7 @@ commands_post = commands = false {envname} is misconfigured -[testenv:py{310,311,312,313}] +[testenv:py{310,311,312,313,314}] commands_pre = python --version pip --version @@ -79,7 +79,7 @@ commands = python apache_beam/examples/complete/autocomplete_test.py bash {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}" -[testenv:py{310,311,312,313}-macos] +[testenv:py{310,311,312,313,314}-macos] commands_pre = python --version pip --version @@ -89,14 +89,14 @@ commands = python apache_beam/examples/complete/autocomplete_test.py bash {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}" -[testenv:py{310,311,312,313}-win] +[testenv:py{310,311,312,313,314}-win] commands = python apache_beam/examples/complete/autocomplete_test.py bash {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}" install_command = {envbindir}/python.exe {envbindir}/pip.exe install --retries 10 {opts} {packages} list_dependencies_command = {envbindir}/python.exe {envbindir}/pip.exe freeze -[testenv:py{310,311,312,313}-cloud] +[testenv:py{310,311,312,313,314}-cloud] ; extras = test,gcp,interactive,dataframe,aws,azure extras = test,hadoop,gcp,interactive,dataframe,aws,azure commands = @@ -140,14 +140,24 @@ commands = /bin/sh -c "pip freeze | grep -E tensorflow" bash {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}" -[testenv:py{310,311,31,313}-dask] +[testenv:py314-ml] +deps = + accelerate>=1.6.0 +setenv = +extras = test,gcp,dataframe,p314_ml_test +commands = + # Log tensorflow version for debugging + /bin/sh -c "pip freeze | grep -E tensorflow" + bash {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}" + +[testenv:py{310,311,312,313,314}-dask] extras = test,dask,dataframes commands_pre = pip install 'distributed>=2024.4.2' 'dask>=2024.4.2' commands = bash {toxinidir}/scripts/run_pytest.sh {envname} {toxinidir}/apache_beam/runners/dask/ -[testenv:py{310,311,312,313}-win-dask] +[testenv:py{310,311,312,313,314}-win-dask] # use the tight range since the latest dask requires cloudpickle 3.0 commands_pre = pip install 'distributed>=2024.4.2,<2024.9.0' 'dask>=2024.4.2,<2024.9.0' diff --git a/settings.gradle.kts b/settings.gradle.kts index 4540fa4b597b..d8acd274c2c6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -288,37 +288,44 @@ include(":sdks:python:container:py310") include(":sdks:python:container:py311") include(":sdks:python:container:py312") include(":sdks:python:container:py313") +include(":sdks:python:container:py314") include(":sdks:python:container:distroless") include(":sdks:python:container:distroless:py310") include(":sdks:python:container:distroless:py311") include(":sdks:python:container:distroless:py312") include(":sdks:python:container:distroless:py313") +include(":sdks:python:container:distroless:py314") include(":sdks:python:container:ml") include(":sdks:python:container:ml:py310") include(":sdks:python:container:ml:py311") include(":sdks:python:container:ml:py312") include(":sdks:python:container:ml:py313") +include(":sdks:python:container:ml:py314") include(":sdks:python:expansion-service-container") include(":sdks:python:test-suites:dataflow") include(":sdks:python:test-suites:dataflow:py310") include(":sdks:python:test-suites:dataflow:py311") include(":sdks:python:test-suites:dataflow:py312") include(":sdks:python:test-suites:dataflow:py313") +include(":sdks:python:test-suites:dataflow:py314") include(":sdks:python:test-suites:direct") include(":sdks:python:test-suites:direct:py310") include(":sdks:python:test-suites:direct:py311") include(":sdks:python:test-suites:direct:py312") include(":sdks:python:test-suites:direct:py313") +include(":sdks:python:test-suites:direct:py314") include(":sdks:python:test-suites:direct:xlang") include(":sdks:python:test-suites:portable:py310") include(":sdks:python:test-suites:portable:py311") include(":sdks:python:test-suites:portable:py312") include(":sdks:python:test-suites:portable:py313") +include(":sdks:python:test-suites:portable:py314") include(":sdks:python:test-suites:tox:pycommon") include(":sdks:python:test-suites:tox:py310") include(":sdks:python:test-suites:tox:py311") include(":sdks:python:test-suites:tox:py312") include(":sdks:python:test-suites:tox:py313") +include(":sdks:python:test-suites:tox:py314") include(":sdks:python:test-suites:xlang") include(":sdks:typescript") include(":sdks:typescript:container")