def inspect_venv( root_package_name: str, root_package_extras: Set[str], venv_bin_path: Path, venv_python_path: Path, ) -> VenvMetadata: app_paths_of_dependencies: Dict[str, List[Path]] = {} apps_of_dependencies: List[str] = [] root_req = Requirement(root_package_name) root_req.extras = root_package_extras (venv_sys_path, venv_env, venv_python_version) = fetch_info_in_venv( venv_python_path ) venv_inspect_info = VenvInspectInformation( bin_path=venv_bin_path, env=venv_env, distributions=list(metadata.distributions(path=venv_sys_path)), ) root_dist = get_dist(root_req.name, venv_inspect_info.distributions) if root_dist is None: raise PipxError( "Pipx Internal Error: cannot find package {root_req.name!r} metadata." ) app_paths_of_dependencies = _dfs_package_apps( root_dist, root_req, venv_inspect_info, app_paths_of_dependencies ) apps = get_apps(root_dist, venv_bin_path) app_paths = [venv_bin_path / app for app in apps] if WINDOWS: app_paths = _windows_extra_app_paths(app_paths) for dep in app_paths_of_dependencies: apps_of_dependencies += [ dep_path.name for dep_path in app_paths_of_dependencies[dep] ] if WINDOWS: app_paths_of_dependencies[dep] = _windows_extra_app_paths( app_paths_of_dependencies[dep] ) venv_metadata = VenvMetadata( apps=apps, app_paths=app_paths, apps_of_dependencies=apps_of_dependencies, app_paths_of_dependencies=app_paths_of_dependencies, package_version=root_dist.version, python_version=venv_python_version, ) return venv_metadata
def resolve_requirement_versions(package_versions): """ Resolves a list of requirements for the same package. Given a list of package details in the form of `packaging.requirements.Requirement` objects, combine the specifier, extras, url and marker information to create a new requirement object. """ resolved = Requirement(str(package_versions[0])) for package_version in package_versions[1:]: resolved.specifier = resolved.specifier & package_version.specifier resolved.extras = resolved.extras.union(package_version.extras) resolved.url = resolved.url or package_version.url if resolved.marker and package_version.marker: resolved.marker = Marker( f"{resolved.marker} or {package_version.marker}") elif package_version.marker: resolved.marker = package_version.marker return resolved