Spaces:
Sleeping
Sleeping
import sys | |
import tomllib | |
from packaging.version import parse as parse_version | |
import re | |
MIN_VERSION_LIBS = [ | |
"langchain-core", | |
"langchain-community", | |
"langchain", | |
"langchain-text-splitters", | |
] | |
def get_min_version(version: str) -> str: | |
# base regex for x.x.x with cases for rc/post/etc | |
# valid strings: https://peps.python.org/pep-0440/#public-version-identifiers | |
vstring = r"\d+(?:\.\d+){0,2}(?:(?:a|b|rc|\.post|\.dev)\d+)?" | |
# case ^x.x.x | |
_match = re.match(f"^\\^({vstring})$", version) | |
if _match: | |
return _match.group(1) | |
# case >=x.x.x,<y.y.y | |
_match = re.match(f"^>=({vstring}),<({vstring})$", version) | |
if _match: | |
_min = _match.group(1) | |
_max = _match.group(2) | |
assert parse_version(_min) < parse_version(_max) | |
return _min | |
# case x.x.x | |
_match = re.match(f"^({vstring})$", version) | |
if _match: | |
return _match.group(1) | |
raise ValueError(f"Unrecognized version format: {version}") | |
def get_min_version_from_toml(toml_path: str): | |
# Parse the TOML file | |
with open(toml_path, "rb") as file: | |
toml_data = tomllib.load(file) | |
# Get the dependencies from tool.poetry.dependencies | |
dependencies = toml_data["tool"]["poetry"]["dependencies"] | |
# Initialize a dictionary to store the minimum versions | |
min_versions = {} | |
# Iterate over the libs in MIN_VERSION_LIBS | |
for lib in MIN_VERSION_LIBS: | |
# Check if the lib is present in the dependencies | |
if lib in dependencies: | |
# Get the version string | |
version_string = dependencies[lib] | |
if isinstance(version_string, dict): | |
version_string = version_string["version"] | |
# Use parse_version to get the minimum supported version from version_string | |
min_version = get_min_version(version_string) | |
# Store the minimum version in the min_versions dictionary | |
min_versions[lib] = min_version | |
return min_versions | |
if __name__ == "__main__": | |
# Get the TOML file path from the command line argument | |
toml_file = sys.argv[1] | |
# Call the function to get the minimum versions | |
min_versions = get_min_version_from_toml(toml_file) | |
print( | |
" ".join([f"{lib}=={version}" for lib, version in min_versions.items()]) | |
) | |