diff --git a/.github/workflows/hamilton-lsp.yml b/.github/workflows/hamilton-lsp.yml index 88458b028..52a30198e 100644 --- a/.github/workflows/hamilton-lsp.yml +++ b/.github/workflows/hamilton-lsp.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.10', '3.11', '3.12', '3.13'] + python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] defaults: run: working-directory: dev_tools/language_server diff --git a/.github/workflows/hamilton-main.yml b/.github/workflows/hamilton-main.yml index 0c9db92d6..bbfb79dab 100644 --- a/.github/workflows/hamilton-main.yml +++ b/.github/workflows/hamilton-main.yml @@ -27,6 +27,7 @@ jobs: - '3.11' - '3.12' - '3.13' + - '3.14' env: UV_PRERELEASE: "allow" HAMILTON_TELEMETRY_ENABLED: false diff --git a/.github/workflows/hamilton-sdk.yml b/.github/workflows/hamilton-sdk.yml index daba9beca..139f2060e 100644 --- a/.github/workflows/hamilton-sdk.yml +++ b/.github/workflows/hamilton-sdk.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.10', '3.11', '3.12', '3.13'] + python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] defaults: run: working-directory: ui/sdk diff --git a/contrib/setup.py b/contrib/setup.py index 7662d65c2..ae5bf018e 100644 --- a/contrib/setup.py +++ b/contrib/setup.py @@ -79,6 +79,7 @@ def load_requirements(): "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ], # Note that this feature requires pep8 >= v9 and a version of setup tools greater than the # default version installed with virtualenv. Make sure to update your tools! diff --git a/pyproject.toml b/pyproject.toml index 481c85b0d..79ffe7a7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,8 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13" + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14" ] dependencies = [ "numpy", @@ -73,7 +74,7 @@ pyspark = [ # we have to run these dependencies because Spark does not check to ensure the right target was called "pyspark[pandas_on_spark,sql]", ] -ray = ["ray>=2.0.0", "pyarrow"] +ray = ["ray>=2.0.0; python_version < '3.14'", "pyarrow"] rich = ["rich"] sdk = ["sf-hamilton-sdk"] slack = ["slack-sdk"] @@ -93,7 +94,7 @@ dev = [ "ruff==0.5.7", # this should match `.pre-commit-config.yaml` ] test = [ - "connectorx", + "connectorx; python_version < '3.14'", "dask[complete]", "dask-expr>=1.1.14", "datasets>=2.18.0", # huggingface datasets -- https://github.com/huggingface/datasets/issues/6737#issuecomment-2107336816 @@ -101,22 +102,22 @@ test = [ "dlt", "fsspec", "graphviz", - "kaleido", - "kedro", - "lancedb", - "lightgbm", + "kaleido; python_version < '3.14'", + "kedro; python_version < '3.14'", + "lancedb; python_version < '3.14'", + "lightgbm; python_version < '3.14'", "lxml", "lz4", "matplotlib", - "mlflow", + "mlflow; python_version <= '3.13'", "networkx", "openpyxl", # for excel data loader "pandera[dask]", - "plotly", - "polars", + "plotly; python_version < '3.14'", + "polars; python_version < '3.14'", "pyarrow", "pydantic >=2.0", - "pyreadstat", # for SPSS data loader + "pyreadstat; python_version < '3.14'", # for SPSS data loader "pytest", "pytest-asyncio", "pytest-cov", @@ -124,7 +125,7 @@ test = [ "scikit-learn", "sqlalchemy", "typer", - "xgboost", + "xgboost; python_version < '3.14'", "xlsx2csv", # for excel data loader "xlsxwriter", # Excel export requires 'xlsxwriter' ] diff --git a/tests/conftest.py b/tests/conftest.py index b131ad9a5..0adbe6158 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,7 +15,34 @@ # specific language governing permissions and limitations # under the License. +import sys + from hamilton import telemetry # disable telemetry for all tests! telemetry.disable_telemetry() + +# Skip tests that require packages not yet available on Python 3.14 +collect_ignore = [] +if sys.version_info >= (3, 14): + collect_ignore.extend( + [ + # polars - no Python 3.14 support yet + "plugins/test_polars_extensions.py", + "plugins/test_polars_lazyframe_extensions.py", + "resources/narwhals_example.py", + # plotly - no Python 3.14 support yet + "plugins/test_plotly_extensions.py", + # xgboost - no Python 3.14 support yet + "plugins/test_xgboost_extensions.py", + # lightgbm - no Python 3.14 support yet + "plugins/test_lightgbm_extensions.py", + # mlflow - no Python 3.14 support yet + "plugins/test_mlflow_extension.py", + # kedro - no Python 3.14 support yet + "plugins/test_h_kedro.py", + "plugins/test_kedro_extensions.py", + # lancedb - no Python 3.14 support yet + "plugins/test_huggingface_extensions.py", + ] + ) diff --git a/tests/plugins/test_pandas_extensions.py b/tests/plugins/test_pandas_extensions.py index 244108a18..479b09a07 100644 --- a/tests/plugins/test_pandas_extensions.py +++ b/tests/plugins/test_pandas_extensions.py @@ -18,6 +18,7 @@ import os import pathlib import sqlite3 +import sys from typing import Union from unittest import mock @@ -321,6 +322,7 @@ def test_pandas_table_reader(tmp_path: pathlib.Path) -> None: ] +@pytest.mark.skipif(sys.version_info >= (3, 14), reason="pyreadstat not available on Python 3.14") def test_pandas_spss_reader(tmp_path: pathlib.Path) -> None: import pyreadstat diff --git a/ui/backend/setup.py b/ui/backend/setup.py index 60aed1a88..5b4130b70 100644 --- a/ui/backend/setup.py +++ b/ui/backend/setup.py @@ -58,6 +58,7 @@ def load_requirements(): "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ], # Note that this feature requires pep8 >= v9 and a version of setup tools greater than the # default version installed with virtualenv. Make sure to update your tools! diff --git a/ui/sdk/pyproject.toml b/ui/sdk/pyproject.toml index 695aa83a1..506ee9cb0 100644 --- a/ui/sdk/pyproject.toml +++ b/ui/sdk/pyproject.toml @@ -20,7 +20,8 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13" + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14" ] requires-python = ">=3.10, <4" dynamic = ["dependencies", "optional-dependencies", "version"]