Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/docker-images.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ jobs:
- "prefecthq/prefect"
- "prefecthq/prefect-client"
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/integration-package-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.9"
python-version: "3.10"
cache: "pip"
cache-dependency-path: "requirements*.txt"

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/integration-package-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.9"
python-version: "3.10"
- name: Generate matrix
id: set-matrix
run: |
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/prefect-aws-docker-images.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ jobs:
fail-fast: false
matrix:
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/prefect-client.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
python-version: "3.9"
python-version: "3.10"
cache-dependency-glob: "pyproject.toml"
activate-environment: true

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/python-package.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
python-version: "3.9"
python-version: "3.10"
cache-dependency-glob: "pyproject.toml"

- uses: actions/setup-node@v6
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/python-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ jobs:
- "postgres:14"
- "sqlite"
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
Expand Down Expand Up @@ -180,7 +179,6 @@ jobs:
database:
- "postgres:14"
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/static-analysis.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
- name: Install uv and set the python version
uses: astral-sh/setup-uv@v7
with:
python-version: "3.9"
python-version: "3.10"
enable-cache: true
cache-dependency-glob: "pyproject.toml"

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/windows-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
strategy:
matrix:
python-version:
- "3.9"
- "3.10"
- "3.12"
- "3.14"

Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ prefect config view # Inspect configuration

### Code Conventions

- Python 3.9+ with modern typing (`list[int]`, `T | None`)
- Python 3.10+ with modern typing (`list[int]`, `T | None`)
- Private implementation details (`_private_method`)
- No public API changes without approval
- Use `uv` for dependency management, not `pip`
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# The version of Python in the final image
ARG PYTHON_VERSION=3.9
ARG PYTHON_VERSION=3.10
# The base image to use for the final image; Prefect and its Python requirements will
# be installed in this image. The default is the official Python slim image.
# The following images are also available in this file:
# prefect-conda: Derivative of continuum/miniconda3 with a 'prefect' environment. Used for the 'conda' flavor.
# Any image tag can be used, but it must have apt and pip.
ARG BASE_IMAGE=python:${PYTHON_VERSION}-slim
# The version used to build the Python distributable.
ARG BUILD_PYTHON_VERSION=3.9
ARG BUILD_PYTHON_VERSION=3.10
# THe version used to build the UI distributable.
ARG NODE_VERSION=20.19.0
# SQLite version to install (format: X.YY.Z becomes XYYZZOO in filename)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ Workflow activity is tracked and can be monitored with a self-hosted [Prefect se

## Getting started

