mirror of
https://github.com/hwchase17/langchain.git
synced 2026-04-23 20:23:59 +00:00
Clean up the `workflow_dispatch` dropdowns for the release and scheduled integration-test workflows. Showing short package names (`openai`, `langchain_v1`, ...) instead of `libs/partners/openai` makes the UI in the Actions tab easier to scan; the prefix now lives in the resolver rather than every dropdown entry.
67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
"""Verify _release.yml dropdown options match actual package directories.
|
|
|
|
Dropdown options are short names (e.g. `openai`, `core`). The workflow's
|
|
`EFFECTIVE_WORKING_DIR` expression re-adds the `libs/` prefix for top-level
|
|
packages and `libs/partners/` for everything else. This test reconstructs the
|
|
full path for each short name and compares against packages on disk.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
|
|
import yaml
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
|
|
# Keep in sync with the non-partner allowlist in `EFFECTIVE_WORKING_DIR`
|
|
# in `.github/workflows/_release.yml`.
|
|
TOP_LEVEL_PACKAGES = frozenset(
|
|
{"core", "langchain", "langchain_v1", "text-splitters", "standard-tests", "model-profiles"}
|
|
)
|
|
|
|
|
|
def _get_release_options() -> list[str]:
|
|
workflow = REPO_ROOT / ".github" / "workflows" / "_release.yml"
|
|
with open(workflow) as f:
|
|
data = yaml.safe_load(f)
|
|
try:
|
|
# PyYAML (YAML 1.1) parses the bare key `on` as boolean True
|
|
return data[True]["workflow_dispatch"]["inputs"]["working-directory"]["options"]
|
|
except (KeyError, TypeError) as e:
|
|
msg = f"Could not find workflow_dispatch options in {workflow}: {e}"
|
|
raise AssertionError(msg) from e
|
|
|
|
|
|
def _expand_option(option: str) -> str:
|
|
if option in TOP_LEVEL_PACKAGES:
|
|
return f"libs/{option}"
|
|
return f"libs/partners/{option}"
|
|
|
|
|
|
def _get_package_dirs() -> set[str]:
|
|
libs = REPO_ROOT / "libs"
|
|
dirs: set[str] = set()
|
|
# Top-level packages (libs/core, libs/langchain, etc.)
|
|
for p in libs.iterdir():
|
|
if p.is_dir() and (p / "pyproject.toml").exists():
|
|
dirs.add(f"libs/{p.name}")
|
|
# Partner packages (libs/partners/*)
|
|
partners = libs / "partners"
|
|
if partners.exists():
|
|
for p in partners.iterdir():
|
|
if p.is_dir() and (p / "pyproject.toml").exists():
|
|
dirs.add(f"libs/partners/{p.name}")
|
|
return dirs
|
|
|
|
|
|
def test_release_options_match_packages() -> None:
|
|
options = {_expand_option(o) for o in _get_release_options()}
|
|
packages = _get_package_dirs()
|
|
missing_from_dropdown = packages - options
|
|
extra_in_dropdown = options - packages
|
|
assert not missing_from_dropdown, (
|
|
f"Packages on disk missing from _release.yml dropdown: {missing_from_dropdown}"
|
|
)
|
|
assert not extra_in_dropdown, (
|
|
f"Dropdown options with no matching package directory: {extra_in_dropdown}"
|
|
)
|