diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 307cc6cab..f2c74ca04 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -65,7 +65,7 @@ jobs: run: | MATRIX=$(jq -nsc '{ "os": ["ubuntu-latest", "macos-latest", "windows-latest"], - "environment": ["test-310", "test-313"], + "environment": ["test-310", "test-313", "test-314"], "exclude": [ { "environment": "test-310", @@ -79,7 +79,7 @@ jobs: run: | MATRIX=$(jq -nsc '{ "os": ["ubuntu-latest", "macos-latest", "windows-latest"], - "environment": ["test-310", "test-313"], + "environment": ["test-310", "test-313", "test-314"], "include": [ { "environment": "test-311", @@ -131,6 +131,7 @@ jobs: - name: Test Unit run: pixi run -e ${{ matrix.environment }} test-unit-cov - name: Test Geo + if: ${{ matrix.environment != 'test-314' }} run: pixi run -e ${{ matrix.environment }} test-unit-geo-cov - name: Test Examples run: | diff --git a/doc/conftest.py b/doc/conftest.py index f41d89855..51ea6dad1 100644 --- a/doc/conftest.py +++ b/doc/conftest.py @@ -1,5 +1,4 @@ import os -import sys from importlib.util import find_spec @@ -21,27 +20,42 @@ if os.getenv('HVPLOT_INCLUDE_SLOW_EXAMPLES'): collect_ignore_glob.extend(SLOW_EXAMPLES) -# On MacOs, Python 3.12 and 3.13, got the following error running this: -# `pos = layout(G)` -# => OSError: Format: "dot" not recognized. No formats found. -# Fixed locally by running `dot -c` -if not find_spec('pygraphviz') or ( - sys.platform == 'darwin' and sys.version_info[:2] in [(3, 12), (3, 13)] -): - collect_ignore_glob += [ - 'user_guide/NetworkX.ipynb', - ] -if not find_spec('geoviews'): +if not find_spec('geoviews'): # geo examples collect_ignore_glob += [ 'tutorials/getting_started.ipynb', 'gallery/geospatial/*.ipynb', 'gallery/gridded/rgb_satellite_imagery.ipynb', + 'ref/api/manual/hvplot.hvPlot.paths.ipynb', + 'ref/api/manual/hvplot.hvPlot.points.ipynb', + 'ref/api/manual/hvplot.hvPlot.polygons.ipynb', + 'ref/api/manual/hvplot.hvPlot.quadmesh.ipynb', + 'ref/api/manual/hvplot.hvPlot.rgb.ipynb', + 'ref/api/manual/hvplot.hvPlot.vectorfield.ipynb', + 'ref/data_libraries.ipynb', + 'ref/plotting_options/geographic.ipynb', 'user_guide/Explorer.ipynb', 'user_guide/Geographic_Data.ipynb', 'user_guide/Integrations.ipynb', ] +if not find_spec('datashader'): + collect_ignore_glob += [ + 'ref/api/manual/hvplot.plotting.scatter_matrix.ipynb', + 'ref/plotting_options/resampling.ipynb', + 'user_guide/Gridded_Data.ipynb', + 'user_guide/Large_Timeseries.ipynb', + 'user_guide/Plotting.ipynb', + 'user_guide/Plotting_with_Matplotlib.ipynb', + 'user_guide/Plotting_with_Plotly.ipynb', + ] + +if not find_spec('streamz'): + collect_ignore_glob += [ + 'ref/plotting_options/streaming.ipynb', + ] + + try: import ibis import duckdb @@ -52,16 +66,17 @@ except ImportError: pass -try: - webdriver_control.create() -except RuntimeError: - # hvplot.save() with bokeh - collect_ignore_glob += [ - 'user_guide/Viewing.ipynb', - 'user_guide/NetworkX.ipynb', - ] -finally: - webdriver_control.cleanup() +if find_spec('selenium'): + try: + webdriver_control.create() + except RuntimeError: + # hvplot.save() with bokeh + collect_ignore_glob += [ + 'user_guide/Viewing.ipynb', + 'user_guide/NetworkX.ipynb', + ] + finally: + webdriver_control.cleanup() if Version(dask.__version__).release < (2025, 1, 0): diff --git a/pixi.toml b/pixi.toml index 09838cd59..427011626 100644 --- a/pixi.toml +++ b/pixi.toml @@ -33,8 +33,12 @@ no-default-feature = true features = ["py313", "required", "test-core", "test", "example", "geo", "graphviz", "test-example"] no-default-feature = true +[environments.test-314] +features = ["py314", "required", "test-core", "test-314", "example-314", "graphviz", "test-example"] # geo +no-default-feature = true + [environments.test-core] -features = ["py313", "required", "test-core"] +features = ["py314", "required", "test-core"] no-default-feature = true [environments.docs] @@ -73,26 +77,28 @@ PYTHONIOENCODING = "utf-8" [feature.py310.dependencies] python = "3.10.*" -bokeh_sampledata = "*" [feature.py311.dependencies] python = "3.11.*" -bokeh_sampledata = "*" [feature.py312.dependencies] python = "3.12.*" -bokeh_sampledata = "*" [feature.py312.activation.env] COVERAGE_CORE = "sysmon" [feature.py313.dependencies] python = "3.13.*" -bokeh_sampledata = "*" [feature.py313.activation.env] COVERAGE_CORE = "sysmon" +[feature.py314.dependencies] +python = "3.14.*" + +[feature.py314.activation.env] +COVERAGE_CORE = "sysmon" + # =================== DEV =================== [feature.dev.dependencies] @@ -143,6 +149,39 @@ xyzservices = ">=2022.9.0" geodatasets = ">=2023.12.0" hvsampledata = ">=0.1.4a2" +[feature.example-314.dependencies] +dask = "*" # dask[dataframe] +# datashader = ">=0.6.5" +duckdb = "*" +qpd = ">=0.4.4" +fugue-sql-antlr = ">=0.2.0" +sqlglot = "*" +jinja2 = "*" +fugue = "*" +ibis-duckdb = ">=9.0.0" # ibis-framework[duckdb] +intake-parquet = ">=0.2.3" +intake-xarray = ">=0.5.0,<2" +intake = ">=0.6.5,<2.0.0" +ipywidgets = "*" +networkx = ">=2.6.3" +matplotlib = "*" +notebook = ">=5.4" +# numba = ">=0.51.0" +pillow = ">=8.2.0" +plotly = "*" +polars = "*" +pooch = ">=1.6.0" +s3fs = ">=2022.1.0" +scikit-image = ">=0.17.2" +scikit-learn = ">=1.4.0" +scipy = ">=1.5.3" +selenium = ">=3.141.0" +# streamz = ">=0.3.0" +xarray = ">=0.18.2" +xyzservices = ">=2022.9.0" +geodatasets = ">=2023.12.0" +hvsampledata = ">=0.1.4a2" + # =================== TESTS =================== [feature.test-core.dependencies] @@ -159,7 +198,7 @@ pytest = "*" ruff = "*" scipy = "*" xarray = "*" -# bokeh_sampledata = "*" (only available starting from Python 3.10) +bokeh_sampledata = "*" psutil = "*" cftime = "*" numpydoc = "*" @@ -188,6 +227,18 @@ dask = "*" spatialpandas = "*" duckdb = "*" +[feature.test-314.dependencies] +qpd = ">=0.4.4" +fugue-sql-antlr = ">=0.2.0" +sqlglot = "*" +jinja2 = "*" +fugue = "*" +ibis-duckdb = ">=9.0.0" # ibis-framework[duckdb] +polars = "*" +dask = "*" +# spatialpandas = "*" +duckdb = "*" + [feature.geo.dependencies] # Geo dependencies are always a little special. cartopy = "*" @@ -208,6 +259,11 @@ test-unit-geo = 'pytest -v hvplot --geo' test-unit-cov = 'pytest -v hvplot --cov=hvplot --cov-branch --cov-append' test-unit-geo-cov = 'pytest -v hvplot --geo --cov=hvplot --cov-branch --cov-append' +[feature.test-314.tasks] +test-unit-geo = 'pytest -v hvplot --geo' +test-unit-cov = 'pytest -v hvplot --cov=hvplot --cov-branch --cov-append' +test-unit-geo-cov = 'pytest -v hvplot --geo --cov=hvplot --cov-branch --cov-append' + [feature.test-core.tasks] test-unit = 'pytest -v hvplot' diff --git a/pyproject.toml b/pyproject.toml index a9a0d1e38..247bf9e73 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", "Intended Audience :: Science/Research", "Intended Audience :: Developers", @@ -66,7 +67,7 @@ tests-core = [ "ruff", "scipy", "xarray", - "bokeh_sampledata; python_version >= '3.10'", + "bokeh_sampledata", "psutil", "cftime", "numpydoc", @@ -204,6 +205,8 @@ filterwarnings = [ "ignore: 'xdrlib' is deprecated and slated for removal in Python 3.13:DeprecationWarning:metpy.io.nexrad", # 2023-09: See https://github.com/python-streamz/streamz/issues/460 "ignore: pkg_resources is deprecated as an API:DeprecationWarning:streamz.plugins", + # 2025-10 + "ignore:'_UnionGenericAlias' is deprecated and slated for removal in Python 3.17", # OK ] [tool.codespell]