Repository: PrefectHQ/prefect
Pull request: update classifiers and matrix generation for integrations 3.13 support
closes #17784 

Problem statement:
Prefect integrations support for Python3.13
### Describe the current behavior

Hello,
Would it be possible to add support for prefect integrations like prefect-docker and prefect-bitbucket since Prefect supports python3.13 without pendulum dependency?

### Describe the proposed behavior

Remove the pendulum as a dependency and increase Pyhon version range to include 3.13.

### Example Use

_No response_

### Additional context

_No response_

Hints from issue discussion:
Hey @lazargugleta! I think we should be able to add 3.13 support to integration libraries without too much trouble, but it depends on 3.13 support for those library's dependencies. I'll start with `prefect-docker` and `prefect-bitbucket` first to see how it goes.
Thanks for the prompt response! @desertaxle

Commit message: omit ray 3.13

Patch to review:
diff --git a/scripts/generate_integration_package_tests_matrix.py b/scripts/generate_integration_package_tests_matrix.py
index a89195fb73a8..ef24a36f2ee6 100644
--- a/scripts/generate_integration_package_tests_matrix.py
+++ b/scripts/generate_integration_package_tests_matrix.py
@@ -1,21 +1,21 @@
 import json
 import subprocess
 import sys
-from typing import Dict, List, Set
 
 PYTHON_VERSIONS = [
     "3.9",
     "3.10",
     "3.11",
     "3.12",
+    "3.13",
 ]
 
