Skip to content

Instantly share code, notes, and snippets.

@cmpadden
Created December 9, 2025 20:39
Show Gist options
  • Select an option

  • Save cmpadden/fe6fd88b6c7cd4961d6fe17221fe7847 to your computer and use it in GitHub Desktop.

Select an option

Save cmpadden/fe6fd88b6c7cd4961d6fe17221fe7847 to your computer and use it in GitHub Desktop.
git diff colton/python-3-14 "12-08-support_3.14" | pbcopy
diff --git a/docs/docs/getting-started/installation.md b/docs/docs/getting-started/installation.md
index ec6171f82d..88ec13bfcf 100644
--- a/docs/docs/getting-started/installation.md
+++ b/docs/docs/getting-started/installation.md
@@ -8,7 +8,7 @@ import InstallUv from '@site/docs/partials/\_InstallUv.md';
:::note
-To follow the steps in this guide, you'll need to install [Python 3.10](https://www.python.org/downloads/) or higher. **Python 3.14 is recommended**.
+To follow the steps in this guide, you'll need to install [Python 3.10](https://www.python.org/downloads/) or higher. **Python 3.13 is recommended**.
:::
diff --git a/docs/sphinx/_ext/sphinx-click/tox.ini b/docs/sphinx/_ext/sphinx-click/tox.ini
index 6922d8b16c..21d9c2f79c 100644
--- a/docs/sphinx/_ext/sphinx-click/tox.ini
+++ b/docs/sphinx/_ext/sphinx-click/tox.ini
@@ -1,6 +1,6 @@
[tox]
minversion = 2.0
-envlist = py{310,311,312,313}-click{8,8-async},style,docs
+envlist = py{310,311,312,313,314}-click{8,8-async},style,docs
[testenv]
passenv =
@@ -47,6 +47,7 @@ python =
3.11: py311
3.12: py312
3.13: py313
+ 3.14: py314
[coverage:run]
branch = True
diff --git a/docs/sphinx/_ext/sphinx-mdx-builder/tox.ini b/docs/sphinx/_ext/sphinx-mdx-builder/tox.ini
index 201f0727fd..0b996e6fee 100644
--- a/docs/sphinx/_ext/sphinx-mdx-builder/tox.ini
+++ b/docs/sphinx/_ext/sphinx-mdx-builder/tox.ini
@@ -1,11 +1,12 @@
[tox]
minversion = 4
-envlist =
+envlist =
python3.9-sphinx{7,8}
python3.10-sphinx{7,8}
python3.11-sphinx{7,8}
python3.12-sphinx{7,8}
python3.13-sphinx{7,8}
+ python3.14-sphinx{7,8}
[testenv]
@@ -21,6 +22,7 @@ basepython =
python3.11: python3.11
python3.12: python3.12
python3.13: python3.13
+ python3.14: python3.14
deps =
pytest
diff --git a/examples/components_yaml_checks_dsl/uv.lock b/examples/components_yaml_checks_dsl/uv.lock
index 67d109a447..f41891fd7d 100644
--- a/examples/components_yaml_checks_dsl/uv.lock
+++ b/examples/components_yaml_checks_dsl/uv.lock
@@ -1,6 +1,6 @@
version = 1
revision = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.13"
resolution-markers = [
"python_full_version >= '3.12'",
"python_full_version == '3.11.*'",
diff --git a/examples/docs_projects/project_ask_ai_dagster/uv.lock b/examples/docs_projects/project_ask_ai_dagster/uv.lock
index 9d1ac3471c..886e888613 100644
--- a/examples/docs_projects/project_ask_ai_dagster/uv.lock
+++ b/examples/docs_projects/project_ask_ai_dagster/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.14"
resolution-markers = [
"python_full_version < '3.11'",
"python_full_version == '3.11.*'",
diff --git a/examples/docs_projects/project_atproto_dashboard/uv.lock b/examples/docs_projects/project_atproto_dashboard/uv.lock
index c363025be6..7e95e016dc 100644
--- a/examples/docs_projects/project_atproto_dashboard/uv.lock
+++ b/examples/docs_projects/project_atproto_dashboard/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.14"
resolution-markers = [
"python_full_version < '3.10'",
"python_full_version == '3.10.*'",
diff --git a/examples/docs_projects/project_components_pdf_extraction/uv.lock b/examples/docs_projects/project_components_pdf_extraction/uv.lock
index d28636c481..38f888fe26 100644
--- a/examples/docs_projects/project_components_pdf_extraction/uv.lock
+++ b/examples/docs_projects/project_components_pdf_extraction/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.13"
resolution-markers = [
"python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' and sys_platform == 'darwin'",
"python_full_version < '3.10' and platform_machine == 'arm64' and platform_system != 'Darwin' and sys_platform == 'darwin'",
diff --git a/examples/docs_projects/project_dbt/pyproject.toml b/examples/docs_projects/project_dbt/pyproject.toml
index 64a13e6beb..2f444290bd 100644
--- a/examples/docs_projects/project_dbt/pyproject.toml
+++ b/examples/docs_projects/project_dbt/pyproject.toml
@@ -33,3 +33,4 @@ registry_modules = [
"project_dbt.components.*",
]
+
diff --git a/examples/docs_projects/project_dbt/uv.lock b/examples/docs_projects/project_dbt/uv.lock
index 74b2ef2415..40f81282e1 100644
--- a/examples/docs_projects/project_dbt/uv.lock
+++ b/examples/docs_projects/project_dbt/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.14"
resolution-markers = [
"python_full_version < '3.10'",
"python_full_version == '3.10.*'",
diff --git a/examples/docs_projects/project_dspy/pyproject.toml b/examples/docs_projects/project_dspy/pyproject.toml
index 3294220299..149ee40473 100644
--- a/examples/docs_projects/project_dspy/pyproject.toml
+++ b/examples/docs_projects/project_dspy/pyproject.toml
@@ -35,4 +35,4 @@ registry_modules = ["project_dspy.components.*"]
# Enable additional lint rule set: "I" = isort (import sorting) rules.
lint.extend-select = ["I"]
-extend-exclude = ["*.ipynb"] # Ignore Jupyter notebooks
+extend-exclude = ["*.ipynb"] # Ignore Jupyter notebooks
\ No newline at end of file
diff --git a/examples/docs_projects/project_dspy/uv.lock b/examples/docs_projects/project_dspy/uv.lock
index 1117874d0d..6c41cc0a54 100644
--- a/examples/docs_projects/project_dspy/uv.lock
+++ b/examples/docs_projects/project_dspy/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.14"
resolution-markers = [
"python_full_version < '3.10'",
"python_full_version == '3.10.*'",
diff --git a/examples/docs_projects/project_etl_tutorial/uv.lock b/examples/docs_projects/project_etl_tutorial/uv.lock
index f31ef7d85e..eacb258809 100644
--- a/examples/docs_projects/project_etl_tutorial/uv.lock
+++ b/examples/docs_projects/project_etl_tutorial/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.14"
resolution-markers = [
"python_full_version < '3.11'",
"python_full_version == '3.11.*'",
diff --git a/examples/docs_projects/project_mini/uv.lock b/examples/docs_projects/project_mini/uv.lock
index f7bfe599a7..c9c319bfb8 100644
--- a/examples/docs_projects/project_mini/uv.lock
+++ b/examples/docs_projects/project_mini/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.14"
resolution-markers = [
"python_full_version < '3.10'",
"python_full_version == '3.10.*'",
diff --git a/examples/docs_projects/project_ml/pyproject.toml b/examples/docs_projects/project_ml/pyproject.toml
index 57c0395115..21cb9f21fe 100644
--- a/examples/docs_projects/project_ml/pyproject.toml
+++ b/examples/docs_projects/project_ml/pyproject.toml
@@ -28,4 +28,4 @@ directory_type = "project"
[tool.dg.project]
root_module = "project_ml"
-registry_modules = ["project_ml.components.*"]
+registry_modules = ["project_ml.components.*"]
\ No newline at end of file
diff --git a/examples/docs_projects/project_ml/uv.lock b/examples/docs_projects/project_ml/uv.lock
index a813d31509..3270e8701e 100644
--- a/examples/docs_projects/project_ml/uv.lock
+++ b/examples/docs_projects/project_ml/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.14"
resolution-markers = [
"python_full_version < '3.10'",
"python_full_version == '3.10.*'",
diff --git a/examples/docs_snippets/docs_snippets/guides/tutorials/dagster_tutorial/uv.lock b/examples/docs_snippets/docs_snippets/guides/tutorials/dagster_tutorial/uv.lock
index cb63e5d17e..dad7d1f41b 100644
--- a/examples/docs_snippets/docs_snippets/guides/tutorials/dagster_tutorial/uv.lock
+++ b/examples/docs_snippets/docs_snippets/guides/tutorials/dagster_tutorial/uv.lock
@@ -1,5 +1,5 @@
version = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.14"
resolution-markers = [
"python_full_version < '3.10'",
"python_full_version == '3.10.*'",
diff --git a/examples/docs_snippets/docs_snippets_tests/snippet_checks/guides/dg/test_migrating_project/my-existing-project-uv/uv.lock b/examples/docs_snippets/docs_snippets_tests/snippet_checks/guides/dg/test_migrating_project/my-existing-project-uv/uv.lock
index 71f22455f7..6693c5f5b0 100644
--- a/examples/docs_snippets/docs_snippets_tests/snippet_checks/guides/dg/test_migrating_project/my-existing-project-uv/uv.lock
+++ b/examples/docs_snippets/docs_snippets_tests/snippet_checks/guides/dg/test_migrating_project/my-existing-project-uv/uv.lock
@@ -1,6 +1,6 @@
version = 1
revision = 1
-requires-python = ">=3.9, <3.15"
+requires-python = ">=3.9, <3.13"
resolution-markers = [
"python_full_version >= '3.12'",
"python_full_version == '3.11.*'",
diff --git a/examples/quickstart_etl/pyproject.toml b/examples/quickstart_etl/pyproject.toml
index 3d582303a4..64aa607a98 100644
--- a/examples/quickstart_etl/pyproject.toml
+++ b/examples/quickstart_etl/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "quickstart_etl"
-requires-python = ">=3.10,<3.14"
+requires-python = ">=3.10,<3.15"
version = "0.1.0"
dependencies = [
"dagster",
diff --git a/js_modules/dagster-ui/packages/ui-core/src/assets/LaunchAssetExecutionButton.tsx b/js_modules/dagster-ui/packages/ui-core/src/assets/LaunchAssetExecutionButton.tsx
index 276b0ec691..e7ca007dec 100644
--- a/js_modules/dagster-ui/packages/ui-core/src/assets/LaunchAssetExecutionButton.tsx
+++ b/js_modules/dagster-ui/packages/ui-core/src/assets/LaunchAssetExecutionButton.tsx
@@ -14,6 +14,7 @@ import uniq from 'lodash/uniq';
import React, {useContext, useMemo, useState} from 'react';
import {Link} from 'react-router-dom';
import {observeEnabled} from 'shared/app/observeEnabled.oss';
+import {MaterializeButton} from 'shared/assets/MaterializeButton.oss';
import {useLaunchWithTelemetry} from 'shared/launchpad/useLaunchWithTelemetry.oss';
import {ASSET_NODE_CONFIG_FRAGMENT} from './AssetConfig';
@@ -318,7 +319,7 @@ export const LaunchAssetExecutionButton = ({
{firstOption.icon}
</UnstyledButton>
) : (
- <Button
+ <MaterializeButton
intent={primary ? 'primary' : undefined}
data-testid={testId('materialize-button')}
onClick={(e) => firstAction(firstOption.assetKeys, e)}
@@ -337,7 +338,7 @@ export const LaunchAssetExecutionButton = ({
}
>
{firstOption.label}
- </Button>
+ </MaterializeButton>
)}
</Tooltip>
diff --git a/js_modules/dagster-ui/packages/ui-core/src/assets/MaterializeButton.oss.tsx b/js_modules/dagster-ui/packages/ui-core/src/assets/MaterializeButton.oss.tsx
new file mode 100644
index 0000000000..67c9bfb21c
--- /dev/null
+++ b/js_modules/dagster-ui/packages/ui-core/src/assets/MaterializeButton.oss.tsx
@@ -0,0 +1,3 @@
+import {Button} from '@dagster-io/ui-components';
+
+export const MaterializeButton = Button;
diff --git a/python_modules/automation/automation/docker/images/buildkite-test/Dockerfile b/python_modules/automation/automation/docker/images/buildkite-test/Dockerfile
index 0fdf60523f..b3ead77d2a 100644
--- a/python_modules/automation/automation/docker/images/buildkite-test/Dockerfile
+++ b/python_modules/automation/automation/docker/images/buildkite-test/Dockerfile
@@ -56,9 +56,9 @@ RUN apt-get update -yqq \
pkg-config
# Install Java (required by pyspark) - Java 17 for compatibility with both Spark 3 and 4
-COPY --from=openjdk:17-slim-buster /usr/local/openjdk-17 /usr/local/openjdk-17
-ENV JAVA_HOME /usr/local/openjdk-17
-RUN update-alternatives --install /usr/bin/java java /usr/local/openjdk-17/bin/java 1
+COPY --from=eclipse-temurin:17-jdk-jammy /opt/java/openjdk /opt/java/openjdk
+ENV JAVA_HOME /opt/java/openjdk
+RUN update-alternatives --install /usr/bin/java java /opt/java/openjdk/bin/java 1
# Install various packages used in running/installing/testing Dagster:
# - git/make (cloning dagster, running checks defined in Makefile)
@@ -66,7 +66,7 @@ RUN update-alternatives --install /usr/bin/java java /usr/local/openjdk-17/bin/j
# - assorted others-- some may no longer be required, but leaving in place for now
#
# deb.nodesource script adds node source to apt
-RUN curl -sL https://deb.nodesource.com/setup_21.x | bash - \
+RUN curl -sL https://deb.nodesource.com/setup_22.x | bash - \
# Add yarn GPG key and apt source
&& curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | \
gpg --dearmor -o /usr/share/keyrings/yarnkey.gpg \
@@ -90,7 +90,6 @@ RUN curl -sL https://deb.nodesource.com/setup_21.x | bash - \
rabbitmq-server \
rsync \
ssh \
- software-properties-common \
unzip \
wget \
xz-utils \
@@ -107,8 +106,9 @@ RUN wget https://github.com/fossas/fossa-cli/releases/download/v${FOSSA_VERSION}
# Install Google Cloud SDK
# https://cloud.google.com/sdk/docs/install#deb
-# Add Google Cloud GPG key and apt source
-RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - \
+# Add Google Cloud GPG key and apt source (using modern method without deprecated apt-key)
+RUN curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
+ gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \
tee -a /etc/apt/sources.list.d/google-cloud-sdk.list > /dev/null \
&& apt-get -yqq update \
diff --git a/python_modules/automation/automation/docker/images/buildkite-test/last_updated.yaml b/python_modules/automation/automation/docker/images/buildkite-test/last_updated.yaml
index 7ae3425e87..e9cd6c505c 100644
--- a/python_modules/automation/automation/docker/images/buildkite-test/last_updated.yaml
+++ b/python_modules/automation/automation/docker/images/buildkite-test/last_updated.yaml
@@ -1,6 +1,6 @@
-"3.10": 2025-07-23T160819
-"3.11": 2025-07-23T160819
-"3.12": 2025-07-23T160819
-"3.13": 2025-07-23T160819
-"3.14": 2025-07-23T160819
-"3.9": 2025-07-23T160819
+'3.10': 2025-07-23T160819
+'3.11': 2025-07-23T160819
+'3.12': 2025-07-23T160819
+'3.13': 2025-07-23T160819
+'3.14': 2025-12-09T171311
+'3.9': 2025-07-23T160819
diff --git a/python_modules/automation/automation/docker/images/test-project-base/last_updated.yaml b/python_modules/automation/automation/docker/images/test-project-base/last_updated.yaml
index f1a601643d..cbf92135fc 100644
--- a/python_modules/automation/automation/docker/images/test-project-base/last_updated.yaml
+++ b/python_modules/automation/automation/docker/images/test-project-base/last_updated.yaml
@@ -1,6 +1,6 @@
-"3.10": 2025-07-02T150642
-"3.11": 2025-07-02T150642
-"3.12": 2025-07-02T150642
-"3.13": 2025-07-02T150642
-"3.14": 2025-07-02T150642
-"3.9": 2025-07-02T150642
+'3.10': 2025-07-02T150642
+'3.11': 2025-07-02T150642
+'3.12': 2025-07-02T150642
+'3.13': 2025-07-02T150642
+'3.14': 2025-12-09T171541
+'3.9': 2025-07-02T150642
diff --git a/python_modules/dagster/README.md b/python_modules/dagster/README.md
index 1a4da609fe..fdde743306 100644
--- a/python_modules/dagster/README.md
+++ b/python_modules/dagster/README.md
@@ -71,7 +71,7 @@ Dagster is built to be used at every stage of the data development lifecycle - l
If you're new to Dagster, we recommend checking out the [docs](https://docs.dagster.io) or following the hands-on [tutorial](https://docs.dagster.io/etl-pipeline-tutorial/).
-Dagster is available on PyPI and officially supports Python 3.9 through Python 3.13.
+Dagster is available on PyPI and officially supports Python 3.9 through Python 3.14.
```bash
pip install dagster dagster-webserver
diff --git a/python_modules/libraries/create-dagster/setup.py b/python_modules/libraries/create-dagster/setup.py
index 057190812d..a351721b1e 100644
--- a/python_modules/libraries/create-dagster/setup.py
+++ b/python_modules/libraries/create-dagster/setup.py
@@ -29,6 +29,7 @@ def get_version() -> str:
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
],
diff --git a/python_modules/libraries/dagster-cloud-cli/dagster_cloud_cli_tests/test_pyproject_toml_support.py b/python_modules/libraries/dagster-cloud-cli/dagster_cloud_cli_tests/test_pyproject_toml_support.py
index 900984066e..90a4fd059f 100644
--- a/python_modules/libraries/dagster-cloud-cli/dagster_cloud_cli_tests/test_pyproject_toml_support.py
+++ b/python_modules/libraries/dagster-cloud-cli/dagster_cloud_cli_tests/test_pyproject_toml_support.py
@@ -580,7 +580,7 @@ def test_get_pyproject_deps_requirements_multi_location_scenario() -> None:
pyproject_content = """
[project]
name = "location1"
- requires-python = ">=3.9,<3.14"
+ requires-python = ">=3.9,<3.15"
version = "0.1.0"
dependencies = [
"dagster>=1.0.0",
diff --git a/python_modules/libraries/dagster-cloud-cli/setup.py b/python_modules/libraries/dagster-cloud-cli/setup.py
index dde0eaed65..4b6b9d51aa 100644
--- a/python_modules/libraries/dagster-cloud-cli/setup.py
+++ b/python_modules/libraries/dagster-cloud-cli/setup.py
@@ -29,6 +29,7 @@ def get_version() -> str:
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
],
diff --git a/python_modules/libraries/dagster-dg-cli/setup.py b/python_modules/libraries/dagster-dg-cli/setup.py
index 3f7f7f1d29..f709c9cba9 100644
--- a/python_modules/libraries/dagster-dg-cli/setup.py
+++ b/python_modules/libraries/dagster-dg-cli/setup.py
@@ -29,6 +29,7 @@ def get_version() -> str:
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
],
diff --git a/scripts/install_dev_python_modules.py b/scripts/install_dev_python_modules.py
index 0e706cb586..79e4b76778 100644
--- a/scripts/install_dev_python_modules.py
+++ b/scripts/install_dev_python_modules.py
@@ -127,6 +127,50 @@ def main(
"python_modules/libraries/dagster-airflow",
]
+ # Python 3.14 exclusions - packages that depend on libraries without 3.14 wheels yet
+ if sys.version_info >= (3, 14):
+ # Many packages with native dependencies don't have Python 3.14 wheels yet
+ # This list should be reduced as more packages add 3.14 support
+ python_314_exclusions = [
+ # Polars doesn't have Python 3.14 wheels yet
+ "dagster-deltalake-polars",
+ "dagster-snowflake-polars",
+ # Delta-rs/deltalake doesn't have Python 3.14 wheels yet
+ "dagster-deltalake",
+ # Great Expectations doesn't have Python 3.14 wheels yet
+ "dagster-ge",
+ # MLflow doesn't have Python 3.14 wheels yet
+ "dagster-mlflow",
+ # Pandera doesn't have Python 3.14 wheels yet
+ "dagster-pandera",
+ # Sling doesn't have Python 3.14 wheels yet
+ "dagster-sling",
+ "dagster-embedded-elt", # depends on sling
+ # PySpark doesn't have Python 3.14 wheels yet
+ "dagster-pyspark",
+ "dagster-gcp-pyspark",
+ "dagster-spark", # might pull in pyspark
+ # Datahub doesn't have Python 3.14 wheels yet
+ "dagster-datahub",
+ # Papermill/dagstermill has issues on Python 3.14
+ "dagstermill",
+ # Airflow-based packages (airflow doesn't support 3.14 yet)
+ "dagster-airlift",
+ # Dask might not have Python 3.14 wheels yet
+ "dagster-dask",
+ # Databricks SDK might not have Python 3.14 wheels yet
+ "dagster-databricks",
+ # DLT might not have Python 3.14 wheels yet
+ "dagster-dlt",
+ # Snowflake connector doesn't have Python 3.14 wheels yet
+ "dagster-snowflake",
+ ]
+ editable_target_paths = [
+ p
+ for p in editable_target_paths
+ if not any(exclude in p for exclude in python_314_exclusions)
+ ]
+
install_targets += list(
itertools.chain.from_iterable(
zip(["-e"] * len(editable_target_paths), editable_target_paths)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment