mirror of
https://github.com/hwchase17/langchain.git
synced 2025-04-27 03:31:51 +00:00
100 lines
3.1 KiB
Python
100 lines
3.1 KiB
Python
#!/usr/bin/env python
|
|
"""Script to sync libraries from various repositories into the main langchain repository."""
|
|
|
|
import os
|
|
import shutil
|
|
import yaml
|
|
from pathlib import Path
|
|
from typing import Dict, Any
|
|
|
|
|
|
def load_packages_yaml() -> Dict[str, Any]:
|
|
"""Load and parse the packages.yml file."""
|
|
with open("langchain/libs/packages.yml", "r") as f:
|
|
return yaml.safe_load(f)
|
|
|
|
|
|
def get_target_dir(package_name: str) -> Path:
|
|
"""Get the target directory for a given package."""
|
|
package_name_short = package_name.replace("langchain-", "")
|
|
base_path = Path("langchain/libs")
|
|
if package_name_short == "experimental":
|
|
return base_path / "experimental"
|
|
return base_path / "partners" / package_name_short
|
|
|
|
|
|
def clean_target_directories(packages: list) -> None:
|
|
"""Remove old directories that will be replaced."""
|
|
for package in packages:
|
|
|
|
target_dir = get_target_dir(package["name"])
|
|
if target_dir.exists():
|
|
print(f"Removing {target_dir}")
|
|
shutil.rmtree(target_dir)
|
|
|
|
|
|
def move_libraries(packages: list) -> None:
|
|
"""Move libraries from their source locations to the target directories."""
|
|
for package in packages:
|
|
|
|
repo_name = package["repo"].split("/")[1]
|
|
source_path = package["path"]
|
|
target_dir = get_target_dir(package["name"])
|
|
|
|
# Handle root path case
|
|
if source_path == ".":
|
|
source_dir = repo_name
|
|
else:
|
|
source_dir = f"{repo_name}/{source_path}"
|
|
|
|
print(f"Moving {source_dir} to {target_dir}")
|
|
|
|
# Ensure target directory exists
|
|
os.makedirs(os.path.dirname(target_dir), exist_ok=True)
|
|
|
|
try:
|
|
# Move the directory
|
|
shutil.move(source_dir, target_dir)
|
|
except Exception as e:
|
|
print(f"Error moving {source_dir} to {target_dir}: {e}")
|
|
|
|
|
|
def main():
|
|
"""Main function to orchestrate the library sync process."""
|
|
try:
|
|
# Load packages configuration
|
|
package_yaml = load_packages_yaml()
|
|
|
|
# Clean target directories
|
|
clean_target_directories([
|
|
p
|
|
for p in package_yaml["packages"]
|
|
if (p["repo"].startswith("langchain-ai/") or p.get("include_in_api_ref"))
|
|
and p["repo"] != "langchain-ai/langchain"
|
|
])
|
|
|
|
# Move libraries to their new locations
|
|
move_libraries([
|
|
p
|
|
for p in package_yaml["packages"]
|
|
if not p.get("disabled", False)
|
|
and (p["repo"].startswith("langchain-ai/") or p.get("include_in_api_ref"))
|
|
and p["repo"] != "langchain-ai/langchain"
|
|
])
|
|
|
|
# Delete ones without a pyproject.toml
|
|
for partner in Path("langchain/libs/partners").iterdir():
|
|
if partner.is_dir() and not (partner / "pyproject.toml").exists():
|
|
print(f"Removing {partner} as it does not have a pyproject.toml")
|
|
shutil.rmtree(partner)
|
|
|
|
print("Library sync completed successfully!")
|
|
|
|
except Exception as e:
|
|
print(f"Error during library sync: {e}")
|
|
raise
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|