-SKIP_VERSIONS = {
-    "prefect-ray": ["3.12"],
+SKIP_VERSIONS: dict[str, list[str]] = {
+    "prefect-ray": ["3.13"],
 }
 
 
-def get_changed_packages(commit_range: str) -> List[str]:
+def get_changed_packages(commit_range: str) -> list[str]:
     # Get the list of changed files in the specified commit range
     result = subprocess.run(
         ["git", "diff", "--name-only", commit_range],
@@ -25,7 +25,7 @@ def get_changed_packages(commit_range: str) -> List[str]:
     )
     changed_files = result.stdout.split()
     # Filter for src/integrations directories
-    packages: Set[str] = set()
+    packages: set[str] = set()
     for file in changed_files:
         parts = file.split("/")
         if len(parts) > 1 and parts[0] == "src" and parts[1] == "integrations":
@@ -33,8 +33,10 @@ def get_changed_packages(commit_range: str) -> List[str]:
     return list(packages)
 
 
-def generate_matrix(packages: List[str], python_versions: List[str]) -> Dict:
-    matrix = {"include": []}
+def generate_matrix(
+    packages: list[str], python_versions: list[str]
+) -> dict[str, list[dict[str, str]]]:
+    matrix: dict[str, list[dict[str, str]]] = {"include": []}
     for package in packages:
         for version in python_versions:
             if version in SKIP_VERSIONS.get(package, []):
diff --git a/src/integrations/prefect-aws/pyproject.toml b/src/integrations/prefect-aws/pyproject.toml
index 2f8b3df39089..b74a2278759a 100644
--- a/src/integrations/prefect-aws/pyproject.toml
+++ b/src/integrations/prefect-aws/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = [
diff --git a/src/integrations/prefect-azure/pyproject.toml b/src/integrations/prefect-azure/pyproject.toml
index 4327b894bbc7..76a0aa36d79c 100644
--- a/src/integrations/prefect-azure/pyproject.toml
+++ b/src/integrations/prefect-azure/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = [
diff --git a/src/integrations/prefect-bitbucket/pyproject.toml b/src/integrations/prefect-bitbucket/pyproject.toml
index 619b1200ff93..0ac45b798f02 100644
--- a/src/integrations/prefect-bitbucket/pyproject.toml
+++ b/src/integrations/prefect-bitbucket/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = [
diff --git a/src/integrations/prefect-dask/pyproject.toml b/src/integrations/prefect-dask/pyproject.toml
index 313f800203f3..4d825657d824 100644
--- a/src/integrations/prefect-dask/pyproject.toml
+++ b/src/integrations/prefect-dask/pyproject.toml
@@ -28,6 +28,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 
diff --git a/src/integrations/prefect-databricks/pyproject.toml b/src/integrations/prefect-databricks/pyproject.toml
index fb8998ec83e3..7165bf7eb176 100644
--- a/src/integrations/prefect-databricks/pyproject.toml
+++ b/src/integrations/prefect-databricks/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = ["prefect>=3.0.0"]
diff --git a/src/integrations/prefect-dbt/pyproject.toml b/src/integrations/prefect-dbt/pyproject.toml
index 85a8fab05e1e..af631a2c3c80 100644
--- a/src/integrations/prefect-dbt/pyproject.toml
+++ b/src/integrations/prefect-dbt/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = [
diff --git a/src/integrations/prefect-docker/pyproject.toml b/src/integrations/prefect-docker/pyproject.toml
index d132810192ee..df4bb64919c4 100644
--- a/src/integrations/prefect-docker/pyproject.toml
+++ b/src/integrations/prefect-docker/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = ["prefect>=3.1.1", "docker>=6.1.1", "exceptiongroup"]
diff --git a/src/integrations/prefect-email/pyproject.toml b/src/integrations/prefect-email/pyproject.toml
index df0348df46d7..a02ec3ce07c8 100644
--- a/src/integrations/prefect-email/pyproject.toml
+++ b/src/integrations/prefect-email/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = ["prefect>=3.0.0"]
diff --git a/src/integrations/prefect-gcp/pyproject.toml b/src/integrations/prefect-gcp/pyproject.toml
index e1c2d25c5474..ab043697f194 100644
--- a/src/integrations/prefect-gcp/pyproject.toml
+++ b/src/integrations/prefect-gcp/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = [
diff --git a/src/integrations/prefect-github/pyproject.toml b/src/integrations/prefect-github/pyproject.toml
index 6c3f62f028dd..f079c695f18a 100644
--- a/src/integrations/prefect-github/pyproject.toml
+++ b/src/integrations/prefect-github/pyproject.toml
@@ -22,6 +22,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 
diff --git a/src/integrations/prefect-gitlab/pyproject.toml b/src/integrations/prefect-gitlab/pyproject.toml
index e23e846c197b..8400d3fb5844 100644
--- a/src/integrations/prefect-gitlab/pyproject.toml
+++ b/src/integrations/prefect-gitlab/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = ["prefect>=3.0.0", "python-gitlab>=3.12.0", "tenacity>=8.2.3"]
diff --git a/src/integrations/prefect-kubernetes/pyproject.toml b/src/integrations/prefect-kubernetes/pyproject.toml
index 2aba8d92d587..51cf3e852d33 100644
--- a/src/integrations/prefect-kubernetes/pyproject.toml
+++ b/src/integrations/prefect-kubernetes/pyproject.toml
@@ -28,6 +28,7 @@ classifiers = [
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
+    "Programming Language :: Python :: 3.13",
     "Topic :: Software Development :: Libraries",
 ]
 dynamic = ["version"]
diff --git a/src/integrations/prefect-ray/pyproject.toml b/src/integrations/prefect-ray/pyproject.toml
index b5a27c48df45..8fdb31717afa 100644
--- a/src/integrations/prefect-ray/pyproject.toml
+++ b/src/integrations/prefect-ray/pyproject.toml
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
 name = "prefect-ray"
 description = "Prefect integrations with the Ray execution framework."
 readme = "README.md"
-requires-python = ">=3.9"
+requires-python = ">=3.9,!=3.13"
 license = { text = "Apache License 2.0" }
 keywords = ["prefect"]
 authors = [{ name = "Prefect Technologies, Inc.", email = "help@prefect.io" }]
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = ["prefect>=3.3.1", "ray[default]>=2.0.0"]
diff --git a/src/integrations/prefect-redis/pyproject.toml b/src/integrations/prefect-redis/pyproject.toml
index 99a8664d4e73..533305681589 100644
--- a/src/integrations/prefect-redis/pyproject.toml
+++ b/src/integrations/prefect-redis/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = ["prefect>=3.0.0", "redis>=5.0.1"]
diff --git a/src/integrations/prefect-shell/pyproject.toml b/src/integrations/prefect-shell/pyproject.toml
index 646c970e6e98..7da594d08ad5 100644
--- a/src/integrations/prefect-shell/pyproject.toml
+++ b/src/integrations/prefect-shell/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = ["prefect>=3.0.0"]
diff --git a/src/integrations/prefect-slack/pyproject.toml b/src/integrations/prefect-slack/pyproject.toml
index bc3e367b7462..f984d037cb9a 100644
--- a/src/integrations/prefect-slack/pyproject.toml
+++ b/src/integrations/prefect-slack/pyproject.toml
@@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 dependencies = ["aiohttp", "slack_sdk>=3.15.1", "prefect>=3.0.0"]
diff --git a/src/integrations/prefect-snowflake/pyproject.toml b/src/integrations/prefect-snowflake/pyproject.toml
index 0702e7013ca9..71b16d2ab4f6 100644
--- a/src/integrations/prefect-snowflake/pyproject.toml
+++ b/src/integrations/prefect-snowflake/pyproject.toml
@@ -4,7 +4,11 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "prefect-snowflake"
-dependencies = ["snowflake>=1.2.0", "snowflake-connector-python>=3.0.4", "prefect>=3.0.0"]
+dependencies = [
+  "snowflake>=1.2.0",
+  "snowflake-connector-python>=3.0.4",
+  "prefect>=3.0.0",
+]
 dynamic = ["version"]
 description = "Prefect integrations for interacting with Snowflake"
 readme = "README.md"
@@ -22,6 +26,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 
diff --git a/src/integrations/prefect-sqlalchemy/pyproject.toml b/src/integrations/prefect-sqlalchemy/pyproject.toml
index 6db9c1e0838f..4b1f5e2b463c 100644
--- a/src/integrations/prefect-sqlalchemy/pyproject.toml
+++ b/src/integrations/prefect-sqlalchemy/pyproject.toml
@@ -22,6 +22,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
   "Topic :: Software Development :: Libraries",
 ]
 


Code review comments:
diff_hunk: @@ -20,6 +20,7 @@ classifiers = [
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
path: src/integrations/prefect-ray/pyproject.toml
text: @user1:
We should keep this out for now right?
```suggestion
```

@author:
ah yes indeed