these 2 derivations will be built: /nix/store/b7jwxh8ksrbhk867mxgijfs9lyp1msl6-clan-cli-source.drv /nix/store/1y3a62w3p0kr1cgsnw6gg3cglfwz23ih-clan-pytest-without-core.drv building '/nix/store/1y3a62w3p0kr1cgsnw6gg3cglfwz23ih-clan-pytest-without-core.drv' on 'ssh-ng://builder@build04.clan.lol' building '/nix/store/1y3a62w3p0kr1cgsnw6gg3cglfwz23ih-clan-pytest-without-core.drv' clan-pytest-without-core> Starting pytest session clan-pytest-without-core> Session config: <_pytest.config.Config object at 0x102a4f230> clan-pytest-without-core> ============================= test session starts ============================== clan-pytest-without-core> platform darwin -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0 clan-pytest-without-core> rootdir: /nix/var/nix/builds/nix-78939-1448654285/src clan-pytest-without-core> configfile: pyproject.toml clan-pytest-without-core> plugins: subprocess-1.6.0, xdist-3.8.0, timeout-2.4.0 clan-pytest-without-core> 10 workers [359 items] clan-pytest-without-core> scheduling tests via LoadScheduling clan-pytest-without-core> clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestDeleteVarFile::test_nested clan-pytest-without-core> [gw2] [ 0%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestDeleteVarFile::test_nested clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_basic clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_ro_paths_are_readable clan-pytest-without-core> [gw8] [ 0%] SKIPPED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_ro_paths_are_readable clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_allows_write_to_tmpdir clan-pytest-without-core> [gw9] [ 0%] SKIPPED clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_allows_write_to_tmpdir clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_noop_if_missing clan-pytest-without-core> [gw1] [ 1%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_noop_if_missing clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_not_ssh_forward clan-pytest-without-core> [gw7] [ 1%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_not_ssh_forward clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_ssh_url_scheme clan-pytest-without-core> [gw7] [ 1%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_ssh_url_scheme clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_basic clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_transform_url_explicit_path clan-pytest-without-core> [gw4] [ 1%] PASSED clan_lib/templates/template_url_test.py::test_transform_url_explicit_path clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestDeleteVarFile::test_noop_if_missing clan-pytest-without-core> [gw2] [ 2%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestDeleteVarFile::test_noop_if_missing clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_ro_paths_are_not_writable clan-pytest-without-core> [gw8] [ 2%] SKIPPED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_ro_paths_are_not_writable clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_raises_on_unsupported_platform clan-pytest-without-core> clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_no_machine_attrs clan-pytest-without-core> [gw3] [ 2%] PASSED clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_no_machine_attrs clan-pytest-without-core> clan_lib/vars/generator_test.py::test_generator_get_previous_value clan-pytest-without-core> [gw3] [ 3%] PASSED clan_lib/vars/generator_test.py::test_generator_get_previous_value clan-pytest-without-core> clan_lib/vars/generator_test.py::test_dependencies_as_files clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_ssh_url_ipv6 clan-pytest-without-core> [gw7] [ 3%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_ssh_url_ipv6 clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_ssh_url_ipv6_already_bracketed clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_denies_write_to_home clan-pytest-without-core> [gw9] [ 3%] SKIPPED clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_denies_write_to_home clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_explicit_abs_path_default clan-pytest-without-core> [gw6] [ 3%] PASSED clan_lib/templates/template_url_test.py::test_explicit_abs_path_default clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_explicit_home_path_default clan-pytest-without-core> [gw6] [ 4%] PASSED clan_lib/templates/template_url_test.py::test_explicit_home_path_default clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_proxy_command_with_spaces clan-pytest-without-core> [gw6] [ 4%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_proxy_command_with_spaces clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_locked_input_template_no_quotes clan-pytest-without-core> [gw5] [ 4%] PASSED clan_lib/templates/template_url_test.py::test_locked_input_template_no_quotes clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_allows_nix_store_read clan-pytest-without-core> [gw9] [ 5%] SKIPPED clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_allows_nix_store_read clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_executes_successfully clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_socks_proxy clan-pytest-without-core> [gw6] [ 5%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_socks_proxy clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_control_master clan-pytest-without-core> [gw8] [ 5%] PASSED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_raises_on_unsupported_platform clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_works_returns_true_on_linux clan-pytest-without-core> [gw8] [ 5%] SKIPPED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_works_returns_true_on_linux clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_works_returns_true_on_darwin clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_locked_input_template_no_dot clan-pytest-without-core> [gw5] [ 6%] PASSED clan_lib/templates/template_url_test.py::test_locked_input_template_no_dot clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_explicit_path_default_minimal_rel_1 clan-pytest-without-core> [gw5] [ 6%] PASSED clan_lib/templates/template_url_test.py::test_explicit_path_default_minimal_rel_1 clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_explicit_path_default_minimal_rel_2 clan-pytest-without-core> [gw5] [ 6%] PASSED clan_lib/templates/template_url_test.py::test_explicit_path_default_minimal_rel_2 clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_explicit_path_default_minimal_parent_1 clan-pytest-without-core> [gw3] [ 6%] PASSED clan_lib/vars/generator_test.py::test_dependencies_as_files clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_transform_url_self_explicit_dot clan-pytest-without-core> [gw3] [ 7%] PASSED clan_lib/templates/template_url_test.py::test_transform_url_self_explicit_dot clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_default_clan_template clan-pytest-without-core> [gw9] [ 7%] SKIPPED clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_executes_successfully clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_ro_bind_is_readable clan-pytest-without-core> clan_lib/vars/graph_test.py::test_required_generators clan-pytest-without-core> [gw2] [ 7%] PASSED clan_lib/vars/graph_test.py::test_required_generators clan-pytest-without-core> clan_lib/vars/graph_test.py::test_shared_generator_invalidates_multiple_machines_dependents clan-pytest-without-core> [gw2] [ 8%] PASSED clan_lib/vars/graph_test.py::test_shared_generator_invalidates_multiple_machines_dependents clan-pytest-without-core> [gw7] [ 8%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_ssh_url_ipv6_already_bracketed clan-pytest-without-core> clan_lib/ssh/localhost_test.py::test_localhost clan-pytest-without-core> [gw0] [ 8%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_basic clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_fixes_symlinks clan-pytest-without-core> [gw0] [ 8%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_fixes_symlinks clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_decreases_symlink_depth clan-pytest-without-core> [gw1] [ 9%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_basic clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_fixes_symlinks clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_transform_url_quoted_selector clan-pytest-without-core> [gw4] [ 9%] PASSED clan_lib/templates/template_url_test.py::test_transform_url_quoted_selector clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_single_quote_selector clan-pytest-without-core> [gw4] [ 9%] PASSED clan_lib/templates/template_url_test.py::test_single_quote_selector clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_custom_template_path clan-pytest-without-core> [gw4] [ 10%] PASSED clan_lib/templates/template_url_test.py::test_custom_template_path clan-pytest-without-core> clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_removes_platform_attrs clan-pytest-without-core> [gw6] [ 10%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_control_master clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_port_and_key clan-pytest-without-core> [gw6] [ 10%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_port_and_key clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_host_key_none clan-pytest-without-core> [gw6] [ 10%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_host_key_none clan-pytest-without-core> [gw8] [ 11%] PASSED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_works_returns_true_on_darwin clan-pytest-without-core> [gw2] [ 11%] PASSED clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_removes_platform_attrs clan-pytest-without-core> [gw5] [ 11%] PASSED clan_lib/templates/template_url_test.py::test_explicit_path_default_minimal_parent_1 clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_explicit_path_default_minimal_parent_2 clan-pytest-without-core> [gw5] [ 11%] PASSED clan_lib/templates/template_url_test.py::test_explicit_path_default_minimal_parent_2 clan-pytest-without-core> [gw3] [ 12%] PASSED clan_lib/templates/template_url_test.py::test_default_clan_template clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_transform_url_self_no_dot clan-pytest-without-core> [gw3] [ 12%] PASSED clan_lib/templates/template_url_test.py::test_transform_url_self_no_dot clan-pytest-without-core> [gw9] [ 12%] SKIPPED clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_ro_bind_is_readable clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_ro_bind_is_not_writable clan-pytest-without-core> [gw9] [ 13%] SKIPPED clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_ro_bind_is_not_writable clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_rw_bind_is_writable clan-pytest-without-core> [gw9] [ 13%] SKIPPED clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_rw_bind_is_writable clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_denies_unmounted_paths clan-pytest-without-core> [gw9] [ 13%] SKIPPED clan_lib/sandbox_exec/tests/test_bubblewrap_exec.py::test_bubblewrap_denies_unmounted_paths clan-pytest-without-core> clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_forward_agent clan-pytest-without-core> [gw6] [ 13%] PASSED clan_lib/ssh/tests/test_nix_ssh_env.py::test_nix_ssh_env_forward_agent clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path0-whitelist0-True] clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_works_returns_false_on_unsupported_platform clan-pytest-without-core> [gw8] [ 14%] PASSED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_works_returns_false_on_unsupported_platform clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_bash_returns_bash_outside_nix_sandbox clan-pytest-without-core> [gw8] [ 14%] PASSED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_bash_returns_bash_outside_nix_sandbox clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_internal_dot_template clan-pytest-without-core> [gw5] [ 14%] PASSED clan_lib/templates/template_url_test.py::test_internal_dot_template clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_explicit_rel_path_default clan-pytest-without-core> [gw5] [ 15%] PASSED clan_lib/templates/template_url_test.py::test_explicit_rel_path_default clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_transform_url_builtin_template clan-pytest-without-core> [gw3] [ 15%] PASSED clan_lib/templates/template_url_test.py::test_transform_url_builtin_template clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_transform_url_remote_template clan-pytest-without-core> [gw3] [ 15%] PASSED clan_lib/templates/template_url_test.py::test_transform_url_remote_template clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path8-whitelist8-True] clan-pytest-without-core> [gw9] [ 15%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path8-whitelist8-True] clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_bash_resolves_path_in_nix_sandbox clan-pytest-without-core> [gw1] [ 16%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_fixes_symlinks clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_internal_symlink clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path9-whitelist9-True] clan-pytest-without-core> [gw6] [ 16%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path0-whitelist0-True] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path1-whitelist1-True] clan-pytest-without-core> [gw6] [ 16%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path1-whitelist1-True] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path2-whitelist2-True] clan-pytest-without-core> [gw6] [ 16%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path2-whitelist2-True] clan-pytest-without-core> [gw9] [ 17%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path9-whitelist9-True] clan-pytest-without-core> [gw0] [ 17%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_decreases_symlink_depth clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_increases_symlink_depth clan-pytest-without-core> [gw0] [ 17%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_increases_symlink_depth clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_internal_symlink clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_full_url_query_and_fragment clan-pytest-without-core> [gw4] [ 18%] PASSED clan_lib/templates/template_url_test.py::test_full_url_query_and_fragment clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_custom_template_type clan-pytest-without-core> [gw4] [ 18%] PASSED clan_lib/templates/template_url_test.py::test_custom_template_type clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_malformed_identifier clan-pytest-without-core> [gw4] [ 18%] PASSED clan_lib/templates/template_url_test.py::test_malformed_identifier clan-pytest-without-core> clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_preserves_other_attrs clan-pytest-without-core> [gw2] [ 18%] PASSED clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_preserves_other_attrs clan-pytest-without-core> clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_multiple_files clan-pytest-without-core> [gw2] [ 19%] PASSED clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_multiple_files clan-pytest-without-core> clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_empty_dict clan-pytest-without-core> [gw2] [ 19%] PASSED clan_lib/vars/generator_test.py::test_filter_machine_specific_attrs_empty_dict clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_update_parent_non_writable clan-pytest-without-core> [gw2] [ 19%] PASSED clan_lib/persist/patch_engine_test.py::test_update_parent_non_writable clan-pytest-without-core> [gw0] [ 20%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_internal_symlink clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path3-whitelist3-True] clan-pytest-without-core> [gw6] [ 20%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path3-whitelist3-True] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path4-whitelist4-True] clan-pytest-without-core> [gw6] [ 20%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path4-whitelist4-True] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_flatten_data_structured clan-pytest-without-core> [gw3] [ 20%] PASSED clan_lib/persist/path_utils_test.py::test_flatten_data_structured clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_flatten_data_structured_empty clan-pytest-without-core> [gw3] [ 21%] PASSED clan_lib/persist/path_utils_test.py::test_flatten_data_structured_empty clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_flatten_data_structured_nested_empty clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_delete_intermediate clan-pytest-without-core> [gw5] [ 21%] PASSED clan_lib/persist/path_utils_test.py::test_delete_intermediate clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_delete_top_level clan-pytest-without-core> [gw5] [ 21%] PASSED clan_lib/persist/path_utils_test.py::test_delete_top_level clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_delete_key_not_found clan-pytest-without-core> [gw5] [ 22%] PASSED clan_lib/persist/path_utils_test.py::test_delete_key_not_found clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_delete_intermediate_not_dict clan-pytest-without-core> [gw5] [ 22%] PASSED clan_lib/persist/path_utils_test.py::test_delete_intermediate_not_dict clan-pytest-without-core> [gw3] [ 22%] PASSED clan_lib/persist/path_utils_test.py::test_flatten_data_structured_nested_empty clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_calculate_static_data_no_static_sets clan-pytest-without-core> [gw2] [ 22%] PASSED clan_lib/persist/patch_engine_test.py::test_calculate_static_data_no_static_sets clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_calculate_static_data_no_static_sets_legacy clan-pytest-without-core> [gw2] [ 23%] PASSED clan_lib/persist/patch_engine_test.py::test_calculate_static_data_no_static_sets_legacy clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path5-whitelist5-True] clan-pytest-without-core> [gw6] [ 23%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path5-whitelist5-True] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path6-whitelist6-True] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path10-whitelist10-False] clan-pytest-without-core> [gw9] [ 23%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path10-whitelist10-False] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path11-whitelist11-False] clan-pytest-without-core> [gw9] [ 23%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path11-whitelist11-False] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path12-whitelist12-False] clan-pytest-without-core> [gw9] [ 24%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path12-whitelist12-False] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path13-whitelist13-False] clan-pytest-without-core> [gw1] [ 24%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_internal_symlink clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_creates_dst_parents clan-pytest-without-core> [gw1] [ 24%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_creates_dst_parents clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_noop_if_missing clan-pytest-without-core> [gw1] [ 25%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestCopyVarFile::test_noop_if_missing clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestDeleteVarFile::test_basic clan-pytest-without-core> [gw8] [ 25%] PASSED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_bash_resolves_path_in_nix_sandbox clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path16-whitelist16-True] clan-pytest-without-core> [gw8] [ 25%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path16-whitelist16-True] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path17-whitelist17-False] clan-pytest-without-core> [gw8] [ 25%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path17-whitelist17-False] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path18-whitelist18-False] clan-pytest-without-core> [gw8] [ 26%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path18-whitelist18-False] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_patch_nested clan-pytest-without-core> [gw8] [ 26%] PASSED clan_lib/persist/path_utils_test.py::test_patch_nested clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_patch_nested_dict clan-pytest-without-core> [gw8] [ 26%] PASSED clan_lib/persist/path_utils_test.py::test_patch_nested_dict clan-pytest-without-core> [gw6] [ 27%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path6-whitelist6-True] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_delete_empty_path clan-pytest-without-core> [gw5] [ 27%] PASSED clan_lib/persist/path_utils_test.py::test_delete_empty_path clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_delete_non_existent_path_deep clan-pytest-without-core> [gw5] [ 27%] PASSED clan_lib/persist/path_utils_test.py::test_delete_non_existent_path_deep clan-pytest-without-core> [gw9] [ 27%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path13-whitelist13-False] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path14-whitelist14-False] clan-pytest-without-core> [gw9] [ 28%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path14-whitelist14-False] clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_create_missing_paths clan-pytest-without-core> [gw8] [ 28%] PASSED clan_lib/persist/path_utils_test.py::test_create_missing_paths clan-pytest-without-core> [gw1] [ 28%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestDeleteVarFile::test_basic clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_update_list clan-pytest-without-core> [gw2] [ 28%] PASSED clan_lib/persist/patch_engine_test.py::test_update_list clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_list_delete_static clan-pytest-without-core> [gw2] [ 29%] PASSED clan_lib/persist/patch_engine_test.py::test_list_delete_static clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_update_list_duplicates clan-pytest-without-core> [gw2] [ 29%] PASSED clan_lib/persist/patch_engine_test.py::test_update_list_duplicates clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_nested_subdirectories clan-pytest-without-core> [gw0] [ 29%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_nested_subdirectories clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_creates_dst_parents clan-pytest-without-core> [gw0] [ 30%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_creates_dst_parents clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_flatten_data_dot_in_keys clan-pytest-without-core> [gw3] [ 30%] PASSED clan_lib/persist/path_utils_test.py::test_flatten_data_dot_in_keys clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_update_simple clan-pytest-without-core> [gw3] [ 30%] PASSED clan_lib/persist/patch_engine_test.py::test_update_simple clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_update_add_empty_dict clan-pytest-without-core> [gw3] [ 30%] PASSED clan_lib/persist/patch_engine_test.py::test_update_add_empty_dict clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_changed_contains_all_leaves clan-pytest-without-core> clan_lib/templates/template_url_test.py::test_locked_input_template clan-pytest-without-core> [gw4] [ 31%] PASSED clan_lib/templates/template_url_test.py::test_locked_input_template clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_objects_basic clan-pytest-without-core> [gw0] [ 31%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestMoveVarFile::test_changed_contains_all_leaves clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_set_null clan-pytest-without-core> [gw0] [ 31%] PASSED clan_lib/persist/patch_engine_test.py::test_set_null clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path7-whitelist7-True] clan-pytest-without-core> [gw6] [ 32%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path7-whitelist7-True] clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_update_many clan-pytest-without-core> [gw3] [ 32%] PASSED clan_lib/persist/patch_engine_test.py::test_update_many clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_objects_with_mismatching_nesting clan-pytest-without-core> [gw6] [ 32%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_objects_with_mismatching_nesting clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_path_match[path15-whitelist15-False] clan-pytest-without-core> [gw9] [ 32%] PASSED clan_lib/persist/path_utils_test.py::test_path_match[path15-whitelist15-False] clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_uses_main_program_from_meta clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_delete_atom clan-pytest-without-core> clan_lib/vars/migrations/test_migrate_var.py::TestDeleteVarFile::test_with_symlinks clan-pytest-without-core> [gw1] [ 33%] PASSED clan_lib/vars/migrations/test_migrate_var.py::TestDeleteVarFile::test_with_symlinks clan-pytest-without-core> clan_lib/persist/path_utils_test.py::test_list_unmerge clan-pytest-without-core> [gw5] [ 33%] PASSED clan_lib/persist/path_utils_test.py::test_list_unmerge clan-pytest-without-core> clan_lib/persist/migrations/test_services.py::test_run_inventory_migrations_noop_no_file clan-pytest-without-core> [gw5] [ 33%] PASSED clan_lib/persist/migrations/test_services.py::test_run_inventory_migrations_noop_no_file clan-pytest-without-core> clan_lib/persist/migrations/test_services.py::test_run_inventory_migrations_noop_clean clan-pytest-without-core> [gw4] [ 33%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_objects_basic clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_objects_simple clan-pytest-without-core> [gw4] [ 34%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_objects_simple clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_none_to_value clan-pytest-without-core> [gw4] [ 34%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_none_to_value clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_objects_value_to_none clan-pytest-without-core> [gw8] [ 34%] PASSED clan_lib/persist/path_utils_test.py::test_delete_atom clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_removes_directory_contents clan-pytest-without-core> clan_lib/persist/migrations/test_services.py::test_empty_services_removed clan-pytest-without-core> [gw6] [ 35%] PASSED clan_lib/persist/migrations/test_services.py::test_empty_services_removed clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_resolve_single_package_cache_hit_skips_gcroot_creation clan-pytest-without-core> clan_lib/persist/migrations/test_services.py::test_no_services_key_is_noop clan-pytest-without-core> [gw6] [ 35%] PASSED clan_lib/persist/migrations/test_services.py::test_no_services_key_is_noop clan-pytest-without-core> [gw5] [ 35%] PASSED clan_lib/persist/migrations/test_services.py::test_run_inventory_migrations_noop_clean clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_returns_resolved_package clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_machine_delete clan-pytest-without-core> [gw0] [ 35%] PASSED clan_lib/persist/patch_engine_test.py::test_machine_delete clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_update_mismatching_update_type clan-pytest-without-core> [gw0] [ 36%] PASSED clan_lib/persist/patch_engine_test.py::test_update_mismatching_update_type clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_delete_key clan-pytest-without-core> [gw0] [ 36%] PASSED clan_lib/persist/patch_engine_test.py::test_delete_key clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_delete_key_intermediate clan-pytest-without-core> [gw0] [ 36%] PASSED clan_lib/persist/patch_engine_test.py::test_delete_key_intermediate clan-pytest-without-core> [gw8] [ 37%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_removes_directory_contents clan-pytest-without-core> clan_lib/network/network_test.py::TestPeerPortUser::test_peer_default_port_user clan-pytest-without-core> [gw8] [ 37%] PASSED clan_lib/network/network_test.py::TestPeerPortUser::test_peer_default_port_user clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_dont_persist_defaults clan-pytest-without-core> [gw2] [ 37%] PASSED clan_lib/persist/patch_engine_test.py::test_dont_persist_defaults clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_single_character_difference clan-pytest-without-core> [gw2] [ 37%] PASSED clan_lib/machines/test_suggestions.py::test_single_character_difference clan-pytest-without-core> clan_lib/network/network_test.py::TestPeerPortUser::test_peer_custom_port_user clan-pytest-without-core> [gw8] [ 38%] PASSED clan_lib/network/network_test.py::TestPeerPortUser::test_peer_custom_port_user clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_delete_key_non_writable clan-pytest-without-core> [gw0] [ 38%] PASSED clan_lib/persist/patch_engine_test.py::test_delete_key_non_writable clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_multiple_differences clan-pytest-without-core> [gw4] [ 38%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_objects_value_to_none clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_objects_nested clan-pytest-without-core> [gw4] [ 38%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_objects_nested clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_objects_lists clan-pytest-without-core> [gw4] [ 39%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_objects_lists clan-pytest-without-core> clan_lib/persist/migrations/test_services.py::test_non_empty_services_raises clan-pytest-without-core> [gw6] [ 39%] PASSED clan_lib/persist/migrations/test_services.py::test_non_empty_services_raises clan-pytest-without-core> clan_lib/persist/migrations/test_services.py::test_idempotent_after_removal clan-pytest-without-core> [gw6] [ 39%] PASSED clan_lib/persist/migrations/test_services.py::test_idempotent_after_removal clan-pytest-without-core> clan_lib/network/network_test.py::test_networks_from_flake clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_handles_mixed_old_and_new clan-pytest-without-core> [gw1] [ 40%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_handles_mixed_old_and_new clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_creates_lock_file clan-pytest-without-core> [gw1] [ 40%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_creates_lock_file clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_noop_when_cache_doesnt_exist clan-pytest-without-core> [gw1] [ 40%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_noop_when_cache_doesnt_exist clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_maybe_cleanup_respects_interval clan-pytest-without-core> [gw1] [ 40%] PASSED clan_lib/nix/tests/test_cache.py::test_maybe_cleanup_respects_interval clan-pytest-without-core> [gw2] [ 41%] PASSED clan_lib/machines/test_suggestions.py::test_multiple_differences clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_case_sensitivity clan-pytest-without-core> [gw2] [ 41%] PASSED clan_lib/machines/test_suggestions.py::test_case_sensitivity clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_exact_match clan-pytest-without-core> [gw2] [ 41%] PASSED clan_lib/machines/test_suggestions.py::test_exact_match clan-pytest-without-core> [gw8] [ 42%] PASSED clan_lib/network/network_test.py::test_networks_from_flake clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_objects_empty clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_with_zero_max_age clan-pytest-without-core> [gw1] [ 42%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_with_zero_max_age clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_identical_strings clan-pytest-without-core> [gw8] [ 42%] PASSED clan_lib/machines/test_suggestions.py::test_identical_strings clan-pytest-without-core> [gw0] [ 42%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_objects_empty clan-pytest-without-core> [gw7] [ 43%] PASSED clan_lib/ssh/localhost_test.py::test_localhost clan-pytest-without-core> clan_lib/ssh/create_test.py::test_clan_generate_sshkeys clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_case_insensitive_matching clan-pytest-without-core> [gw0] [ 43%] PASSED clan_lib/machines/test_suggestions.py::test_case_insensitive_matching clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_max_suggestions_limit clan-pytest-without-core> clan_lib/persist/patch_engine_test.py::test_merge_objects_unset_list_elements clan-pytest-without-core> [gw4] [ 43%] PASSED clan_lib/persist/patch_engine_test.py::test_merge_objects_unset_list_elements clan-pytest-without-core> [gw0] [ 44%] PASSED clan_lib/machines/test_suggestions.py::test_max_suggestions_limit clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_empty_candidates clan-pytest-without-core> [gw0] [ 44%] PASSED clan_lib/machines/test_suggestions.py::test_empty_candidates clan-pytest-without-core> clan_lib/persist/migrations/test_services.py::test_run_inventory_migrations_writes_file clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_realistic_machine_names clan-pytest-without-core> [gw0] [ 44%] PASSED clan_lib/machines/test_suggestions.py::test_realistic_machine_names clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_close_match clan-pytest-without-core> [gw2] [ 44%] PASSED clan_lib/machines/test_suggestions.py::test_close_match clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_add_child clan-pytest-without-core> [gw2] [ 45%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_add_child clan-pytest-without-core> clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_dynamic_name_url_encoding_forward_slash clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_get_child clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_handles_permission_error clan-pytest-without-core> [gw1] [ 45%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_handles_permission_error clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogManagerGroupConfiguration::test_find_group_config_simple clan-pytest-without-core> [gw2] [ 45%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_get_child clan-pytest-without-core> [gw1] [ 45%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogManagerGroupConfiguration::test_find_group_config_simple clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_sorting_by_distance_then_alphabetically clan-pytest-without-core> [gw0] [ 46%] PASSED clan_lib/machines/test_suggestions.py::test_sorting_by_distance_then_alphabetically clan-pytest-without-core> clan_lib/machines/test_suggestions.py::test_empty_string clan-pytest-without-core> [gw8] [ 46%] PASSED clan_lib/machines/test_suggestions.py::test_empty_string clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileCreation::test_create_log_file_unregistered_group_fails clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestFilterFunction::test_filter_nonexistent_path clan-pytest-without-core> [gw8] [ 46%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileCreation::test_create_log_file_unregistered_group_fails clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogManagerGroupConfiguration::test_find_group_config_nested clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestDateFormatValidation::test_valid_date_formats clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileCreation::test_create_log_file_invalid_structure_fails clan-pytest-without-core> [gw0] [ 47%] PASSED clan_lib/log_manager/test_log_manager.py::TestFilterFunction::test_filter_nonexistent_path clan-pytest-without-core> [gw1] [ 47%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogManagerGroupConfiguration::test_find_group_config_nested clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogManagerGroupConfiguration::test_find_group_config_nonexistent clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestGetLogFile::test_get_log_file_by_op_key clan-pytest-without-core> [gw1] [ 47%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogManagerGroupConfiguration::test_find_group_config_nonexistent clan-pytest-without-core> [gw8] [ 47%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileCreation::test_create_log_file_invalid_structure_fails clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileCreation::test_create_log_file_default_group clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestFilterFunction::test_filter_empty_returns_top_level_groups clan-pytest-without-core> [gw4] [ 48%] PASSED clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_dynamic_name_url_encoding_forward_slash clan-pytest-without-core> [gw2] [ 48%] PASSED clan_lib/log_manager/test_log_manager.py::TestDateFormatValidation::test_valid_date_formats clan-pytest-without-core> clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_dynamic_name_url_encoding_special_characters clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestDateFormatValidation::test_invalid_date_formats clan-pytest-without-core> [gw0] [ 48%] PASSED clan_lib/log_manager/test_log_manager.py::TestGetLogFile::test_get_log_file_by_op_key clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestGetLogFile::test_get_log_file_with_selector clan-pytest-without-core> [gw8] [ 49%] PASSED clan_lib/log_manager/test_log_manager.py::TestFilterFunction::test_filter_empty_returns_top_level_groups clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestFilterFunction::test_filter_lists_dynamic_names clan-pytest-without-core> [gw2] [ 49%] PASSED clan_lib/log_manager/test_log_manager.py::TestDateFormatValidation::test_invalid_date_formats clan-pytest-without-core> [gw0] [ 49%] PASSED clan_lib/log_manager/test_log_manager.py::TestGetLogFile::test_get_log_file_with_selector clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogManagerGroupConfiguration::test_add_root_group_config clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestGetLogFile::test_get_log_file_with_date clan-pytest-without-core> [gw2] [ 49%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogManagerGroupConfiguration::test_add_root_group_config clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_comparison_by_date clan-pytest-without-core> [gw2] [ 50%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_comparison_by_date clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_secondary_sort_by_group clan-pytest-without-core> [gw1] [ 50%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileCreation::test_create_log_file_default_group clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileCreation::test_create_log_file_with_nested_groups clan-pytest-without-core> [gw4] [ 50%] PASSED clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_dynamic_name_url_encoding_special_characters clan-pytest-without-core> clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_structure_elements_not_encoded clan-pytest-without-core> [gw2] [ 50%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_secondary_sort_by_group clan-pytest-without-core> [gw1] [ 51%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileCreation::test_create_log_file_with_nested_groups clan-pytest-without-core> [gw0] [ 51%] PASSED clan_lib/log_manager/test_log_manager.py::TestGetLogFile::test_get_log_file_with_date clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestListLogDays::test_list_log_days_empty clan-pytest-without-core> [gw1] [ 51%] PASSED clan_lib/log_manager/test_log_manager.py::TestListLogDays::test_list_log_days_empty clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestGetLogFile::test_get_log_file_nonexistent clan-pytest-without-core> [gw0] [ 52%] PASSED clan_lib/log_manager/test_log_manager.py::TestGetLogFile::test_get_log_file_nonexistent clan-pytest-without-core> [gw4] [ 52%] PASSED clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_structure_elements_not_encoded clan-pytest-without-core> clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_url_encoding_with_unicode_characters clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestListLogDays::test_list_log_days_populated clan-pytest-without-core> clan_lib/import_utils/import_utils_test.py::test_import_with_source clan-pytest-without-core> [gw4] [ 52%] PASSED clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_url_encoding_with_unicode_characters clan-pytest-without-core> clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_backward_compatibility_single_element_paths clan-pytest-without-core> [gw1] [ 52%] PASSED clan_lib/log_manager/test_log_manager.py::TestListLogDays::test_list_log_days_populated clan-pytest-without-core> [gw0] [ 53%] PASSED clan_lib/import_utils/import_utils_test.py::test_import_with_source clan-pytest-without-core> [gw4] [ 53%] PASSED clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_backward_compatibility_single_element_paths clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestApiCompatibility::test_api_workflow_like_example_usage clan-pytest-without-core> clan_lib/import_utils/import_utils_test.py::test_import_with_source_with_args clan-pytest-without-core> clan_lib/flake/flake_test.py::test_parse_selector clan-pytest-without-core> [gw4] [ 53%] PASSED clan_lib/flake/flake_test.py::test_parse_selector clan-pytest-without-core> [gw1] [ 54%] PASSED clan_lib/log_manager/test_log_manager.py::TestApiCompatibility::test_api_workflow_like_example_usage clan-pytest-without-core> clan_lib/flake/flake_test.py::test_select clan-pytest-without-core> [gw0] [ 54%] PASSED clan_lib/import_utils/import_utils_test.py::test_import_with_source_with_args clan-pytest-without-core> [gw4] [ 54%] PASSED clan_lib/flake/flake_test.py::test_select clan-pytest-without-core> clan_lib/flake/flake_test.py::test_out_path clan-pytest-without-core> [gw4] [ 54%] PASSED clan_lib/flake/flake_test.py::test_out_path clan-pytest-without-core> clan_lib/import_utils/import_utils_test.py::test_import_with_source_module_not_found clan-pytest-without-core> [gw0] [ 55%] PASSED clan_lib/import_utils/import_utils_test.py::test_import_with_source_module_not_found clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_comparison_by_datetime clan-pytest-without-core> [gw7] [ 55%] PASSED clan_lib/ssh/create_test.py::test_clan_generate_sshkeys clan-pytest-without-core> clan_lib/flake/flake_test.py::test_out_path_in_multiselect_raises_exception clan-pytest-without-core> clan_lib/import_utils/import_utils_test.py::test_import_with_source_class_not_found clan-pytest-without-core> [gw4] [ 55%] PASSED clan_lib/flake/flake_test.py::test_out_path_in_multiselect_raises_exception clan-pytest-without-core> [gw0] [ 55%] PASSED clan_lib/import_utils/import_utils_test.py::test_import_with_source_class_not_found clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_insert_and_iscached clan-pytest-without-core> [gw1] [ 56%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_comparison_by_datetime clan-pytest-without-core> clan_lib/flake/flake_test.py::test_clan_select_error_single_line_error clan-pytest-without-core> [gw4] [ 56%] PASSED clan_lib/flake/flake_cache_test.py::test_insert_and_iscached clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_cache_is_cached_with_clan_test_store clan-pytest-without-core> [gw1] [ 56%] PASSED clan_lib/flake/flake_test.py::test_clan_select_error_single_line_error clan-pytest-without-core> clan_lib/flake/flake_test.py::test_clan_select_error_multiline_error clan-pytest-without-core> [gw1] [ 57%] PASSED clan_lib/flake/flake_test.py::test_clan_select_error_multiline_error clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_executes_successfully clan-pytest-without-core> [gw7] [ 57%] SKIPPED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_executes_successfully clan-pytest-without-core> [gw4] [ 57%] PASSED clan_lib/flake/flake_cache_test.py::test_cache_is_cached_with_clan_test_store clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_cache_is_cached_with_nix_store_dir clan-pytest-without-core> clan_lib/flake/flake_test.py::test_clan_select_error_explicit_description_overrides_cmd_error clan-pytest-without-core> clan_lib/flake/flake_test.py::test_clan_select_error_multiline_preserves_structure clan-pytest-without-core> [gw1] [ 57%] PASSED clan_lib/flake/flake_test.py::test_clan_select_error_multiline_preserves_structure clan-pytest-without-core> clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_rw_paths_are_writable clan-pytest-without-core> [gw7] [ 58%] SKIPPED clan_lib/sandbox_exec/tests/test_sandbox_cmd.py::test_sandbox_cmd_rw_paths_are_writable clan-pytest-without-core> [gw0] [ 58%] PASSED clan_lib/flake/flake_test.py::test_clan_select_error_explicit_description_overrides_cmd_error clan-pytest-without-core> clan_lib/flake/flake_test.py::test_clan_select_error_no_error_pattern_in_stderr clan-pytest-without-core> [gw0] [ 58%] PASSED clan_lib/flake/flake_test.py::test_clan_select_error_no_error_pattern_in_stderr clan-pytest-without-core> clan_lib/flake/flake_test.py::test_clan_select_error_newline_after_colon clan-pytest-without-core> [gw0] [ 59%] PASSED clan_lib/flake/flake_test.py::test_clan_select_error_newline_after_colon clan-pytest-without-core> clan_lib/persist/write_rules_test.py::test_write_simple clan-pytest-without-core> [gw7] [ 59%] PASSED clan_lib/persist/write_rules_test.py::test_write_simple clan-pytest-without-core> clan_lib/persist/write_rules_test.py::test_write_inherited clan-pytest-without-core> [gw7] [ 59%] PASSED clan_lib/persist/write_rules_test.py::test_write_inherited clan-pytest-without-core> clan_lib/persist/write_rules_test.py::test_non_write_inherited clan-pytest-without-core> [gw7] [ 59%] PASSED clan_lib/persist/write_rules_test.py::test_non_write_inherited clan-pytest-without-core> [gw4] [ 60%] PASSED clan_lib/flake/flake_cache_test.py::test_cache_is_cached_with_nix_store_dir clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_tertiary_sort_by_func_name clan-pytest-without-core> [gw8] [ 60%] PASSED clan_lib/log_manager/test_log_manager.py::TestFilterFunction::test_filter_lists_dynamic_names clan-pytest-without-core> clan_lib/persist/write_rules_test.py::test_write_list clan-pytest-without-core> [gw2] [ 60%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_tertiary_sort_by_func_name clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestFilterFunction::test_filter_with_specific_date clan-pytest-without-core> [gw7] [ 61%] PASSED clan_lib/persist/write_rules_test.py::test_write_list clan-pytest-without-core> clan_lib/persist/write_rules_test.py::test_write_because_written clan-pytest-without-core> [gw7] [ 61%] PASSED clan_lib/persist/write_rules_test.py::test_write_because_written clan-pytest-without-core> [gw8] [ 61%] PASSED clan_lib/log_manager/test_log_manager.py::TestFilterFunction::test_filter_with_specific_date clan-pytest-without-core> clan_lib/flake/flake_test.py::test_clan_select_error_takes_last_error_marker clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_complex_sorting_scenario clan-pytest-without-core> [gw0] [ 61%] PASSED clan_lib/flake/flake_test.py::test_clan_select_error_takes_last_error_marker clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_store_reference_helpers clan-pytest-without-core> clan_lib/persist/write_rules_test.py::test_static_object clan-pytest-without-core> [gw7] [ 62%] PASSED clan_lib/persist/write_rules_test.py::test_static_object clan-pytest-without-core> clan_lib/persist/write_rules_test.py::test_attributes_totality clan-pytest-without-core> [gw7] [ 62%] PASSED clan_lib/persist/write_rules_test.py::test_attributes_totality clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_store_path_with_line_numbers_not_wrapped clan-pytest-without-core> [gw4] [ 62%] PASSED clan_lib/flake/flake_cache_test.py::test_store_path_with_line_numbers_not_wrapped clan-pytest-without-core> [gw0] [ 62%] PASSED clan_lib/flake/flake_cache_test.py::test_store_reference_helpers clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_cache_with_multiple_store_references clan-pytest-without-core> [gw0] [ 63%] PASSED clan_lib/flake/flake_cache_test.py::test_cache_with_multiple_store_references clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_store_references_with_custom_store_dir clan-pytest-without-core> clan_lib/docs_test.py::test_reference_url clan-pytest-without-core> [gw4] [ 63%] PASSED clan_lib/docs_test.py::test_reference_url clan-pytest-without-core> clan_lib/dirs/dirs_test.py::test_clan_key_safe clan-pytest-without-core> [gw4] [ 63%] PASSED clan_lib/dirs/dirs_test.py::test_clan_key_safe clan-pytest-without-core> [gw0] [ 64%] PASSED clan_lib/flake/flake_cache_test.py::test_store_references_with_custom_store_dir clan-pytest-without-core> clan_lib/flake/flake_test.py::test_clan_select_error_no_cmd_error clan-pytest-without-core> [gw1] [ 64%] PASSED clan_lib/flake/flake_test.py::test_clan_select_error_no_cmd_error clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_reinserting_store_path_value clan-pytest-without-core> [gw1] [ 64%] PASSED clan_lib/flake/flake_cache_test.py::test_reinserting_store_path_value clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_no_select_cache_env_skips_disk_load clan-pytest-without-core> clan_lib/persist/write_rules_test.py::test_totality_simple clan-pytest-without-core> [gw7] [ 64%] PASSED clan_lib/persist/write_rules_test.py::test_totality_simple clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_allowed_any_types clan-pytest-without-core> [gw7] [ 65%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_allowed_any_types clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_simple_union_types clan-pytest-without-core> [gw7] [ 65%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_simple_union_types clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_cache_path_with_line_numbers clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_quaternary_sort_by_op_key clan-pytest-without-core> [gw8] [ 65%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_complex_sorting_scenario clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_get_log_file_returns_newest_when_multiple_exist clan-pytest-without-core> [gw8] [ 66%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_get_log_file_returns_newest_when_multiple_exist clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_list_log_days_sorted_newest_first clan-pytest-without-core> [gw8] [ 66%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_list_log_days_sorted_newest_first clan-pytest-without-core> [gw1] [ 66%] PASSED clan_lib/flake/flake_cache_test.py::test_no_select_cache_env_skips_disk_load clan-pytest-without-core> clan_lib/flake/flake_cache_test.py::test_no_select_cache_env_skips_disk_save clan-pytest-without-core> [gw1] [ 66%] PASSED clan_lib/flake/flake_cache_test.py::test_no_select_cache_env_skips_disk_save clan-pytest-without-core> clan_lib/bwrap/tests/test_bwrap.py::test_bubblewrap_works_on_linux clan-pytest-without-core> [gw4] [ 67%] SKIPPED clan_lib/bwrap/tests/test_bwrap.py::test_bubblewrap_works_on_linux clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_type_variables clan-pytest-without-core> [gw0] [ 67%] PASSED clan_lib/flake/flake_cache_test.py::test_cache_path_with_line_numbers clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_dataclasses clan-pytest-without-core> [gw0] [ 67%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_dataclasses clan-pytest-without-core> [gw4] [ 67%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_type_variables clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_type_variable_nested_scopes clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_dataclass_with_optional_fields clan-pytest-without-core> [gw0] [ 68%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_dataclass_with_optional_fields clan-pytest-without-core> [gw4] [ 68%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_type_variable_nested_scopes clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestURLEncoding::test_special_characters_in_dynamic_names clan-pytest-without-core> clan_lib/docs_test.py::test_docs_url_builds_versioned_url clan-pytest-without-core> [gw2] [ 68%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogFileSorting::test_logfile_quaternary_sort_by_op_key clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_complex_union_types clan-pytest-without-core> [gw7] [ 69%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_complex_union_types clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_nested_open_dicts clan-pytest-without-core> [gw0] [ 69%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_nested_open_dicts clan-pytest-without-core> [gw1] [ 69%] PASSED clan_lib/docs_test.py::test_docs_url_builds_versioned_url clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_forwardref_resolution_from_module clan-pytest-without-core> [gw8] [ 69%] PASSED clan_lib/log_manager/test_log_manager.py::TestURLEncoding::test_special_characters_in_dynamic_names clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_open_typed_dict clan-pytest-without-core> [gw8] [ 70%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_open_typed_dict clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_type_alias clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_forwardref_invalid_type clan-pytest-without-core> [gw0] [ 70%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_forwardref_invalid_type clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_string_type_annotation_error clan-pytest-without-core> [gw7] [ 70%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_string_type_annotation_error clan-pytest-without-core> [gw1] [ 71%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_forwardref_resolution_from_module clan-pytest-without-core> [gw8] [ 71%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_type_alias clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_total_typed_dict clan-pytest-without-core> [gw4] [ 71%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_total_typed_dict clan-pytest-without-core> clan_lib/api/serde_serialize_test.py::test_dataclass_to_dict clan-pytest-without-core> [gw4] [ 71%] PASSED clan_lib/api/serde_serialize_test.py::test_dataclass_to_dict clan-pytest-without-core> clan_lib/api/serde_serialize_test.py::test_sanitize_string clan-pytest-without-core> [gw0] [ 72%] PASSED clan_lib/api/serde_serialize_test.py::test_sanitize_string clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_forwardref_without_module clan-pytest-without-core> clan_lib/api/serde_serialize_test.py::test_dataclass_to_dict_defaults clan-pytest-without-core> [gw1] [ 72%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_forwardref_without_module clan-pytest-without-core> clan_lib/api/serde_serialize_test.py::test_dataclass_to_dict_nested clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_string_type_annotation_jsonvalue clan-pytest-without-core> [gw8] [ 72%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_string_type_annotation_jsonvalue clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_simple_field_missing clan-pytest-without-core> [gw0] [ 72%] PASSED clan_lib/api/serde_serialize_test.py::test_dataclass_to_dict_defaults clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_nested clan-pytest-without-core> [gw4] [ 73%] PASSED clan_lib/api/serde_serialize_test.py::test_dataclass_to_dict_nested clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_nullable_non_exist clan-pytest-without-core> [gw4] [ 73%] PASSED clan_lib/api/serde_deserialize_test.py::test_nullable_non_exist clan-pytest-without-core> [gw8] [ 73%] PASSED clan_lib/api/serde_deserialize_test.py::test_simple_field_missing clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_forwardref_resolution clan-pytest-without-core> [gw7] [ 74%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_forwardref_resolution clan-pytest-without-core> clan_lib/api/serde_serialize_test.py::test_custom_enum clan-pytest-without-core> [gw7] [ 74%] PASSED clan_lib/api/serde_serialize_test.py::test_custom_enum clan-pytest-without-core> [gw1] [ 74%] PASSED clan_lib/api/serde_deserialize_test.py::test_nested clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_simple_primitives clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_list clan-pytest-without-core> clan_lib/api/serde_serialize_test.py::test_filters_null_fields clan-pytest-without-core> [gw0] [ 74%] PASSED clan_lib/api/serde_serialize_test.py::test_filters_null_fields clan-pytest-without-core> [gw4] [ 75%] PASSED clan_lib/api/serde_deserialize_test.py::test_list clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_alias_field clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_nested_nullable clan-pytest-without-core> [gw1] [ 75%] PASSED clan_lib/api/serde_deserialize_test.py::test_nested_nullable clan-pytest-without-core> [gw4] [ 75%] PASSED clan_lib/api/serde_deserialize_test.py::test_alias_field clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_simple clan-pytest-without-core> [gw7] [ 76%] PASSED clan_lib/api/serde_deserialize_test.py::test_simple clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_roundtrip_escape clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_roundtrip_typed_dict clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_union_with_none_edge_cases clan-pytest-without-core> [gw0] [ 76%] PASSED clan_lib/api/serde_deserialize_test.py::test_roundtrip_escape clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_alias_field_from_orig_name clan-pytest-without-core> [gw1] [ 76%] PASSED clan_lib/api/serde_deserialize_test.py::test_roundtrip_typed_dict clan-pytest-without-core> [gw4] [ 76%] PASSED clan_lib/api/serde_deserialize_test.py::test_alias_field_from_orig_name clan-pytest-without-core> [gw7] [ 77%] PASSED clan_lib/api/serde_deserialize_test.py::test_union_with_none_edge_cases clan-pytest-without-core> [gw2] [ 77%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_simple_primitives clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_construct_typed_dict clan-pytest-without-core> [gw0] [ 77%] PASSED clan_lib/api/serde_deserialize_test.py::test_construct_typed_dict clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_path_field clan-pytest-without-core> [gw1] [ 77%] PASSED clan_lib/api/serde_deserialize_test.py::test_path_field clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_literal_field clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_private_public_fields clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_unknown_deserialize clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_enum_roundtrip clan-pytest-without-core> [gw7] [ 78%] PASSED clan_lib/api/serde_deserialize_test.py::test_private_public_fields clan-pytest-without-core> [gw4] [ 78%] PASSED clan_lib/api/serde_deserialize_test.py::test_literal_field clan-pytest-without-core> [gw1] [ 78%] PASSED clan_lib/api/serde_deserialize_test.py::test_unknown_deserialize clan-pytest-without-core> [gw0] [ 79%] PASSED clan_lib/api/serde_deserialize_test.py::test_enum_roundtrip clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_enum_type clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_nullable clan-pytest-without-core> [gw8] [ 79%] PASSED clan_lib/api/serde_deserialize_test.py::test_nullable clan-pytest-without-core> clan_cli/vars/list_test.py::test_list_command_no_flake clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_unknown_serialize clan-pytest-without-core> [gw2] [ 79%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_enum_type clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_none_or_string clan-pytest-without-core> [gw7] [ 79%] PASSED clan_lib/api/serde_deserialize_test.py::test_unknown_serialize clan-pytest-without-core> clan_lib/api/serde_deserialize_test.py::test_union_dataclass clan-pytest-without-core> [gw8] [ 80%] PASSED clan_lib/api/serde_deserialize_test.py::test_none_or_string clan-pytest-without-core> clan_cli/vars/get_test.py::test_get_command_no_flake clan-pytest-without-core> clan_lib/api/type_to_jsonschema_test.py::test_unsupported_any_types clan-pytest-without-core> clan_cli/tests/test_vars_generate.py::test_import_from_cli clan-pytest-without-core> [gw2] [ 80%] PASSED clan_lib/api/type_to_jsonschema_test.py::test_unsupported_any_types clan-pytest-without-core> clan_cli/vars/upload_test.py::test_upload_command_no_flake clan-pytest-without-core> clan_cli/tests/test_ssh_local.py::test_run_local clan-pytest-without-core> [gw8] [ 80%] PASSED clan_cli/tests/test_vars_generate.py::test_import_from_cli clan-pytest-without-core> clan_cli/tests/test_ssh_local.py::test_timeout clan-pytest-without-core> [gw4] [ 81%] PASSED clan_lib/api/serde_deserialize_test.py::test_union_dataclass clan-pytest-without-core> clan_cli/vars/generate_test.py::test_generate_command_no_flake clan-pytest-without-core> [gw2] [ 81%] PASSED clan_cli/tests/test_ssh_local.py::test_run_local clan-pytest-without-core> clan_cli/tests/test_ssh_local.py::test_run_exception clan-pytest-without-core> [gw2] [ 81%] PASSED clan_cli/tests/test_ssh_local.py::test_run_exception clan-pytest-without-core> clan_cli/tests/test_git.py::test_commit_file clan-pytest-without-core> [gw9] [ 81%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_resolve_single_package_cache_hit_skips_gcroot_creation clan-pytest-without-core> [gw3] [ 82%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_uses_main_program_from_meta clan-pytest-without-core> [gw5] [ 82%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_returns_resolved_package clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_detects_broken_symlink clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_returns_exe_name clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_resolve_multi_package_cache_hit_skips_gcroot_creation clan-pytest-without-core> [gw3] [ 82%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_detects_broken_symlink clan-pytest-without-core> [gw5] [ 83%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_returns_exe_name clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_multi_output clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_cache_isolation_by_nixpkgs_path clan-pytest-without-core> [gw3] [ 83%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_cache_isolation_by_nixpkgs_path clan-pytest-without-core> [gw9] [ 83%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_resolve_multi_package_cache_hit_skips_gcroot_creation clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_nix_shell_uses_resolved_paths clan-pytest-without-core> [gw5] [ 83%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_multi_output clan-pytest-without-core> [gw3] [ 84%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_nix_shell_uses_resolved_paths clan-pytest-without-core> [gw7] [ 84%] PASSED clan_cli/vars/get_test.py::test_get_command_no_flake clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_nix_shell_skips_provided_packages clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_removes_old_directories clan-pytest-without-core> clan_cli/tests/test_ssh_local.py::test_run_environment clan-pytest-without-core> [gw9] [ 84%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_removes_old_directories clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_preserves_recent_directories clan-pytest-without-core> [gw3] [ 84%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_nix_shell_skips_provided_packages clan-pytest-without-core> [gw9] [ 85%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_preserves_recent_directories clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_creates_gcroot_symlink clan-pytest-without-core> clan_lib/nix/tests/test_nix_invocations.py::test_nix_shell_skips_in_sandbox clan-pytest-without-core> [gw5] [ 85%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_creates_gcroot_symlink clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_skips_hidden_files clan-pytest-without-core> [gw9] [ 85%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_skips_hidden_files clan-pytest-without-core> clan_cli/tests/test_git.py::test_commit_file_not_existing_raises_error clan-pytest-without-core> [gw3] [ 86%] PASSED clan_lib/nix/tests/test_nix_invocations.py::test_nix_shell_skips_in_sandbox clan-pytest-without-core> clan_lib/nix/tests/test_cache.py::test_cleanup_skips_non_directories clan-pytest-without-core> [gw9] [ 86%] PASSED clan_lib/nix/tests/test_cache.py::test_cleanup_skips_non_directories clan-pytest-without-core> clan_cli/tests/test_git.py::test_clan_flake_in_subdir clan-pytest-without-core> clan_cli/tests/test_api_dataclass_compat.py::test_all_dataclasses clan-pytest-without-core> [gw6] [ 86%] PASSED clan_lib/persist/migrations/test_services.py::test_run_inventory_migrations_writes_file clan-pytest-without-core> clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_empty_dynamic_name_encoding clan-pytest-without-core> [gw6] [ 86%] PASSED clan_lib/log_manager/test_url_encoding.py::TestURLEncoding::test_empty_dynamic_name_encoding clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_creation_with_nickname clan-pytest-without-core> [gw6] [ 87%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_creation_with_nickname clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_creation_without_nickname clan-pytest-without-core> [gw6] [ 87%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_creation_without_nickname clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_get_display_name_with_nickname clan-pytest-without-core> [gw6] [ 87%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_get_display_name_with_nickname clan-pytest-without-core> clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_get_display_name_without_nickname clan-pytest-without-core> [gw6] [ 88%] PASSED clan_lib/log_manager/test_log_manager.py::TestLogGroupConfig::test_get_display_name_without_nickname clan-pytest-without-core> clan_cli/machines/update_test.py::test_remote_from_cli_override_forwards_agent[False] clan-pytest-without-core> [gw6] [ 88%] PASSED clan_cli/machines/update_test.py::test_remote_from_cli_override_forwards_agent[False] clan-pytest-without-core> clan_cli/machines/update_test.py::test_remote_from_cli_override_forwards_agent[True] clan-pytest-without-core> [gw6] [ 88%] PASSED clan_cli/machines/update_test.py::test_remote_from_cli_override_forwards_agent[True] clan-pytest-without-core> [gw7] [ 88%] PASSED clan_cli/tests/test_ssh_local.py::test_run_environment clan-pytest-without-core> [gw0] [ 89%] PASSED clan_cli/vars/list_test.py::test_list_command_no_flake clan-pytest-without-core> clan_cli/machines/update_test.py::test_darwin_rebuild_cmd_no_literal_quotes clan-pytest-without-core> clan_cli/vars/check_test.py::test_check_command_no_flake clan-pytest-without-core> [gw6] [ 89%] PASSED clan_cli/machines/update_test.py::test_darwin_rebuild_cmd_no_literal_quotes clan-pytest-without-core> clan_cli/tests/test_git.py::test_commit_file_outside_git_raises_error clan-pytest-without-core> clan_cli/machines/update_test.py::test_darwin_rebuild_cmd_structure clan-pytest-without-core> [gw6] [ 89%] PASSED clan_cli/machines/update_test.py::test_darwin_rebuild_cmd_structure clan-pytest-without-core> clan_cli/machines/update_test.py::test_run_update_with_network_nixos_systemd_run_path[my-spec-/nix/store/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-fake-config/specialisation/my-spec/bin/switch-to-configuration] clan-pytest-without-core> [gw6] [ 89%] PASSED clan_cli/machines/update_test.py::test_run_update_with_network_nixos_systemd_run_path[my-spec-/nix/store/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-fake-config/specialisation/my-spec/bin/switch-to-configuration] clan-pytest-without-core> clan_cli/machines/update_test.py::test_nixos_activate_inhibitor_failure_suggests_reboot clan-pytest-without-core> [gw6] [ 90%] PASSED clan_cli/machines/update_test.py::test_nixos_activate_inhibitor_failure_suggests_reboot clan-pytest-without-core> clan_cli/machines/update_test.py::test_run_update_preserves_explicit_path_flake_url_for_metadata clan-pytest-without-core> [gw8] [ 90%] PASSED clan_cli/tests/test_ssh_local.py::test_timeout clan-pytest-without-core> clan_cli/tests/test_ssh_local.py::test_run_local_non_shell clan-pytest-without-core> [gw1] [ 90%] PASSED clan_cli/vars/upload_test.py::test_upload_command_no_flake clan-pytest-without-core> clan_cli/vars/fix_test.py::test_fix_command_no_flake clan-pytest-without-core> [gw6] [ 91%] PASSED clan_cli/machines/update_test.py::test_run_update_preserves_explicit_path_flake_url_for_metadata clan-pytest-without-core> clan_cli/machines/update_test.py::test_run_update_preserves_relative_flake_url_for_metadata clan-pytest-without-core> [gw6] [ 91%] PASSED clan_cli/machines/update_test.py::test_run_update_preserves_relative_flake_url_for_metadata clan-pytest-without-core> clan_cli/machines/update_test.py::test_nixos_activate_omits_nixos_no_check_when_unset clan-pytest-without-core> [gw8] [ 91%] PASSED clan_cli/tests/test_ssh_local.py::test_run_local_non_shell clan-pytest-without-core> [gw6] [ 91%] PASSED clan_cli/machines/update_test.py::test_nixos_activate_omits_nixos_no_check_when_unset clan-pytest-without-core> clan_cli/machines/list_test.py::test_machines_list_require_flake_error clan-pytest-without-core> clan_cli/machines/update_test.py::test_upload_sources_preserves_explicit_path_flake_url_for_archive clan-pytest-without-core> [gw5] [ 92%] PASSED clan_cli/tests/test_git.py::test_commit_file_not_existing_raises_error clan-pytest-without-core> [gw8] [ 92%] PASSED clan_cli/machines/update_test.py::test_upload_sources_preserves_explicit_path_flake_url_for_archive clan-pytest-without-core> clan_cli/machines/hardware_test.py::test_create_command_no_flake clan-pytest-without-core> clan_cli/tests/test_cli.py::test_help clan-pytest-without-core> [gw7] [ 92%] PASSED clan_cli/tests/test_git.py::test_commit_file_outside_git_raises_error clan-pytest-without-core> clan_cli/machines/update_test.py::test_run_update_with_network_nixos_systemd_run_path[None-/nix/store/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-fake-config/bin/switch-to-configuration] clan-pytest-without-core> [gw7] [ 93%] PASSED clan_cli/machines/update_test.py::test_run_update_with_network_nixos_systemd_run_path[None-/nix/store/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-fake-config/bin/switch-to-configuration] clan-pytest-without-core> clan_cli/help_test.py::test_help_formatter_no_default_when_none clan-pytest-without-core> [gw7] [ 93%] PASSED clan_cli/help_test.py::test_help_formatter_no_default_when_none clan-pytest-without-core> clan_cli/help_test.py::test_help_formatter_preserves_existing_default_marker clan-pytest-without-core> [gw7] [ 93%] PASSED clan_cli/help_test.py::test_help_formatter_preserves_existing_default_marker clan-pytest-without-core> clan_cli/completions_test.py::test_complete_machines_signature clan-pytest-without-core> [gw7] [ 93%] PASSED clan_cli/completions_test.py::test_complete_machines_signature clan-pytest-without-core> clan_cli/clan/show_test.py::test_clan_show_no_flake clan-pytest-without-core> [gw4] [ 94%] PASSED clan_cli/vars/generate_test.py::test_generate_command_no_flake clan-pytest-without-core> clan_cli/tests/test_machines_cli.py::test_machines_metavar_completeness clan-pytest-without-core> [gw5] [ 94%] PASSED clan_cli/tests/test_cli.py::test_help clan-pytest-without-core> clan_cli/help_test.py::test_help_formatter_no_default_for_non_choices clan-pytest-without-core> [gw4] [ 94%] PASSED clan_cli/tests/test_machines_cli.py::test_machines_metavar_completeness clan-pytest-without-core> [gw5] [ 94%] PASSED clan_cli/help_test.py::test_help_formatter_no_default_for_non_choices clan-pytest-without-core> clan_cli/backups/list_test.py::test_list_command_no_flake clan-pytest-without-core> clan_cli/backups/create_test.py::test_create_command_no_flake clan-pytest-without-core> [gw6] [ 95%] PASSED clan_cli/machines/list_test.py::test_machines_list_require_flake_error clan-pytest-without-core> clan_cli/machines/build_test.py::test_build_command_no_flake clan-pytest-without-core> [gw8] [ 95%] PASSED clan_cli/machines/hardware_test.py::test_create_command_no_flake clan-pytest-without-core> clan_cli/help_test.py::test_help_formatter_adds_default_to_choices clan-pytest-without-core> [gw8] [ 95%] PASSED clan_cli/help_test.py::test_help_formatter_adds_default_to_choices clan-pytest-without-core> [gw2] [ 96%] PASSED clan_cli/tests/test_git.py::test_commit_file clan-pytest-without-core> clan_cli/tests/test_git.py::test_commit_file_no_commit_intent_to_add clan-pytest-without-core> [gw0] [ 96%] PASSED clan_cli/vars/check_test.py::test_check_command_no_flake clan-pytest-without-core> clan_cli/machines/update_test.py::test_run_update_with_network_darwin_raises_on_specialisation clan-pytest-without-core> [gw0] [ 96%] PASSED clan_cli/machines/update_test.py::test_run_update_with_network_darwin_raises_on_specialisation clan-pytest-without-core> [gw5] [ 96%] PASSED clan_cli/backups/create_test.py::test_create_command_no_flake clan-pytest-without-core> [gw7] [ 97%] PASSED clan_cli/clan/show_test.py::test_clan_show_no_flake clan-pytest-without-core> clan_cli/backups/restore_test.py::test_restore_command_no_flake clan-pytest-without-core> [gw1] [ 97%] PASSED clan_cli/vars/fix_test.py::test_fix_command_no_flake clan-pytest-without-core> clan_cli/machines/update_test.py::test_nixos_activate_forwards_nixos_no_check clan-pytest-without-core> [gw1] [ 97%] PASSED clan_cli/machines/update_test.py::test_nixos_activate_forwards_nixos_no_check clan-pytest-without-core> [gw4] [ 98%] PASSED clan_cli/backups/list_test.py::test_list_command_no_flake clan-pytest-without-core> [gw6] [ 98%] PASSED clan_cli/machines/build_test.py::test_build_command_no_flake clan-pytest-without-core> [gw7] [ 98%] PASSED clan_cli/backups/restore_test.py::test_restore_command_no_flake clan-pytest-without-core> [gw9] [ 98%] FAILED clan_cli/tests/test_api_dataclass_compat.py::test_all_dataclasses clan-pytest-without-core> clan_cli/machines/update_test.py::test_update_command_no_flake clan-pytest-without-core> [gw3] [ 99%] PASSED clan_cli/tests/test_git.py::test_clan_flake_in_subdir clan-pytest-without-core> clan_cli/ssh/test_deploy_info.py::test_from_json clan-pytest-without-core> [gw3] [ 99%] PASSED clan_cli/ssh/test_deploy_info.py::test_from_json clan-pytest-without-core> [gw9] [ 99%] PASSED clan_cli/machines/update_test.py::test_update_command_no_flake clan-pytest-without-core> [gw2] [100%] PASSED clan_cli/tests/test_git.py::test_commit_file_no_commit_intent_to_add clan-pytest-without-core> clan-pytest-without-core> =================================== FAILURES =================================== clan-pytest-without-core> _____________________________ test_all_dataclasses _____________________________ clan-pytest-without-core> [gw9] darwin -- Python 3.14.7 /nix/store/kmq6qdcg0yq6r4awf02dgq003n42r6zk-python3-3.14.7/bin/python clan-pytest-without-core> clan-pytest-without-core> def test_all_dataclasses() -> None: clan-pytest-without-core> """Ensures that all dataclasses are compatible with the API. clan-pytest-without-core> clan-pytest-without-core> It will load all dataclasses from the clan_cli directory and clan-pytest-without-core> generate a JSON schema for each of them. clan-pytest-without-core> clan-pytest-without-core> It will fail if any dataclass cannot be converted to JSON schema. clan-pytest-without-core> This means the dataclass in its current form is not compatible with the API. clan-pytest-without-core> """ clan-pytest-without-core> # Excludes: clan-pytest-without-core> # - API includes Type Generic wrappers, that are not known in the init file. clan-pytest-without-core> excludes = [ clan-pytest-without-core> "api/__init__.py", clan-pytest-without-core> "cmd.py", # We don't want the UI to have access to the cmd module anyway clan-pytest-without-core> "async_run.py", # We don't want the UI to have access to the async_run module anyway clan-pytest-without-core> "tests", clan-pytest-without-core> ] clan-pytest-without-core> clan-pytest-without-core> cli_path = Path("clan_cli").resolve() clan-pytest-without-core> dataclasses = find_dataclasses_in_directory(cli_path, excludes) clan-pytest-without-core> clan-pytest-without-core> for file, dataclass in dataclasses: clan-pytest-without-core> print(f"checking dataclass {dataclass} in file: {file}") clan-pytest-without-core> try: clan-pytest-without-core> API.reset() clan-pytest-without-core> dclass = load_dataclass_from_file(file, dataclass, str(cli_path.parent)) clan-pytest-without-core> if dclass is None: clan-pytest-without-core> msg = f"Could not load dataclass {dataclass} from {file}" clan-pytest-without-core> raise ClanError(msg) clan-pytest-without-core> > type_to_dict(dclass) clan-pytest-without-core> clan-pytest-without-core> clan_cli/tests/test_api_dataclass_compat.py:152: clan-pytest-without-core> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ clan-pytest-without-core> clan_lib/api/type_to_jsonschema.py:155: in type_to_dict clan-pytest-without-core> properties[f.metadata.get("alias", f.name)] = type_to_dict( clan-pytest-without-core> clan_lib/api/type_to_jsonschema.py:205: in type_to_dict clan-pytest-without-core> dict_properties[field_name] = type_to_dict( clan-pytest-without-core> clan_lib/api/type_to_jsonschema.py:303: in type_to_dict clan-pytest-without-core> return type_to_dict(t.__args__[0], scope, type_map) clan-pytest-without-core> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ clan-pytest-without-core> clan_lib/api/type_to_jsonschema.py:268: in type_to_dict clan-pytest-without-core> return type_to_dict( clan-pytest-without-core> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ clan-pytest-without-core> clan-pytest-without-core> t = typing.Any, scope = ['CreateOptions.machine', 'MachineInput.nixpkgs'] clan-pytest-without-core> type_map = {}, narrow_unsupported_union_types = False clan-pytest-without-core> clan-pytest-without-core> def type_to_dict( clan-pytest-without-core> t: Any, clan-pytest-without-core> scope: list[str] | None = None, clan-pytest-without-core> type_map: dict[TypeVar, type] | None = None, clan-pytest-without-core> narrow_unsupported_union_types: bool = False, clan-pytest-without-core> ) -> dict: clan-pytest-without-core> if scope is None: clan-pytest-without-core> scope = [] clan-pytest-without-core> clan-pytest-without-core> if type_map is None: clan-pytest-without-core> type_map = {} clan-pytest-without-core> if t is None: clan-pytest-without-core> return {"type": "null"} clan-pytest-without-core> clan-pytest-without-core> # Handle string type annotations (forward references represented as strings) clan-pytest-without-core> if isinstance(t, str): clan-pytest-without-core> # Special case for JSONValue which represents arbitrary JSON values clan-pytest-without-core> # This is a recursive type that can't be fully represented in JSON Schema without $ref clan-pytest-without-core> if t == "JSONValue": clan-pytest-without-core> # Return a permissive schema that allows any JSON-compatible value clan-pytest-without-core> # This matches the intent of JSONValue = str | int | float | bool | None | list[JSONValue] | dict[str, JSONValue] clan-pytest-without-core> return {} # Empty schema allows any type clan-pytest-without-core> clan-pytest-without-core> msg = f"{' '.join(scope)} - String type annotation '{t}' cannot be resolved. This may indicate a forward reference or recursive type." clan-pytest-without-core> raise JSchemaTypeError(msg) clan-pytest-without-core> clan-pytest-without-core> if inspect.isclass(t) and t.__name__ == "Unknown": clan-pytest-without-core> # Empty should represent unknown clan-pytest-without-core> # We don't know anything about this type clan-pytest-without-core> # Nor about the nested fields, if there are any clan-pytest-without-core> return {} clan-pytest-without-core> clan-pytest-without-core> if dataclasses.is_dataclass(t): clan-pytest-without-core> fields = dataclasses.fields(t) clan-pytest-without-core> properties = {} clan-pytest-without-core> for f in fields: clan-pytest-without-core> if f.name.startswith("_"): clan-pytest-without-core> continue clan-pytest-without-core> if isinstance(f.type, str): clan-pytest-without-core> msg = f"Expected field type to be a type, got {f.type}, Have you imported `from __future__ import annotations`?" clan-pytest-without-core> raise JSchemaTypeError(msg) clan-pytest-without-core> properties[f.metadata.get("alias", f.name)] = type_to_dict( clan-pytest-without-core> f.type, clan-pytest-without-core> [*scope, f"{t.__name__}.{f.name}"], # type: ignore[union-attr] clan-pytest-without-core> type_map, # type: ignore[misc] clan-pytest-without-core> ) clan-pytest-without-core> clan-pytest-without-core> required = set() clan-pytest-without-core> for pn, pv in properties.items(): clan-pytest-without-core> if pv.get("type") is not None: clan-pytest-without-core> if "null" not in pv["type"]: clan-pytest-without-core> required.add(pn) clan-pytest-without-core> clan-pytest-without-core> elif pv.get("oneOf") is not None and "null" not in [ clan-pytest-without-core> i.get("type") for i in pv.get("oneOf", []) clan-pytest-without-core> ]: clan-pytest-without-core> required.add(pn) clan-pytest-without-core> clan-pytest-without-core> required_fields = { clan-pytest-without-core> f.name clan-pytest-without-core> for f in fields clan-pytest-without-core> # If first item is return, we are dealing with the return type clan-pytest-without-core> if next(iter(scope), None) == "return" clan-pytest-without-core> or (f.default is MISSING and f.default_factory is MISSING) clan-pytest-without-core> } clan-pytest-without-core> clan-pytest-without-core> # TODO: figure out why we needed to do this clan-pytest-without-core> # intersection = required_fields & required clan-pytest-without-core> clan-pytest-without-core> return { clan-pytest-without-core> "type": "object", clan-pytest-without-core> "properties": properties, clan-pytest-without-core> "required": sorted(required_fields), clan-pytest-without-core> # Dataclasses can only have the specified properties clan-pytest-without-core> "additionalProperties": False, clan-pytest-without-core> } clan-pytest-without-core> clan-pytest-without-core> if is_typed_dict(t): clan-pytest-without-core> dict_fields = get_typed_dict_fields(t, scope) clan-pytest-without-core> dict_properties: dict = {} clan-pytest-without-core> explicit_optional: set[str] = set() clan-pytest-without-core> explicit_required: set[str] = set() clan-pytest-without-core> for field_name, field_type in dict_fields.items(): clan-pytest-without-core> # Unwrap special case for "NotRequired" and "Required" clan-pytest-without-core> # A field type that only exist for TypedDicts clan-pytest-without-core> if get_origin(field_type) is NotRequired: clan-pytest-without-core> explicit_optional.add(field_name) clan-pytest-without-core> clan-pytest-without-core> if get_origin(field_type) is Required: clan-pytest-without-core> explicit_required.add(field_name) clan-pytest-without-core> clan-pytest-without-core> dict_properties[field_name] = type_to_dict( clan-pytest-without-core> field_type, clan-pytest-without-core> [*scope, f"{t.__name__}.{field_name}"], clan-pytest-without-core> type_map, clan-pytest-without-core> ) clan-pytest-without-core> clan-pytest-without-core> optional = set(dict_fields) - explicit_optional clan-pytest-without-core> return { clan-pytest-without-core> "type": "object", clan-pytest-without-core> "properties": dict_properties, clan-pytest-without-core> "required": sorted(optional) if is_total(t) else sorted(explicit_required), clan-pytest-without-core> "additionalProperties": False, clan-pytest-without-core> } clan-pytest-without-core> clan-pytest-without-core> origin = get_origin(t) clan-pytest-without-core> # UnionTypes clan-pytest-without-core> if type(t) is UnionType or origin is Union: clan-pytest-without-core> supported = [] clan-pytest-without-core> for arg in get_args(t): clan-pytest-without-core> try: clan-pytest-without-core> supported.append( clan-pytest-without-core> type_to_dict(arg, scope, type_map, narrow_unsupported_union_types), clan-pytest-without-core> ) clan-pytest-without-core> except JSchemaTypeError: clan-pytest-without-core> if narrow_unsupported_union_types: clan-pytest-without-core> # If we are narrowing unsupported union types, we skip the error clan-pytest-without-core> continue clan-pytest-without-core> raise clan-pytest-without-core> clan-pytest-without-core> if len(supported) == 0: clan-pytest-without-core> msg = f"{' '.join(scope)} - No supported types in Union {t!s}, type_map: {type_map}" clan-pytest-without-core> raise JSchemaTypeError(msg) clan-pytest-without-core> clan-pytest-without-core> if len(supported) == 1: clan-pytest-without-core> # If there's only one supported type, return it directly clan-pytest-without-core> return supported[0] clan-pytest-without-core> clan-pytest-without-core> # TODO: it would maybe be better to return 'anyOf' this should work for typescript clan-pytest-without-core> # But is more correct for JSON Schema validation clan-pytest-without-core> # i.e. 42 would match all of "int | float" which would be an invalid value for that using "oneOf" clan-pytest-without-core> clan-pytest-without-core> # If there are multiple supported types, return them as oneOf clan-pytest-without-core> return { clan-pytest-without-core> "oneOf": supported, clan-pytest-without-core> } clan-pytest-without-core> clan-pytest-without-core> if isinstance(t, TypeVar): clan-pytest-without-core> # if t is a TypeVar, look up the type in the type_map clan-pytest-without-core> # And return the resolved type instead of the TypeVar clan-pytest-without-core> resolved = type_map.get(t) clan-pytest-without-core> if not resolved: clan-pytest-without-core> msg = f"{' '.join(scope)} - TypeVar {t} not found in type_map, map: {type_map}" clan-pytest-without-core> raise JSchemaTypeError(msg) clan-pytest-without-core> return type_to_dict(type_map.get(t), scope, type_map) clan-pytest-without-core> clan-pytest-without-core> if isinstance(t, NewType): clan-pytest-without-core> origtype = t.__supertype__ clan-pytest-without-core> return type_to_dict(origtype, scope, type_map) clan-pytest-without-core> clan-pytest-without-core> if isinstance(t, TypeAliasType): clan-pytest-without-core> if t is AnyJson: clan-pytest-without-core> return {} clan-pytest-without-core> # Handle PEP 695 type aliases (type X = Y syntax) clan-pytest-without-core> return type_to_dict( clan-pytest-without-core> t.__value__, scope, type_map, narrow_unsupported_union_types clan-pytest-without-core> ) clan-pytest-without-core> clan-pytest-without-core> if hasattr(t, "__origin__"): # Check if it's a generic type clan-pytest-without-core> origin = get_origin(t) clan-pytest-without-core> args = get_args(t) clan-pytest-without-core> clan-pytest-without-core> if origin is None: clan-pytest-without-core> # Non-generic user-defined or built-in type clan-pytest-without-core> # TODO: handle custom types clan-pytest-without-core> msg = f"{scope} Unhandled Type: " clan-pytest-without-core> raise JSchemaTypeError(msg, origin) clan-pytest-without-core> clan-pytest-without-core> if origin is Literal: clan-pytest-without-core> # Handle Literal values for enums in JSON Schema clan-pytest-without-core> return { clan-pytest-without-core> "type": "string", clan-pytest-without-core> "enum": list(args), # assumes all args are strings clan-pytest-without-core> } clan-pytest-without-core> clan-pytest-without-core> if origin is Annotated: clan-pytest-without-core> base_type, *metadata = get_args(t) clan-pytest-without-core> schema = type_to_dict(base_type, scope) # Generate schema for the base type clan-pytest-without-core> return apply_annotations(schema, metadata) clan-pytest-without-core> clan-pytest-without-core> if origin in {list, set, frozenset, tuple}: clan-pytest-without-core> return { clan-pytest-without-core> "type": "array", clan-pytest-without-core> "items": type_to_dict(t.__args__[0], scope, type_map), clan-pytest-without-core> } clan-pytest-without-core> clan-pytest-without-core> # Used to mark optional fields in TypedDict clan-pytest-without-core> # Here we just unwrap the type and return the schema for the inner type clan-pytest-without-core> if origin is NotRequired or origin is Required or origin is ReadOnly: clan-pytest-without-core> return type_to_dict(t.__args__[0], scope, type_map) clan-pytest-without-core> clan-pytest-without-core> if issubclass(origin, dict): clan-pytest-without-core> value_type = t.__args__[1] clan-pytest-without-core> if value_type is Any: clan-pytest-without-core> return {"type": "object", "additionalProperties": True} clan-pytest-without-core> return { clan-pytest-without-core> "type": "object", clan-pytest-without-core> "additionalProperties": type_to_dict(value_type, scope, type_map), clan-pytest-without-core> } clan-pytest-without-core> # Generic dataclass with type parameters clan-pytest-without-core> if dataclasses.is_dataclass(origin): clan-pytest-without-core> # This behavior should mimic the scoping of typeVars in dataclasses clan-pytest-without-core> # Once type_to_dict() encounters a TypeVar, it will look up the type in the type_map clan-pytest-without-core> # When type_to_dict() returns the map goes out of scope. clan-pytest-without-core> # This behaves like a stack, where the type_map is pushed and popped as we traverse the dataclass fields clan-pytest-without-core> new_map = copy.deepcopy(type_map) clan-pytest-without-core> new_map.update(inspect_dataclass_fields(t)) clan-pytest-without-core> return type_to_dict(origin, scope, new_map) clan-pytest-without-core> clan-pytest-without-core> msg = f"{scope} - Error api type not yet supported {t!s}" clan-pytest-without-core> raise JSchemaTypeError(msg) clan-pytest-without-core> clan-pytest-without-core> if isinstance(t, type): clan-pytest-without-core> if t is str: clan-pytest-without-core> return {"type": "string"} clan-pytest-without-core> if t is int: clan-pytest-without-core> return {"type": "integer"} clan-pytest-without-core> if t is float: clan-pytest-without-core> return {"type": "number"} clan-pytest-without-core> if t is bool: clan-pytest-without-core> return {"type": "boolean"} clan-pytest-without-core> if t is object: clan-pytest-without-core> return {"type": "object"} clan-pytest-without-core> if type(t) is EnumType: clan-pytest-without-core> return { clan-pytest-without-core> "type": "string", clan-pytest-without-core> # Construct every enum value and use the same method as the serde module for converting it into the same literal string clan-pytest-without-core> "enum": [dataclass_to_dict(t(value)) for value in t], # type: ignore[var-annotated] clan-pytest-without-core> } clan-pytest-without-core> if t is Any: clan-pytest-without-core> msg = f"{' '.join(scope)} - Usage of the Any type is not supported for API functions. In: {scope}" clan-pytest-without-core> > raise JSchemaTypeError(msg) clan-pytest-without-core> E clan_lib.api.type_to_jsonschema.JSchemaTypeError: CreateOptions.machine MachineInput.nixpkgs - Usage of the Any type is not supported for API functions. In: ['CreateOptions.machine', 'MachineInput.nixpkgs'] clan-pytest-without-core> clan-pytest-without-core> clan_lib/api/type_to_jsonschema.py:345: JSchemaTypeError clan-pytest-without-core> clan-pytest-without-core> The above exception was the direct cause of the following exception: clan-pytest-without-core> clan-pytest-without-core> def test_all_dataclasses() -> None: clan-pytest-without-core> """Ensures that all dataclasses are compatible with the API. clan-pytest-without-core> clan-pytest-without-core> It will load all dataclasses from the clan_cli directory and clan-pytest-without-core> generate a JSON schema for each of them. clan-pytest-without-core> clan-pytest-without-core> It will fail if any dataclass cannot be converted to JSON schema. clan-pytest-without-core> This means the dataclass in its current form is not compatible with the API. clan-pytest-without-core> """ clan-pytest-without-core> # Excludes: clan-pytest-without-core> # - API includes Type Generic wrappers, that are not known in the init file. clan-pytest-without-core> excludes = [ clan-pytest-without-core> "api/__init__.py", clan-pytest-without-core> "cmd.py", # We don't want the UI to have access to the cmd module anyway clan-pytest-without-core> "async_run.py", # We don't want the UI to have access to the async_run module anyway clan-pytest-without-core> "tests", clan-pytest-without-core> ] clan-pytest-without-core> clan-pytest-without-core> cli_path = Path("clan_cli").resolve() clan-pytest-without-core> dataclasses = find_dataclasses_in_directory(cli_path, excludes) clan-pytest-without-core> clan-pytest-without-core> for file, dataclass in dataclasses: clan-pytest-without-core> print(f"checking dataclass {dataclass} in file: {file}") clan-pytest-without-core> try: clan-pytest-without-core> API.reset() clan-pytest-without-core> dclass = load_dataclass_from_file(file, dataclass, str(cli_path.parent)) clan-pytest-without-core> if dclass is None: clan-pytest-without-core> msg = f"Could not load dataclass {dataclass} from {file}" clan-pytest-without-core> raise ClanError(msg) clan-pytest-without-core> type_to_dict(dclass) clan-pytest-without-core> except JSchemaTypeError as e: clan-pytest-without-core> print(f"Error loading dataclass {dataclass} from {file}: {e}") clan-pytest-without-core> msg = f""" clan-pytest-without-core> -------------------------------------------------------------------------------- clan-pytest-without-core> Error converting dataclass 'class {dataclass}()' from {file} clan-pytest-without-core> clan-pytest-without-core> Details: clan-pytest-without-core> {e} clan-pytest-without-core> clan-pytest-without-core> Help: clan-pytest-without-core> - Converting public fields to PRIVATE by prefixing them with underscore ('_') clan-pytest-without-core> - Ensure all private fields are initialized the API wont provide initial values for them. clan-pytest-without-core> -------------------------------------------------------------------------------- clan-pytest-without-core> """ clan-pytest-without-core> > raise ClanError( clan-pytest-without-core> msg, clan-pytest-without-core> location=__file__, clan-pytest-without-core> ) from e clan-pytest-without-core> E clan_lib.errors.ClanError: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_api_dataclass_compat.py: clan-pytest-without-core> E clan-pytest-without-core> E -------------------------------------------------------------------------------- clan-pytest-without-core> E Error converting dataclass 'class CreateOptions()' from /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/machines/create.py clan-pytest-without-core> E clan-pytest-without-core> E Details: clan-pytest-without-core> E CreateOptions.machine MachineInput.nixpkgs - Usage of the Any type is not supported for API functions. In: ['CreateOptions.machine', 'MachineInput.nixpkgs'] clan-pytest-without-core> E clan-pytest-without-core> E Help: clan-pytest-without-core> E - Converting public fields to PRIVATE by prefixing them with underscore ('_') clan-pytest-without-core> E - Ensure all private fields are initialized the API wont provide initial values for them. clan-pytest-without-core> E -------------------------------------------------------------------------------- clan-pytest-without-core> clan-pytest-without-core> clan_cli/tests/test_api_dataclass_compat.py:167: ClanError clan-pytest-without-core> ----------------------------- Captured stdout call ----------------------------- clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/helpers/validator.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/helpers/__init__.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/helpers/cli.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/helpers/flake_cache.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_import_sops_cli.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_backups.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_clan_nix_attrset.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_machines_cli.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/command.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/fixtures_flakes.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_vars_cache.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_install_secret_path.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_api_dataclass_compat.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_vars_prompts.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/git_repo.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_create_flake.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/ports.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_git.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/gpg_keys.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/hosts.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_hardware_config.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/temporary_dir.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_vars_generate_inventory_checks.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/runtime.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_inventory_serde.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/sshd.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_secrets_cli.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/fixture_error.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_vars_errors.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_vars_age.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/age_keys.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/stdout.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/root.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_cli.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_upload_single_file.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_vars_shared.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_vars_generate.py clan-pytest-without-core> Skipping dataclass check for file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/tests/test_ssh_local.py clan-pytest-without-core> checking dataclass FlashOptions in file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/flash/flash_cmd.py clan-pytest-without-core> ModuleSpec(name='clan_cli.flash.flash_cmd', loader=<_frozen_importlib_external.SourceFileLoader object at 0x10a6eac30>, origin='/nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/flash/flash_cmd.py') clan-pytest-without-core> clan-pytest-without-core> checking dataclass CreateOptions in file: /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/machines/create.py clan-pytest-without-core> ModuleSpec(name='clan_cli.machines.create', loader=<_frozen_importlib_external.SourceFileLoader object at 0x10a6ebef0>, origin='/nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/machines/create.py') clan-pytest-without-core> clan-pytest-without-core> Error loading dataclass CreateOptions from /nix/var/nix/builds/nix-78939-1448654285/src/clan_cli/machines/create.py: CreateOptions.machine MachineInput.nixpkgs - Usage of the Any type is not supported for API functions. In: ['CreateOptions.machine', 'MachineInput.nixpkgs'] clan-pytest-without-core> ============================= slowest 5 durations ============================== clan-pytest-without-core> 0.28s call clan_cli/tests/test_api_dataclass_compat.py::test_all_dataclasses clan-pytest-without-core> 0.24s call clan_cli/tests/test_git.py::test_clan_flake_in_subdir clan-pytest-without-core> 0.24s call clan_lib/persist/migrations/test_services.py::test_run_inventory_migrations_writes_file clan-pytest-without-core> 0.23s call clan_lib/nix/tests/test_nix_invocations.py::test_resolve_package_uses_main_program_from_meta clan-pytest-without-core> 0.22s call clan_lib/nix/tests/test_nix_invocations.py::test_resolve_single_package_cache_hit_skips_gcroot_creation clan-pytest-without-core> =========================== short test summary info ============================ clan-pytest-without-core> FAILED clan_cli/tests/test_api_dataclass_compat.py::test_all_dataclasses - clan_lib.errors.ClanError: /nix/var/nix/builds/nix-78939-1448654285/src/cla... clan-pytest-without-core> ================== 1 failed, 344 passed, 15 skipped in 3.28s =================== error: path '/nix/store/54kn6s6g2xk51i48f0yq89xmc4aic13r-clan-pytest-without-core' is not valid error: Cannot build '/nix/store/1y3a62w3p0kr1cgsnw6gg3cglfwz23ih-clan-pytest-without-core.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/54kn6s6g2xk51i48f0yq89xmc4aic13r-clan-pytest-without-core