Prefect requires Python 3.9+. To [install the latest version of Prefect](https://docs.prefect.io/v3/get-started/install), run one of the following commands:
Prefect requires Python 3.10+. To [install the latest version of Prefect](https://docs.prefect.io/v3/get-started/install), run one of the following commands:

```bash
pip install -U prefect
Expand Down
2 changes: 1 addition & 1 deletion client/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ARG PYTHON_VERSION=3.9
ARG PYTHON_VERSION=3.10
# SQLite version to install (format: X.YY.Z becomes XYYZZOO in filename)
ARG SQLITE_VERSION=3.50.4
ARG SQLITE_YEAR=2025
Expand Down
2 changes: 1 addition & 1 deletion client/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ or other resource-constrained environments.

## Getting started

`prefect-client` shares the same installation requirements as prefect. To install, make sure you are on Python 3.9 or
`prefect-client` shares the same installation requirements as prefect. To install, make sure you are on Python 3.10 or
later and run the following command:

```bash
Expand Down
4 changes: 1 addition & 3 deletions client/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ name = "prefect-client"
dynamic = ["version"]
description = "Workflow orchestration and management."
readme = "README.md"
requires-python = ">=3.9,<3.15"
requires-python = ">=3.10,<3.15"
license = { text = "Apache-2.0" }
authors = [{ name = "Prefect Technologies, Inc.", email = "[email protected]" }]
classifiers = [
Expand All @@ -16,7 +16,6 @@ classifiers = [
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand All @@ -40,7 +39,6 @@ dependencies = [
"httpcore>=1.0.5,<2.0.0",
"httpx[http2]>=0.23,!=0.23.2",
"humanize>=4.9.0,<5.0.0",
"importlib_metadata>=4.4;python_version<'3.10'",
"jsonpatch>=1.32,<2.0",
"jsonschema>=4.18.0,<5.0.0",
"opentelemetry-api>=1.27.0,<2.0.0",
Expand Down
2 changes: 1 addition & 1 deletion docs/v3/advanced/daemonize-processes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ that poll for scheduled flow runs, including how to:

## Prerequisites

* An environment with a linux operating system with [systemd](https://systemd.io/) and Python 3.9
* An environment with a linux operating system with [systemd](https://systemd.io/) and Python 3.10
or later.
* A superuser account that can run `sudo` commands.
* A Prefect Cloud account, or an instance of a Prefect server running on your network.
Expand Down
2 changes: 1 addition & 1 deletion docs/v3/get-started/install.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ icon: arrow-down-to-line

import Installation from '/snippets/installation.mdx'

Prefect is published as a Python package, which requires Python 3.9 or newer. We recommend installing Prefect in a Python virtual environment.
Prefect is published as a Python package, which requires Python 3.10 or newer. We recommend installing Prefect in a Python virtual environment.

<Installation />

Expand Down
4 changes: 2 additions & 2 deletions old-sqlite.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Build the Python distributable
FROM python:3.9-slim AS python-builder
FROM python:3.10-slim AS python-builder

WORKDIR /opt/prefect

Expand All @@ -21,7 +21,7 @@ RUN uv build --sdist --wheel --out-dir dist && \
mv "dist/prefect-"*".tar.gz" "dist/prefect.tar.gz"

# Final image
FROM python:3.9-slim
FROM python:3.10-slim
COPY --from=python-builder /bin/uv /bin/uv

# Accept SQLite version as build argument
Expand Down
6 changes: 2 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ name = "prefect"
dynamic = ["version"]
description = "Workflow orchestration and management."
readme = "README.md"
requires-python = ">=3.9,<3.15"
requires-python = ">=3.10,<3.15"
license = { text = "Apache-2.0" }
authors = [{ name = "Prefect Technologies, Inc.", email = "[email protected]" }]
classifiers = [
Expand All @@ -16,7 +16,6 @@ classifiers = [
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand Down Expand Up @@ -55,7 +54,6 @@ dependencies = [
"httpcore>=1.0.5,<2.0.0",
"httpx[http2]>=0.23,!=0.23.2",
"humanize>=4.9.0,<5.0.0",
"importlib_metadata>=4.4;python_version<'3.10'",
"jsonpatch>=1.32,<2.0",
"jsonschema>=4.18.0,<5.0.0",
"opentelemetry-api>=1.27.0,<2.0.0",
Expand Down Expand Up @@ -292,7 +290,7 @@ filterwarnings = [
plugins = ["pydantic.mypy"]
ignore_missing_imports = true
follow_imports = "skip"
python_version = "3.9"
python_version = "3.10"

[tool.coverage.run]
branch = true
Expand Down
1 change: 0 additions & 1 deletion scripts/generate_integration_package_tests_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import sys

PYTHON_VERSIONS = [
"3.9",
"3.10",
"3.11",
"3.12",
Expand Down
3 changes: 1 addition & 2 deletions src/integrations/prefect-aws/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
name = "prefect-aws"
description = "Prefect integrations for interacting with Amazon Web Services."
readme = "README.md"
requires-python = ">=3.9"
requires-python = ">=3.10"
license = { text = "Apache License 2.0" }
keywords = ["prefect"]
authors = [{ name = "Prefect Technologies, Inc.", email = "[email protected]" }]
Expand All @@ -16,7 +16,6 @@ classifiers = [
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand Down
3 changes: 1 addition & 2 deletions src/integrations/prefect-azure/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
name = "prefect-azure"
description = "Prefect integrations with Microsoft Azure services"
readme = "README.md"
requires-python = ">=3.9"
requires-python = ">=3.10"
license = { text = "Apache License 2.0" }
keywords = ["prefect"]
authors = [{ name = "Prefect Technologies, Inc.", email = "[email protected]" }]
Expand All @@ -16,7 +16,6 @@ classifiers = [
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand Down
4 changes: 2 additions & 2 deletions src/integrations/prefect-azure/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from unittest.mock import MagicMock
from unittest.mock import AsyncMock, MagicMock

import pytest
from azure.core.exceptions import ResourceExistsError
from azure.storage.blob.aio import ContainerClient
from prefect_azure.credentials import AzureBlobStorageCredentials

from prefect.testing.utilities import AsyncMock, prefect_test_harness
from prefect.testing.utilities import prefect_test_harness


@pytest.fixture(scope="session", autouse=True)
Expand Down
3 changes: 1 addition & 2 deletions src/integrations/prefect-azure/tests/test_aci_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import datetime
import uuid
from typing import Dict, List, Tuple, Union
from unittest.mock import MagicMock, Mock
from unittest.mock import AsyncMock, MagicMock, Mock

import dateutil.parser
import prefect_azure.container_instance
Expand All @@ -29,7 +29,6 @@
from prefect.client.schemas import FlowRun
from prefect.server.schemas.core import Flow
from prefect.settings import get_current_settings
from prefect.testing.utilities import AsyncMock
from prefect.utilities.dockerutils import get_prefect_image_name


Expand Down
3 changes: 1 addition & 2 deletions src/integrations/prefect-azure/tests/test_repository.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import urllib.parse
from pathlib import Path
from tempfile import TemporaryDirectory
from unittest.mock import AsyncMock

import pytest
from prefect_azure.credentials import AzureDevopsCredentials
from prefect_azure.repository import AzureDevopsRepository
from pydantic import SecretStr

from prefect.testing.utilities import AsyncMock


class TestAzureDevopsRepository:
def test_https_repo_without_credentials(self):
Expand Down
3 changes: 1 addition & 2 deletions src/integrations/prefect-bitbucket/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
name = "prefect-bitbucket"
description = "Prefect integrations for working with Bitbucket repositories."
readme = "README.md"
requires-python = ">=3.9"
requires-python = ">=3.10"
license = { text = "Apache License 2.0" }
keywords = ["prefect"]
authors = [{ name = "Prefect Technologies, Inc.", email = "[email protected]" }]
Expand All @@ -16,7 +16,6 @@ classifiers = [
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
from pathlib import Path
from tempfile import TemporaryDirectory
from typing import Set, Tuple
from unittest.mock import AsyncMock

import pytest
from pydantic import VERSION as PYDANTIC_VERSION

from prefect.exceptions import InvalidRepositoryURLError
from prefect.testing.utilities import AsyncMock

if PYDANTIC_VERSION.startswith("2."):
pass
Expand Down
3 changes: 1 addition & 2 deletions src/integrations/prefect-dask/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ dependencies = [
dynamic = ["version"]
description = "Prefect integrations with the Dask execution framework."
readme = "README.md"
requires-python = ">=3.9"
requires-python = ">=3.10"
license = { text = "Apache License 2.0" }
keywords = ["prefect"]
authors = [{ name = "Prefect Technologies, Inc.", email = "[email protected]" }]
Expand All @@ -26,7 +26,6 @@ classifiers = [
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand Down
3 changes: 1 addition & 2 deletions src/integrations/prefect-databricks/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
name = "prefect-databricks"
description = "Prefect integrations with Databricks"
readme = "README.md"
requires-python = ">=3.9"
requires-python = ">=3.10"
license = { text = "Apache License 2.0" }
keywords = ["prefect"]
authors = [{ name = "Prefect Technologies, Inc.", email = "[email protected]" }]
Expand All @@ -16,7 +16,6 @@ classifiers = [
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand Down
3 changes: 1 addition & 2 deletions src/integrations/prefect-dbt/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
name = "prefect-dbt"
description = "Prefect integrations for working with dbt"
readme = "README.md"
requires-python = ">=3.9"
requires-python = ">=3.10"
license = { text = "Apache License 2.0" }
keywords = ["prefect"]
authors = [{ name = "Prefect Technologies, Inc.", email = "[email protected]" }]
Expand All @@ -16,7 +16,6 @@ classifiers = [
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
Expand Down
Loading