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,=({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()]) )