Repository: conda-forge/hvplot-feedstock
Pull request #35: hvplot v0.11.3
Author: login: regro-cf-autotick-bot
Created: 2025-04-30T19:55:54Z | Merged: 2025-05-01T17:07:41Z

It is very likely that the current package version for this feedstock is out of date.

Checklist before merging this PR:
- [x] Dependencies have been updated if changed: see [upstream](https://hvplot.holoviz.org)
- [x] Tests have passed 
- [x] Updated license if changed and `license_file` is packaged 

Information about this PR:
1. Feel free to push to the bot's branch to update this PR if needed.
2. The bot will almost always only open one PR per version.
3. The bot will stop issuing PRs if more than 3 version bump PRs generated by the bot are open. If you don't want to package a particular version please close the PR.
4. If you want these PRs to be merged automatically, make an issue with <code>@conda-forge-admin,</code>`please add bot automerge` in the title and merge the resulting PR. This command will add our bot automerge feature to your feedstock.
5. If this PR was opened in error or needs to be updated please add the `bot-rerun` label to this PR. The bot will close this PR and schedule another one. If you do not have permissions to add this label, you can use the phrase <code>@<space/>conda-forge-admin, please rerun bot</code> in a PR comment to have the `conda-forge-admin` add it for you.



<sub>This PR was created by the [regro-cf-autotick-bot](https://github.com/regro/cf-scripts). The **regro-cf-autotick-bot** is a service to automatically track the dependency graph, migrate packages, and propose package version updates for conda-forge. Feel free to drop us a line if there are any [issues](https://github.com/regro/cf-scripts/issues)! This PR was generated by https://github.com/regro/cf-scripts/actions/runs/14763086765 - please use this URL for debugging.</sub>


Diff:
diff --git a/.ci_support/linux_64_.yaml b/.ci_support/linux_64_.yaml
index 0da1c13..9964e05 100644
--- a/.ci_support/linux_64_.yaml
+++ b/.ci_support/linux_64_.yaml
@@ -6,3 +6,5 @@ channel_targets:
 - conda-forge main
 docker_image:
 - quay.io/condaforge/linux-anvil-x86_64:alma9
+python_min:
+- '3.9'
diff --git a/.gitignore b/.gitignore
index 179afe5..47b5408 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,8 @@
 /build_artifacts
 
 *.pyc
+
+# Rattler-build's artifacts are in `output` when not specifying anything.
+/output
+# Pixi's configuration
+.pixi
diff --git a/.scripts/run_docker_build.sh b/.scripts/run_docker_build.sh
index 00f377a..6ee04aa 100755
--- a/.scripts/run_docker_build.sh
+++ b/.scripts/run_docker_build.sh
@@ -12,7 +12,7 @@ source .scripts/logging_utils.sh
 set -xeo pipefail
 
 THISDIR="$( cd "$( dirname "$0" )" >/dev/null && pwd )"
-PROVIDER_DIR="$(basename $THISDIR)"
+PROVIDER_DIR="$(basename "$THISDIR")"
 
 FEEDSTOCK_ROOT="$( cd "$( dirname "$0" )/.." >/dev/null && pwd )"
 RECIPE_ROOT="${FEEDSTOCK_ROOT}/recipe"
diff --git a/build-locally.py b/build-locally.py
index c4a56c6..02c2374 100755
--- a/build-locally.py
+++ b/build-locally.py
@@ -10,6 +10,7 @@
 import os
 import platform
 import subprocess
+import sys
 from argparse import ArgumentParser
 
 
@@ -44,10 +45,19 @@ def run_osx_build(ns):
     subprocess.check_call([script])
 
 
+def run_win_build(ns):
+    script = ".scripts/run_win_build.bat"
+    subprocess.check_call(["cmd", "/D", "/Q", "/C", f"CALL {script}"])
+
+
 def verify_config(ns):
+    choices_filter = ns.filter or "*"
     valid_configs = {
-        os.path.basename(f)[:-5] for f in glob.glob(".ci_support/*.yaml")
+        os.path.basename(f)[:-5]
+        for f in glob.glob(f".ci_support/{choices_filter}.yaml")
     }
+    if choices_filter != "*":
+        print(f"filtering for '{choices_filter}.yaml' configs")
     print(f"valid configs are {valid_configs}")
     if ns.config in valid_configs:
         print("Using " + ns.config + " configuration")
@@ -60,30 +70,37 @@ def verify_config(ns):
         selections = list(enumerate(sorted(valid_configs), 1))
         for i, c in selections:
             print(f"{i}. {c}")
-        s = input("\n> ")
+        try:
+            s = input("\n> ")
+        except KeyboardInterrupt:
+            print("\nno option selected, bye!", file=sys.stderr)
+            sys.exit(1)
         idx = int(s) - 1
         ns.config = selections[idx][1]
         print(f"selected {ns.config}")
     else:
         raise ValueError("config " + ns.config + " is not valid")
-    # Remove the following, as implemented
-    if ns.config.startswith("win"):
-        raise ValueError(
-            f"only Linux/macOS configs currently supported, got {ns.config}"
+    if (
+        ns.config.startswith("osx")
+        and platform.system() == "Darwin"
+        and not os.environ.get("OSX_SDK_DIR")
+    ):
+        raise RuntimeError(
+            "Need OSX_SDK_DIR env variable set. Run 'export OSX_SDK_DIR=$PWD/SDKs' "
+            "to download the SDK automatically to '$PWD/SDKs/MacOSX<ver>.sdk'. "
+            "Note: OSX_SDK_DIR must be set to an absolute path. "
+            "Setting this variable implies agreement to the licensing terms of the SDK by Apple."
         )
-    elif ns.config.startswith("osx"):
-        if "OSX_SDK_DIR" not in os.environ:
-            raise RuntimeError(
-                "Need OSX_SDK_DIR env variable set. Run 'export OSX_SDK_DIR=$PWD/SDKs' "
-                "to download the SDK automatically to '$PWD/SDKs/MacOSX<ver>.sdk'. "
-                "Note: OSX_SDK_DIR must be set to an absolute path. "
-                "Setting this variable implies agreement to the licensing terms of the SDK by Apple."
-            )
 
 
 def main(args=None):
     p = ArgumentParser("build-locally")
     p.add_argument("config", default=None, nargs="?")
+    p.add_argument(
+        "--filter",
+        default=None,
+        help="Glob string to filter which build choices are presented in interactive mode.",
+    )
     p.add_argument(
         "--debug",
         action="store_true",
@@ -104,6 +121,8 @@ def main(args=None):
             run_docker_build(ns)
         elif ns.config.startswith("osx"):
             run_osx_build(ns)
+        elif ns.config.startswith("win"):
+            run_win_build(ns)
     finally:
         recipe_license_file = os.path.join(
             "recipe", "recipe-scripts-license.txt"
diff --git a/recipe/meta.yaml b/recipe/meta.yaml
index d9261ea..611f6db 100644
--- a/recipe/meta.yaml
+++ b/recipe/meta.yaml
@@ -1,4 +1,4 @@
-{% set version = "0.11.2" %}
+{% set version = "0.11.3" %}
 
 package:
   name: hvplot
@@ -6,7 +6,7 @@ package:
 
 source:
   url: https://pypi.org/packages/source/h/hvplot/hvplot-{{ version }}.tar.gz
-  sha256: b7ad1f2f1c705e47e26b22c89c11711a84f7774faaabab756b45e8d1e00a6010
+  sha256: ce82dea296af6146b9a51aa5ed1f772e5415a07c6c33a4eae0f00bbe7ec880ca
 
 build:
   number: 0
@@ -15,12 +15,12 @@ build:
 
 requirements:
   host:
-    - python >=3.9
+    - python {{ python_min }}
     - pip
     - setuptools >=30.3.0
     - setuptools_scm >=6
   run:
-    - python >=3.9
+    - python >={{ python_min }}
     - bokeh >=3.1
     - colorcet >=2
     - holoviews >=1.19.0
@@ -42,6 +42,7 @@ test:
     - pip check
     - pytest hvplot
   requires:
+    - python 3.10
     - pytest
     - pip
     - parameterized
@@ -53,7 +54,7 @@ test:
     - scipy
     - ipywidgets
     - dask
-    - bokeh_sampledata   # [py>39]
+    - bokeh_sampledata   # [py>=310]
     - spatialpandas
     - duckdb
 


Reviews:
user: login: ocefpaf
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-01T15:11:34Z
user: login: maximlt
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T15:37:49Z
user: login: ocefpaf
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-01T17:47:10Z
user: login: maximlt
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-02T07:53:05Z

Review comments:
diff_hunk: @@ -15,12 +15,12 @@ build:
 
 requirements:
   host:
-    - python {{ python_min }}
+    - python >=3.9
path: recipe/meta.yaml
user: login: ocefpaf
body: Why? We need CFEP-25.
created_at: 2025-05-01T15:11:33Z
author_association: MEMBER
diff_hunk: @@ -15,12 +15,12 @@ build:
 
 requirements:
   host:
-    - python {{ python_min }}
+    - python >=3.9
path: recipe/meta.yaml
user: login: maximlt
body: Just because I was too lazy to figure out this build failure :) https://github.com/conda-forge/hvplot-feedstock/runs/41488465467
created_at: 2025-05-01T15:37:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -42,6 +42,7 @@ test:
     - pip check
     - pytest hvplot
   requires:
+    - python 3.10
path: recipe/meta.yaml
user: login: ocefpaf
body: The correct way, if the min is 3.10, is to use `{% set python_min = "3.10" %}` at the top and re-render.
created_at: 2025-05-01T17:47:09Z
author_association: MEMBER
diff_hunk: @@ -42,6 +42,7 @@ test:
     - pip check
     - pytest hvplot
   requires:
+    - python 3.10
path: recipe/meta.yaml
user: login: maximlt
body: One issue I had was that even if `bokeh_sampledata` is declared as `bokeh_sampledata # [py>=310]` in the test dependencies, it was attempted to be installed with Python 3.9.

I was in a rush, so went for a solution that worked. Our next release 0.12.0 will likely drop Python 3.9 support, I'll fix all that when we get there :).

Thanks for your support!
created_at: 2025-05-02T07:53:05Z
author_association: CONTRIBUTOR

PR comments:
user: login: maximlt
created_at: 2025-05-01T14:16:15Z
body: @conda-forge-admin, please rerender
author_association: CONTRIBUTOR
user: login: conda-forge-admin
created_at: 2025-05-01T14:18:23Z
body: Hi! This is the friendly automated conda-forge-webservice.

I tried to rerender for you, but it looks like there was nothing to do.


<sub>This message was generated by GitHub Actions workflow run [https://github.com/conda-forge/conda-forge-webservices/actions/runs/14776910674](https://github.com/conda-forge/conda-forge-webservices/actions/runs/14776910674). Examine the logs at this URL for more detail.</sub>

author_association: CONTRIBUTOR
user: login: maximlt
created_at: 2025-05-01T14:19:54Z
body: @conda-forge-admin, please restart ci
author_association: CONTRIBUTOR
user: login: conda-forge-admin
created_at: 2025-05-01T14:21:37Z
body: Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (```recipe/meta.yaml```) and found it was in an excellent condition.

I do have some suggestions for making it better though...


For **recipe/meta.yaml**:

 * ℹ️ `noarch: python` recipes should usually follow the syntax in our [documentation](https://conda-forge.org/docs/maintainer/knowledge_base/#noarch-python) for specifying the Python version.
   - For the `host` section of the recipe, you should usually use the pin `python {{ python_min }}` for the `python` entry.
   - For the `run` section of the recipe, you should usually use the pin `python >={{ python_min }}` for the `python` entry.
   - For the `test.requires` section of the recipe, you should usually use the pin `python {{ python_min }}` for the `python` entry.
   - If the package requires a newer Python version than the currently supported minimum version on `conda-forge`, you can override the `python_min` variable by adding a Jinja2 `set` statement at the top of your recipe (or using an equivalent `context` variable for v1 recipes).


<sub>This message was generated by GitHub Actions workflow run [https://github.com/conda-forge/conda-forge-webservices/actions/runs/14776971373](https://github.com/conda-forge/conda-forge-webservices/actions/runs/14776971373). Examine the logs at this URL for more detail.</sub>

author_association: CONTRIBUTOR
user: login: conda-forge-admin
created_at: 2025-05-01T14:43:32Z
body: Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (```recipe/meta.yaml```) and found it was in an excellent condition.

author_association: CONTRIBUTOR
user: login: conda-forge-admin
created_at: 2025-05-01T15:03:39Z
body: Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (```recipe/meta.yaml```) and found it was in an excellent condition.

I do have some suggestions for making it better though...


For **recipe/meta.yaml**:

 * ℹ️ `noarch: python` recipes should usually follow the syntax in our [documentation](https://conda-forge.org/docs/maintainer/knowledge_base/#noarch-python) for specifying the Python version.
   - For the `host` section of the recipe, you should usually use the pin `python {{ python_min }}` for the `python` entry.
   - For the `run` section of the recipe, you should usually use the pin `python >={{ python_min }}` for the `python` entry.
   - For the `test.requires` section of the recipe, you should usually use the pin `python {{ python_min }}` for the `python` entry.
   - If the package requires a newer Python version than the currently supported minimum version on `conda-forge`, you can override the `python_min` variable by adding a Jinja2 `set` statement at the top of your recipe (or using an equivalent `context` variable for v1 recipes).


<sub>This message was generated by GitHub Actions workflow run [https://github.com/conda-forge/conda-forge-webservices/actions/runs/14777647981](https://github.com/conda-forge/conda-forge-webservices/actions/runs/14777647981). Examine the logs at this URL for more detail.</sub>

author_association: CONTRIBUTOR
user: login: ocefpaf
created_at: 2025-05-01T15:07:56Z
body: @conda-forge-admin, please rerender 
author_association: MEMBER
user: login: conda-forge-admin
created_at: 2025-05-01T15:08:52Z
body: Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (```recipe/meta.yaml```) and found it was in an excellent condition.

author_association: CONTRIBUTOR
user: login: conda-forge-admin
created_at: 2025-05-01T15:20:25Z
body: Hi! This is the friendly conda-forge automerge bot!

I considered the following status checks when analyzing this PR:
 - **linter**: passed
 - **azure**: failed


Thus the PR was not passing and not merged.
author_association: CONTRIBUTOR
user: login: conda-forge-admin
created_at: 2025-05-01T15:40:49Z
body: Hi! This is the friendly conda-forge automerge bot!

Commits were made to this PR after the `automerge` label was added. For security reasons, I have disabled automerge by removing the `automerge` label. Please add the `automerge` label again (or ask a maintainer to do so) if you'd like to enable automerge again!

author_association: CONTRIBUTOR
user: login: conda-forge-admin
created_at: 2025-05-01T16:29:12Z
body: Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (```recipe/meta.yaml```) and found it was in an excellent condition.

I do have some suggestions for making it better though...


For **recipe/meta.yaml**:

 * ℹ️ `noarch: python` recipes should usually follow the syntax in our [documentation](https://conda-forge.org/docs/maintainer/knowledge_base/#noarch-python) for specifying the Python version.
   - For the `test.requires` section of the recipe, you should usually use the pin `python {{ python_min }}` for the `python` entry.
   - If the package requires a newer Python version than the currently supported minimum version on `conda-forge`, you can override the `python_min` variable by adding a Jinja2 `set` statement at the top of your recipe (or using an equivalent `context` variable for v1 recipes).


<sub>This message was generated by GitHub Actions workflow run [https://github.com/conda-forge/conda-forge-webservices/actions/runs/14779069945](https://github.com/conda-forge/conda-forge-webservices/actions/runs/14779069945). Examine the logs at this URL for more detail.</sub>

author_association: CONTRIBUTOR