SYMBOL INDEX (1845 symbols across 94 files) FILE: comfy_cli/cmdline.py function main (line 37) | def main(): class MutuallyExclusiveValidator (line 41) | class MutuallyExclusiveValidator: method __init__ (line 42) | def __init__(self): method reset_for_testing (line 45) | def reset_for_testing(self): method validate (line 48) | def validate(self, _ctx: typer.Context, param: typer.CallbackParam, va... function help (line 62) | def help(ctx: typer.Context): function entry (line 68) | def entry( function validate_commit_and_version (line 137) | def validate_commit_and_version(commit: str | None, ctx: typer.Context) ... function _resolve_cuda (line 147) | def _resolve_cuda( function install (line 186) | def install( function update (line 389) | def update( function run (line 428) | def run( function validate_comfyui (line 493) | def validate_comfyui(_env_checker): function stop (line 501) | def stop(): function launch (line 522) | def launch( function set_default (line 539) | def set_default( function which (line 569) | def which(): function env (line 582) | def env(): function nodes (line 596) | def nodes(): function models (line 602) | def models(): function feedback (line 608) | def feedback(): function dependency (line 640) | def dependency(): function standalone (line 651) | def standalone( FILE: comfy_cli/command/code_search.py function _build_query (line 27) | def _build_query(query: str, repo: str | None, count: int) -> str: function _fetch_results (line 42) | def _fetch_results(query: str) -> dict: function _format_results (line 48) | def _format_results(search: dict) -> list[dict]: function _get_stats (line 91) | def _get_stats(search: dict) -> dict: function _print_results (line 99) | def _print_results(results: list[dict], stats: dict, json_output: bool) ... function code_search (line 147) | def code_search( FILE: comfy_cli/command/custom_nodes/bisect_custom_nodes.py class BisectState (line 19) | class BisectState(NamedTuple): method good (line 34) | def good(self) -> BisectState: method bad (line 58) | def bad(self) -> BisectState: method save (line 82) | def save(self, state_file=None): method reset (line 88) | def reset(self): method load (line 99) | def load(cls, state_file=None) -> BisectState: method inactive_nodes (line 107) | def inactive_nodes(self) -> list[str]: method set_custom_node_enabled_states (line 110) | def set_custom_node_enabled_states(self): method __str__ (line 116) | def __str__(self): function parse_cm_output (line 125) | def parse_cm_output(cm_output: str, pinned_nodes: set[str] | None = None... function start (line 146) | def start( function good (line 182) | def good(): function bad (line 201) | def bad(): function reset (line 220) | def reset(): FILE: comfy_cli/command/custom_nodes/cm_cli_util.py function find_cm_cli (line 29) | def find_cm_cli() -> bool: function resolve_manager_gui_mode (line 57) | def resolve_manager_gui_mode(not_installed_value: str | None = None) -> ... function execute_cm_cli (line 89) | def execute_cm_cli( FILE: comfy_cli/command/custom_nodes/command.py class ShowTarget (line 44) | class ShowTarget(str, Enum): function _resolve_uv_compile (line 54) | def _resolve_uv_compile(uv_compile: bool | None, fast_deps: bool = False... function validate_comfyui_manager (line 72) | def validate_comfyui_manager(): function run_script (line 78) | def run_script(cmd, cwd="."): function get_installed_packages (line 91) | def get_installed_packages(): function try_install_script (line 115) | def try_install_script(repo_path, install_cmd, instant_execution=False): function execute_install_script (line 161) | def execute_install_script(repo_path): function save_snapshot (line 189) | def save_snapshot( function restore_snapshot (line 204) | def restore_snapshot( function restore_dependencies (line 247) | def restore_dependencies( function disable_manager (line 262) | def disable_manager(): function enable_gui (line 272) | def enable_gui(): function disable_gui (line 282) | def disable_gui(): function enable_legacy_gui (line 292) | def enable_legacy_gui(): function migrate_legacy (line 302) | def migrate_legacy( function uv_compile_default (line 429) | def uv_compile_default( function clear (line 447) | def clear(): function update_cache (line 453) | def update_cache(): function node_completer (line 464) | def node_completer(incomplete: str) -> list[str]: function node_or_all_completer (line 476) | def node_or_all_completer(incomplete: str) -> list[str]: function validate_mode (line 492) | def validate_mode(mode): function show (line 504) | def show( function simple_show (line 529) | def simple_show( function install (line 555) | def install( function reinstall (line 639) | def reinstall( function uv_sync (line 694) | def uv_sync(): function uninstall (line 700) | def uninstall( function update_node_id_cache (line 725) | def update_node_id_cache(): function update (line 748) | def update( function disable (line 785) | def disable( function enable (line 812) | def enable( function fix (line 839) | def fix( function install_deps (line 877) | def install_deps( function deps_in_workflow (line 941) | def deps_in_workflow( function validate_node_for_publishing (line 970) | def validate_node_for_publishing(): function validate (line 1018) | def validate(): function publish (line 1028) | def publish( function scaffold (line 1069) | def scaffold(): function display_all_nodes (line 1081) | def display_all_nodes(): function registry_install (line 1127) | def registry_install( function pack (line 1207) | def pack(): function scaffold_cookiecutter (line 1227) | def scaffold_cookiecutter(): FILE: comfy_cli/command/generate/adapters.py class Adapter (line 38) | class Adapter: function _inline_image (line 54) | def _inline_image(value: str) -> tuple[str, str]: function _gemini_build_body (line 75) | def _gemini_build_body(values: dict, api_key: str) -> dict[str, Any]: function _gemini_decode_sync (line 89) | def _gemini_decode_sync(body: dict, download: str, request_id: str) -> l... function _seedance_text (line 155) | def _seedance_text(values: dict) -> str: function _seedance_image_url (line 170) | def _seedance_image_url(value: str, api_key: str) -> str: function _seedance_build_body (line 179) | def _seedance_build_body(values: dict, api_key: str) -> dict[str, Any]: function get (line 250) | def get(endpoint_id: str) -> Adapter | None: function resolve_path (line 254) | def resolve_path(template: str, values: dict, adapter: Adapter) -> str: FILE: comfy_cli/command/generate/app.py function register_with (line 39) | def register_with(parent: typer.Typer) -> None: function _separate_meta_flags (line 73) | def _separate_meta_flags(extra_args: list[str]) -> tuple[list[str], dict... function _show_schema_help (line 105) | def _show_schema_help(endpoint: spec.Endpoint) -> None: function _spinner (line 121) | def _spinner() -> Progress: function _emit_result (line 130) | def _emit_result(result: poll.PollResult, *, request_id: str, download: ... function _generate (line 148) | def _generate(model: str, extra_args: list[str]) -> None: function _arg_value (line 275) | def _arg_value(args: list[str], *names: str) -> str | None: function _list_models (line 285) | def _list_models(extra_args: list[str]) -> None: function _schema (line 308) | def _schema(extra_args: list[str]) -> None: function _refresh (line 321) | def _refresh() -> None: function _upload (line 334) | def _upload(extra_args: list[str]) -> None: function _apply_upload_transforms (line 375) | def _apply_upload_transforms(values: dict, flags: list[schema.FlagDef], ... function _resume (line 412) | def _resume(extra_args: list[str]) -> None: function _print_top_help (line 463) | def _print_top_help() -> None: FILE: comfy_cli/command/generate/client.py class ApiError (line 22) | class ApiError(RuntimeError): method __init__ (line 23) | def __init__(self, status: int, body: str, message: str | None = None)... function resolve_api_key (line 29) | def resolve_api_key(explicit: str | None = None) -> str: function _split_payload (line 43) | def _split_payload( function _auth_headers (line 83) | def _auth_headers(api_key: str, extra: dict[str, str] | None = None) -> ... function send_request (line 98) | def send_request( function get (line 133) | def get(url: str, api_key: str, timeout: float = 60.0) -> httpx.Response: function download_bytes (line 140) | def download_bytes(url: str, timeout: float = 120.0) -> bytes: function raise_for_status (line 149) | def raise_for_status(resp: httpx.Response) -> None: FILE: comfy_cli/command/generate/output.py function _ext_from_url (line 28) | def _ext_from_url(url: str) -> str: function _ext_from_response (line 33) | def _ext_from_response(resp: httpx.Response) -> str: function _resolve_template (line 41) | def _resolve_template(template: str, request_id: str, index: int, ext: s... function save_urls (line 50) | def save_urls(urls: list[str], template: str, request_id: str) -> list[P... function save_inline_blobs (line 73) | def save_inline_blobs(blobs: list[tuple[str, bytes]], template: str, req... function save_binary_response (line 92) | def save_binary_response(resp: httpx.Response, template: str, request_id... function print_urls (line 101) | def print_urls(urls: list[str], request_id: str | None = None) -> None: function print_json (line 112) | def print_json(body: dict | list | str) -> None: function print_saved (line 119) | def print_saved(paths: list[Path]) -> None: FILE: comfy_cli/command/generate/poll.py class PollResult (line 30) | class PollResult: function _now (line 62) | def _now() -> float: function _extract_urls (line 66) | def _extract_urls(node: Any) -> list[str]: function _dotget (line 90) | def _dotget(body: Any, path: str) -> Any: function _first (line 101) | def _first(body: Any, paths: tuple[str, ...]) -> Any: function _sleep (line 109) | def _sleep(seconds: float) -> None: function poll_bfl (line 113) | def poll_bfl( class PollSpec (line 148) | class PollSpec: function _build_poll_url (line 249) | def _build_poll_url(spec: PollSpec, job_id: str, create_path: str | None... function poll_generic (line 258) | def poll_generic( function extract_job_id (line 313) | def extract_job_id(name: str, body: dict[str, Any]) -> str | None: function build_synthetic_initial (line 324) | def build_synthetic_initial(name: str, job_id: str, base_url: str | None... function get_poller (line 347) | def get_poller(name: str) -> Callable[..., PollResult]: function sync_result_from_response (line 380) | def sync_result_from_response(resp: httpx.Response) -> PollResult: FILE: comfy_cli/command/generate/schema.py class FlagDef (line 22) | class FlagDef: class SchemaError (line 33) | class SchemaError(ValueError): function _classify (line 37) | def _classify(prop: dict[str, Any]) -> tuple[str, str | None]: function _detect_upload_mode (line 66) | def _detect_upload_mode(name: str, prop: dict[str, Any]) -> str | None: function flags_for (line 89) | def flags_for(endpoint: Endpoint) -> list[FlagDef]: function _coerce (line 120) | def _coerce(flag: FlagDef, raw: str) -> Any: function parse_args (line 167) | def parse_args(flags: list[FlagDef], argv: list[str]) -> dict[str, Any]: function help_text (line 226) | def help_text(endpoint: Endpoint, flags: list[FlagDef]) -> str: function example_invocation (line 263) | def example_invocation(endpoint: Endpoint, flags: list[FlagDef], display... FILE: comfy_cli/command/generate/spec.py class _YamlLoader (line 24) | class _YamlLoader(yaml.SafeLoader): class Endpoint (line 54) | class Endpoint: function aliases (line 162) | def aliases() -> dict[str, str]: function preferred_alias (line 167) | def preferred_alias(endpoint_id: str) -> str | None: function resolve_alias (line 172) | def resolve_alias(target: str) -> str: class SpecError (line 259) | class SpecError(RuntimeError): function _select_spec_path (line 263) | def _select_spec_path() -> Path: function load_raw_spec (line 274) | def load_raw_spec() -> dict[str, Any]: function base_url (line 280) | def base_url() -> str: function _resolve_ref (line 289) | def _resolve_ref(spec: dict[str, Any], ref: str) -> dict[str, Any]: function _resolve (line 299) | def _resolve(spec: dict[str, Any], node: Any, seen: frozenset[str] = fro... function _detect_polling (line 314) | def _detect_polling(partner: str, response_schema: dict[str, Any]) -> st... function _registry (line 329) | def _registry() -> dict[str, Endpoint]: function list_endpoints (line 377) | def list_endpoints( function get_endpoint (line 394) | def get_endpoint(endpoint_id: str) -> Endpoint: function _unknown_endpoint_message (line 402) | def _unknown_endpoint_message(endpoint_id: str) -> str: function write_cache (line 415) | def write_cache(yaml_text: str) -> Path: function active_spec_path (line 425) | def active_spec_path() -> Path: FILE: comfy_cli/command/generate/upload.py class UploadResult (line 33) | class UploadResult: function _guess_content_type (line 39) | def _guess_content_type(name: str) -> str: function _sha256_hex (line 44) | def _sha256_hex(data: bytes) -> str: function _request_signed_url (line 48) | def _request_signed_url( function _put_bytes (line 68) | def _put_bytes(upload_url: str, data: bytes, content_type: str) -> None: function upload_bytes (line 76) | def upload_bytes(data: bytes, file_name: str, api_key: str, content_type... function upload_path (line 98) | def upload_path(path: Path | str, api_key: str) -> UploadResult: function upload_remote_url (line 109) | def upload_remote_url(url: str, api_key: str) -> UploadResult: function upload_target (line 123) | def upload_target(target: str | Path, api_key: str) -> UploadResult: FILE: comfy_cli/command/github/pr_info.py class PRInfo (line 4) | class PRInfo(NamedTuple): method is_fork (line 15) | def is_fork(self) -> bool: FILE: comfy_cli/command/install.py function get_os_details (line 32) | def get_os_details(): function _pip_install_torch (line 38) | def _pip_install_torch(python: str, index_args: list[str]) -> subprocess... function pip_install_comfyui_dependencies (line 46) | def pip_install_comfyui_dependencies( function pip_install_manager (line 117) | def pip_install_manager(repo_dir, python=sys.executable): function execute (line 146) | def execute( function handle_pr_checkout (line 302) | def handle_pr_checkout(pr_ref: str, comfy_path: str) -> str: function validate_version (line 362) | def validate_version(version: str) -> str | None: class GitHubRateLimitError (line 392) | class GitHubRateLimitError(Exception): function handle_github_rate_limit (line 396) | def handle_github_rate_limit(response): class GithubRelease (line 411) | class GithubRelease(TypedDict): function clone_comfyui (line 426) | def clone_comfyui(url: str, repo_dir: str): function _resolve_latest_tag_from_local (line 438) | def _resolve_latest_tag_from_local(repo_dir: str) -> tuple[str | None, b... function _parse_github_owner_repo (line 511) | def _parse_github_owner_repo(url: str | None) -> tuple[str, str] | None: function checkout_stable_comfyui (line 529) | def checkout_stable_comfyui(version: str, repo_dir: str, url: str | None... function get_latest_release (line 589) | def get_latest_release(repo_owner: str, repo_name: str) -> GithubRelease... function _parse_pr_reference (line 633) | def _parse_pr_reference( function parse_pr_reference (line 669) | def parse_pr_reference(pr_ref: str) -> tuple[str, str, int | None]: function fetch_pr_info (line 673) | def fetch_pr_info(repo_owner: str, repo_name: str, pr_number: int) -> PR... function find_pr_by_branch (line 707) | def find_pr_by_branch(repo_owner: str, repo_name: str, username: str, br... function _print_npm_not_found_help (line 739) | def _print_npm_not_found_help(node_version: str) -> None: function verify_node_tools (line 825) | def verify_node_tools() -> bool: function handle_temporary_frontend_pr (line 923) | def handle_temporary_frontend_pr(frontend_pr: str) -> str | None: function parse_frontend_pr_reference (line 1030) | def parse_frontend_pr_reference(pr_ref: str) -> tuple[str, str, int | No... FILE: comfy_cli/command/launch.py function _get_manager_flags (line 27) | def _get_manager_flags() -> list[str]: function launch_comfyui (line 53) | def launch_comfyui(extra, frontend_pr=None, python=sys.executable): function launch (line 149) | def launch( function background_launch (line 191) | def background_launch(extra, frontend_pr=None): function launch_and_monitor (line 249) | async def launch_and_monitor(cmd, listen, port): FILE: comfy_cli/command/models/models.py function get_workspace (line 36) | def get_workspace() -> pathlib.Path: function _format_elapsed (line 40) | def _format_elapsed(seconds: float) -> str: function potentially_strip_param_url (line 52) | def potentially_strip_param_url(path_name: str) -> str: function check_huggingface_url (line 56) | def check_huggingface_url(url: str) -> tuple[bool, str | None, str | Non... function check_civitai_url (line 93) | def check_civitai_url(url: str) -> tuple[bool, bool, int | None, int | N... function request_civitai_model_version_api (line 154) | def request_civitai_model_version_api(version_id: int, headers: dict | N... function request_civitai_model_api (line 173) | def request_civitai_model_api(model_id: int, version_id: int = None, hea... function download (line 202) | def download( function remove (line 374) | def remove( function list_models (line 442) | def list_models(path: pathlib.Path) -> list[pathlib.Path]: function list_command (line 451) | def list_command( FILE: comfy_cli/command/pr_command.py function list_cached (line 23) | def list_cached() -> None: function clean_cache (line 60) | def clean_cache( FILE: comfy_cli/command/run.py function is_ui_workflow (line 23) | def is_ui_workflow(workflow) -> bool: function _validate_api_workflow (line 31) | def _validate_api_workflow(workflow): function fetch_object_info (line 41) | def fetch_object_info(host: str, port: int, timeout: int) -> dict: function execute (line 68) | def execute( class ExecutionProgress (line 176) | class ExecutionProgress(Progress): method get_renderables (line 177) | def get_renderables(self): class WorkflowExecution (line 193) | class WorkflowExecution: method __init__ (line 194) | def __init__(self, workflow, host, port, verbose, progress, local_path... method connect (line 215) | def connect(self): method queue (line 219) | def queue(self): method watch_execution (line 248) | def watch_execution(self): method update_overall_progress (line 257) | def update_overall_progress(self): method get_node_title (line 260) | def get_node_title(self, node_id): method log_node (line 268) | def log_node(self, type, node_id): method format_image_path (line 285) | def format_image_path(self, img): method on_message (line 299) | def on_message(self, message): method on_executing (line 318) | def on_executing(self, data): method on_cached (line 333) | def on_cached(self, data): method on_progress (line 340) | def on_progress(self, data): method on_executed (line 352) | def on_executed(self, data): method on_error (line 367) | def on_error(self, data): FILE: comfy_cli/config_manager.py class ConfigManager (line 10) | class ConfigManager: method __init__ (line 11) | def __init__(self): method get_config_path (line 17) | def get_config_path(): method get_config_file_path (line 20) | def get_config_file_path(self): method write_config (line 23) | def write_config(self): method set (line 32) | def set(self, key, value): method get (line 39) | def get(self, key): method get_bool (line 45) | def get_bool(self, key) -> bool | None: method get_or_override (line 56) | def get_or_override(self, env_key: str, config_key: str, set_value: st... method load (line 77) | def load(self): method get_env_data (line 96) | def get_env_data(self): method remove_background (line 156) | def remove_background(self): method get_cli_version (line 161) | def get_cli_version(self): FILE: comfy_cli/constants.py class OS (line 5) | class OS(str, Enum): class PROC (line 11) | class PROC(str, Enum): class CUDAVersion (line 79) | class CUDAVersion(str, Enum): class ROCmVersion (line 89) | class ROCmVersion(str, Enum): class GPU_OPTION (line 97) | class GPU_OPTION(str, Enum): FILE: comfy_cli/cuda_detect.py function _load_libcuda (line 27) | def _load_libcuda() -> ctypes.CDLL: function _detect_via_ctypes (line 53) | def _detect_via_ctypes() -> int | None: function _detect_via_nvidia_smi (line 79) | def _detect_via_nvidia_smi() -> tuple[int, int] | None: function detect_cuda_driver_version (line 98) | def detect_cuda_driver_version() -> tuple[int, int] | None: function resolve_cuda_wheel (line 121) | def resolve_cuda_wheel(driver_version: tuple[int, int]) -> str | None: FILE: comfy_cli/env_checker.py function format_python_version (line 17) | def format_python_version(version_info): function check_comfy_server_running (line 35) | def check_comfy_server_running(port=8188, host="localhost"): class EnvChecker (line 50) | class EnvChecker: method __init__ (line 69) | def __init__(self): method is_isolated_env (line 75) | def is_isolated_env(self): method get_isolated_env (line 78) | def get_isolated_env(self): method check (line 87) | def check(self): method fill_print_table (line 91) | def fill_print_table(self): FILE: comfy_cli/file_utils.py class DownloadException (line 16) | class DownloadException(Exception): function guess_status_code_reason (line 20) | def guess_status_code_reason(status_code: int, message: str) -> str: function check_unauthorized (line 49) | def check_unauthorized(url: str, headers: dict | None = None) -> bool: function _poll_aria2_download (line 68) | def _poll_aria2_download(download) -> None: function _download_file_aria2 (line 113) | def _download_file_aria2(url: str, local_filepath: pathlib.Path, headers... class _TransientHTTPStatusError (line 183) | class _TransientHTTPStatusError(Exception): method __init__ (line 186) | def __init__(self, status_code: int, reason: str): function _cleanup_partial (line 195) | def _cleanup_partial(filepath: pathlib.Path) -> None: function _friendly_network_error (line 203) | def _friendly_network_error(exc: Exception) -> str: function _download_file_httpx (line 228) | def _download_file_httpx( function download_file (line 272) | def download_file(url: str, local_filepath: pathlib.Path, headers: dict ... function _load_comfyignore_spec (line 329) | def _load_comfyignore_spec(ignore_filename: str = ".comfyignore") -> Pat... function list_git_tracked_files (line 344) | def list_git_tracked_files(base_path: str | os.PathLike = ".") -> list[s... function _normalize_path (line 356) | def _normalize_path(path: str) -> str: function _is_force_included (line 363) | def _is_force_included(rel_path: str, include_prefixes: list[str]) -> bool: function zip_files (line 367) | def zip_files(zip_filename, includes=None): function upload_file_to_signed_url (line 464) | def upload_file_to_signed_url(signed_url: str, file_path: str): function extract_package_as_zip (line 475) | def extract_package_as_zip(file_path: pathlib.Path, extract_path: pathli... FILE: comfy_cli/git_utils.py function sanitize_for_local_branch (line 13) | def sanitize_for_local_branch(branch_name: str) -> str: function git_checkout_tag (line 27) | def git_checkout_tag(repo_path: str, tag: str) -> bool: function checkout_pr (line 94) | def checkout_pr(repo_path: str, pr_info: PRInfo) -> bool: FILE: comfy_cli/logging.py function setup_logging (line 12) | def setup_logging(): function debug (line 30) | def debug(message): function info (line 34) | def info(message): function warning (line 38) | def warning(message): function error (line 42) | def error(message): FILE: comfy_cli/pr_cache.py class PRCache (line 19) | class PRCache: method __init__ (line 33) | def __init__(self) -> None: method get_frontend_cache_path (line 40) | def get_frontend_cache_path(self, pr_info) -> Path: method get_cache_info_path (line 48) | def get_cache_info_path(self, cache_path: Path) -> Path: method is_cache_valid (line 52) | def is_cache_valid(self, pr_info, cache_path: Path) -> bool: method save_cache_info (line 81) | def save_cache_info(self, pr_info, cache_path: Path) -> None: method get_cached_frontend_path (line 99) | def get_cached_frontend_path(self, pr_info) -> Path | None: method _load_cache_info (line 108) | def _load_cache_info(self, cache_dir: Path) -> dict | None: method _clean_specific_pr_cache (line 120) | def _clean_specific_pr_cache(self, frontend_cache: Path, pr_number: in... method clean_frontend_cache (line 131) | def clean_frontend_cache(self, pr_number: int | None = None) -> None: method _calculate_cache_size_mb (line 144) | def _calculate_cache_size_mb(self, cache_dir: Path) -> float: method _get_cache_info_with_metadata (line 149) | def _get_cache_info_with_metadata(self, cache_dir: Path) -> dict | None: method list_cached_frontends (line 157) | def list_cached_frontends(self) -> list[dict]: method _is_cache_expired (line 173) | def _is_cache_expired(self, cached_at: str) -> bool: method _get_expired_items (line 181) | def _get_expired_items(self, cached_items: list[dict]) -> list[dict]: method _get_excess_items (line 190) | def _get_excess_items(self, cached_items: list[dict], expired_items: l... method _remove_cache_item (line 198) | def _remove_cache_item(self, item: dict) -> None: method enforce_cache_limits (line 206) | def enforce_cache_limits(self) -> None: method get_cache_age (line 219) | def get_cache_age(self, cached_at: str) -> str: FILE: comfy_cli/registry/api.py class RegistryAPI (line 17) | class RegistryAPI: method __init__ (line 18) | def __init__(self): method determine_base_url (line 21) | def determine_base_url(self): method publish_node_version (line 30) | def publish_node_version(self, node_config: PyProjectConfig, token) ->... method list_all_nodes (line 88) | def list_all_nodes(self): method install_node (line 103) | def install_node(self, node_id, version=None): function map_node_version (line 128) | def map_node_version(api_node_version): function map_node_to_node_class (line 150) | def map_node_to_node_class(api_node_data): function serialize_license (line 175) | def serialize_license(license: License) -> str: FILE: comfy_cli/registry/config_parser.py function create_comfynode_config (line 47) | def create_comfynode_config(): function sanitize_node_name (line 98) | def sanitize_node_name(name: str) -> str: function validate_and_extract_os_classifiers (line 122) | def validate_and_extract_os_classifiers(classifiers: list) -> list: function validate_and_extract_accelerator_classifiers (line 142) | def validate_and_extract_accelerator_classifiers(classifiers: list) -> l... function validate_version (line 170) | def validate_version(version: str, field_name: str) -> str: function _strip_url_credentials (line 192) | def _strip_url_credentials(url: str) -> str: function initialize_project_config (line 204) | def initialize_project_config(): function _resolve_dynamic_version (line 305) | def _resolve_dynamic_version(pyproject_dir: pathlib.Path, rel_path: str)... function _parse_dynamic_fields (line 379) | def _parse_dynamic_fields(project_data) -> list[str]: function _extract_version (line 398) | def _extract_version(project_data, comfy_data, pyproject_dir: pathlib.Pa... function extract_node_configuration (line 461) | def extract_node_configuration( FILE: comfy_cli/registry/types.py class NodeVersion (line 5) | class NodeVersion: class Node (line 15) | class Node: class PublishNodeVersionResponse (line 28) | class PublishNodeVersionResponse: class URLs (line 34) | class URLs: class Model (line 42) | class Model: class ComfyConfig (line 48) | class ComfyConfig: class License (line 59) | class License: class ProjectConfig (line 65) | class ProjectConfig: class PyProjectConfig (line 80) | class PyProjectConfig: FILE: comfy_cli/resolve_python.py function _get_python_binary (line 12) | def _get_python_binary(env_path: str) -> str: function _is_externally_managed (line 18) | def _is_externally_managed() -> bool: function resolve_workspace_python (line 24) | def resolve_workspace_python(workspace_path: str | None = None) -> str: function create_workspace_venv (line 46) | def create_workspace_venv(workspace_path: str) -> str: function ensure_workspace_python (line 56) | def ensure_workspace_python(workspace_path: str) -> str: FILE: comfy_cli/standalone.py function _resolve_python_version (line 31) | def _resolve_python_version(asset_url_prefix: str, minor_version: str) -... function download_standalone_python (line 59) | def download_standalone_python( class StandalonePython (line 99) | class StandalonePython: method FromDistro (line 101) | def FromDistro( method FromTarball (line 123) | def FromTarball(fpath: PathLike, name: PathLike = "python", show_progr... method __init__ (line 131) | def __init__(self, rpath: PathLike): method clean (line 150) | def clean(self): method run_module (line 154) | def run_module(self, mod: str, *args: str): method pip_install (line 164) | def pip_install(self, *args: str): method uv_install (line 167) | def uv_install(self, *args: str): method install_comfy_cli (line 170) | def install_comfy_cli(self, dev: bool = False): method run_comfy_cli (line 176) | def run_comfy_cli(self, *args: str): method install_comfy (line 179) | def install_comfy(self, *args: str, gpu_arg: str = "--nvidia"): method dehydrate_comfy_deps (line 182) | def dehydrate_comfy_deps( method rehydrate_comfy_deps (line 200) | def rehydrate_comfy_deps(self, packWheels: bool = False): method to_tarball (line 210) | def to_tarball(self, outPath: PathLike | None = None, show_progress: b... FILE: comfy_cli/tracking.py function enable (line 36) | def enable(): function disable (line 43) | def disable(): function track_event (line 48) | def track_event(event_name: str, properties: any = None): function track_command (line 64) | def track_command(sub_command: str = None): function prompt_tracking_consent (line 92) | def prompt_tracking_consent(skip_prompt: bool = False, default_value: bo... function init_tracking (line 104) | def init_tracking(enable_tracking: bool): FILE: comfy_cli/ui.py function show_progress (line 17) | def show_progress(iterable, total, description="Downloading..."): function prompt_autocomplete (line 41) | def prompt_autocomplete( function prompt_select (line 61) | def prompt_select( function prompt_select_enum (line 84) | def prompt_select_enum(question: str, choices: list[E], force_prompting:... function prompt_input (line 107) | def prompt_input(question: str, default: str = "", force_prompting: bool... function prompt_multi_select (line 126) | def prompt_multi_select(prompt: str, choices: list[str]) -> list[str]: function prompt_confirm_action (line 141) | def prompt_confirm_action(prompt: str, default: bool) -> bool: function display_table (line 157) | def display_table(data: list[tuple], column_names: list[str], title: str... function display_error_message (line 177) | def display_error_message(message: str) -> None: FILE: comfy_cli/update.py function check_for_newer_pypi_version (line 14) | def check_for_newer_pypi_version(package_name, current_version): function check_for_updates (line 30) | def check_for_updates(): function get_version_from_pyproject (line 38) | def get_version_from_pyproject(): function notify_update (line 43) | def notify_update(current_version: str, newer_version: str): FILE: comfy_cli/utils.py function singleton (line 23) | def singleton(cls): function get_os (line 43) | def get_os(): function get_proc (line 56) | def get_proc(): function install_conda_package (line 67) | def install_conda_package(package_name): function get_not_user_set_default_workspace (line 76) | def get_not_user_set_default_workspace(): function kill_all (line 80) | def kill_all(pid): function is_running (line 91) | def is_running(pid): function create_choice_completer (line 99) | def create_choice_completer(opts: list[str]): function download_url (line 106) | def download_url( function extract_tarball (line 137) | def extract_tarball( function create_tarball (line 192) | def create_tarball( FILE: comfy_cli/uv.py function _run (line 14) | def _run(cmd: list[str], cwd: PathLike, check: bool = True) -> subproces... function _check_call (line 18) | def _check_call(cmd: list[str], cwd: PathLike | None = None): function _req_re_closure (line 46) | def _req_re_closure(name: str) -> re.Pattern[str]: function parse_uv_compile_error (line 50) | def parse_uv_compile_error(err: str) -> tuple[str, list[str]]: function parse_req_file (line 65) | def parse_req_file(rf: PathLike, skips: list[str] | None = None): class DependencyCompiler (line 85) | class DependencyCompiler: method Find_Req_Files (line 112) | def Find_Req_Files(*ders: PathLike) -> list[Path]: method Install_Build_Deps (line 128) | def Install_Build_Deps(executable: PathLike = sys.executable): method Compile (line 134) | def Compile( method Install (line 208) | def Install( method Sync (line 261) | def Sync( method Download (line 290) | def Download( method Wheel (line 326) | def Wheel( method Resolve_Gpu (line 362) | def Resolve_Gpu(gpu: GPU_OPTION | None): method __init__ (line 377) | def __init__( method find_core_reqs (line 436) | def find_core_reqs(self): method find_ext_reqs (line 439) | def find_ext_reqs(self): method make_override (line 443) | def make_override(self): method compile_core_plus_ext (line 474) | def compile_core_plus_ext(self): method handle_opencv (line 507) | def handle_opencv(self): method compile_deps (line 528) | def compile_deps(self): method install_deps (line 533) | def install_deps(self): method install_dists (line 542) | def install_dists(self): method install_wheels (line 552) | def install_wheels(self): method install_wheels_directly (line 562) | def install_wheels_directly(self): method sync_core_plus_ext (line 571) | def sync_core_plus_ext(self): method fetch_dep_dists (line 579) | def fetch_dep_dists(self, skip_uv: bool = False): method fetch_dep_wheels (line 594) | def fetch_dep_wheels(self, skip_uv: bool = False): FILE: comfy_cli/workflow_to_api.py class WorkflowConversionError (line 59) | class WorkflowConversionError(Exception): function is_api_format (line 63) | def is_api_format(workflow: Any) -> bool: function is_subgraph_uuid (line 77) | def is_subgraph_uuid(node_type: Any) -> bool: function convert_ui_to_api (line 87) | def convert_ui_to_api(workflow: dict, object_info: dict) -> dict: function _has_group_nodes (line 175) | def _has_group_nodes(workflow: dict) -> bool: function _strip_orphan_link_inputs (line 189) | def _strip_orphan_link_inputs(api_prompt: dict[str, dict]) -> None: class _SubgraphCtx (line 211) | class _SubgraphCtx: method __init__ (line 214) | def __init__(self) -> None: function _collect_subgraph_defs (line 223) | def _collect_subgraph_defs(workflow: dict) -> dict[str, dict]: function _expand_subgraphs (line 242) | def _expand_subgraphs( function _outer_slot_to_input_idx (line 283) | def _outer_slot_to_input_idx(outer_node: dict, sg_def: dict) -> dict[int... function _expand_one_subgraph (line 299) | def _expand_one_subgraph( function _rewrite_internal_input (line 396) | def _rewrite_internal_input( function _rewrite_links_for_subgraphs (line 417) | def _rewrite_links_for_subgraphs(links: list, ctx: _SubgraphCtx, nodes: ... function _resolve_subgraph_output (line 456) | def _resolve_subgraph_output(node_id_str: str, slot: Any, ctx: _Subgraph... function _resolve_subgraph_input_all (line 469) | def _resolve_subgraph_input_all( function _is_valid_connection (line 499) | def _is_valid_connection(type_a: Any, type_b: Any) -> bool: function _build_link_map (line 522) | def _build_link_map(links: list) -> dict[int, dict]: function _collect_primitive_values (line 538) | def _collect_primitive_values(nodes: list[dict]) -> dict[str, Any]: function _collect_bypassed (line 549) | def _collect_bypassed(nodes: list[dict]) -> set[str]: function _collect_reroute_sources (line 553) | def _collect_reroute_sources(nodes: list[dict], link_map: dict[int, dict... function _collect_get_set_mappings (line 573) | def _collect_get_set_mappings( function _collect_excluded (line 607) | def _collect_excluded(nodes: list[dict]) -> set[str]: class _Tracers (line 628) | class _Tracers: method __init__ (line 631) | def __init__( method trace_reroute (line 652) | def trace_reroute(self, src_id: Any, src_slot: Any) -> tuple[Any, Any]: method trace_get_set (line 664) | def trace_get_set(self, src_id: Any, src_slot: Any) -> tuple[Any, Any]: method trace_bypassed (line 679) | def trace_bypassed(self, src_id: Any, src_slot: Any) -> tuple[Any, Any]: function _wrap_widget_value (line 769) | def _wrap_widget_value(value: Any) -> Any: function process_dynamic_prompt (line 780) | def process_dynamic_prompt(value: str) -> str: function _resolve_dynamic_prompt (line 797) | def _resolve_dynamic_prompt(value: str) -> str: function _parse_dynamic_prompt_block (line 817) | def _parse_dynamic_prompt_block(value: str, i: int) -> tuple[str, int]: function _dynamic_prompt_input_names (line 852) | def _dynamic_prompt_input_names(node_type: str | None, node: dict | None... function _build_api_node (line 874) | def _build_api_node( function _schema_for (line 964) | def _schema_for(node_type: str, node: dict, object_info: dict) -> dict |... function _schema_input_def (line 973) | def _schema_input_def(schema: Any) -> dict: function _get_ordered_input_names (line 988) | def _get_ordered_input_names(node_type: str, node: dict, object_info: di... function _is_widget_input (line 1011) | def _is_widget_input(input_spec: Any) -> tuple[bool, bool]: function _dynamic_combo_sub_inputs (line 1044) | def _dynamic_combo_sub_inputs( function _get_widget_name_order (line 1074) | def _get_widget_name_order(node_type: str, node: dict, object_info: dict... function _fallback_widget_names (line 1103) | def _fallback_widget_names(node: dict, widget_values: list[Any]) -> list... function _filter_control_values (line 1139) | def _filter_control_values( function _has_control_after_generate_companion (line 1202) | def _has_control_after_generate_companion(input_name: str, input_spec: A... function _collect_widget_inputs (line 1225) | def _collect_widget_inputs( function _absorb_dict_widget_values (line 1280) | def _absorb_dict_widget_values(widget_values: list[Any], out: dict[str, ... function _collect_default_inputs (line 1302) | def _collect_default_inputs( function _extract_default (line 1328) | def _extract_default(input_spec: Any) -> Any: function _normalize_combo_values (line 1344) | def _normalize_combo_values(schema: dict | None, inputs: dict[str, Any])... FILE: comfy_cli/workspace_manager.py class ModelPath (line 19) | class ModelPath: class Model (line 24) | class Model: class Basics (line 33) | class Basics: class CustomNode (line 39) | class CustomNode: class ComfyLockYAMLStruct (line 45) | class ComfyLockYAMLStruct: function _paths_match (line 51) | def _paths_match(path_a: str, path_b: str) -> bool: function _has_comfyui_markers (line 58) | def _has_comfyui_markers(path: str) -> bool: function _find_comfyui_root (line 64) | def _find_comfyui_root(path: str) -> str | None: function check_comfy_repo (line 78) | def check_comfy_repo(path) -> tuple[bool, str | None]: function save_yaml (line 146) | def save_yaml(file_path: str, metadata: ComfyLockYAMLStruct): function check_file_is_model (line 169) | def check_file_is_model(path): class WorkspaceType (line 174) | class WorkspaceType(Enum): class WorkspaceManager (line 182) | class WorkspaceManager: method __init__ (line 183) | def __init__( method setup_workspace_manager (line 195) | def setup_workspace_manager( method set_recent_workspace (line 208) | def set_recent_workspace(self, path: str): method set_default_workspace (line 214) | def set_default_workspace(self, path: str): method set_default_launch_extras (line 220) | def set_default_launch_extras(self, extras: str): method __get_specified_workspace (line 226) | def __get_specified_workspace(self) -> str | None: method get_workspace_path (line 232) | def get_workspace_path(self) -> tuple[str, WorkspaceType]: method scan_dir (line 306) | def scan_dir(self): method scan_dir_concur (line 318) | def scan_dir_concur(self): method load_metadata (line 331) | def load_metadata(self): method save_metadata (line 339) | def save_metadata(self): method fill_print_table (line 343) | def fill_print_table(self): FILE: tests/comfy_cli/command/generate/test_adapters.py function test_nano_banana_alias_resolves (line 15) | def test_nano_banana_alias_resolves(): function test_gemini_adapter_overrides_schema_flags (line 22) | def test_gemini_adapter_overrides_schema_flags(): function test_gemini_build_body_text_only (line 30) | def test_gemini_build_body_text_only(): function test_gemini_build_body_inlines_local_image (line 38) | def test_gemini_build_body_inlines_local_image(tmp_path): function test_gemini_build_body_inlines_remote_url (line 52) | def test_gemini_build_body_inlines_remote_url(monkeypatch): function test_gemini_build_body_inlines_data_uri (line 81) | def test_gemini_build_body_inlines_data_uri(): function test_gemini_inline_image_missing_path_raises (line 92) | def test_gemini_inline_image_missing_path_raises(tmp_path): function test_gemini_decode_sync_saves_inline_blobs (line 97) | def test_gemini_decode_sync_saves_inline_blobs(tmp_path): function test_gemini_decode_sync_handles_snake_case_keys (line 106) | def test_gemini_decode_sync_handles_snake_case_keys(tmp_path): function test_gemini_decode_sync_returns_empty_when_blocked (line 117) | def test_gemini_decode_sync_returns_empty_when_blocked(tmp_path): function test_gemini_resolve_path_substitutes_model (line 123) | def test_gemini_resolve_path_substitutes_model(): function test_gemini_send_request_hits_substituted_path (line 130) | def test_gemini_send_request_hits_substituted_path(monkeypatch): function test_seedance_alias_resolves (line 154) | def test_seedance_alias_resolves(): function test_seedance_adapter_overrides_flags (line 161) | def test_seedance_adapter_overrides_flags(): function test_seedance_build_body_text_only (line 171) | def test_seedance_build_body_text_only(): function test_seedance_build_body_inlines_knobs_into_text (line 177) | def test_seedance_build_body_inlines_knobs_into_text(): function test_seedance_build_body_uploads_local_image (line 198) | def test_seedance_build_body_uploads_local_image(monkeypatch, tmp_path): function test_seedance_build_body_keeps_remote_url_verbatim (line 218) | def test_seedance_build_body_keeps_remote_url_verbatim(monkeypatch): function test_seedance_build_body_includes_audio_flag (line 233) | def test_seedance_build_body_includes_audio_flag(): function test_seedance_send_request_passes_through_body (line 242) | def test_seedance_send_request_passes_through_body(monkeypatch): function test_seedance_poll_url_and_success_extraction (line 262) | def test_seedance_poll_url_and_success_extraction(monkeypatch): function test_seedance_poll_failure (line 283) | def test_seedance_poll_failure(monkeypatch): function test_seedance_resume_helper_round_trip (line 296) | def test_seedance_resume_helper_round_trip(): function test_save_inline_blobs_auto_indexes_multi (line 308) | def test_save_inline_blobs_auto_indexes_multi(tmp_path): function test_save_inline_blobs_picks_extension_from_mime (line 318) | def test_save_inline_blobs_picks_extension_from_mime(tmp_path): FILE: tests/comfy_cli/command/generate/test_app.py function disable_tracking_prompt (line 19) | def disable_tracking_prompt(monkeypatch): function runner (line 27) | def runner(): function api_key (line 32) | def api_key(monkeypatch): function test_no_args_prints_top_help (line 40) | def test_no_args_prints_top_help(runner): function test_top_help_via_dash_help (line 47) | def test_top_help_via_dash_help(runner): function test_list_shows_aliases (line 56) | def test_list_shows_aliases(runner): function test_list_partner_filter (line 62) | def test_list_partner_filter(runner): function test_list_partner_eq_form (line 69) | def test_list_partner_eq_form(runner): function test_list_style_filter (line 75) | def test_list_style_filter(runner): function test_list_query_filter (line 81) | def test_list_query_filter(runner): function test_list_no_matches (line 87) | def test_list_no_matches(runner): function test_schema_alias (line 96) | def test_schema_alias(runner): function test_schema_full_path (line 103) | def test_schema_full_path(runner): function test_schema_missing_arg (line 109) | def test_schema_missing_arg(runner): function test_schema_unknown_model (line 115) | def test_schema_unknown_model(runner): function test_per_model_help (line 124) | def test_per_model_help(runner): function test_generate_missing_api_key (line 134) | def test_generate_missing_api_key(runner, monkeypatch): function test_generate_bad_int_suggests_schema (line 144) | def test_generate_bad_int_suggests_schema(runner, api_key): function test_generate_unknown_model (line 154) | def test_generate_unknown_model(runner, api_key): function test_generate_missing_required (line 160) | def test_generate_missing_required(runner, api_key): function test_generate_bad_timeout (line 166) | def test_generate_bad_timeout(runner, api_key, monkeypatch): function test_generate_async_sync_poll_to_ready (line 183) | def test_generate_async_sync_poll_to_ready(runner, api_key, monkeypatch): function test_generate_async_returns_job_id (line 202) | def test_generate_async_returns_job_id(runner, api_key, monkeypatch): function test_generate_async_failure_status (line 215) | def test_generate_async_failure_status(runner, api_key, monkeypatch): function test_generate_sync_prints_url (line 229) | def test_generate_sync_prints_url(runner, api_key, monkeypatch): function test_generate_sync_with_download (line 237) | def test_generate_sync_with_download(runner, api_key, tmp_path, monkeypa... function test_generate_json_flag (line 249) | def test_generate_json_flag(runner, api_key, monkeypatch): function test_generate_download_no_urls (line 259) | def test_generate_download_no_urls(runner, api_key, monkeypatch): function test_generate_binary_response_with_download (line 270) | def test_generate_binary_response_with_download(runner, api_key, tmp_pat... function test_generate_binary_response_no_download (line 279) | def test_generate_binary_response_no_download(runner, api_key, monkeypat... function test_generate_api_error_surface (line 290) | def test_generate_api_error_surface(runner, api_key, monkeypatch): function test_generate_network_error_surface (line 299) | def test_generate_network_error_surface(runner, api_key, monkeypatch): function test_generate_non_json_response (line 309) | def test_generate_non_json_response(runner, api_key, monkeypatch): function test_resume_missing_args (line 320) | def test_resume_missing_args(runner, api_key): function test_resume_sync_model_rejected (line 326) | def test_resume_sync_model_rejected(runner, api_key): function test_resume_unknown_model (line 332) | def test_resume_unknown_model(runner, api_key): function test_resume_async_succeeds (line 338) | def test_resume_async_succeeds(runner, api_key, monkeypatch): function test_resume_with_download (line 350) | def test_resume_with_download(runner, api_key, tmp_path, monkeypatch): function test_refresh_writes_cache (line 367) | def test_refresh_writes_cache(runner, monkeypatch, tmp_path): function test_refresh_network_failure (line 399) | def test_refresh_network_failure(runner, monkeypatch): function test_upload_missing_arg (line 422) | def test_upload_missing_arg(runner, api_key): function test_upload_local_file (line 428) | def test_upload_local_file(runner, api_key, tmp_path, monkeypatch): function test_upload_json_output (line 443) | def test_upload_json_output(runner, api_key, tmp_path, monkeypatch): function test_upload_does_not_mistake_meta_value_for_target (line 459) | def test_upload_does_not_mistake_meta_value_for_target(runner, monkeypat... function test_upload_propagates_api_error (line 478) | def test_upload_propagates_api_error(runner, api_key, tmp_path, monkeypa... function test_generate_auto_base64_for_kontext (line 494) | def test_generate_auto_base64_for_kontext(runner, api_key, tmp_path, mon... function test_generate_auto_upload_leaves_url_alone (line 515) | def test_generate_auto_upload_leaves_url_alone(runner, api_key, monkeypa... function test_generate_auto_upload_skipped_for_multipart (line 548) | def test_generate_auto_upload_skipped_for_multipart(runner, api_key, tmp... function test_video_kling_async_path (line 584) | def test_video_kling_async_path(runner, api_key, monkeypatch): function test_video_luma_async_path (line 605) | def test_video_luma_async_path(runner, api_key, monkeypatch): function test_video_runway_failure_surfaces (line 633) | def test_video_runway_failure_surfaces(runner, api_key, monkeypatch): function test_video_async_submission_shows_resume_alias (line 661) | def test_video_async_submission_shows_resume_alias(runner, api_key, monk... function test_video_resume_kling (line 670) | def test_video_resume_kling(runner, api_key, monkeypatch): function test_list_video_filter (line 687) | def test_list_video_filter(runner): function test_arg_value_long_and_eq (line 698) | def test_arg_value_long_and_eq(): function test_arg_value_alternatives (line 704) | def test_arg_value_alternatives(): function test_separate_meta_flags_typical (line 708) | def test_separate_meta_flags_typical(): function test_separate_meta_flags_eq_form (line 716) | def test_separate_meta_flags_eq_form(): function test_separate_meta_flags_missing_value_raises (line 721) | def test_separate_meta_flags_missing_value_raises(): FILE: tests/comfy_cli/command/generate/test_client.py function test_resolve_api_key_from_env (line 9) | def test_resolve_api_key_from_env(monkeypatch): function test_resolve_api_key_explicit_wins (line 14) | def test_resolve_api_key_explicit_wins(monkeypatch): function test_resolve_api_key_missing (line 19) | def test_resolve_api_key_missing(monkeypatch): function test_split_payload_json_pass_through (line 25) | def test_split_payload_json_pass_through(): function test_split_payload_multipart_separates_files (line 37) | def test_split_payload_multipart_separates_files(tmp_path): function _capture_post (line 57) | def _capture_post(monkeypatch): function test_send_request_uses_x_api_key_for_comfyui_keys (line 70) | def test_send_request_uses_x_api_key_for_comfyui_keys(monkeypatch): function test_send_request_uses_bearer_for_firebase_tokens (line 80) | def test_send_request_uses_bearer_for_firebase_tokens(monkeypatch): function test_raise_for_status_includes_body (line 90) | def test_raise_for_status_includes_body(): FILE: tests/comfy_cli/command/generate/test_output.py function test_resolve_template_directory_shorthand (line 8) | def test_resolve_template_directory_shorthand(tmp_path): function test_resolve_template_placeholders (line 13) | def test_resolve_template_placeholders(tmp_path): function test_ext_from_response_known_mime (line 19) | def test_ext_from_response_known_mime(): function test_ext_from_url_strips_query (line 24) | def test_ext_from_url_strips_query(): FILE: tests/comfy_cli/command/generate/test_poll.py function _resp (line 10) | def _resp(body): function test_poll_bfl_extracts_sample_url (line 14) | def test_poll_bfl_extracts_sample_url(): function test_poll_bfl_reports_failure (line 46) | def test_poll_bfl_reports_failure(): FILE: tests/comfy_cli/command/generate/test_schema.py function test_flags_for_bfl_classifies_types (line 8) | def test_flags_for_bfl_classifies_types(): function test_flags_for_multipart_finds_binary_fields (line 19) | def test_flags_for_multipart_finds_binary_fields(): function test_parse_args_basic_coercion (line 28) | def test_parse_args_basic_coercion(): function test_parse_args_eq_form_and_enum (line 43) | def test_parse_args_eq_form_and_enum(): function test_parse_args_rejects_unknown_flag (line 53) | def test_parse_args_rejects_unknown_flag(): function test_parse_args_rejects_bad_int (line 60) | def test_parse_args_rejects_bad_int(): function test_parse_args_missing_required (line 67) | def test_parse_args_missing_required(): function test_parse_args_enum_value_validated (line 74) | def test_parse_args_enum_value_validated(): function test_parse_args_object_accepts_json (line 84) | def test_parse_args_object_accepts_json(): FILE: tests/comfy_cli/command/generate/test_spec.py function test_registry_loads_and_has_entries (line 7) | def test_registry_loads_and_has_entries(): function test_get_endpoint_round_trip (line 12) | def test_get_endpoint_round_trip(): function test_unknown_endpoint_suggests_close_match (line 21) | def test_unknown_endpoint_suggests_close_match(): function test_request_schema_resolved_no_refs (line 31) | def test_request_schema_resolved_no_refs(): function test_multipart_endpoints_detected (line 39) | def test_multipart_endpoints_detected(): function test_json_endpoints_detected (line 44) | def test_json_endpoints_detected(): function test_sync_endpoints_have_no_polling (line 49) | def test_sync_endpoints_have_no_polling(): function test_filter_by_partner_and_category (line 54) | def test_filter_by_partner_and_category(): function test_proxy_prefix_accepted (line 61) | def test_proxy_prefix_accepted(): FILE: tests/comfy_cli/command/generate/test_upload.py function test_request_signed_url_posts_hash (line 9) | def test_request_signed_url_posts_hash(monkeypatch): function test_upload_bytes_dedupe_skips_put (line 35) | def test_upload_bytes_dedupe_skips_put(monkeypatch): function test_upload_bytes_new_file_puts (line 57) | def test_upload_bytes_new_file_puts(monkeypatch): function test_upload_path_reads_file (line 83) | def test_upload_path_reads_file(monkeypatch, tmp_path): function test_upload_path_missing_file (line 100) | def test_upload_path_missing_file(tmp_path): function test_upload_remote_url_rehosts (line 105) | def test_upload_remote_url_rehosts(monkeypatch): function test_upload_target_dispatches_on_scheme (line 137) | def test_upload_target_dispatches_on_scheme(monkeypatch, tmp_path): function test_put_bytes_raises_on_error (line 147) | def test_put_bytes_raises_on_error(monkeypatch): FILE: tests/comfy_cli/command/generate/test_video_poll.py function _resp (line 9) | def _resp(body): function no_sleep (line 14) | def no_sleep(monkeypatch): function _make_runner (line 18) | def _make_runner(get_responses): function test_kling_sibling_poll_path (line 24) | def test_kling_sibling_poll_path(no_sleep, monkeypatch): function test_luma_succeeds (line 44) | def test_luma_succeeds(no_sleep, monkeypatch): function test_runway_progress_normalized (line 59) | def test_runway_progress_normalized(no_sleep, monkeypatch): function test_runway_failure_states (line 75) | def test_runway_failure_states(no_sleep, monkeypatch): function test_minimax_redeems_file_id (line 85) | def test_minimax_redeems_file_id(no_sleep, monkeypatch): function test_pika_polls_videos_endpoint (line 102) | def test_pika_polls_videos_endpoint(no_sleep, monkeypatch): function test_vidu_polls_creations_path (line 115) | def test_vidu_polls_creations_path(no_sleep, monkeypatch): function test_xai_video_polls_request_id (line 127) | def test_xai_video_polls_request_id(no_sleep, monkeypatch): function test_moonvalley_polls_prompts (line 139) | def test_moonvalley_polls_prompts(no_sleep, monkeypatch): function test_missing_id_raises (line 151) | def test_missing_id_raises(monkeypatch): function test_kling_without_create_path_raises (line 157) | def test_kling_without_create_path_raises(): function test_build_synthetic_initial_for_each_partner (line 162) | def test_build_synthetic_initial_for_each_partner(): function test_build_synthetic_initial_for_bfl (line 169) | def test_build_synthetic_initial_for_bfl(): function test_extract_urls_recognizes_video_extensions (line 175) | def test_extract_urls_recognizes_video_extensions(): function test_extract_urls_recognizes_query_strings (line 181) | def test_extract_urls_recognizes_query_strings(): function test_extract_job_id_from_nested_paths (line 187) | def test_extract_job_id_from_nested_paths(): function test_existing_bfl_poller_still_works (line 194) | def test_existing_bfl_poller_still_works(no_sleep, monkeypatch): FILE: tests/comfy_cli/command/github/test_pr.py function runner (line 28) | def runner(): function sample_pr_info (line 35) | def sample_pr_info(): class TestPRReferenceParsing (line 48) | class TestPRReferenceParsing: method test_parse_pr_number_format (line 49) | def test_parse_pr_number_format(self): method test_parse_user_branch_format (line 56) | def test_parse_user_branch_format(self): method test_parse_github_url_format (line 63) | def test_parse_github_url_format(self): method test_parse_invalid_format (line 71) | def test_parse_invalid_format(self): method test_parse_empty_string (line 76) | def test_parse_empty_string(self): class TestGitHubAPIIntegration (line 82) | class TestGitHubAPIIntegration: method test_fetch_pr_info_success (line 86) | def test_fetch_pr_info_success(self, mock_get, sample_pr_info): method test_fetch_pr_info_not_found (line 112) | def test_fetch_pr_info_not_found(self, mock_get): method test_fetch_pr_info_rate_limit (line 123) | def test_fetch_pr_info_rate_limit(self, mock_get): method test_find_pr_by_branch_success (line 134) | def test_find_pr_by_branch_success(self, mock_get): method test_find_pr_by_branch_not_found (line 161) | def test_find_pr_by_branch_not_found(self, mock_get): method test_find_pr_by_branch_error (line 172) | def test_find_pr_by_branch_error(self, mock_get): class TestGitOperations (line 180) | class TestGitOperations: method test_checkout_pr_fork_success (line 186) | def test_checkout_pr_fork_success(self, mock_getcwd, mock_chdir, mock_... method test_checkout_pr_non_fork_success (line 211) | def test_checkout_pr_non_fork_success(self, mock_getcwd, mock_chdir, m... method test_checkout_pr_git_failure (line 239) | def test_checkout_pr_git_failure(self, mock_getcwd, mock_chdir, mock_s... class TestGitCheckoutTag (line 251) | class TestGitCheckoutTag: method _init_repo (line 261) | def _init_repo(path): method test_succeeds_offline_when_tag_already_local (line 270) | def test_succeeds_offline_when_tag_already_local(self, tmp_path): method test_fetches_when_tag_missing_locally (line 297) | def test_fetches_when_tag_missing_locally(self, tmp_path): class TestHandlePRCheckout (line 311) | class TestHandlePRCheckout: method test_handle_pr_checkout_success (line 321) | def test_handle_pr_checkout_success( class TestCommandLineIntegration (line 349) | class TestCommandLineIntegration: method test_install_with_pr_parameter (line 353) | def test_install_with_pr_parameter(self, mock_execute, runner): method test_pr_and_version_conflict (line 363) | def test_pr_and_version_conflict(self, runner): method test_pr_and_commit_conflict (line 369) | def test_pr_and_commit_conflict(self, runner): method test_commit_without_pr_does_not_conflict (line 379) | def test_commit_without_pr_does_not_conflict(self, mock_track, mock_ws... method test_cpu_pr_conflict_with_version (line 393) | def test_cpu_pr_conflict_with_version(self, mock_track, mock_ws, mock_... method test_cpu_pr_conflict_with_commit (line 406) | def test_cpu_pr_conflict_with_commit(self, mock_track, mock_ws, mock_c... method test_cpu_pr_passes_pr_to_execute (line 421) | def test_cpu_pr_passes_pr_to_execute(self, mock_track, mock_ws, mock_c... class TestPRInfoDataClass (line 431) | class TestPRInfoDataClass: method test_pr_info_is_fork_true (line 434) | def test_pr_info_is_fork_true(self): method test_pr_info_is_fork_false (line 448) | def test_pr_info_is_fork_false(self): class TestEdgeCases (line 463) | class TestEdgeCases: method test_parse_pr_reference_whitespace (line 466) | def test_parse_pr_reference_whitespace(self): method test_fetch_pr_info_with_github_token (line 474) | def test_fetch_pr_info_with_github_token(self, mock_get): method test_checkout_pr_remote_already_exists (line 498) | def test_checkout_pr_remote_already_exists(self, mock_getcwd, mock_chd... class TestGetLatestRelease (line 514) | class TestGetLatestRelease: method test_sends_auth_header_when_token_set (line 518) | def test_sends_auth_header_when_token_set(self, mock_get): method test_no_auth_header_without_token (line 537) | def test_no_auth_header_without_token(self, mock_get): method test_rate_limit_raises_error (line 554) | def test_rate_limit_raises_error(self, mock_get): method test_non_semver_tag_returns_release_with_version_none (line 565) | def test_non_semver_tag_returns_release_with_version_none(self, mock_g... class TestHandleGithubRateLimit (line 583) | class TestHandleGithubRateLimit: method test_primary_rate_limit_message_format (line 584) | def test_primary_rate_limit_message_format(self): method test_retry_after_header (line 596) | def test_retry_after_header(self): method test_no_rate_limit_does_not_raise (line 603) | def test_no_rate_limit_does_not_raise(self): class TestResolveLatestTagFromLocal (line 610) | class TestResolveLatestTagFromLocal: method _init_repo (line 615) | def _init_repo(path): method _make_repo (line 625) | def _make_repo(cls, path, tags): method test_picks_highest_stable_semver (line 630) | def test_picks_highest_stable_semver(self, tmp_path): method test_skips_pre_release_tags (line 635) | def test_skips_pre_release_tags(self, tmp_path): method test_skips_non_semver_tags (line 641) | def test_skips_non_semver_tags(self, tmp_path): method test_returns_none_when_no_tags (line 646) | def test_returns_none_when_no_tags(self, tmp_path): method test_returns_none_when_only_prereleases (line 651) | def test_returns_none_when_only_prereleases(self, tmp_path): method test_returns_none_when_only_non_semver (line 656) | def test_returns_none_when_only_non_semver(self, tmp_path): method test_returns_none_for_non_git_directory (line 661) | def test_returns_none_for_non_git_directory(self, tmp_path): method test_tolerates_fetch_exception (line 666) | def test_tolerates_fetch_exception(self, tmp_path): method test_tolerates_fetch_nonzero_exit (line 683) | def test_tolerates_fetch_nonzero_exit(self, tmp_path): method test_tag_with_v_prefix_normalized (line 701) | def test_tag_with_v_prefix_normalized(self, tmp_path): class TestParseGithubOwnerRepo (line 708) | class TestParseGithubOwnerRepo: method test_parses_github_urls (line 732) | def test_parses_github_urls(self, url, expected): method test_returns_none_for_non_github_urls (line 747) | def test_returns_none_for_non_github_urls(self, url): class TestCheckoutStableComfyUI (line 759) | class TestCheckoutStableComfyUI: method test_latest_uses_local_tag_no_api_call (line 767) | def test_latest_uses_local_tag_no_api_call(self, mock_local, mock_api,... method test_latest_warns_on_stale_tag_when_fetch_failed (line 778) | def test_latest_warns_on_stale_tag_when_fetch_failed(self, mock_local,... method test_latest_no_warning_when_fetch_succeeded (line 797) | def test_latest_no_warning_when_fetch_succeeded(self, mock_local, mock... method test_latest_falls_back_to_api_when_local_empty (line 808) | def test_latest_falls_back_to_api_when_local_empty(self, mock_local, m... method test_latest_fallback_uses_fork_owner_repo_from_url (line 821) | def test_latest_fallback_uses_fork_owner_repo_from_url(self, mock_loca... method test_latest_fallback_strips_branch_suffix_from_url (line 837) | def test_latest_fallback_strips_branch_suffix_from_url(self, mock_loca... method test_latest_fallback_defaults_to_upstream_for_non_github_url (line 849) | def test_latest_fallback_defaults_to_upstream_for_non_github_url(self,... method test_latest_fallback_defaults_to_upstream_when_url_omitted (line 861) | def test_latest_fallback_defaults_to_upstream_when_url_omitted(self, m... method test_latest_warns_when_fetch_failed_before_api_fallback (line 873) | def test_latest_warns_when_fetch_failed_before_api_fallback(self, mock... method test_latest_exits_when_both_local_and_api_fail (line 888) | def test_latest_exits_when_both_local_and_api_fail(self, mock_local, m... method test_specific_version_skips_both_local_and_api (line 896) | def test_specific_version_skips_both_local_and_api(self, mock_local, m... method test_specific_version_with_v_prefix_passes_through (line 907) | def test_specific_version_with_v_prefix_passes_through(self, mock_loca... method test_latest_with_rate_limited_api_when_no_local_tags (line 916) | def test_latest_with_rate_limited_api_when_no_local_tags(self, mock_co... method test_latest_with_local_tags_no_network_at_all (line 938) | def test_latest_with_local_tags_no_network_at_all(self, mock_co, mock_... class TestInstallExecuteWithLatest (line 951) | class TestInstallExecuteWithLatest: method _make_comfy_repo (line 967) | def _make_comfy_repo(path): method test_full_execute_resolves_latest_locally_no_api_call (line 983) | def test_full_execute_resolves_latest_locally_no_api_call(self, tmp_pa... method test_full_execute_with_specific_version_no_api_no_resolver (line 1034) | def test_full_execute_with_specific_version_no_api_no_resolver(self, t... FILE: tests/comfy_cli/command/models/test_models.py function _make_model_tree (line 10) | def _make_model_tree(tmp_path: pathlib.Path) -> pathlib.Path: function test_list_models_finds_files_in_subdirectories (line 23) | def test_list_models_finds_files_in_subdirectories(tmp_path): function test_list_models_finds_root_level_files (line 33) | def test_list_models_finds_root_level_files(tmp_path): function test_list_models_returns_empty_for_missing_directory (line 40) | def test_list_models_returns_empty_for_missing_directory(tmp_path): function test_list_models_ignores_directories (line 44) | def test_list_models_ignores_directories(tmp_path): function test_list_command_shows_type_column (line 56) | def test_list_command_shows_type_column(tmp_path): function test_remove_with_path_traversal_is_rejected (line 67) | def test_remove_with_path_traversal_is_rejected(tmp_path): function test_remove_deletes_model_in_subdirectory (line 84) | def test_remove_deletes_model_in_subdirectory(tmp_path): function test_remove_rejects_directory_name (line 98) | def test_remove_rejects_directory_name(tmp_path): function test_remove_deletes_root_level_model (line 110) | def test_remove_deletes_root_level_model(tmp_path): function test_remove_interactive_shows_relative_paths (line 124) | def test_remove_interactive_shows_relative_paths(tmp_path): function test_valid_model_url (line 142) | def test_valid_model_url(): function test_valid_model_url_with_version (line 147) | def test_valid_model_url_with_version(): function test_valid_model_url_with_version_and_additional_segments (line 152) | def test_valid_model_url_with_version_and_additional_segments(): function test_valid_model_url_with_query (line 157) | def test_valid_model_url_with_query(): function test_valid_api_url (line 162) | def test_valid_api_url(): function test_invalid_url (line 167) | def test_invalid_url(): function test_malformed_url (line 172) | def test_malformed_url(): function test_invalid_model_id_url (line 177) | def test_invalid_model_id_url(): function test_malformed_query_url (line 182) | def test_malformed_query_url(): function test_model_url_with_model_version_id_query (line 187) | def test_model_url_with_model_version_id_query(): function test_model_url_with_model_version_id_invalid (line 192) | def test_model_url_with_model_version_id_invalid(): function test_valid_api_v1_model_versions_url (line 197) | def test_valid_api_v1_model_versions_url(): function test_valid_api_v1_model_versions_camelcase_segment (line 202) | def test_valid_api_v1_model_versions_camelcase_segment(): function test_valid_api_download_with_query_params (line 207) | def test_valid_api_download_with_query_params(): function test_api_download_trailing_slash_is_ok (line 212) | def test_api_download_trailing_slash_is_ok(): function test_api_download_non_numeric_id_models_version (line 217) | def test_api_download_non_numeric_id_models_version(): function test_api_download_non_numeric_id (line 222) | def test_api_download_non_numeric_id(): function test_model_url_with_slug_and_query (line 227) | def test_model_url_with_slug_and_query(): function test_www_subdomain_is_accepted (line 232) | def test_www_subdomain_is_accepted(): function test_completly_mailformed_civitai_url (line 237) | def test_completly_mailformed_civitai_url(): function test_non_evil_civitai_url (line 242) | def test_non_evil_civitai_url(): function test_valid_model_url_red_domain (line 247) | def test_valid_model_url_red_domain(): function test_valid_model_url_red_with_query (line 252) | def test_valid_model_url_red_with_query(): function test_valid_api_download_url_red_domain (line 257) | def test_valid_api_download_url_red_domain(): function test_valid_api_v1_model_versions_url_red_domain (line 262) | def test_valid_api_v1_model_versions_url_red_domain(): function test_www_subdomain_red_is_accepted (line 267) | def test_www_subdomain_red_is_accepted(): function test_non_evil_civitai_red_url (line 272) | def test_non_evil_civitai_red_url(): function test_red_as_spoofed_subdomain_of_other_tld (line 277) | def test_red_as_spoofed_subdomain_of_other_tld(): function test_valid_huggingface_url (line 282) | def test_valid_huggingface_url(): function test_valid_huggingface_url_sd_audio (line 287) | def test_valid_huggingface_url_sd_audio(): function test_valid_huggingface_url_with_folder (line 292) | def test_valid_huggingface_url_with_folder(): function test_valid_huggingface_url_with_subfolder (line 303) | def test_valid_huggingface_url_with_subfolder(): function test_valid_huggingface_url_with_encoded_filename (line 314) | def test_valid_huggingface_url_with_encoded_filename(): function test_invalid_huggingface_url (line 319) | def test_invalid_huggingface_url(): function test_invalid_huggingface_url_structure (line 324) | def test_invalid_huggingface_url_structure(): function test_huggingface_url_with_com_domain (line 329) | def test_huggingface_url_with_com_domain(): function test_huggingface_url_with_folder_structure (line 334) | def test_huggingface_url_with_folder_structure(): class TestFormatElapsed (line 345) | class TestFormatElapsed: method test_under_one_minute (line 346) | def test_under_one_minute(self): method test_fractional_seconds (line 349) | def test_fractional_seconds(self): method test_rounds_up_to_minute_boundary (line 352) | def test_rounds_up_to_minute_boundary(self): method test_exactly_sixty_seconds (line 355) | def test_exactly_sixty_seconds(self): method test_minutes_and_seconds (line 358) | def test_minutes_and_seconds(self): method test_over_one_hour (line 361) | def test_over_one_hour(self): method test_large_duration (line 364) | def test_large_duration(self): class TestDownloadCommandDownloaderOption (line 373) | class TestDownloadCommandDownloaderOption: method test_downloader_flag_forwarded (line 374) | def test_downloader_flag_forwarded(self, tmp_path): method test_default_from_config (line 406) | def test_default_from_config(self, tmp_path): method test_cli_flag_overrides_config (line 439) | def test_cli_flag_overrides_config(self, tmp_path): class TestDownloadCommandErrorHandling (line 475) | class TestDownloadCommandErrorHandling: method _run_with_download_error (line 478) | def _run_with_download_error(self, tmp_path, exc): method test_download_exception_exits_with_code_1 (line 503) | def test_download_exception_exits_with_code_1(self, tmp_path): method test_download_exception_does_not_show_traceback (line 511) | def test_download_exception_does_not_show_traceback(self, tmp_path): method test_download_exception_skips_done_message (line 522) | def test_download_exception_skips_done_message(self, tmp_path): method test_download_exception_with_markup_chars_does_not_crash (line 529) | def test_download_exception_with_markup_chars_does_not_crash(self, tmp... FILE: tests/comfy_cli/command/nodes/test_bisect_custom_nodes.py function bisect_state (line 10) | def bisect_state(): function test_good (line 19) | def test_good(): function test_good_resolved (line 33) | def test_good_resolved(bisect_state: BisectState): function test_bad (line 41) | def test_bad(bisect_state): function test_bad_resolved (line 49) | def test_bad_resolved(): function test_save (line 64) | def test_save(mock_execute_cm_cli, bisect_state, tmp_path): function test_reset (line 75) | def test_reset(mock_execute_cm_cli, bisect_state): function test_load_existing_state (line 84) | def test_load_existing_state(tmp_path): function test_load_nonexistent_state (line 102) | def test_load_nonexistent_state(tmp_path): function test_set_custom_node_enabled_states (line 112) | def test_set_custom_node_enabled_states(mock_execute_cm_cli, bisect_state): function test_set_custom_node_enabled_states_no_active_nodes (line 118) | def test_set_custom_node_enabled_states_no_active_nodes(mock_execute_cm_... FILE: tests/comfy_cli/command/nodes/test_node_init.py function test_node_init_strips_credentials (line 11) | def test_node_init_strips_credentials(tmp_path, monkeypatch): function test_node_init_refuses_overwrite (line 32) | def test_node_init_refuses_overwrite(tmp_path, monkeypatch): FILE: tests/comfy_cli/command/nodes/test_node_install.py function strip_ansi (line 13) | def strip_ansi(text): function test_install_no_deps_option_exists (line 18) | def test_install_no_deps_option_exists(): function test_install_fast_deps_and_no_deps_mutually_exclusive (line 26) | def test_install_fast_deps_and_no_deps_mutually_exclusive(): function test_install_no_deps_alone_works (line 32) | def test_install_no_deps_alone_works(): function test_install_fast_deps_alone_works (line 42) | def test_install_fast_deps_alone_works(): function test_install_neither_deps_option (line 52) | def test_install_neither_deps_option(): function test_multiple_commands_work_independently (line 62) | def test_multiple_commands_work_independently(): function test_install_uv_compile_passes_to_execute (line 72) | def test_install_uv_compile_passes_to_execute(): function test_install_no_uv_compile_passes_false (line 83) | def test_install_no_uv_compile_passes_false(): function test_install_uv_compile_and_fast_deps_mutually_exclusive (line 92) | def test_install_uv_compile_and_fast_deps_mutually_exclusive(): function test_install_uv_compile_and_no_deps_mutually_exclusive (line 98) | def test_install_uv_compile_and_no_deps_mutually_exclusive(): function test_uv_sync_calls_execute_cm_cli (line 104) | def test_uv_sync_calls_execute_cm_cli(): function test_reinstall_uv_compile_passes_to_execute (line 113) | def test_reinstall_uv_compile_passes_to_execute(): function test_reinstall_uv_compile_and_fast_deps_mutually_exclusive (line 122) | def test_reinstall_uv_compile_and_fast_deps_mutually_exclusive(): function test_reinstall_no_uv_compile_passes_false (line 128) | def test_reinstall_no_uv_compile_passes_false(): function test_install_exit_on_fail_reraises_and_propagates_code (line 137) | def test_install_exit_on_fail_reraises_and_propagates_code(): function test_save_snapshot_no_output (line 148) | def test_save_snapshot_no_output(): function test_save_snapshot_with_output (line 157) | def test_save_snapshot_with_output(): function test_restore_snapshot_with_uv_compile (line 167) | def test_restore_snapshot_with_uv_compile(): function test_restore_snapshot_with_pip_flags (line 176) | def test_restore_snapshot_with_pip_flags(): function test_restore_dependencies_with_uv_compile (line 186) | def test_restore_dependencies_with_uv_compile(): function test_update_with_uv_compile (line 195) | def test_update_with_uv_compile(): function test_fix_with_uv_compile (line 207) | def test_fix_with_uv_compile(): function test_uninstall_rejects_all (line 216) | def test_uninstall_rejects_all(): function test_reinstall_rejects_all (line 223) | def test_reinstall_rejects_all(): function test_validate_mode_rejects_invalid (line 230) | def test_validate_mode_rejects_invalid(): function test_install_deps_with_deps_file (line 236) | def test_install_deps_with_deps_file(): function test_install_deps_with_uv_compile (line 245) | def test_install_deps_with_uv_compile(): function test_install_deps_no_args_shows_error (line 254) | def test_install_deps_no_args_shows_error(): function test_restore_snapshot_with_pip_non_local_url (line 260) | def test_restore_snapshot_with_pip_non_local_url(): function test_update_calls_update_node_id_cache (line 269) | def test_update_calls_update_node_id_cache(): function test_uninstall_calls_execute (line 280) | def test_uninstall_calls_execute(): function test_show_installed (line 289) | def test_show_installed(): function test_install_deps_with_workflow (line 298) | def test_install_deps_with_workflow(tmp_path): function test_install_rejects_all (line 315) | def test_install_rejects_all(): function test_simple_show_installed (line 322) | def test_simple_show_installed(): function test_show_with_channel (line 331) | def test_show_with_channel(): class TestRegistryInstallDownloadError (line 340) | class TestRegistryInstallDownloadError: method _invoke (line 344) | def _invoke(self, tmp_path, download_side_effect): method test_download_exception_caught_and_reported (line 360) | def test_download_exception_caught_and_reported(self, tmp_path): method test_no_extract_or_install_script_after_failure (line 373) | def test_no_extract_or_install_script_after_failure(self, tmp_path): method test_no_traceback_in_output (line 381) | def test_no_traceback_in_output(self, tmp_path): FILE: tests/comfy_cli/command/nodes/test_pack.py function test_pack_creates_zip_with_correct_contents (line 24) | def test_pack_creates_zip_with_correct_contents(tmp_path, monkeypatch): FILE: tests/comfy_cli/command/nodes/test_publish.py function create_mock_config (line 11) | def create_mock_config(includes_list=None): function test_publish_fails_on_security_violations (line 34) | def test_publish_fails_on_security_violations(): function test_publish_continues_on_no_security_violations (line 52) | def test_publish_continues_on_no_security_violations(): function test_publish_handles_missing_ruff (line 82) | def test_publish_handles_missing_ruff(): function test_publish_with_token_option (line 90) | def test_publish_with_token_option(): function test_publish_exits_on_upload_failure (line 118) | def test_publish_exits_on_upload_failure(): function test_publish_fails_when_config_is_none (line 149) | def test_publish_fails_when_config_is_none(): function test_publish_fails_when_version_is_empty (line 161) | def test_publish_fails_when_version_is_empty(): function test_publish_with_includes_parameter (line 179) | def test_publish_with_includes_parameter(): FILE: tests/comfy_cli/command/test_bisect_parse.py class TestParseCmOutput (line 110) | class TestParseCmOutput: method test_real_output_filters_fetch_lines (line 111) | def test_real_output_filters_fetch_lines(self): method test_no_fetch_lines_in_result (line 116) | def test_no_fetch_lines_in_result(self): method test_pinned_nodes_excluded (line 121) | def test_pinned_nodes_excluded(self): method test_empty_output (line 128) | def test_empty_output(self): method test_only_fetch_lines (line 132) | def test_only_fetch_lines(self): method test_no_fetch_lines (line 136) | def test_no_fetch_lines(self): method test_arbitrary_status_lines_filtered (line 140) | def test_arbitrary_status_lines_filtered(self): FILE: tests/comfy_cli/command/test_cm_cli_util.py function _make_mock_proc (line 11) | def _make_mock_proc(returncode, stdout_lines=None, stderr_lines=None): function _clear_find_cm_cli_cache (line 21) | def _clear_find_cm_cli_cache(): function _cm_cli_env (line 28) | def _cm_cli_env(tmp_path): class TestFindCmCli (line 48) | class TestFindCmCli: method test_returns_true_when_module_exists_same_python (line 49) | def test_returns_true_when_module_exists_same_python(self): method test_returns_true_no_workspace_module_exists (line 61) | def test_returns_true_no_workspace_module_exists(self): method test_returns_false_when_module_missing (line 69) | def test_returns_false_when_module_missing(self): method test_returns_true_when_found_in_workspace_venv (line 76) | def test_returns_true_when_found_in_workspace_venv(self): method test_returns_false_when_missing_from_workspace_venv (line 88) | def test_returns_false_when_missing_from_workspace_venv(self): method test_workspace_python_checked_first_not_cli_interpreter (line 100) | def test_workspace_python_checked_first_not_cli_interpreter(self): method test_result_is_cached (line 124) | def test_result_is_cached(self): method test_cache_clear_allows_recheck (line 135) | def test_cache_clear_allows_recheck(self): method test_returns_false_on_subprocess_timeout (line 147) | def test_returns_false_on_subprocess_timeout(self): class TestResolveManagerGuiMode (line 163) | class TestResolveManagerGuiMode: method test_returns_config_mode_when_set (line 164) | def test_returns_config_mode_when_set(self): method test_legacy_false_returns_disable (line 169) | def test_legacy_false_returns_disable(self): method test_legacy_true_returns_enable_gui (line 174) | def test_legacy_true_returns_enable_gui(self): method test_legacy_boolean_0_returns_disable (line 179) | def test_legacy_boolean_0_returns_disable(self): method test_no_config_manager_available_returns_enable_gui (line 184) | def test_no_config_manager_available_returns_enable_gui(self): method test_no_config_no_manager_returns_not_installed_value (line 192) | def test_no_config_no_manager_returns_not_installed_value(self): method test_no_config_no_manager_returns_none_by_default (line 200) | def test_no_config_no_manager_returns_none_by_default(self): class TestExecuteCmCli (line 209) | class TestExecuteCmCli: method test_no_workspace_raises_exit (line 210) | def test_no_workspace_raises_exit(self): method test_no_cm_cli_raises_exit (line 217) | def test_no_cm_cli_raises_exit(self): method test_happy_path_returns_stdout (line 225) | def test_happy_path_returns_stdout(self, _cm_cli_env): method test_cmd_uses_python_m_cm_cli (line 229) | def test_cmd_uses_python_m_cm_cli(self, _cm_cli_env): method test_channel_appended (line 234) | def test_channel_appended(self, _cm_cli_env): method test_uv_compile_flag (line 240) | def test_uv_compile_flag(self, _cm_cli_env): method test_fast_deps_adds_no_deps (line 245) | def test_fast_deps_adds_no_deps(self, _cm_cli_env): method test_no_deps_adds_no_deps (line 250) | def test_no_deps_adds_no_deps(self, _cm_cli_env): method test_uv_compile_takes_precedence_over_fast_deps (line 255) | def test_uv_compile_takes_precedence_over_fast_deps(self, _cm_cli_env): method test_mode_appended (line 261) | def test_mode_appended(self, _cm_cli_env): method test_error_returncode_1_returns_none (line 267) | def test_error_returncode_1_returns_none(self, tmp_path): method test_error_returncode_2_returns_none (line 282) | def test_error_returncode_2_returns_none(self, tmp_path): method test_error_other_returncode_raises (line 297) | def test_error_other_returncode_raises(self, tmp_path): method test_raise_on_error_reraises (line 312) | def test_raise_on_error_reraises(self, tmp_path): method test_fast_deps_triggers_dependency_compiler (line 327) | def test_fast_deps_triggers_dependency_compiler(self, tmp_path): method test_fast_deps_non_dependency_cmd_skips_compiler (line 350) | def test_fast_deps_non_dependency_cmd_skips_compiler(self, tmp_path): method test_sets_comfyui_path_env (line 369) | def test_sets_comfyui_path_env(self, _cm_cli_env): method test_captures_stderr_via_pipe (line 374) | def test_captures_stderr_via_pipe(self, _cm_cli_env): FILE: tests/comfy_cli/command/test_code_search.py function search_response (line 40) | def search_response(): function raw_api_response (line 80) | def raw_api_response(search_response): function empty_search (line 86) | def empty_search(): function empty_api_response (line 101) | def empty_api_response(empty_search): function limit_hit_search (line 106) | def limit_hit_search(search_response): function limit_hit_response (line 112) | def limit_hit_response(limit_hit_search): class TestBuildQuery (line 121) | class TestBuildQuery: method test_simple_query (line 122) | def test_simple_query(self): method test_with_repo_short_name (line 125) | def test_with_repo_short_name(self): method test_with_repo_full_name (line 129) | def test_with_repo_full_name(self): method test_with_custom_count (line 133) | def test_with_custom_count(self): method test_with_repo_and_count (line 137) | def test_with_repo_and_count(self): method test_user_type_filter_preserved (line 141) | def test_user_type_filter_preserved(self): method test_user_type_file_not_duplicated (line 147) | def test_user_type_file_not_duplicated(self): class TestFormatResults (line 157) | class TestFormatResults: method test_formats_valid_results (line 158) | def test_formats_valid_results(self, search_response): method test_empty_results (line 175) | def test_empty_results(self, empty_search): method test_skips_results_without_repo (line 178) | def test_skips_results_without_repo(self): method test_skips_results_without_file (line 182) | def test_skips_results_without_file(self): method test_handles_missing_branch_info (line 192) | def test_handles_missing_branch_info(self): method test_handles_completely_empty_response (line 211) | def test_handles_completely_empty_response(self): method test_handles_no_line_matches (line 214) | def test_handles_no_line_matches(self): class TestGetStats (line 237) | class TestGetStats: method test_extracts_stats (line 238) | def test_extracts_stats(self, search_response): method test_empty_response (line 244) | def test_empty_response(self): method test_limit_hit (line 250) | def test_limit_hit(self, limit_hit_search): class TestFetchResults (line 260) | class TestFetchResults: method test_successful_fetch (line 262) | def test_successful_fetch(self, mock_get, raw_api_response): method test_http_error_propagates (line 274) | def test_http_error_propagates(self, mock_get): method test_timeout_propagates (line 283) | def test_timeout_propagates(self, mock_get): method test_connection_error_propagates (line 290) | def test_connection_error_propagates(self, mock_get): class TestPrintResults (line 302) | class TestPrintResults: method test_json_output (line 303) | def test_json_output(self, capsys, search_response): method test_empty_results_message (line 314) | def test_empty_results_message(self, capsys): method test_formatted_output_contains_file_info (line 319) | def test_formatted_output_contains_file_info(self, capsys, search_resp... method test_limit_hit_message (line 329) | def test_limit_hit_message(self, capsys, limit_hit_search): method test_non_tty_prints_file_url_once_and_no_per_line_urls (line 337) | def test_non_tty_prints_file_url_once_and_no_per_line_urls(self, capsy... method test_tty_emits_osc8_and_hides_urls (line 355) | def test_tty_emits_osc8_and_hides_urls(self, search_response): method test_non_tty_ignores_force_color_env (line 387) | def test_non_tty_ignores_force_color_env(self, capsys, search_response... class TestCodeSearchCLI (line 405) | class TestCodeSearchCLI: method test_basic_search (line 407) | def test_basic_search(self, mock_fetch, raw_api_response): method test_search_with_repo (line 417) | def test_search_with_repo(self, mock_fetch, raw_api_response): method test_search_with_count (line 426) | def test_search_with_count(self, mock_fetch, raw_api_response): method test_search_json_output (line 435) | def test_search_json_output(self, mock_fetch, raw_api_response): method test_search_no_results (line 445) | def test_search_no_results(self, mock_fetch, empty_api_response): method test_connection_error (line 454) | def test_connection_error(self, mock_fetch): method test_timeout_error (line 463) | def test_timeout_error(self, mock_fetch): method test_http_error (line 472) | def test_http_error(self, mock_fetch): method test_http_error_no_response (line 483) | def test_http_error_no_response(self, mock_fetch): method test_short_options (line 492) | def test_short_options(self, mock_fetch, raw_api_response): class TestRootCLIWiring (line 508) | class TestRootCLIWiring: method test_code_search_registered (line 514) | def test_code_search_registered(self, mock_fetch, mock_ws, mock_track,... method test_cs_alias_registered (line 526) | def test_cs_alias_registered(self, mock_fetch, mock_ws, mock_track, ra... FILE: tests/comfy_cli/command/test_command.py function runner (line 11) | def runner(): function mock_execute (line 18) | def mock_execute(): function mock_prompt_select_enum (line 24) | def mock_prompt_select_enum(): function mock_tracking_consent (line 36) | def mock_tracking_consent(): function test_install_here (line 48) | def test_install_here(cmd, runner, mock_execute, mock_prompt_select_enum): function test_version (line 58) | def test_version(runner): function mock_run_execute (line 65) | def mock_run_execute(): function _write_workflow (line 70) | def _write_workflow(tmp_path): class TestRunApiKeyResolution (line 76) | class TestRunApiKeyResolution: method test_envvar_is_picked_up (line 79) | def test_envvar_is_picked_up(self, runner, mock_run_execute, tmp_path): method test_flag_overrides_envvar (line 85) | def test_flag_overrides_envvar(self, runner, mock_run_execute, tmp_path): method test_absent_resolves_to_none (line 95) | def test_absent_resolves_to_none(self, runner, mock_run_execute, tmp_p... method test_envvar_trailing_whitespace_is_stripped (line 102) | def test_envvar_trailing_whitespace_is_stripped(self, runner, mock_run... method test_whitespace_only_collapses_to_none (line 108) | def test_whitespace_only_collapses_to_none(self, runner, mock_run_exec... FILE: tests/comfy_cli/command/test_frontend_pr.py function runner (line 14) | def runner(): function sample_frontend_pr_info (line 19) | def sample_frontend_pr_info(): class TestFrontendPRReferenceParsing (line 32) | class TestFrontendPRReferenceParsing: method test_parse_frontend_pr_number_format (line 35) | def test_parse_frontend_pr_number_format(self): method test_parse_frontend_user_branch_format (line 42) | def test_parse_frontend_user_branch_format(self): method test_parse_frontend_github_url_format (line 49) | def test_parse_frontend_github_url_format(self): method test_parse_frontend_custom_repo_url (line 57) | def test_parse_frontend_custom_repo_url(self): method test_parse_frontend_invalid_format (line 65) | def test_parse_frontend_invalid_format(self): method test_parse_frontend_empty_string (line 70) | def test_parse_frontend_empty_string(self): class TestNodeToolsVerification (line 76) | class TestNodeToolsVerification: method test_verify_node_tools_success (line 80) | def test_verify_node_tools_success(self, mock_run): method test_verify_node_tools_missing_node (line 101) | def test_verify_node_tools_missing_node(self, mock_run): method test_verify_node_tools_missing_npm (line 112) | def test_verify_node_tools_missing_npm(self, mock_run): method test_verify_node_tools_auto_install_pnpm (line 128) | def test_verify_node_tools_auto_install_pnpm(self, mock_run, mock_conf... method test_verify_node_tools_user_declines_pnpm_install (line 161) | def test_verify_node_tools_user_declines_pnpm_install(self, mock_run, ... method test_verify_node_tools_file_not_found (line 184) | def test_verify_node_tools_file_not_found(self, mock_run): FILE: tests/comfy_cli/command/test_launch_frontend_pr.py function runner (line 17) | def runner(): function mock_tracking_consent (line 22) | def mock_tracking_consent(): function sample_frontend_pr_info (line 28) | def sample_frontend_pr_info(): function mock_pr_cache (line 42) | def mock_pr_cache(): class TestLaunchWithFrontendPR (line 49) | class TestLaunchWithFrontendPR: method test_launch_frontend_pr_without_node (line 53) | def test_launch_frontend_pr_without_node(self, mock_verify): method test_launch_frontend_pr_with_cache_hit (line 64) | def test_launch_frontend_pr_with_cache_hit( method test_launch_frontend_pr_cache_miss_builds (line 91) | def test_launch_frontend_pr_cache_miss_builds( class TestPRCacheManagement (line 133) | class TestPRCacheManagement: method test_pr_cache_get_frontend_path (line 136) | def test_pr_cache_get_frontend_path(self, sample_frontend_pr_info): method test_pr_cache_list_empty (line 145) | def test_pr_cache_list_empty(self): method test_pr_cache_clean_specific (line 152) | def test_pr_cache_clean_specific(self, tmp_path): method test_pr_cache_age_check (line 168) | def test_pr_cache_age_check(self, sample_frontend_pr_info, tmp_path): method test_pr_cache_enforce_limits (line 192) | def test_pr_cache_enforce_limits(self, tmp_path): method test_get_cache_age (line 220) | def test_get_cache_age(self): class TestPRCacheCommands (line 238) | class TestPRCacheCommands: method test_pr_cache_list_command (line 241) | def test_pr_cache_list_command(self, runner): method test_pr_cache_clean_command_with_confirmation (line 252) | def test_pr_cache_clean_command_with_confirmation(self, runner): method test_pr_cache_clean_command_with_yes_flag (line 267) | def test_pr_cache_clean_command_with_yes_flag(self, runner): FILE: tests/comfy_cli/command/test_manager_gui.py function mock_config_manager (line 11) | def mock_config_manager(): function mock_launch_config_manager (line 19) | def mock_launch_config_manager(): class TestManagerCommands (line 26) | class TestManagerCommands: method test_disable_manager_sets_config (line 27) | def test_disable_manager_sets_config(self, mock_config_manager): method test_enable_gui_sets_config (line 34) | def test_enable_gui_sets_config(self, mock_config_manager): method test_disable_gui_sets_config (line 41) | def test_disable_gui_sets_config(self, mock_config_manager): method test_enable_legacy_gui_sets_config (line 48) | def test_enable_legacy_gui_sets_config(self, mock_config_manager): class TestGetManagerFlags (line 56) | class TestGetManagerFlags: method test_disable_mode_returns_empty (line 58) | def test_disable_mode_returns_empty(self, mock_resolve): method test_enable_gui_mode_returns_enable_manager (line 64) | def test_enable_gui_mode_returns_enable_manager(self, mock_resolve, mo... method test_disable_gui_mode_returns_both_flags (line 70) | def test_disable_gui_mode_returns_both_flags(self, mock_resolve, mock_... method test_enable_legacy_gui_mode_returns_legacy_flags (line 76) | def test_enable_legacy_gui_mode_returns_legacy_flags(self, mock_resolv... method test_unknown_mode_returns_default_with_warning (line 82) | def test_unknown_mode_returns_default_with_warning(self, mock_resolve,... method test_enable_mode_without_cmcli_returns_empty (line 90) | def test_enable_mode_without_cmcli_returns_empty(self, mock_resolve, m... method test_not_installed_returns_empty (line 97) | def test_not_installed_returns_empty(self, mock_resolve): class TestResolveManagerGuiMode (line 103) | class TestResolveManagerGuiMode: method test_returns_configured_mode (line 107) | def test_returns_configured_mode(self, mock_cm_cls): method test_old_config_false_migrates_to_disable (line 118) | def test_old_config_false_migrates_to_disable(self, mock_cm_cls, mock_... method test_old_config_true_migrates_to_enable_gui (line 132) | def test_old_config_true_migrates_to_enable_gui(self, mock_cm_cls, moc... method test_no_config_with_cmcli_defaults_to_enable_gui (line 146) | def test_no_config_with_cmcli_defaults_to_enable_gui(self, mock_cm_cls... method test_no_config_no_cmcli_returns_not_installed_value (line 157) | def test_no_config_no_cmcli_returns_not_installed_value(self, mock_cm_... method test_old_config_boolean_false_migrates_to_disable (line 168) | def test_old_config_boolean_false_migrates_to_disable(self, mock_cm_cls): method test_old_config_boolean_true_migrates_to_enable_gui (line 183) | def test_old_config_boolean_true_migrates_to_enable_gui(self, mock_cm_... class TestLaunchManagerFlagInjection (line 197) | class TestLaunchManagerFlagInjection: method test_launch_injects_enable_manager (line 203) | def test_launch_injects_enable_manager( method test_launch_no_inject_when_disabled (line 224) | def test_launch_no_inject_when_disabled( method test_launch_injects_when_extra_is_none (line 244) | def test_launch_injects_when_extra_is_none( method test_launch_injects_disable_gui_flags (line 264) | def test_launch_injects_disable_gui_flags( method test_launch_injects_legacy_gui_flags (line 287) | def test_launch_injects_legacy_gui_flags( class TestMigrateLegacy (line 304) | class TestMigrateLegacy: method test_migrate_legacy_no_workspace_exits (line 306) | def test_migrate_legacy_no_workspace_exits(self, mock_ws, mock_config_... method test_migrate_legacy_with_cli_only_mode (line 319) | def test_migrate_legacy_with_cli_only_mode(self, mock_ws, mock_config_... method test_migrate_legacy_without_cli_only_mode (line 340) | def test_migrate_legacy_without_cli_only_mode(self, mock_ws, mock_subp... method test_migrate_legacy_no_legacy_manager (line 362) | def test_migrate_legacy_no_legacy_manager(self, mock_ws, mock_config_m... method test_migrate_legacy_target_exists (line 377) | def test_migrate_legacy_target_exists(self, mock_ws, mock_config_manag... method test_migrate_legacy_lowercase_directory (line 394) | def test_migrate_legacy_lowercase_directory(self, mock_ws, mock_subpro... method test_migrate_legacy_installs_manager_requirements (line 418) | def test_migrate_legacy_installs_manager_requirements( method test_migrate_legacy_no_requirements_file (line 449) | def test_migrate_legacy_no_requirements_file(self, mock_ws, mock_subpr... method test_migrate_legacy_not_git_repo (line 468) | def test_migrate_legacy_not_git_repo(self, mock_ws, mock_config_manage... method test_migrate_legacy_skips_symlink (line 487) | def test_migrate_legacy_skips_symlink(self, mock_ws, mock_config_manag... method test_migrate_legacy_move_error (line 510) | def test_migrate_legacy_move_error(self, mock_ws, mock_move, mock_conf... method test_migrate_legacy_user_cancels (line 531) | def test_migrate_legacy_user_cancels(self, mock_ws, mock_confirm, mock... class TestInstallSkipManager (line 551) | class TestInstallSkipManager: method test_skip_manager_sets_disable_config (line 567) | def test_skip_manager_sets_disable_config( class TestInstallManagerFailure (line 607) | class TestInstallManagerFailure: method test_manager_install_failure_sets_disable_config (line 623) | def test_manager_install_failure_sets_disable_config( method test_manager_install_success_does_not_set_disable (line 676) | def test_manager_install_success_does_not_set_disable( method test_fast_deps_manager_failure_sets_disable_config (line 730) | def test_fast_deps_manager_failure_sets_disable_config( class TestPipInstallManagerCacheClear (line 775) | class TestPipInstallManagerCacheClear: method test_pip_install_manager_clears_cache_on_success (line 781) | def test_pip_install_manager_clears_cache_on_success(self, mock_exists... method test_pip_install_manager_no_cache_clear_on_failure (line 798) | def test_pip_install_manager_no_cache_clear_on_failure(self, mock_exis... class TestFillPrintTable (line 812) | class TestFillPrintTable: method mock_workspace_config_manager (line 816) | def mock_workspace_config_manager(self): method test_fill_print_table_disable_mode (line 823) | def test_fill_print_table_disable_mode(self, mock_resolve, mock_worksp... method test_fill_print_table_enable_gui_mode (line 839) | def test_fill_print_table_enable_gui_mode(self, mock_resolve, mock_wor... method test_fill_print_table_disable_gui_mode (line 852) | def test_fill_print_table_disable_gui_mode(self, mock_resolve, mock_wo... method test_fill_print_table_enable_legacy_gui_mode (line 865) | def test_fill_print_table_enable_legacy_gui_mode(self, mock_resolve, m... method test_fill_print_table_not_installed (line 878) | def test_fill_print_table_not_installed(self, mock_resolve, mock_works... method test_fill_print_table_unknown_mode_defaults_to_enable (line 891) | def test_fill_print_table_unknown_mode_defaults_to_enable(self, mock_r... method test_fill_print_table_uv_compile_enabled (line 904) | def test_fill_print_table_uv_compile_enabled(self, mock_resolve, mock_... method test_fill_print_table_uv_compile_disabled (line 921) | def test_fill_print_table_uv_compile_disabled(self, mock_resolve, mock... method test_fill_print_table_uv_compile_lowercase_true (line 936) | def test_fill_print_table_uv_compile_lowercase_true(self, mock_resolve... method test_fill_print_table_uv_compile_explicit_false (line 951) | def test_fill_print_table_uv_compile_explicit_false(self, mock_resolve... class TestResolveUvCompile (line 966) | class TestResolveUvCompile: method mock_resolve_config_manager (line 970) | def mock_resolve_config_manager(self): method test_explicit_true_returns_true (line 976) | def test_explicit_true_returns_true(self, mock_resolve_config_manager): method test_explicit_false_returns_false (line 982) | def test_explicit_false_returns_false(self, mock_resolve_config_manager): method test_explicit_true_ignores_config (line 988) | def test_explicit_true_ignores_config(self, mock_resolve_config_manager): method test_none_with_config_true (line 996) | def test_none_with_config_true(self, mock_resolve_config_manager): method test_none_with_config_false (line 1003) | def test_none_with_config_false(self, mock_resolve_config_manager): method test_none_with_no_config (line 1010) | def test_none_with_no_config(self, mock_resolve_config_manager): method test_config_true_overridden_by_fast_deps (line 1017) | def test_config_true_overridden_by_fast_deps(self, mock_resolve_config... method test_config_true_overridden_by_no_deps (line 1024) | def test_config_true_overridden_by_no_deps(self, mock_resolve_config_m... method test_config_false_with_fast_deps_stays_false (line 1031) | def test_config_false_with_fast_deps_stays_false(self, mock_resolve_co... method test_explicit_true_not_affected_by_fast_deps (line 1038) | def test_explicit_true_not_affected_by_fast_deps(self, mock_resolve_co... class TestUvCompileDefaultCommand (line 1045) | class TestUvCompileDefaultCommand: method test_uv_compile_default_enable (line 1048) | def test_uv_compile_default_enable(self, mock_config_manager): method test_uv_compile_default_disable (line 1055) | def test_uv_compile_default_disable(self, mock_config_manager): class TestFindCmCli (line 1063) | class TestFindCmCli: method test_find_cm_cli_module_found (line 1066) | def test_find_cm_cli_module_found(self): method test_find_cm_cli_module_not_found (line 1080) | def test_find_cm_cli_module_not_found(self): method test_find_cm_cli_cache_behavior (line 1098) | def test_find_cm_cli_cache_behavior(self): class TestPipInstallManagerEdgeCases (line 1119) | class TestPipInstallManagerEdgeCases: method test_pip_install_manager_requirements_not_found (line 1124) | def test_pip_install_manager_requirements_not_found(self, mock_exists,... class TestValidateComfyuiManager (line 1135) | class TestValidateComfyuiManager: method test_validate_comfyui_manager_exits_when_not_found (line 1139) | def test_validate_comfyui_manager_exits_when_not_found(self, mock_find... method test_validate_comfyui_manager_passes_when_found (line 1150) | def test_validate_comfyui_manager_passes_when_found(self, mock_find_cm... FILE: tests/comfy_cli/command/test_npm_help.py class TestPrintNpmNotFoundHelp (line 11) | class TestPrintNpmNotFoundHelp: method capture_output (line 15) | def capture_output(self): method test_npm_not_found_help_shows_common_message (line 24) | def test_npm_not_found_help_shows_common_message(self, capture_output): method test_npm_not_found_help_windows (line 35) | def test_npm_not_found_help_windows(self, capture_output): method test_npm_not_found_help_macos (line 45) | def test_npm_not_found_help_macos(self, capture_output): method test_npm_not_found_help_linux (line 57) | def test_npm_not_found_help_linux(self, capture_output): method test_npm_not_found_help_unknown_os_falls_back_to_linux (line 69) | def test_npm_not_found_help_unknown_os_falls_back_to_linux(self, captu... FILE: tests/comfy_cli/command/test_run.py function workflow (line 21) | def workflow(): function workflow_file (line 37) | def workflow_file(workflow): function mock_execution (line 46) | def mock_execution(workflow): function _make_msg (line 60) | def _make_msg(msg_type, prompt_id, **data_fields): class TestIsUiWorkflow (line 64) | class TestIsUiWorkflow: method test_detects_ui_workflow (line 65) | def test_detects_ui_workflow(self): method test_rejects_api_workflow (line 68) | def test_rejects_api_workflow(self): method test_rejects_non_dict (line 71) | def test_rejects_non_dict(self): method test_requires_both_keys (line 75) | def test_requires_both_keys(self): method test_rejects_api_workflow_with_nodes_and_links_as_keys (line 79) | def test_rejects_api_workflow_with_nodes_and_links_as_keys(self): method test_rejects_when_values_are_not_lists (line 88) | def test_rejects_when_values_are_not_lists(self): function _make_http_error (line 93) | def _make_http_error(code: int, body: bytes = b"") -> urllib.error.HTTPE... function _ok_response (line 103) | def _ok_response(body: bytes) -> MagicMock: class TestFetchObjectInfo (line 111) | class TestFetchObjectInfo: method test_returns_parsed_json_on_success (line 112) | def test_returns_parsed_json_on_success(self): method test_http_error_exits_cleanly (line 122) | def test_http_error_exits_cleanly(self): method test_network_error_exits_cleanly (line 131) | def test_network_error_exits_cleanly(self): method test_timeout_exits_cleanly (line 140) | def test_timeout_exits_cleanly(self): method test_invalid_json_exits_cleanly (line 146) | def test_invalid_json_exits_cleanly(self): class TestWorkflowExecutionAuth (line 156) | class TestWorkflowExecutionAuth: method _make_exec (line 159) | def _make_exec(self, workflow, api_key=None): method test_queue_embeds_api_key_in_extra_data (line 173) | def test_queue_embeds_api_key_in_extra_data(self, workflow): method test_queue_does_not_send_x_api_key_header (line 182) | def test_queue_does_not_send_x_api_key_header(self, workflow): method test_queue_omits_extra_data_when_no_api_key (line 190) | def test_queue_omits_extra_data_when_no_api_key(self, workflow): class TestWatchExecution (line 201) | class TestWatchExecution: method test_successful_execution (line 202) | def test_successful_execution(self, mock_execution): method test_skips_other_prompt_messages (line 220) | def test_skips_other_prompt_messages(self, mock_execution): method test_unknown_node_ids_do_not_crash (line 235) | def test_unknown_node_ids_do_not_crash(self, mock_execution): method test_unknown_node_ids_verbose (line 255) | def test_unknown_node_ids_verbose(self, workflow): method test_collects_image_outputs (line 281) | def test_collects_image_outputs(self, mock_execution): class TestExecuteErrorHandling (line 311) | class TestExecuteErrorHandling: method _run_execute_expect_exit (line 312) | def _run_execute_expect_exit(self, workflow_file, **overrides): method test_timeout_exits_with_code_1 (line 319) | def test_timeout_exits_with_code_1(self, workflow_file): method test_connection_error_exits_with_code_1 (line 332) | def test_connection_error_exits_with_code_1(self, workflow_file): method test_websocket_exception_exits_with_code_1 (line 345) | def test_websocket_exception_exits_with_code_1(self, workflow_file): method test_successful_execution (line 358) | def test_successful_execution(self, workflow_file): method test_file_not_found_exits (line 375) | def test_file_not_found_exits(self): method test_rejects_invalid_workflow_format (line 380) | def test_rejects_invalid_workflow_format(self): method test_rejects_malformed_json (line 394) | def test_rejects_malformed_json(self): method test_rejects_unreadable_file (line 407) | def test_rejects_unreadable_file(self): method test_progress_stopped_on_error (line 429) | def test_progress_stopped_on_error(self, workflow_file): class TestExecuteUiWorkflow (line 446) | class TestExecuteUiWorkflow: method ui_workflow_file (line 489) | def ui_workflow_file(self): method test_ui_workflow_is_converted_then_executed (line 497) | def test_ui_workflow_is_converted_then_executed(self, ui_workflow_file): method test_ui_workflow_exits_when_server_not_running (line 517) | def test_ui_workflow_exits_when_server_not_running(self, ui_workflow_f... method test_ui_workflow_exits_cleanly_on_unexpected_converter_crash (line 527) | def test_ui_workflow_exits_cleanly_on_unexpected_converter_crash(self,... method test_ui_workflow_plumbs_api_key_through_to_execution (line 545) | def test_ui_workflow_plumbs_api_key_through_to_execution(self, ui_work... method test_ui_workflow_exits_when_conversion_yields_nothing (line 561) | def test_ui_workflow_exits_when_conversion_yields_nothing(self): FILE: tests/comfy_cli/conftest.py function _preserve_cwd (line 7) | def _preserve_cwd(): FILE: tests/comfy_cli/registry/test_api.py class TestRegistryAPI (line 9) | class TestRegistryAPI(unittest.TestCase): method setUp (line 10) | def setUp(self): method test_determine_base_url_dev (line 31) | def test_determine_base_url_dev(self, mock_getenv): method test_determine_base_url_prod (line 36) | def test_determine_base_url_prod(self, mock_getenv): method test_publish_node_version_success (line 41) | def test_publish_node_version_success(self, mock_post): method test_publish_node_version_failure (line 63) | def test_publish_node_version_failure(self, mock_post): method test_list_all_nodes_success (line 74) | def test_list_all_nodes_success(self, mock_get): method test_list_all_nodes_failure (line 107) | def test_list_all_nodes_failure(self, mock_get): method test_install_node_success (line 118) | def test_install_node_success(self, mock_get): method test_install_node_failure (line 136) | def test_install_node_failure(self, mock_get): FILE: tests/comfy_cli/registry/test_config_parser.py function mock_toml_data (line 24) | def mock_toml_data(): function test_extract_node_configuration_success (line 61) | def test_extract_node_configuration_success(mock_toml_data): function test_extract_node_configuration_license_spdx_string (line 94) | def test_extract_node_configuration_license_spdx_string(license_str): function test_extract_node_configuration_license_text_dict (line 111) | def test_extract_node_configuration_license_text_dict(): function test_extract_node_configuration_with_os_classifiers (line 131) | def test_extract_node_configuration_with_os_classifiers(): function test_extract_node_configuration_with_accelerator_classifiers (line 155) | def test_extract_node_configuration_with_accelerator_classifiers(): function test_extract_node_configuration_with_comfyui_version (line 185) | def test_extract_node_configuration_with_comfyui_version(): function test_extract_node_configuration_with_requires_comfyui (line 202) | def test_extract_node_configuration_with_requires_comfyui(): function _write_pyproject (line 215) | def _write_pyproject(tmp_path, body: str) -> str: function test_dynamic_version_resolved_from_double_quoted_literal (line 222) | def test_dynamic_version_resolved_from_double_quoted_literal(tmp_path): function test_dynamic_version_resolved_from_VERSION_name (line 234) | def test_dynamic_version_resolved_from_VERSION_name(tmp_path): function test_dynamic_version_resolved_from_single_quotes (line 245) | def test_dynamic_version_resolved_from_single_quotes(tmp_path): function test_dynamic_version_resolved_with_type_annotation (line 256) | def test_dynamic_version_resolved_with_type_annotation(tmp_path): function test_dynamic_version_ignores_commented_line (line 267) | def test_dynamic_version_ignores_commented_line(tmp_path): function test_dynamic_version_first_match_wins (line 279) | def test_dynamic_version_first_match_wins(tmp_path): function test_static_version_wins_over_tool_comfy_version (line 290) | def test_static_version_wins_over_tool_comfy_version(tmp_path): function test_dynamic_version_without_tool_comfy_version_warns (line 304) | def test_dynamic_version_without_tool_comfy_version_warns(mock_echo, tmp... function test_dynamic_version_absolute_path_rejected (line 313) | def test_dynamic_version_absolute_path_rejected(mock_echo, tmp_path): function test_dynamic_version_windows_absolute_path_rejected (line 325) | def test_dynamic_version_windows_absolute_path_rejected(mock_echo, tmp_p... function test_dynamic_version_path_traversal_rejected (line 339) | def test_dynamic_version_path_traversal_rejected(mock_echo, tmp_path): function test_dynamic_version_missing_file_warns (line 351) | def test_dynamic_version_missing_file_warns(mock_echo, tmp_path): function test_dynamic_version_no_match_warns (line 363) | def test_dynamic_version_no_match_warns(mock_echo, tmp_path): function test_dynamic_version_handles_utf8_bom (line 375) | def test_dynamic_version_handles_utf8_bom(tmp_path): function test_dynamic_version_invalid_utf8_warns (line 388) | def test_dynamic_version_invalid_utf8_warns(mock_echo, tmp_path): function test_dynamic_version_scalar_tool_comfy_version_warns (line 403) | def test_dynamic_version_scalar_tool_comfy_version_warns(mock_echo, tmp_... function test_malformed_dynamic_scalar_string_warns (line 417) | def test_malformed_dynamic_scalar_string_warns(mock_echo, tmp_path): function test_dynamic_version_indented_only_does_not_match (line 431) | def test_dynamic_version_indented_only_does_not_match(tmp_path): function test_dynamic_version_trailing_inline_comment_resolves (line 445) | def test_dynamic_version_trailing_inline_comment_resolves(tmp_path): function test_dynamic_version_path_is_directory_warns (line 459) | def test_dynamic_version_path_is_directory_warns(mock_echo, tmp_path): function test_padded_static_version_is_stripped (line 473) | def test_padded_static_version_is_stripped(tmp_path): function test_dynamic_version_non_string_path_warns_as_type_error (line 483) | def test_dynamic_version_non_string_path_warns_as_type_error(mock_echo, ... function test_static_version_happy_path_emits_no_version_warnings (line 499) | def test_static_version_happy_path_emits_no_version_warnings(mock_echo, ... function test_malformed_toml_does_not_crash (line 518) | def test_malformed_toml_does_not_crash(tmp_path): function test_pyproject_with_utf8_bom_parses_successfully (line 526) | def test_pyproject_with_utf8_bom_parses_successfully(tmp_path): function test_pyproject_with_invalid_utf8_returns_none_gracefully (line 538) | def test_pyproject_with_invalid_utf8_returns_none_gracefully(tmp_path): function test_static_version_non_string_scalar_rejected (line 549) | def test_static_version_non_string_scalar_rejected(mock_echo, tmp_path): function test_static_version_array_rejected (line 561) | def test_static_version_array_rejected(mock_echo, tmp_path): function test_static_version_inline_table_rejected (line 573) | def test_static_version_inline_table_rejected(mock_echo, tmp_path): function test_project_scalar_at_root_does_not_crash (line 586) | def test_project_scalar_at_root_does_not_crash(mock_echo, tmp_path): function test_static_version_falsy_non_string_rejected (line 598) | def test_static_version_falsy_non_string_rejected(mock_echo, tmp_path, v... function test_dynamic_version_padded_literal_is_stripped (line 618) | def test_dynamic_version_padded_literal_is_stripped(tmp_path): function test_dynamic_version_empty_path_string_warns_as_not_set (line 635) | def test_dynamic_version_empty_path_string_warns_as_not_set(mock_echo, t... function test_dynamic_version_table_missing_path_key_warns_as_not_set (line 648) | def test_dynamic_version_table_missing_path_key_warns_as_not_set(mock_ec... function test_falsy_nonstring_path_values_warn_as_type_mismatch (line 661) | def test_falsy_nonstring_path_values_warn_as_type_mismatch(mock_echo, tm... function test_dynamic_version_backslash_in_value_not_matched (line 682) | def test_dynamic_version_backslash_in_value_not_matched(mock_echo, tmp_p... function test_dynamic_version_adjacent_literals_double_quote_warns (line 704) | def test_dynamic_version_adjacent_literals_double_quote_warns(mock_echo,... function test_dynamic_version_adjacent_literals_no_whitespace_warns (line 724) | def test_dynamic_version_adjacent_literals_no_whitespace_warns(mock_echo... function test_dynamic_version_adjacent_literals_single_quote_warns (line 739) | def test_dynamic_version_adjacent_literals_single_quote_warns(mock_echo,... function test_dynamic_version_adjacent_literals_mixed_quotes_warns (line 754) | def test_dynamic_version_adjacent_literals_mixed_quotes_warns(mock_echo,... function test_dynamic_version_semicolon_after_literal_still_resolves (line 770) | def test_dynamic_version_semicolon_after_literal_still_resolves(tmp_path): function test_validate_and_extract_os_classifiers_valid (line 785) | def test_validate_and_extract_os_classifiers_valid(): function test_validate_and_extract_os_classifiers_invalid (line 800) | def test_validate_and_extract_os_classifiers_invalid(mock_echo): function test_validate_and_extract_accelerator_classifiers_valid (line 813) | def test_validate_and_extract_accelerator_classifiers_valid(): function test_validate_and_extract_accelerator_classifiers_invalid (line 835) | def test_validate_and_extract_accelerator_classifiers_invalid(mock_echo): function test_validate_version_valid (line 848) | def test_validate_version_valid(): function test_validate_version_invalid (line 876) | def test_validate_version_invalid(mock_echo): function test_strip_url_credentials (line 913) | def test_strip_url_credentials(url, expected): function test_initialize_project_config_strips_credentials (line 917) | def test_initialize_project_config_strips_credentials(tmp_path, monkeypa... function test_initialize_project_config_clean_https (line 936) | def test_initialize_project_config_clean_https(tmp_path, monkeypatch): function test_initialize_project_config_ssh_remote (line 954) | def test_initialize_project_config_ssh_remote(tmp_path, monkeypatch): function _init_git_repo_with_reqs (line 979) | def _init_git_repo_with_reqs(tmp_path, requirements_content: str) -> None: function test_initialize_project_config_strips_inline_comments (line 990) | def test_initialize_project_config_strips_inline_comments(tmp_path, monk... function test_initialize_project_config_skips_full_line_comments (line 1003) | def test_initialize_project_config_skips_full_line_comments(tmp_path, mo... function test_initialize_project_config_skips_pip_options (line 1016) | def test_initialize_project_config_skips_pip_options(tmp_path, monkeypat... function test_initialize_project_config_preserves_vcs_subdirectory_fragment (line 1042) | def test_initialize_project_config_preserves_vcs_subdirectory_fragment(t... function test_initialize_project_config_vcs_with_inline_comment (line 1058) | def test_initialize_project_config_vcs_with_inline_comment(tmp_path, mon... FILE: tests/comfy_cli/test_aria2_download.py function aria2_env (line 18) | def aria2_env(monkeypatch): function fake_aria2p (line 25) | def fake_aria2p(): function mock_aria2_success (line 40) | def mock_aria2_success(aria2_env, fake_aria2p): class TestAria2Download (line 79) | class TestAria2Download: method test_success (line 80) | def test_success(self, tmp_path, mock_aria2_success): method test_passes_headers (line 92) | def test_passes_headers(self, tmp_path, mock_aria2_success): method test_no_headers (line 103) | def test_no_headers(self, tmp_path, mock_aria2_success): method test_missing_server_env_raises (line 111) | def test_missing_server_env_raises(self, tmp_path, fake_aria2p, monkey... method test_import_error_raises (line 118) | def test_import_error_raises(self, tmp_path, aria2_env): method test_download_failure_raises (line 124) | def test_download_failure_raises(self, tmp_path, aria2_env, fake_aria2p): method test_download_removed_raises (line 143) | def test_download_removed_raises(self, tmp_path, aria2_env, fake_aria2p): method test_server_url_parsing (line 160) | def test_server_url_parsing(self, tmp_path, fake_aria2p, monkeypatch): method test_server_url_default_port (line 182) | def test_server_url_default_port(self, tmp_path, fake_aria2p, monkeypa... method test_server_url_without_scheme (line 204) | def test_server_url_without_scheme(self, tmp_path, fake_aria2p, monkey... method test_secret_passed_to_client (line 226) | def test_secret_passed_to_client(self, tmp_path, fake_aria2p, monkeypa... method test_malformed_server_url_raises (line 248) | def test_malformed_server_url_raises(self, tmp_path, fake_aria2p, monk... method test_update_connection_error_raises (line 256) | def test_update_connection_error_raises(self, tmp_path, aria2_env, fak... method test_file_missing_after_download_raises (line 273) | def test_file_missing_after_download_raises(self, tmp_path, aria2_env,... class TestDownloadFileDispatch (line 298) | class TestDownloadFileDispatch: method test_default_downloader_uses_httpx (line 299) | def test_default_downloader_uses_httpx(self, tmp_path): method test_downloader_httpx_explicit (line 312) | def test_downloader_httpx_explicit(self, tmp_path): method test_downloader_aria2_dispatches (line 325) | def test_downloader_aria2_dispatches(self, tmp_path): method test_invalid_downloader_raises (line 331) | def test_invalid_downloader_raises(self, tmp_path): FILE: tests/comfy_cli/test_cm_cli_python_resolution.py function _setup_cm_cli (line 12) | def _setup_cm_cli(tmp_path, script_body): function _run (line 20) | def _run(tmp_path, args, *, fast_deps=False, raise_on_error=False): class TestExecuteCmCli (line 50) | class TestExecuteCmCli: method test_uses_resolved_python (line 51) | def test_uses_resolved_python(self, tmp_path): method test_fast_deps_passes_python_to_compiler (line 76) | def test_fast_deps_passes_python_to_compiler(self, tmp_path): method test_stdout_returned_and_streamed (line 104) | def test_stdout_returned_and_streamed(self, tmp_path, capsys): method test_expected_error_codes_return_none (line 120) | def test_expected_error_codes_return_none(self, tmp_path, returncode): method test_unexpected_error_code_raises (line 131) | def test_unexpected_error_code_raises(self, tmp_path): method test_raise_on_error_overrides_silent_return (line 143) | def test_raise_on_error_overrides_silent_return(self, tmp_path): method test_output_streams_incrementally (line 157) | def test_output_streams_incrementally(self, tmp_path): method test_pythonunbuffered_set_in_env (line 183) | def test_pythonunbuffered_set_in_env(self, tmp_path): FILE: tests/comfy_cli/test_cmdline_python_resolution.py class TestUpdateComfy (line 6) | class TestUpdateComfy: method test_uses_resolved_python (line 7) | def test_uses_resolved_python(self, tmp_path): method test_update_comfy_succeeds_when_cm_cli_missing (line 28) | def test_update_comfy_succeeds_when_cm_cli_missing(self, tmp_path): class TestDependency (line 44) | class TestDependency: method test_passes_python_to_compiler (line 45) | def test_passes_python_to_compiler(self, tmp_path): FILE: tests/comfy_cli/test_config_manager.py function _make_config_manager (line 16) | def _make_config_manager(config_dir, is_running_val=True): function config_mgr (line 25) | def config_mgr(tmp_path): class TestLoad (line 31) | class TestLoad: method test_creates_tmp_directory (line 32) | def test_creates_tmp_directory(self, tmp_path): method test_reads_existing_config (line 38) | def test_reads_existing_config(self, tmp_path): method test_parses_background_info (line 47) | def test_parses_background_info(self, tmp_path): method test_removes_background_when_stale_pid (line 56) | def test_removes_background_when_stale_pid(self, tmp_path): class TestWriteConfig (line 67) | class TestWriteConfig: method test_creates_directory_if_missing (line 68) | def test_creates_directory_if_missing(self, tmp_path): method test_set_persists_to_file (line 77) | def test_set_persists_to_file(self, config_mgr): class TestGetBool (line 84) | class TestGetBool: method test_missing_key_returns_none (line 85) | def test_missing_key_returns_none(self, config_mgr): class TestGetOrOverride (line 89) | class TestGetOrOverride: method test_set_value_wins (line 90) | def test_set_value_wins(self, config_mgr): method test_env_var_wins_over_config (line 95) | def test_env_var_wins_over_config(self, config_mgr): method test_config_is_fallback (line 100) | def test_config_is_fallback(self, config_mgr): method test_empty_set_value_returns_none (line 107) | def test_empty_set_value_returns_none(self, config_mgr): method test_empty_env_var_returns_none (line 110) | def test_empty_env_var_returns_none(self, config_mgr): method test_set_value_is_persisted (line 114) | def test_set_value_is_persisted(self, config_mgr): method test_all_missing_returns_none (line 118) | def test_all_missing_returns_none(self, config_mgr): class TestGetEnvData (line 125) | class TestGetEnvData: method test_full_config (line 126) | def test_full_config(self, config_mgr): method test_empty_config (line 142) | def test_empty_config(self, config_mgr): method test_launch_extras_only_read_when_workspace_set (line 149) | def test_launch_extras_only_read_when_workspace_set(self, config_mgr): class TestRemoveBackground (line 155) | class TestRemoveBackground: method test_clears_background (line 156) | def test_clears_background(self, config_mgr): FILE: tests/comfy_cli/test_cuda_detect.py class TestDetectViaCtypes (line 17) | class TestDetectViaCtypes: method test_happy_path (line 18) | def test_happy_path(self): method test_version_decoding (line 41) | def test_version_decoding(self, raw, expected): method test_library_not_found (line 58) | def test_library_not_found(self): method test_cuinit_fails (line 62) | def test_cuinit_fails(self): class TestDetectViaNvidiaSmi (line 70) | class TestDetectViaNvidiaSmi: method test_happy_path (line 71) | def test_happy_path(self): method test_cuda_13 (line 80) | def test_cuda_13(self): method test_not_found (line 85) | def test_not_found(self): method test_parse_failure (line 89) | def test_parse_failure(self): method test_timeout (line 93) | def test_timeout(self): class TestDetectCudaDriverVersion (line 101) | class TestDetectCudaDriverVersion: method test_ctypes_success_skips_smi (line 102) | def test_ctypes_success_skips_smi(self): method test_ctypes_fails_falls_back_to_smi (line 120) | def test_ctypes_fails_falls_back_to_smi(self): method test_both_fail (line 127) | def test_both_fail(self): method test_cuda_visible_devices_restored (line 134) | def test_cuda_visible_devices_restored(self): method test_cuda_visible_devices_empty_string (line 145) | def test_cuda_visible_devices_empty_string(self): class TestResolveCudaWheel (line 173) | class TestResolveCudaWheel: method test_mapping (line 189) | def test_mapping(self, driver_version, expected): method test_driver_too_old (line 192) | def test_driver_too_old(self): method test_very_new_driver (line 196) | def test_very_new_driver(self): method test_exact_match_preferred (line 200) | def test_exact_match_preferred(self): class TestLoadLibcuda (line 205) | class TestLoadLibcuda: method test_linux_paths_tried_in_order (line 206) | def test_linux_paths_tried_in_order(self): method test_windows_path (line 227) | def test_windows_path(self): method test_first_success_wins (line 243) | def test_first_success_wins(self): class TestConstants (line 259) | class TestConstants: method test_wheels_in_descending_order (line 260) | def test_wheels_in_descending_order(self): method test_default_tag_is_in_wheel_list (line 268) | def test_default_tag_is_in_wheel_list(self): FILE: tests/comfy_cli/test_cuda_detect_real.py function _nvidia_smi_cuda_version (line 30) | def _nvidia_smi_cuda_version() -> tuple[int, int] | None: class TestRealDetection (line 42) | class TestRealDetection: method test_detect_returns_valid_tuple (line 43) | def test_detect_returns_valid_tuple(self): method test_detect_matches_nvidia_smi (line 51) | def test_detect_matches_nvidia_smi(self): method test_nvidia_smi_fallback_works (line 61) | def test_nvidia_smi_fallback_works(self): method test_resolve_wheel_for_detected_driver (line 67) | def test_resolve_wheel_for_detected_driver(self): method test_resolved_wheel_version_not_greater_than_driver (line 75) | def test_resolved_wheel_version_not_greater_than_driver(self): FILE: tests/comfy_cli/test_custom_nodes_python_resolution.py class TestGetInstalledPackages (line 7) | class TestGetInstalledPackages: method test_uses_resolved_python (line 8) | def test_uses_resolved_python(self): class TestExecuteInstallScript (line 31) | class TestExecuteInstallScript: method test_pip_uses_resolved_python (line 32) | def test_pip_uses_resolved_python(self, tmp_path): method test_install_py_uses_resolved_python (line 50) | def test_install_py_uses_resolved_python(self, tmp_path): method test_inline_comment_not_passed_to_pip (line 67) | def test_inline_comment_not_passed_to_pip(self, tmp_path): method test_uses_pip_install_r (line 88) | def test_uses_pip_install_r(self, tmp_path): method test_requirements_path_is_absolute_when_repo_path_is_relative (line 109) | def test_requirements_path_is_absolute_when_repo_path_is_relative(self... class TestUpdateNodeIdCache (line 134) | class TestUpdateNodeIdCache: method test_uses_resolved_python (line 135) | def test_uses_resolved_python(self, tmp_path): FILE: tests/comfy_cli/test_env_checker.py class TestFormatPythonVersion (line 14) | class TestFormatPythonVersion: method test_modern_python (line 15) | def test_modern_python(self): method test_python_39_is_modern (line 19) | def test_python_39_is_modern(self): method test_python_38_is_old (line 23) | def test_python_38_is_old(self): method test_python_37_is_old (line 29) | def test_python_37_is_old(self): class TestCheckComfyServerRunning (line 35) | class TestCheckComfyServerRunning: method test_server_running (line 37) | def test_server_running(self, mock_get): method test_server_not_running (line 42) | def test_server_not_running(self, mock_get): method test_non_200_status (line 47) | def test_non_200_status(self, mock_get): method test_custom_port_and_host (line 52) | def test_custom_port_and_host(self, mock_get): class TestEnvChecker (line 58) | class TestEnvChecker: method checker (line 60) | def checker(self): method test_check_detects_virtualenv (line 67) | def test_check_detects_virtualenv(self, checker): method test_check_detects_conda (line 72) | def test_check_detects_conda(self, checker): method test_check_no_isolated_env (line 77) | def test_check_no_isolated_env(self, checker): method test_get_isolated_env_prefers_venv (line 86) | def test_get_isolated_env_prefers_venv(self, checker): method test_get_isolated_env_falls_back_to_conda (line 91) | def test_get_isolated_env_falls_back_to_conda(self, checker): method test_fill_print_table_server_running (line 97) | def test_fill_print_table_server_running(self, mock_cm, mock_server, c... method test_fill_print_table_server_not_running (line 104) | def test_fill_print_table_server_not_running(self, mock_cm, mock_serve... FILE: tests/comfy_cli/test_file_utils.py function test_zip_files_respects_comfyignore (line 6) | def test_zip_files_respects_comfyignore(tmp_path, monkeypatch): function test_zip_files_force_include_overrides_ignore (line 39) | def test_zip_files_force_include_overrides_ignore(tmp_path, monkeypatch): function test_zip_files_without_git_falls_back_to_walk (line 69) | def test_zip_files_without_git_falls_back_to_walk(tmp_path, monkeypatch): FILE: tests/comfy_cli/test_global_python_install.py function _clean_env (line 23) | def _clean_env(): class TestGlobalPythonDetection (line 40) | class TestGlobalPythonDetection: method test_global_python_skips_venv_creation (line 44) | def test_global_python_skips_venv_creation(self, tmp_path): method test_isolated_env_creates_venv (line 62) | def test_isolated_env_creates_venv(self, tmp_path): class TestGlobalPythonInstallExecute (line 76) | class TestGlobalPythonInstallExecute: method _run_execute (line 80) | def _run_execute(self, tmp_path, *, fast_deps, python="/usr/bin/python... method test_fast_deps_global_python_skips_install_build_deps (line 108) | def test_fast_deps_global_python_skips_install_build_deps(self, tmp_pa... method test_fast_deps_venv_python_calls_install_build_deps (line 116) | def test_fast_deps_venv_python_calls_install_build_deps(self, tmp_path): method test_non_fast_deps_uses_global_python (line 125) | def test_non_fast_deps_uses_global_python(self, tmp_path): class TestDependencyCompilerGlobalPython (line 138) | class TestDependencyCompilerGlobalPython: method workspace (line 145) | def workspace(self, tmp_path): method test_compile_produces_complete_output (line 152) | def test_compile_produces_complete_output(self, workspace): method test_compile_nvidia_resolves_torch (line 174) | def test_compile_nvidia_resolves_torch(self, workspace): method test_install_targets_correct_python (line 195) | def test_install_targets_correct_python(self, workspace): FILE: tests/comfy_cli/test_install.py function test_validate_version_nightly (line 8) | def test_validate_version_nightly(): function test_validate_version_latest (line 13) | def test_validate_version_latest(): function test_validate_version_valid_semver (line 18) | def test_validate_version_valid_semver(): function test_validate_version_invalid (line 24) | def test_validate_version_invalid(): function test_validate_version_empty (line 29) | def test_validate_version_empty(): class TestPipInstallManager (line 34) | class TestPipInstallManager: method test_success (line 38) | def test_success(self, mock_exists, mock_run, mock_find): method test_missing_requirements_file (line 45) | def test_missing_requirements_file(self, mock_exists): method test_pip_failure (line 51) | def test_pip_failure(self, mock_exists, mock_run): method test_pip_failure_no_stderr (line 58) | def test_pip_failure_no_stderr(self, mock_exists, mock_run): FILE: tests/comfy_cli/test_install_python_resolution.py class TestPipInstallComfyuiDependencies (line 11) | class TestPipInstallComfyuiDependencies: method test_uses_python_param_cpu (line 12) | def test_uses_python_param_cpu(self, tmp_path): class TestPipInstallManager (line 33) | class TestPipInstallManager: method test_uses_python_param (line 34) | def test_uses_python_param(self, tmp_path): class TestExecute (line 48) | class TestExecute: method test_calls_ensure_and_passes_resolved_python (line 49) | def test_calls_ensure_and_passes_resolved_python(self, tmp_path): method test_fast_deps_passes_python_to_dependency_compiler (line 74) | def test_fast_deps_passes_python_to_dependency_compiler(self, tmp_path): method test_fast_deps_forwards_skip_torch (line 105) | def test_fast_deps_forwards_skip_torch(self, tmp_path): method test_fast_deps_cuda_tag_converted_to_dotted_version (line 135) | def test_fast_deps_cuda_tag_converted_to_dotted_version(self, tmp_path): method test_fast_deps_explicit_cuda_version_no_tag (line 164) | def test_fast_deps_explicit_cuda_version_no_tag(self, tmp_path): class TestAutoDetectIntegration (line 194) | class TestAutoDetectIntegration: method test_auto_detected_cuda_tag_used (line 195) | def test_auto_detected_cuda_tag_used(self, tmp_path): method test_auto_detect_failure_falls_back (line 214) | def test_auto_detect_failure_falls_back(self, tmp_path): method test_explicit_cuda_version_used_when_no_tag (line 233) | def test_explicit_cuda_version_used_when_no_tag(self, tmp_path): method test_cuda_tag_takes_precedence_over_enum (line 252) | def test_cuda_tag_takes_precedence_over_enum(self, tmp_path): function _get_torch_install_cmd (line 272) | def _get_torch_install_cmd(calls): class TestTorchInstallCommands (line 281) | class TestTorchInstallCommands: method test_amd_uses_index_url_with_rocm_version (line 292) | def test_amd_uses_index_url_with_rocm_version(self, tmp_path, rocm_ver... method test_nvidia_uses_index_url_with_cuda_version (line 323) | def test_nvidia_uses_index_url_with_cuda_version(self, tmp_path, cuda_... method test_nvidia_linux_uses_index_url (line 343) | def test_nvidia_linux_uses_index_url(self, tmp_path): FILE: tests/comfy_cli/test_launch_python_resolution.py class TestLaunchComfyui (line 10) | class TestLaunchComfyui: method test_uses_python_param (line 11) | def test_uses_python_param(self): method test_foreground_exit_code_matches_subprocess (line 27) | def test_foreground_exit_code_matches_subprocess(self, returncode): class TestLaunchResolvesWorkspacePython (line 41) | class TestLaunchResolvesWorkspacePython: method test_resolves_and_passes_python (line 42) | def test_resolves_and_passes_python(self): FILE: tests/comfy_cli/test_models_python_resolution.py function _block_huggingface_hub (line 13) | def _block_huggingface_hub(name, *args, **kwargs): class TestDownloadHuggingfacePipInstall (line 19) | class TestDownloadHuggingfacePipInstall: method test_uses_resolved_python (line 20) | def test_uses_resolved_python(self, tmp_path): FILE: tests/comfy_cli/test_resolve_python.py function _clean_env (line 17) | def _clean_env(**overrides): function _make_fake_python (line 42) | def _make_fake_python(base_dir, name="bin/python"): function _make_real_venv (line 50) | def _make_real_venv(base_dir): class TestIsExternallyManaged (line 58) | class TestIsExternallyManaged: method test_true_when_marker_exists (line 59) | def test_true_when_marker_exists(self, tmp_path): method test_false_when_no_marker (line 65) | def test_false_when_no_marker(self, tmp_path): method test_false_when_stdlib_is_none (line 69) | def test_false_when_stdlib_is_none(self): class TestGetPythonBinary (line 74) | class TestGetPythonBinary: method test_unix (line 76) | def test_unix(self, _mock): method test_macos (line 80) | def test_macos(self, _mock): method test_windows (line 84) | def test_windows(self, _mock): class TestResolveWorkspacePython (line 89) | class TestResolveWorkspacePython: method test_virtual_env_takes_precedence_over_workspace_venv (line 90) | def test_virtual_env_takes_precedence_over_workspace_venv(self, tmp_pa... method test_virtual_env_takes_precedence_over_conda (line 100) | def test_virtual_env_takes_precedence_over_conda(self, tmp_path): method test_conda_prefix_when_no_virtual_env (line 110) | def test_conda_prefix_when_no_virtual_env(self, tmp_path): method test_conda_prefix_python_missing_falls_through (line 118) | def test_conda_prefix_python_missing_falls_through(self, tmp_path): method test_virtual_env_missing_falls_to_conda (line 126) | def test_virtual_env_missing_falls_to_conda(self, tmp_path): method test_workspace_dot_venv_found (line 136) | def test_workspace_dot_venv_found(self, tmp_path): method test_workspace_venv_found (line 144) | def test_workspace_venv_found(self, tmp_path): method test_dot_venv_preferred_over_venv (line 152) | def test_dot_venv_preferred_over_venv(self, tmp_path): method test_workspace_dot_venv_dir_exists_but_python_missing (line 161) | def test_workspace_dot_venv_dir_exists_but_python_missing(self, tmp_pa... method test_workspace_dot_venv_broken_falls_to_venv (line 169) | def test_workspace_dot_venv_broken_falls_to_venv(self, tmp_path): method test_workspace_venv_dir_exists_but_python_missing (line 178) | def test_workspace_venv_dir_exists_but_python_missing(self, tmp_path): method test_fallback_to_sys_executable (line 186) | def test_fallback_to_sys_executable(self, tmp_path): method test_none_workspace_path (line 191) | def test_none_workspace_path(self): method test_virtual_env_python_missing_falls_through (line 196) | def test_virtual_env_python_missing_falls_through(self, tmp_path): method test_with_real_venv (line 204) | def test_with_real_venv(self, tmp_path): class TestEnsureWorkspacePython (line 217) | class TestEnsureWorkspacePython: method test_with_virtual_env_does_not_create_venv (line 218) | def test_with_virtual_env_does_not_create_venv(self, tmp_path): method test_with_conda_does_not_create_venv (line 229) | def test_with_conda_does_not_create_venv(self, tmp_path): method test_with_both_env_vars_uses_virtual_env (line 240) | def test_with_both_env_vars_uses_virtual_env(self, tmp_path): method test_global_python_returns_sys_executable (line 253) | def test_global_python_returns_sys_executable(self, tmp_path): method test_global_python_pep668_creates_venv (line 270) | def test_global_python_pep668_creates_venv(self, tmp_path): method test_creates_venv_when_isolated_env (line 288) | def test_creates_venv_when_isolated_env(self, tmp_path): method test_existing_dot_venv_reused (line 306) | def test_existing_dot_venv_reused(self, tmp_path): method test_existing_venv_reused (line 314) | def test_existing_venv_reused(self, tmp_path): method test_broken_dot_venv_falls_to_venv (line 322) | def test_broken_dot_venv_falls_to_venv(self, tmp_path): method test_broken_dot_venv_global_python_returns_sys_executable (line 331) | def test_broken_dot_venv_global_python_returns_sys_executable(self, tm... method test_broken_dot_venv_isolated_env_creates_new (line 346) | def test_broken_dot_venv_isolated_env_creates_new(self, tmp_path): class TestCreateWorkspaceVenv (line 361) | class TestCreateWorkspaceVenv: method test_creates_working_venv (line 362) | def test_creates_working_venv(self, tmp_path): method test_created_venv_has_pip (line 373) | def test_created_venv_has_pip(self, tmp_path): method test_created_venv_is_isolated (line 382) | def test_created_venv_is_isolated(self, tmp_path): method test_returns_platform_specific_path (line 392) | def test_returns_platform_specific_path(self, tmp_path): method test_idempotent (line 402) | def test_idempotent(self, tmp_path): method test_failure_raises (line 413) | def test_failure_raises(self, tmp_path): FILE: tests/comfy_cli/test_standalone.py function _mock_response (line 25) | def _mock_response(text, status_code=200): class TestResolvePythonVersion (line 35) | class TestResolvePythonVersion: method test_resolves_312 (line 37) | def test_resolves_312(self, mock_get): method test_resolves_310 (line 43) | def test_resolves_310(self, mock_get): method test_resolves_313 (line 49) | def test_resolves_313(self, mock_get): method test_missing_version_raises (line 55) | def test_missing_version_raises(self, mock_get): method test_http_error_propagates (line 61) | def test_http_error_propagates(self, mock_get): method test_picks_highest_patch (line 67) | def test_picks_highest_patch(self, mock_get): method test_url_construction (line 79) | def test_url_construction(self, mock_get): method test_no_false_match_across_minor (line 85) | def test_no_false_match_across_minor(self, mock_get): class TestDownloadStandalonePython (line 92) | class TestDownloadStandalonePython: method test_minor_version_triggers_resolution (line 95) | def test_minor_version_triggers_resolution(self, mock_get, mock_downlo... method test_full_version_skips_resolution (line 113) | def test_full_version_skips_resolution(self, mock_get, mock_download): class TestResolveVersionIntegration (line 131) | class TestResolveVersionIntegration: method test_latest_release_json_is_reachable (line 134) | def test_latest_release_json_is_reachable(self): method test_resolve_312_from_real_release (line 143) | def test_resolve_312_from_real_release(self): method test_sha256sums_contains_expected_platforms (line 153) | def test_sha256sums_contains_expected_platforms(self): FILE: tests/comfy_cli/test_tracking.py function tracking_module (line 13) | def tracking_module(tmp_path): class TestTrackEvent (line 32) | class TestTrackEvent: method test_short_circuits_when_disabled (line 33) | def test_short_circuits_when_disabled(self, tracking_module): method test_short_circuits_when_not_configured (line 38) | def test_short_circuits_when_not_configured(self, tracking_module): method test_fires_when_enabled (line 42) | def test_fires_when_enabled(self, tracking_module): method test_properties_default_to_empty_dict (line 52) | def test_properties_default_to_empty_dict(self, tracking_module): method test_swallows_mixpanel_errors (line 59) | def test_swallows_mixpanel_errors(self, tracking_module): class TestTrackCommandRedaction (line 66) | class TestTrackCommandRedaction: method test_api_key_value_is_redacted (line 69) | def test_api_key_value_is_redacted(self, tracking_module): method test_api_key_none_stays_none (line 85) | def test_api_key_none_stays_none(self, tracking_module): class TestInitTrackingRoundTrip (line 101) | class TestInitTrackingRoundTrip: method test_disable_is_respected_by_track_event (line 108) | def test_disable_is_respected_by_track_event(self, tracking_module): method test_enable_is_respected_by_track_event (line 113) | def test_enable_is_respected_by_track_event(self, tracking_module): method test_disable_persists_as_parseable_bool (line 119) | def test_disable_persists_as_parseable_bool(self, tracking_module): method test_enable_generates_user_id (line 123) | def test_enable_generates_user_id(self, tracking_module): method test_disable_does_not_generate_user_id (line 132) | def test_disable_does_not_generate_user_id(self, tracking_module): method test_install_event_fires_once_across_calls (line 136) | def test_install_event_fires_once_across_calls(self, tracking_module): FILE: tests/comfy_cli/test_ui.py function _capture (line 9) | def _capture(fn, *args, **kwargs): class TestDisplayErrorMessageMarkup (line 21) | class TestDisplayErrorMessageMarkup: method test_plain_message_rendered (line 26) | def test_plain_message_rendered(self): method test_closing_tag_alone_does_not_crash (line 30) | def test_closing_tag_alone_does_not_crash(self): method test_bracketed_substring_preserved (line 35) | def test_bracketed_substring_preserved(self): method test_multiple_markup_like_tokens (line 41) | def test_multiple_markup_like_tokens(self): method test_unbalanced_opening_bracket (line 47) | def test_unbalanced_opening_bracket(self): FILE: tests/comfy_cli/test_update.py function _mock_pypi_response (line 8) | def _mock_pypi_response(latest_version): class TestCheckForNewerPypiVersion (line 15) | class TestCheckForNewerPypiVersion: method test_newer_version_available (line 17) | def test_newer_version_available(self, mock_get): method test_no_update_when_current (line 24) | def test_no_update_when_current(self, mock_get): method test_network_failure_returns_false (line 31) | def test_network_failure_returns_false(self, mock_get): method test_timeout_value_is_passed (line 38) | def test_timeout_value_is_passed(self, mock_get): class TestCheckForUpdates (line 44) | class TestCheckForUpdates: method test_notifies_when_update_available (line 48) | def test_notifies_when_update_available(self, mock_get, _mock_ver, moc... method test_no_notification_on_network_error (line 56) | def test_no_notification_on_network_error(self, mock_get, _mock_ver, m... FILE: tests/comfy_cli/test_utils.py class _FakeRaw (line 7) | class _FakeRaw(io.BytesIO): method read (line 16) | def read(self, amt=-1, decode_content=False): class TestDownloadUrl (line 20) | class TestDownloadUrl: method test_writes_file (line 22) | def test_writes_file(self, mock_get, tmp_path): class TestTarballRoundTrip (line 35) | class TestTarballRoundTrip: method test_create_and_extract (line 36) | def test_create_and_extract(self, tmp_path, monkeypatch): FILE: tests/comfy_cli/test_workflow_to_api.py function object_info (line 27) | def object_info(): function _node (line 104) | def _node(node_id, node_type, *, inputs=None, outputs=None, widgets=None... class TestIsApiFormat (line 124) | class TestIsApiFormat: method test_recognizes_api (line 125) | def test_recognizes_api(self): method test_ui_is_not_api (line 128) | def test_ui_is_not_api(self): method test_non_dict_is_not_api (line 131) | def test_non_dict_is_not_api(self): method test_empty_dict_is_not_api (line 136) | def test_empty_dict_is_not_api(self): method test_metadata_only_is_not_api (line 139) | def test_metadata_only_is_not_api(self): class TestIsSubgraphUuid (line 144) | class TestIsSubgraphUuid: method test_real_uuid (line 145) | def test_real_uuid(self): method test_class_name_is_not_uuid (line 148) | def test_class_name_is_not_uuid(self): method test_wrong_length (line 151) | def test_wrong_length(self): method test_wrong_dash_count (line 154) | def test_wrong_dash_count(self): method test_non_string (line 157) | def test_non_string(self): class TestConvertCore (line 167) | class TestConvertCore: method test_already_api_is_returned_unchanged (line 168) | def test_already_api_is_returned_unchanged(self, object_info): method test_minimal_workflow (line 172) | def test_minimal_workflow(self, object_info): method test_input_order_follows_schema (line 199) | def test_input_order_follows_schema(self, object_info): method test_unknown_node_type_uses_class_name_as_title (line 246) | def test_unknown_node_type_uses_class_name_as_title(self, object_info): method test_node_title_overrides_display_name (line 266) | def test_node_title_overrides_display_name(self, object_info): method test_invalid_workflow_raises (line 283) | def test_invalid_workflow_raises(self, object_info): class TestSpecialNodes (line 293) | class TestSpecialNodes: method test_primitive_node_inlines_value (line 294) | def test_primitive_node_inlines_value(self, object_info): method test_reroute_is_transparent (line 323) | def test_reroute_is_transparent(self, object_info): method test_get_set_node_pair (line 345) | def test_get_set_node_pair(self, object_info): method test_muted_node_is_excluded (line 375) | def test_muted_node_is_excluded(self, object_info): method test_bypassed_node_passes_through (line 393) | def test_bypassed_node_passes_through(self, object_info): method test_load_image_output_excluded (line 419) | def test_load_image_output_excluded(self, object_info): method test_note_node_excluded (line 440) | def test_note_node_excluded(self, object_info): method test_output_node_kept_even_without_outgoing_links (line 451) | def test_output_node_kept_even_without_outgoing_links(self, object_info): method test_unwired_node_still_emitted (line 463) | def test_unwired_node_still_emitted(self, object_info): method test_unwired_load_node_still_emitted (line 486) | def test_unwired_load_node_still_emitted(self, object_info): method test_markdown_note_excluded (line 521) | def test_markdown_note_excluded(self, object_info): class TestSchemaAwareBehavior (line 549) | class TestSchemaAwareBehavior: method test_combo_value_normalized_case_insensitively (line 550) | def test_combo_value_normalized_case_insensitively(self, object_info): method test_defaults_filled_when_widget_values_absent (line 575) | def test_defaults_filled_when_widget_values_absent(self, object_info): class TestMalformedInputHardening (line 601) | class TestMalformedInputHardening: method test_rejects_non_dict_workflow (line 609) | def test_rejects_non_dict_workflow(self, object_info): method test_rejects_non_dict_object_info (line 615) | def test_rejects_non_dict_object_info(self): method test_rejects_missing_nodes_or_links (line 619) | def test_rejects_missing_nodes_or_links(self, object_info): method test_skips_non_dict_node_entries (line 625) | def test_skips_non_dict_node_entries(self, object_info): method test_tolerates_garbage_in_inputs_and_outputs (line 641) | def test_tolerates_garbage_in_inputs_and_outputs(self, object_info): method test_tolerates_non_list_widgets_values (line 662) | def test_tolerates_non_list_widgets_values(self, object_info): method test_tolerates_non_numeric_slot_in_link (line 681) | def test_tolerates_non_numeric_slot_in_link(self, object_info): method test_tolerates_garbage_definitions (line 702) | def test_tolerates_garbage_definitions(self, object_info): method test_set_get_node_with_unhashable_var_name_does_not_crash (line 716) | def test_set_get_node_with_unhashable_var_name_does_not_crash(self, ob... method test_unhashable_link_value_in_global_helpers_does_not_crash (line 739) | def test_unhashable_link_value_in_global_helpers_does_not_crash(self, ... method test_subgraph_link_with_unhashable_id_is_skipped (line 806) | def test_subgraph_link_with_unhashable_id_is_skipped(self, object_info): method test_inner_node_with_unhashable_link_id_does_not_crash (line 830) | def test_inner_node_with_unhashable_link_id_does_not_crash(self, objec... method test_malformed_subgraph_definition_does_not_crash (line 860) | def test_malformed_subgraph_definition_does_not_crash(self, object_info): method test_outer_subgraph_node_with_non_dict_inputs_does_not_crash (line 884) | def test_outer_subgraph_node_with_non_dict_inputs_does_not_crash(self,... method test_v3_combo_option_with_non_dict_inputs_keeps_node (line 903) | def test_v3_combo_option_with_non_dict_inputs_keeps_node(self): method test_malformed_schema_input_does_not_crash (line 942) | def test_malformed_schema_input_does_not_crash(self): method test_malformed_schema_input_order_does_not_crash (line 973) | def test_malformed_schema_input_order_does_not_crash(self): method test_single_bad_node_does_not_abort_conversion (line 1000) | def test_single_bad_node_does_not_abort_conversion(self, object_info, ... class TestControlAfterGenerate (line 1034) | class TestControlAfterGenerate: method test_seed_widget_with_control_marker_strips_correctly (line 1040) | def test_seed_widget_with_control_marker_strips_correctly(self): method test_legitimate_value_named_fixed_is_preserved (line 1073) | def test_legitimate_value_named_fixed_is_preserved(self): method test_unknown_node_falls_back_to_legacy_filter (line 1105) | def test_unknown_node_falls_back_to_legacy_filter(self): class TestWildcardInputType (line 1134) | class TestWildcardInputType: method test_star_wildcard_not_treated_as_widget (line 1174) | def test_star_wildcard_not_treated_as_widget(self): method test_empty_string_wildcard_does_not_consume_widget_slot (line 1192) | def test_empty_string_wildcard_does_not_consume_widget_slot(self): class TestImplicitSeedCompanion (line 1214) | class TestImplicitSeedCompanion: method test_seed_named_input_strips_implicit_companion (line 1259) | def test_seed_named_input_strips_implicit_companion(self): method test_noise_seed_named_input_strips_implicit_companion (line 1276) | def test_noise_seed_named_input_strips_implicit_companion(self): method test_seed_input_without_companion_still_works (line 1293) | def test_seed_input_without_companion_still_works(self): method test_regular_int_input_does_not_strip_control_value (line 1313) | def test_regular_int_input_does_not_strip_control_value(self): class TestNodeNameForSAndRAlias (line 1336) | class TestNodeNameForSAndRAlias: method _aliased_workflow (line 1367) | def _aliased_workflow(self, *, widgets_values): method test_meta_title_uses_aliased_schema (line 1391) | def test_meta_title_uses_aliased_schema(self): method test_combo_normalization_uses_aliased_schema (line 1395) | def test_combo_normalization_uses_aliased_schema(self): method test_defaults_filled_from_aliased_schema (line 1400) | def test_defaults_filled_from_aliased_schema(self): method test_aliased_node_with_no_connections_still_emits (line 1405) | def test_aliased_node_with_no_connections_still_emits(self): class TestForceInputHandling (line 1431) | class TestForceInputHandling: method test_forceinput_widget_does_not_consume_value_slot (line 1440) | def test_forceinput_widget_does_not_consume_value_slot(self): method test_legacy_defaultinput_alias_works_the_same (line 1481) | def test_legacy_defaultinput_alias_works_the_same(self): class TestFrontendParity (line 1523) | class TestFrontendParity: method test_list_widget_value_is_wrapped_to_disambiguate_from_link (line 1526) | def test_list_widget_value_is_wrapped_to_disambiguate_from_link(self, ... method test_orphan_link_inputs_are_stripped (line 1553) | def test_orphan_link_inputs_are_stripped(self, object_info): method test_bypass_matches_any_type_wildcard (line 1591) | def test_bypass_matches_any_type_wildcard(self, object_info): method test_bypass_falls_back_to_first_linked_input_when_types_mismatch (line 1619) | def test_bypass_falls_back_to_first_linked_input_when_types_mismatch(s... method test_muted_node_does_not_leave_dangling_reference (line 1648) | def test_muted_node_does_not_leave_dangling_reference(self, object_info): method test_bypass_matches_comma_separated_types (line 1674) | def test_bypass_matches_comma_separated_types(self, object_info): method test_group_node_workflow_emits_warning (line 1700) | def test_group_node_workflow_emits_warning(self, object_info, caplog): class TestTracerChainDepth (line 1718) | class TestTracerChainDepth: method _consumer_id (line 1729) | def _consumer_id(self): method test_long_reroute_chain (line 1732) | def test_long_reroute_chain(self): method test_long_bypass_chain (line 1754) | def test_long_bypass_chain(self): method test_long_getset_chain (line 1782) | def test_long_getset_chain(self): class TestMutedBypassedSubgraph (line 1818) | class TestMutedBypassedSubgraph: method _workflow (line 1827) | def _workflow(self, mode, with_external_wires=False): method test_muted_subgraph_drops_inner_nodes (line 1881) | def test_muted_subgraph_drops_inner_nodes(self, object_info): method test_bypassed_subgraph_drops_inner_nodes (line 1885) | def test_bypassed_subgraph_drops_inner_nodes(self, object_info): method test_normal_subgraph_still_expands (line 1889) | def test_normal_subgraph_still_expands(self, object_info): method test_bypassed_subgraph_passes_external_input_through (line 1895) | def test_bypassed_subgraph_passes_external_input_through(self, object_... class TestDynamicComboAfterControlMarker (line 1904) | class TestDynamicComboAfterControlMarker: method test_dynamic_combo_selector_reads_from_filtered_slot (line 1916) | def test_dynamic_combo_selector_reads_from_filtered_slot(self): class TestDynamicPrompts (line 1960) | class TestDynamicPrompts: method test_no_braces_passes_through (line 1969) | def test_no_braces_passes_through(self): method test_strips_line_comments (line 1973) | def test_strips_line_comments(self): method test_strips_block_comments (line 1977) | def test_strips_block_comments(self): method test_picks_one_option_per_group (line 1981) | def test_picks_one_option_per_group(self): method test_handles_empty_alternatives (line 1987) | def test_handles_empty_alternatives(self): method test_handles_nested_groups (line 1998) | def test_handles_nested_groups(self): method test_escapes_preserve_literal_characters (line 2006) | def test_escapes_preserve_literal_characters(self): method test_unterminated_group_degrades_gracefully (line 2015) | def test_unterminated_group_degrades_gracefully(self): method test_multiple_groups_in_one_string (line 2020) | def test_multiple_groups_in_one_string(self): method test_clip_text_encode_resolves_groups (line 2053) | def test_clip_text_encode_resolves_groups(self): method test_widget_without_dynamic_prompts_flag_left_alone (line 2078) | def test_widget_without_dynamic_prompts_flag_left_alone(self): method test_non_string_value_passes_through_unchanged (line 2096) | def test_non_string_value_passes_through_unchanged(self): method test_random_choice_is_deterministic_under_seed (line 2121) | def test_random_choice_is_deterministic_under_seed(self): class TestFixtureParity (line 2132) | class TestFixtureParity: method test_sd15_workflow_matches_reference (line 2140) | def test_sd15_workflow_matches_reference(self): class TestSubgraphExpansion (line 2147) | class TestSubgraphExpansion: method test_simple_subgraph_expansion (line 2148) | def test_simple_subgraph_expansion(self, object_info): FILE: tests/comfy_cli/test_workspace_manager.py class TestPathsMatch (line 15) | class TestPathsMatch: method test_identical_paths (line 16) | def test_identical_paths(self, tmp_path): method test_symlink_to_same_dir (line 21) | def test_symlink_to_same_dir(self, tmp_path): method test_different_paths (line 28) | def test_different_paths(self, tmp_path): method test_nonexistent_paths_same (line 35) | def test_nonexistent_paths_same(self): method test_nonexistent_paths_different (line 38) | def test_nonexistent_paths_different(self): method test_trailing_slash (line 41) | def test_trailing_slash(self, tmp_path): method test_dot_components (line 46) | def test_dot_components(self, tmp_path): method test_parent_component (line 51) | def test_parent_component(self, tmp_path): method test_one_exists_one_not (line 58) | def test_one_exists_one_not(self, tmp_path): method test_double_symlink (line 65) | def test_double_symlink(self, tmp_path): function _create_comfyui_markers (line 80) | def _create_comfyui_markers(path, markers=None): class TestHasComfyuiMarkers (line 92) | class TestHasComfyuiMarkers: method test_all_five_markers (line 93) | def test_all_five_markers(self, tmp_path): method test_any_four_of_five_sufficient (line 98) | def test_any_four_of_five_sufficient(self, tmp_path, omit): method test_three_markers_insufficient (line 111) | def test_three_markers_insufficient(self, tmp_path, present): method test_empty_directory (line 115) | def test_empty_directory(self, tmp_path): method test_nonexistent_path (line 118) | def test_nonexistent_path(self): function _make_manager (line 122) | def _make_manager(*, use_here=None, specified_workspace=None, use_recent... function _mock_config (line 134) | def _mock_config(mgr, default_workspace=None, recent_workspace=None): class TestFindComfyuiRoot (line 152) | class TestFindComfyuiRoot: method test_markers_at_given_path (line 155) | def test_markers_at_given_path(self, tmp_path): method test_walks_up_to_parent_with_markers (line 159) | def test_walks_up_to_parent_with_markers(self, tmp_path): method test_walks_up_multiple_levels (line 165) | def test_walks_up_multiple_levels(self, tmp_path): method test_no_markers_anywhere (line 171) | def test_no_markers_anywhere(self, tmp_path): method test_returns_nearest_root (line 176) | def test_returns_nearest_root(self, tmp_path): class TestCheckComfyRepoFallback (line 188) | class TestCheckComfyRepoFallback: method test_nonexistent_path (line 191) | def test_nonexistent_path(self): method test_non_git_dir_with_all_markers (line 196) | def test_non_git_dir_with_all_markers(self, tmp_path): method test_non_git_dir_with_four_markers (line 202) | def test_non_git_dir_with_four_markers(self, tmp_path): method test_non_git_dir_insufficient_markers (line 208) | def test_non_git_dir_insufficient_markers(self, tmp_path): method test_non_git_empty_dir (line 214) | def test_non_git_empty_dir(self, tmp_path): method test_returned_path_is_absolute (line 219) | def test_returned_path_is_absolute(self, tmp_path): method test_subdirectory_walks_up_to_root (line 230) | def test_subdirectory_walks_up_to_root(self, tmp_path): method test_fork_repo_with_markers_detected (line 239) | def test_fork_repo_with_markers_detected(self, tmp_path): method test_fork_repo_without_markers_not_detected (line 255) | def test_fork_repo_without_markers_not_detected(self, tmp_path): class TestStep1Workspace (line 270) | class TestStep1Workspace: method test_workspace_flag_takes_priority (line 271) | def test_workspace_flag_takes_priority(self): method test_workspace_overrides_cwd_matching_default (line 280) | def test_workspace_overrides_cwd_matching_default(self, mock_getcwd, m... class TestStep3Here (line 293) | class TestStep3Here: method test_here_flag_forces_current_dir_even_if_matches_default (line 296) | def test_here_flag_forces_current_dir_even_if_matches_default(self, mo... method test_here_flag_non_comfy_dir_appends_comfyui (line 310) | def test_here_flag_non_comfy_dir_appends_comfyui(self, mock_getcwd, mo... class TestStep4AutoDetect (line 323) | class TestStep4AutoDetect: method test_cwd_matches_default_returns_default_type (line 326) | def test_cwd_matches_default_returns_default_type(self, mock_getcwd, m... method test_cwd_different_repo_returns_current_dir (line 342) | def test_cwd_different_repo_returns_current_dir(self, mock_getcwd, moc... method test_cwd_repo_no_default_configured (line 358) | def test_cwd_repo_no_default_configured(self, mock_getcwd, mock_check): method test_cwd_repo_empty_default_returns_current_dir (line 372) | def test_cwd_repo_empty_default_returns_current_dir(self, mock_getcwd,... method test_paths_match_called_with_correct_args (line 385) | def test_paths_match_called_with_correct_args(self, mock_getcwd, mock_... class TestNoHereSkipsStep4 (line 399) | class TestNoHereSkipsStep4: method test_no_here_skips_cwd_detection (line 402) | def test_no_here_skips_cwd_detection(self, mock_getcwd, mock_check): class TestStep5ConfiguredDefault (line 418) | class TestStep5ConfiguredDefault: method test_not_comfy_repo_falls_through_to_default (line 421) | def test_not_comfy_repo_falls_through_to_default(self, mock_getcwd, mo... class TestStep6RecentFallback (line 436) | class TestStep6RecentFallback: method test_no_default_falls_to_recent (line 439) | def test_no_default_falls_to_recent(self, mock_getcwd, mock_check): class TestStep7FallbackDefault (line 458) | class TestStep7FallbackDefault: method test_all_fallbacks_exhausted (line 462) | def test_all_fallbacks_exhausted(self, _cwd, _check, mock_fallback): class TestFullIntegration (line 473) | class TestFullIntegration: method _create_comfy_repo (line 479) | def _create_comfy_repo(path): method test_cwd_is_default_workspace_real_repo (line 493) | def test_cwd_is_default_workspace_real_repo(self, tmp_path): method test_cwd_is_default_workspace_via_symlink (line 507) | def test_cwd_is_default_workspace_via_symlink(self, tmp_path): method test_cwd_is_subdir_of_default_workspace (line 522) | def test_cwd_is_subdir_of_default_workspace(self, tmp_path): method test_two_repos_cwd_in_non_default (line 538) | def test_two_repos_cwd_in_non_default(self, tmp_path): method test_default_workspace_trailing_slash (line 554) | def test_default_workspace_trailing_slash(self, tmp_path): method test_here_flag_overrides_even_with_real_repo (line 567) | def test_here_flag_overrides_even_with_real_repo(self, tmp_path): method test_not_in_any_repo_falls_to_configured_default (line 580) | def test_not_in_any_repo_falls_to_configured_default(self, tmp_path): method test_non_git_comfyui_detected_as_cwd (line 596) | def test_non_git_comfyui_detected_as_cwd(self, tmp_path): method test_non_git_comfyui_as_configured_default (line 611) | def test_non_git_comfyui_as_configured_default(self, tmp_path): method test_non_git_comfyui_from_subdirectory (line 628) | def test_non_git_comfyui_from_subdirectory(self, tmp_path): method test_fork_repo_detected_as_comfyui (line 645) | def test_fork_repo_detected_as_comfyui(self, tmp_path): FILE: tests/e2e/test_e2e.py function e2e_test (line 11) | def e2e_test(func): function exec (line 18) | def exec(cmd: str, **kwargs) -> subprocess.CompletedProcess[str]: function workspace (line 36) | def workspace(): function comfy_cli (line 72) | def comfy_cli(workspace): function test_model (line 78) | def test_model(comfy_cli): function test_node (line 105) | def test_node(comfy_cli, workspace): function test_manager_installed (line 175) | def test_manager_installed(comfy_cli, workspace): function test_node_uv_compile (line 196) | def test_node_uv_compile(comfy_cli): function test_uv_compile_default_config (line 216) | def test_uv_compile_default_config(comfy_cli): function test_install_version_latest_no_github_api (line 247) | def test_install_version_latest_no_github_api(tmp_path): function test_run (line 304) | def test_run(comfy_cli): FILE: tests/e2e/test_e2e_uv_compile.py function _e2e_enabled (line 39) | def _e2e_enabled(): function exec (line 48) | def exec(cmd: str, timeout: int = 600, **kwargs) -> subprocess.Completed... function _rmtree_retry (line 75) | def _rmtree_retry(path, retries=5, delay=2.0): function workspace (line 108) | def workspace(): function comfy_cli (line 166) | def comfy_cli(workspace): function _clean_test_packs (line 171) | def _clean_test_packs(workspace): function test_real_packs_sequential_no_conflict (line 194) | def test_real_packs_sequential_no_conflict(comfy_cli): function test_real_packs_simultaneous_no_conflict (line 210) | def test_real_packs_simultaneous_no_conflict(comfy_cli): function test_progressive_conflict (line 225) | def test_progressive_conflict(comfy_cli): function test_node_reinstall_uv_compile (line 252) | def test_node_reinstall_uv_compile(comfy_cli): function test_node_update_uv_compile (line 264) | def test_node_update_uv_compile(comfy_cli): function test_node_fix_uv_compile (line 276) | def test_node_fix_uv_compile(comfy_cli): function test_node_restore_deps_uv_compile (line 288) | def test_node_restore_deps_uv_compile(comfy_cli): function test_node_uv_sync_standalone (line 305) | def test_node_uv_sync_standalone(comfy_cli): function test_node_uv_sync_standalone_conflict (line 317) | def test_node_uv_sync_standalone_conflict(comfy_cli): function test_uv_compile_config_default (line 337) | def test_uv_compile_config_default(comfy_cli): function test_no_uv_compile_overrides_config (line 352) | def test_no_uv_compile_overrides_config(comfy_cli): function test_uv_compile_mutual_exclusivity (line 372) | def test_uv_compile_mutual_exclusivity(comfy_cli): FILE: tests/test_file_utils_network.py function test_guess_status_code_reason_401_with_json (line 22) | def test_guess_status_code_reason_401_with_json(): function test_guess_status_code_reason_401_without_json (line 29) | def test_guess_status_code_reason_401_without_json(): function test_guess_status_code_reason_403 (line 35) | def test_guess_status_code_reason_403(): function test_guess_status_code_reason_404 (line 40) | def test_guess_status_code_reason_404(): function test_guess_status_code_reason_unknown (line 45) | def test_guess_status_code_reason_unknown(): function test_check_unauthorized_true (line 51) | def test_check_unauthorized_true(mock_get): function test_check_unauthorized_false (line 60) | def test_check_unauthorized_false(mock_get): function test_check_unauthorized_exception (line 69) | def test_check_unauthorized_exception(mock_get): function test_download_file_success (line 76) | def test_download_file_success(mock_stream, tmp_path): function test_download_file_success_without_content_length (line 93) | def test_download_file_success_without_content_length(mock_stream, tmp_p... function test_download_file_failure (line 111) | def test_download_file_failure(mock_stream): function test_upload_file_success (line 126) | def test_upload_file_success(mock_put, tmp_path): function test_upload_file_failure (line 140) | def test_upload_file_failure(mock_put, tmp_path): function test_extract_package_as_zip (line 155) | def test_extract_package_as_zip(tmp_path): function _make_ok_response (line 171) | def _make_ok_response(content=b"data", content_length=None): function _make_failing_iter (line 184) | def _make_failing_iter(data=b"partial", exc=None): function _make_status_response (line 196) | def _make_status_response(status_code, body=b""): class TestCleanupPartial (line 206) | class TestCleanupPartial: method test_removes_existing_file (line 207) | def test_removes_existing_file(self, tmp_path): method test_noop_when_file_missing (line 213) | def test_noop_when_file_missing(self, tmp_path): class TestFriendlyNetworkError (line 219) | class TestFriendlyNetworkError: method test_read_timeout (line 220) | def test_read_timeout(self): method test_connect_timeout (line 224) | def test_connect_timeout(self): method test_generic_timeout (line 228) | def test_generic_timeout(self): method test_network_error (line 232) | def test_network_error(self): method test_protocol_error (line 236) | def test_protocol_error(self): method test_proxy_error (line 241) | def test_proxy_error(self): method test_other_exception (line 246) | def test_other_exception(self): method test_transient_http_status_known_code_includes_phrase (line 250) | def test_transient_http_status_known_code_includes_phrase(self): method test_transient_http_status_500_includes_phrase (line 256) | def test_transient_http_status_500_includes_phrase(self): method test_transient_http_status_unknown_code_falls_back (line 261) | def test_transient_http_status_unknown_code_falls_back(self): method test_invalid_url (line 267) | def test_invalid_url(self): class TestDownloadTimeout (line 273) | class TestDownloadTimeout: method test_uses_generous_timeout (line 275) | def test_uses_generous_timeout(self, mock_stream, tmp_path): class TestDownloadRetry (line 287) | class TestDownloadRetry: method test_succeeds_after_transient_timeout (line 290) | def test_succeeds_after_transient_timeout(self, mock_stream, mock_slee... method test_succeeds_after_network_error (line 306) | def test_succeeds_after_network_error(self, mock_stream, mock_sleep, t... method test_succeeds_after_protocol_error (line 322) | def test_succeeds_after_protocol_error(self, mock_stream, mock_sleep, ... method test_succeeds_after_proxy_error (line 337) | def test_succeeds_after_proxy_error(self, mock_stream, mock_sleep, tmp... method test_all_retries_exhausted_read_timeout (line 352) | def test_all_retries_exhausted_read_timeout(self, mock_stream, mock_sl... method test_all_retries_exhausted_connect_error (line 367) | def test_all_retries_exhausted_connect_error(self, mock_stream, mock_s... method test_http_error_not_retried (line 380) | def test_http_error_not_retried(self, mock_stream, mock_sleep, tmp_path): method test_backoff_increases_with_attempts (line 397) | def test_backoff_increases_with_attempts(self, mock_stream, mock_sleep... method test_original_exception_chained (line 411) | def test_original_exception_chained(self, mock_stream, mock_sleep, tmp... class TestDownloadPartialCleanup (line 421) | class TestDownloadPartialCleanup: method test_partial_file_removed_after_midstream_timeout (line 424) | def test_partial_file_removed_after_midstream_timeout(self, mock_strea... method test_partial_file_removed_between_retries (line 442) | def test_partial_file_removed_between_retries(self, mock_stream, mock_... method test_preexisting_file_preserved_on_http_error (line 465) | def test_preexisting_file_preserved_on_http_error(self, mock_stream, m... method test_preexisting_file_preserved_on_connect_error (line 489) | def test_preexisting_file_preserved_on_connect_error(self, mock_stream... method test_preexisting_file_preserved_on_interrupt_before_open (line 509) | def test_preexisting_file_preserved_on_interrupt_before_open(self, moc... method test_keyboard_interrupt_cleans_up_when_user_confirms (line 528) | def test_keyboard_interrupt_cleans_up_when_user_confirms(self, mock_st... method test_keyboard_interrupt_keeps_partial_when_user_declines (line 547) | def test_keyboard_interrupt_keeps_partial_when_user_declines(self, moc... class TestDownloadHTTPStatusRetry (line 566) | class TestDownloadHTTPStatusRetry: method test_500_retried_and_succeeds (line 571) | def test_500_retried_and_succeeds(self, mock_stream, mock_sleep, tmp_p... method test_502_retried (line 587) | def test_502_retried(self, mock_stream, mock_sleep, tmp_path): method test_503_retried (line 599) | def test_503_retried(self, mock_stream, mock_sleep, tmp_path): method test_504_retried (line 611) | def test_504_retried(self, mock_stream, mock_sleep, tmp_path): method test_429_retried (line 623) | def test_429_retried(self, mock_stream, mock_sleep, tmp_path): method test_408_retried (line 635) | def test_408_retried(self, mock_stream, mock_sleep, tmp_path): method test_all_retries_exhausted_on_500 (line 647) | def test_all_retries_exhausted_on_500(self, mock_stream, mock_sleep, t... method test_retry_body_read_timeout_still_retries (line 669) | def test_retry_body_read_timeout_still_retries(self, mock_stream, mock... method test_mixed_transient_errors_eventually_succeed (line 687) | def test_mixed_transient_errors_eventually_succeed(self, mock_stream, ... method test_404_not_retried (line 703) | def test_404_not_retried(self, mock_stream, mock_sleep, tmp_path): method test_401_not_retried (line 715) | def test_401_not_retried(self, mock_stream, mock_sleep, tmp_path): method test_403_not_retried (line 727) | def test_403_not_retried(self, mock_stream, mock_sleep, tmp_path): method test_preexisting_file_preserved_on_http_status_retry_exhaust (line 739) | def test_preexisting_file_preserved_on_http_status_retry_exhaust(self,... class TestDownloadNonRetriableHTTPError (line 760) | class TestDownloadNonRetriableHTTPError: method test_unsupported_protocol_wrapped (line 767) | def test_unsupported_protocol_wrapped(self, mock_stream, mock_sleep, t... method test_too_many_redirects_wrapped (line 779) | def test_too_many_redirects_wrapped(self, mock_stream, mock_sleep, tmp... method test_decoding_error_wrapped (line 791) | def test_decoding_error_wrapped(self, mock_stream, mock_sleep, tmp_path): method test_invalid_url_wrapped (line 803) | def test_invalid_url_wrapped(self, mock_stream, mock_sleep, tmp_path): method test_invalid_url_preserves_preexisting_file (line 817) | def test_invalid_url_preserves_preexisting_file(self, mock_stream, tmp... method test_preexisting_file_preserved_on_non_retriable_error (line 832) | def test_preexisting_file_preserved_on_non_retriable_error(self, mock_... method test_partial_file_cleaned_up_on_mid_stream_non_retriable (line 847) | def test_partial_file_cleaned_up_on_mid_stream_non_retriable(self, moc... FILE: tests/uv/test_torch_backend_compile.py function _setup_temp (line 35) | def _setup_temp(): function _compile_for (line 41) | def _compile_for(gpu): function test_compile_nvidia (line 55) | def test_compile_nvidia(): function test_compile_amd (line 63) | def test_compile_amd(): function test_compile_cpu (line 71) | def test_compile_cpu(): function test_compile_nvidia_cu130_preserves_cuda_runtime (line 81) | def test_compile_nvidia_cu130_preserves_cuda_runtime(): function test_compile_mac (line 116) | def test_compile_mac(): FILE: tests/uv/test_uv.py function mock_prompt_select (line 24) | def mock_prompt_select(monkeypatch): function test_find_req_files (line 33) | def test_find_req_files(): function test_compile (line 54) | def test_compile(mock_prompt_select): function test_torch_backend_nvidia (line 84) | def test_torch_backend_nvidia(): function test_torch_backend_amd (line 90) | def test_torch_backend_amd(): function test_torch_backend_cpu (line 96) | def test_torch_backend_cpu(): function test_torch_backend_none (line 102) | def test_torch_backend_none(): function test_compile_passes_torch_backend (line 109) | def test_compile_passes_torch_backend(): function test_compile_omits_torch_backend_when_none (line 123) | def test_compile_omits_torch_backend_when_none(): function test_compiled_output_has_no_extra_index_url (line 136) | def test_compiled_output_has_no_extra_index_url(mock_prompt_select): function test_override_file_has_no_extra_index_url (line 152) | def test_override_file_has_no_extra_index_url(): function test_make_override_does_not_strip_cuda_toolkit_extras (line 167) | def test_make_override_does_not_strip_cuda_toolkit_extras(): function test_nvidia_custom_cuda_version (line 236) | def test_nvidia_custom_cuda_version(): function test_nvidia_cuda_13 (line 244) | def test_nvidia_cuda_13(): function test_amd_custom_rocm_version (line 252) | def test_amd_custom_rocm_version(): function test_nvidia_auto_detected_tag (line 260) | def test_nvidia_auto_detected_tag(): function test_nvidia_no_cuda_version_uses_default (line 268) | def test_nvidia_no_cuda_version_uses_default(): function test_skip_torch_disables_gpu_url_and_backend (line 277) | def test_skip_torch_disables_gpu_url_and_backend(gpu): function test_skip_torch_override_has_no_torch (line 283) | def test_skip_torch_override_has_no_torch(): function test_skip_torch_install_deps_no_extra_index_url (line 297) | def test_skip_torch_install_deps_no_extra_index_url(): function test_check_call_prints_nfs_hint_on_uv_install_failure (line 308) | def test_check_call_prints_nfs_hint_on_uv_install_failure(capsys): function test_check_call_prints_nfs_hint_on_uv_sync_failure (line 321) | def test_check_call_prints_nfs_hint_on_uv_sync_failure(capsys): function test_check_call_no_hint_for_non_uv_failure (line 332) | def test_check_call_no_hint_for_non_uv_failure(capsys): function test_check_call_no_hint_on_uv_compile_failure (line 343) | def test_check_call_no_hint_on_uv_compile_failure(capsys): function test_check_call_no_hint_for_pip_install_uv (line 354) | def test_check_call_no_hint_for_pip_install_uv(capsys): function test_parse_req_file_strips_inline_comments (line 370) | def test_parse_req_file_strips_inline_comments(tmp_path): function test_parse_req_file_strips_inline_comment_with_single_space (line 376) | def test_parse_req_file_strips_inline_comment_with_single_space(tmp_path): function test_parse_req_file_skips_full_line_comments (line 382) | def test_parse_req_file_skips_full_line_comments(tmp_path): function test_parse_req_file_preserves_vcs_subdirectory_fragment (line 388) | def test_parse_req_file_preserves_vcs_subdirectory_fragment(tmp_path): function test_parse_req_file_preserves_vcs_egg_fragment (line 396) | def test_parse_req_file_preserves_vcs_egg_fragment(tmp_path): function test_parse_req_file_preserves_direct_url_hash (line 402) | def test_parse_req_file_preserves_direct_url_hash(tmp_path): function test_parse_req_file_vcs_with_inline_comment_strips_only_comment (line 408) | def test_parse_req_file_vcs_with_inline_comment_strips_only_comment(tmp_... function test_parse_req_file_preserves_double_dash_options (line 417) | def test_parse_req_file_preserves_double_dash_options(tmp_path): function test_parse_req_file_handles_crlf_line_endings (line 423) | def test_parse_req_file_handles_crlf_line_endings(tmp_path):