============================= test session starts ============================== platform linux -- Python 3.10.1, pytest-6.2.5, py-1.11.0, pluggy-0.13.1 -- /usr/bin/python cachedir: .pytest_cache rootdir: /build/python-pecan/src/pecan-1.4.1, configfile: setup.cfg collecting ... collected 544 items pecan/tests/test_base.py::TestAppRoot::test_controller_lookup_by_string_path PASSED pecan/tests/test_base.py::TestEmptyContent::test_empty_body PASSED pecan/tests/test_base.py::TestEmptyContent::test_empty_index PASSED pecan/tests/test_base.py::TestEmptyContent::test_empty_text PASSED pecan/tests/test_base.py::TestEmptyContent::test_explicit_body PASSED pecan/tests/test_base.py::TestEmptyContent::test_explicit_json PASSED pecan/tests/test_base.py::TestEmptyContent::test_explicit_json_body PASSED pecan/tests/test_base.py::TestEmptyContent::test_explicit_text PASSED pecan/tests/test_base.py::TestEmptyContent::test_index_with_non_unicode PASSED pecan/tests/test_base.py::TestAppIterFile::test_body_generator PASSED pecan/tests/test_base.py::TestAppIterFile::test_empty_body_generator PASSED pecan/tests/test_base.py::TestInvalidURLEncoding::test_rest_with_non_utf_8_body PASSED pecan/tests/test_base.py::TestIndexRouting::test_empty_root PASSED pecan/tests/test_base.py::TestIndexRouting::test_index PASSED pecan/tests/test_base.py::TestIndexRouting::test_index_html PASSED pecan/tests/test_base.py::TestObjectDispatch::test_index PASSED pecan/tests/test_base.py::TestObjectDispatch::test_one_level PASSED pecan/tests/test_base.py::TestObjectDispatch::test_one_level_with_trailing PASSED pecan/tests/test_base.py::TestObjectDispatch::test_three_levels PASSED pecan/tests/test_base.py::TestObjectDispatch::test_two_levels PASSED pecan/tests/test_base.py::TestObjectDispatch::test_two_levels_with_trailing PASSED pecan/tests/test_base.py::TestUnicodePathSegments::test_unicode_child PASSED pecan/tests/test_base.py::TestUnicodePathSegments::test_unicode_methods PASSED pecan/tests/test_base.py::TestLookups::test_index PASSED pecan/tests/test_base.py::TestLookups::test_lookup PASSED pecan/tests/test_base.py::TestLookups::test_lookup_with_method PASSED pecan/tests/test_base.py::TestLookups::test_lookup_with_wrong_argspec PASSED pecan/tests/test_base.py::TestLookups::test_lookup_with_wrong_return PASSED pecan/tests/test_base.py::TestCanonicalLookups::test_canonical_lookup PASSED pecan/tests/test_base.py::TestControllerArguments::test_argument_and_keyword_argument PASSED pecan/tests/test_base.py::TestControllerArguments::test_duplicate_query_parameters_GET PASSED pecan/tests/test_base.py::TestControllerArguments::test_duplicate_query_parameters_POST PASSED pecan/tests/test_base.py::TestControllerArguments::test_duplicate_query_parameters_POST_mixed PASSED pecan/tests/test_base.py::TestControllerArguments::test_duplicate_query_parameters_POST_mixed_json PASSED pecan/tests/test_base.py::TestControllerArguments::test_encoded_argument_and_keyword_argument PASSED pecan/tests/test_base.py::TestControllerArguments::test_explicit_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_explicit_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_json_kwargs_from_root PASSED pecan/tests/test_base.py::TestControllerArguments::test_keyword_argument PASSED pecan/tests/test_base.py::TestControllerArguments::test_keyword_argument_with_encoded_plus PASSED pecan/tests/test_base.py::TestControllerArguments::test_keyword_argument_with_encoded_url PASSED pecan/tests/test_base.py::TestControllerArguments::test_keyword_argument_with_plus PASSED pecan/tests/test_base.py::TestControllerArguments::test_kwargs_from_root PASSED pecan/tests/test_base.py::TestControllerArguments::test_many_remainders PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_args_with_url_encoded_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_encoded_variable_args PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_args_with_last_encoded_kwarg PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_args_with_last_kwarg PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_args_with_middle_arg PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_args_with_multiple_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_args_with_multiple_encoded_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_args_with_multiple_encoded_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_args_with_multiple_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_args_with_multiple_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_encoded_positional_args_and_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_missing PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_all_args PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_all_url_encoded_args PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_and_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_and_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_one_arg PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_one_url_encoded_arg PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_too_many_args PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_with_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_with_encoded_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_with_encoded_str_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_with_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_with_string_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_positional_args_with_url_encoded_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_optional_url_encoded PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_positional_arguments PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_positional_arguments_with_dictionary_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_positional_arguments_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_positional_arguments_with_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_positional_arguments_with_url_encode PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_positional_arguments_with_url_encoded_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_positional_url_encoded_arguments_with_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_variable_args PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_variable_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_variable_kwargs_with_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_variable_kwargs_with_encoded_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_variable_kwargs_with_explicit_encoded_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_variable_kwargs_with_explicit_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_variable_kwargs_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_with_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_multiple_with_url_encoded_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_no_remainder PASSED pecan/tests/test_base.py::TestControllerArguments::test_one_remainder PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg_with_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg_with_multiple_dictionary_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg_with_multiple_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg_with_multiple_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg_with_multiple_url_encoded_dictionary_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg_with_multiple_url_encoded_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_optional_arg_with_url_encoded_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_path_with_explicit_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_path_with_explicit_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_positional_args_with_dictionary_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_positional_args_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_positional_args_with_url_encoded_dictionary_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_post_empty_remainder_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_post_many_remainders PASSED pecan/tests/test_base.py::TestControllerArguments::test_post_many_remainders_with_many_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_post_many_remainders_with_many_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_post_remainder PASSED pecan/tests/test_base.py::TestControllerArguments::test_post_remainder_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_post_remainder_with_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_post_three_remainders PASSED pecan/tests/test_base.py::TestControllerArguments::test_remainder_with_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_remainder_with_many_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_required_argument PASSED pecan/tests/test_base.py::TestControllerArguments::test_single_argument PASSED pecan/tests/test_base.py::TestControllerArguments::test_single_argument_with_encoded_plus PASSED pecan/tests/test_base.py::TestControllerArguments::test_single_argument_with_encoded_url PASSED pecan/tests/test_base.py::TestControllerArguments::test_single_argument_with_plus PASSED pecan/tests/test_base.py::TestControllerArguments::test_staticmethod PASSED pecan/tests/test_base.py::TestControllerArguments::test_two_arguments PASSED pecan/tests/test_base.py::TestControllerArguments::test_two_remainders PASSED pecan/tests/test_base.py::TestControllerArguments::test_url_encoded_positional_args PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_all PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_all_with_one_extra PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_all_with_two_extras PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_args PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_args_with_dict_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_args_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_args_with_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_mixed PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_mixed_explicit PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_post PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_post_mixed PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_post_mixed_with_json PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_post_with_json_kwargs PASSED pecan/tests/test_base.py::TestControllerArguments::test_variable_post_with_kwargs PASSED pecan/tests/test_base.py::TestDefaultErrorRendering::test_html_error PASSED pecan/tests/test_base.py::TestDefaultErrorRendering::test_json_error PASSED pecan/tests/test_base.py::TestDefaultErrorRendering::test_plain_error PASSED pecan/tests/test_base.py::TestAbort::test_abort PASSED pecan/tests/test_base.py::TestAbort::test_abort_keeps_traceback PASSED pecan/tests/test_base.py::TestAbort::test_abort_with_detail PASSED pecan/tests/test_base.py::TestScriptName::test_handle_script_name PASSED pecan/tests/test_base.py::TestRedirect::test_index PASSED pecan/tests/test_base.py::TestRedirect::test_internal PASSED pecan/tests/test_base.py::TestRedirect::test_internal_with_301 PASSED pecan/tests/test_base.py::TestRedirect::test_permanent_redirect PASSED pecan/tests/test_base.py::TestRedirect::test_x_forward_proto PASSED pecan/tests/test_base.py::TestInternalRedirectContext::test_context_does_not_bleed PASSED pecan/tests/test_base.py::TestInternalRedirectContext::test_internal_with_request_context PASSED pecan/tests/test_base.py::TestStreamedResponse::test_streaming_response PASSED pecan/tests/test_base.py::TestManualResponse::test_manual_response PASSED pecan/tests/test_base.py::TestCustomResponseandRequest::test_custom_objects PASSED pecan/tests/test_base.py::TestThreadLocalState::test_request_state_cleanup PASSED pecan/tests/test_base.py::TestThreadLocalState::test_thread_local_dir PASSED pecan/tests/test_base.py::TestFileTypeExtensions::test_bad_content_type PASSED pecan/tests/test_base.py::TestFileTypeExtensions::test_content_type_guessing_disabled PASSED pecan/tests/test_base.py::TestFileTypeExtensions::test_guessing_disabled PASSED pecan/tests/test_base.py::TestFileTypeExtensions::test_hidden_file PASSED pecan/tests/test_base.py::TestFileTypeExtensions::test_html_extension PASSED pecan/tests/test_base.py::TestFileTypeExtensions::test_image_extension PASSED pecan/tests/test_base.py::TestFileTypeExtensions::test_multi_dot_extension PASSED pecan/tests/test_base.py::TestFileTypeExtensions::test_unknown_file_extension PASSED pecan/tests/test_base.py::TestContentTypeByAcceptHeaders::test_accept_header_missing PASSED pecan/tests/test_base.py::TestContentTypeByAcceptHeaders::test_discarded_accept_parameters PASSED pecan/tests/test_base.py::TestContentTypeByAcceptHeaders::test_file_extension_has_higher_precedence PASSED pecan/tests/test_base.py::TestContentTypeByAcceptHeaders::test_missing_accept PASSED pecan/tests/test_base.py::TestContentTypeByAcceptHeaders::test_not_acceptable PASSED pecan/tests/test_base.py::TestContentTypeByAcceptHeaders::test_quality PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_accept_noncanonical PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_accept_noncanonical_no_trailing_slash PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_broken_clients PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_index PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_posts_fail PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_root PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_sub_controller_redirect PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_sub_controller_with_trailing PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_with_args PASSED pecan/tests/test_base.py::TestCanonicalRouting::test_with_query_string PASSED pecan/tests/test_base.py::TestNonCanonical::test_app_wrap PASSED pecan/tests/test_base.py::TestNonCanonical::test_index PASSED pecan/tests/test_base.py::TestNonCanonical::test_proxy PASSED pecan/tests/test_base.py::TestNonCanonical::test_sub_controller_with_trailing PASSED pecan/tests/test_base.py::TestNonCanonical::test_subcontroller PASSED pecan/tests/test_base.py::TestNonCanonical::test_subcontroller_with_kwargs PASSED pecan/tests/test_base.py::TestLogging::test_logging_setup PASSED pecan/tests/test_base.py::TestLogging::test_logging_setup_with_config_obj PASSED pecan/tests/test_base.py::TestEngines::test_custom_renderer PASSED pecan/tests/test_base.py::TestEngines::test_default_json_renderer PASSED pecan/tests/test_base.py::TestEngines::test_default_json_renderer_with_explicit_content_type PASSED pecan/tests/test_base.py::TestEngines::test_genshi SKIPPED (Genshi n...) pecan/tests/test_base.py::TestEngines::test_jinja PASSED pecan/tests/test_base.py::TestEngines::test_json PASSED pecan/tests/test_base.py::TestEngines::test_kajiki SKIPPED (Kajiki n...) pecan/tests/test_base.py::TestEngines::test_mako PASSED pecan/tests/test_base.py::TestEngines::test_override_template PASSED pecan/tests/test_base.py::TestEngines::test_render PASSED pecan/tests/test_base.py::TestEngines::test_renderer_not_found PASSED pecan/tests/test_base.py::TestDeprecatedRouteMethod::test_required_argument PASSED pecan/tests/test_base.py::TestExplicitRoute::test_alternate_route PASSED pecan/tests/test_base.py::TestExplicitRoute::test_conflicting_custom_routes PASSED pecan/tests/test_base.py::TestExplicitRoute::test_conflicting_custom_routes_in_subclass PASSED pecan/tests/test_base.py::TestExplicitRoute::test_custom_route_on_index PASSED pecan/tests/test_base.py::TestExplicitRoute::test_custom_route_prohibited_on_default PASSED pecan/tests/test_base.py::TestExplicitRoute::test_custom_route_prohibited_on_generic_controllers PASSED pecan/tests/test_base.py::TestExplicitRoute::test_custom_route_prohibited_on_lookup PASSED pecan/tests/test_base.py::TestExplicitRoute::test_custom_route_prohibited_on_route PASSED pecan/tests/test_base.py::TestExplicitRoute::test_custom_route_with_attribute_conflict PASSED pecan/tests/test_base.py::TestExplicitRoute::test_custom_route_with_generic_controllers PASSED pecan/tests/test_base.py::TestExplicitRoute::test_invalid_route_arguments PASSED pecan/tests/test_base.py::TestExplicitRoute::test_manual_route PASSED pecan/tests/test_base.py::TestExplicitRoute::test_manual_route_conflict PASSED pecan/tests/test_commands.py::TestCommandManager::test_commands FAILED pecan/tests/test_commands.py::TestCommandRunner::test_commands FAILED pecan/tests/test_commands.py::TestCommandRunner::test_run usage: py.test [-h] [--version] command ... positional arguments: command options: -h, --help show this help message and exit --version show program's version number and exit py.test: argument command: invalid choice: 'serve' (choose from ) FAILED pecan/tests/test_commands.py::TestCreateCommand::test_run PASSED pecan/tests/test_conf.py::TestConf::test_config_bad_key PASSED pecan/tests/test_conf.py::TestConf::test_config_dir PASSED pecan/tests/test_conf.py::TestConf::test_config_from_dict PASSED pecan/tests/test_conf.py::TestConf::test_config_from_file PASSED pecan/tests/test_conf.py::TestConf::test_config_get_invalid_key PASSED pecan/tests/test_conf.py::TestConf::test_config_get_invalid_key_return_default PASSED pecan/tests/test_conf.py::TestConf::test_config_get_valid_key PASSED pecan/tests/test_conf.py::TestConf::test_config_illegal_ids PASSED pecan/tests/test_conf.py::TestConf::test_config_missing_file PASSED pecan/tests/test_conf.py::TestConf::test_config_missing_file_on_path PASSED pecan/tests/test_conf.py::TestConf::test_config_repr PASSED pecan/tests/test_conf.py::TestConf::test_config_to_dict PASSED pecan/tests/test_conf.py::TestConf::test_config_to_dict_nested PASSED pecan/tests/test_conf.py::TestConf::test_config_to_dict_prefixed PASSED pecan/tests/test_conf.py::TestConf::test_config_with_bad_import PASSED pecan/tests/test_conf.py::TestConf::test_config_with_non_package_relative_import PASSED pecan/tests/test_conf.py::TestConf::test_config_with_syntax_error PASSED pecan/tests/test_conf.py::TestConf::test_update_config_fail_identifier PASSED pecan/tests/test_conf.py::TestConf::test_update_config_fail_message PASSED pecan/tests/test_conf.py::TestConf::test_update_config_with_dict PASSED pecan/tests/test_conf.py::TestConf::test_update_force_dict PASSED pecan/tests/test_conf.py::TestConf::test_update_set_config PASSED pecan/tests/test_conf.py::TestConf::test_update_set_default_config PASSED pecan/tests/test_conf.py::TestGlobalConfig::test_overwrite_from_dict PASSED pecan/tests/test_conf.py::TestGlobalConfig::test_overwrite_from_file PASSED pecan/tests/test_conf.py::TestGlobalConfig::test_paint_from_dict PASSED pecan/tests/test_conf.py::TestGlobalConfig::test_paint_from_file PASSED pecan/tests/test_conf.py::TestGlobalConfig::test_set_config_none_type PASSED pecan/tests/test_conf.py::TestGlobalConfig::test_set_config_to_dir PASSED pecan/tests/test_conf.py::TestConfFromEnv::test_invalid_path PASSED pecan/tests/test_conf.py::TestConfFromEnv::test_is_not_set PASSED pecan/tests/test_conf.py::TestConfFromEnv::test_return_valid_path PASSED pecan/tests/test_conf.py::TestConfigCleanup::test_conf_changed PASSED pecan/tests/test_conf.py::TestConfigCleanup::test_conf_default PASSED pecan/tests/test_generic.py::TestGeneric::test_generic_allow_header PASSED pecan/tests/test_generic.py::TestGeneric::test_nested_generic PASSED pecan/tests/test_generic.py::TestGeneric::test_simple_generic PASSED pecan/tests/test_generic.py::TestGenericWithSpecialMethods::test_generics_not_allowed PASSED pecan/tests/test_hooks.py::TestHooks::test_basic_isolated_hook PASSED pecan/tests/test_hooks.py::TestHooks::test_basic_multi_hook PASSED pecan/tests/test_hooks.py::TestHooks::test_basic_single_hook PASSED pecan/tests/test_hooks.py::TestHooks::test_internal_redirect_with_after_hook PASSED pecan/tests/test_hooks.py::TestHooks::test_isolated_hook_with_global_hook PASSED pecan/tests/test_hooks.py::TestHooks::test_mixin_hooks PASSED pecan/tests/test_hooks.py::TestHooks::test_on_error_response_hook PASSED pecan/tests/test_hooks.py::TestHooks::test_partial_hooks PASSED pecan/tests/test_hooks.py::TestHooks::test_prioritized_hooks PASSED pecan/tests/test_hooks.py::TestStateAccess::test_mixed_args PASSED pecan/tests/test_hooks.py::TestStateAccess::test_no_args PASSED pecan/tests/test_hooks.py::TestStateAccess::test_single_arg PASSED pecan/tests/test_hooks.py::TestStateAccess::test_single_kw PASSED pecan/tests/test_hooks.py::TestStateAccess::test_single_kw_post PASSED pecan/tests/test_hooks.py::TestStateAccess::test_single_vararg PASSED pecan/tests/test_hooks.py::TestStateAccessWithoutThreadLocals::test_mixed_args PASSED pecan/tests/test_hooks.py::TestStateAccessWithoutThreadLocals::test_no_args PASSED pecan/tests/test_hooks.py::TestStateAccessWithoutThreadLocals::test_single_arg PASSED pecan/tests/test_hooks.py::TestStateAccessWithoutThreadLocals::test_single_kw PASSED pecan/tests/test_hooks.py::TestStateAccessWithoutThreadLocals::test_single_kw_post PASSED pecan/tests/test_hooks.py::TestStateAccessWithoutThreadLocals::test_single_vararg PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_delete PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_delete_with_kwargs PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_delete_with_method_argument PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_delete_with_varargs PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_get_all PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_get_all_with_kwargs PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_get_one PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_get_one_with_kwargs PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_get_one_with_varargs PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_post PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_post_with_invalid_method_kwarg PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_post_with_kwargs PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_post_with_varargs PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_put PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_put_with_kwargs PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_put_with_method_argument PASSED pecan/tests/test_hooks.py::TestRestControllerStateAccess::test_put_with_varargs PASSED pecan/tests/test_hooks.py::TestTransactionHook::test_transaction_hook PASSED pecan/tests/test_hooks.py::TestTransactionHook::test_transaction_hook_with_after_actions PASSED pecan/tests/test_hooks.py::TestTransactionHook::test_transaction_hook_with_broken_hook PASSED pecan/tests/test_hooks.py::TestTransactionHook::test_transaction_hook_with_transactional_class_decorator PASSED pecan/tests/test_hooks.py::TestTransactionHook::test_transaction_hook_with_transactional_decorator PASSED pecan/tests/test_hooks.py::TestRequestViewerHook::test_bad_response_from_app PASSED pecan/tests/test_hooks.py::TestRequestViewerHook::test_basic_single_default_hook PASSED pecan/tests/test_hooks.py::TestRequestViewerHook::test_deal_with_pecan_configs PASSED pecan/tests/test_hooks.py::TestRequestViewerHook::test_hook_formatting PASSED pecan/tests/test_hooks.py::TestRequestViewerHook::test_item_not_in_defaults PASSED pecan/tests/test_hooks.py::TestRequestViewerHook::test_single_blacklist_item PASSED pecan/tests/test_hooks.py::TestRequestViewerHook::test_single_item PASSED pecan/tests/test_hooks.py::TestRestControllerWithHooks::test_restcontroller_with_hooks PASSED pecan/tests/test_jsonify.py::test_simple_rule PASSED pecan/tests/test_jsonify.py::TestJsonify::test_simple_jsonify PASSED pecan/tests/test_jsonify.py::TestJsonifyGenericEncoder::test_datetime PASSED pecan/tests/test_jsonify.py::TestJsonifyGenericEncoder::test_decimal PASSED pecan/tests/test_jsonify.py::TestJsonifyGenericEncoder::test_fallback_to_builtin_encoder PASSED pecan/tests/test_jsonify.py::TestJsonifyGenericEncoder::test_json_callable PASSED pecan/tests/test_jsonify.py::TestJsonifyGenericEncoder::test_multidict PASSED pecan/tests/test_jsonify.py::TestJsonifySQLAlchemyGenericEncoder::test_result_proxy PASSED pecan/tests/test_jsonify.py::TestJsonifySQLAlchemyGenericEncoder::test_row_proxy PASSED pecan/tests/test_jsonify.py::TestJsonifySQLAlchemyGenericEncoder::test_sa_object PASSED pecan/tests/test_no_thread_locals.py::TestThreadingLocalUsage::test_locals_are_not_used PASSED pecan/tests/test_no_thread_locals.py::TestThreadingLocalUsage::test_threadlocal_argument_warning PASSED pecan/tests/test_no_thread_locals.py::TestThreadingLocalUsage::test_threadlocal_argument_warning_on_generic PASSED pecan/tests/test_no_thread_locals.py::TestThreadingLocalUsage::test_threadlocal_argument_warning_on_generic_delegate PASSED pecan/tests/test_no_thread_locals.py::TestIndexRouting::test_empty_root PASSED pecan/tests/test_no_thread_locals.py::TestIndexRouting::test_index PASSED pecan/tests/test_no_thread_locals.py::TestIndexRouting::test_index_html PASSED pecan/tests/test_no_thread_locals.py::TestManualResponse::test_manual_response PASSED pecan/tests/test_no_thread_locals.py::TestDispatch::test_index PASSED pecan/tests/test_no_thread_locals.py::TestDispatch::test_one_level PASSED pecan/tests/test_no_thread_locals.py::TestDispatch::test_one_level_with_trailing PASSED pecan/tests/test_no_thread_locals.py::TestDispatch::test_three_levels PASSED pecan/tests/test_no_thread_locals.py::TestDispatch::test_two_levels PASSED pecan/tests/test_no_thread_locals.py::TestDispatch::test_two_levels_with_trailing PASSED pecan/tests/test_no_thread_locals.py::TestLookups::test_index PASSED pecan/tests/test_no_thread_locals.py::TestLookups::test_lookup PASSED pecan/tests/test_no_thread_locals.py::TestLookups::test_lookup_with_method PASSED pecan/tests/test_no_thread_locals.py::TestLookups::test_lookup_with_wrong_argspec PASSED pecan/tests/test_no_thread_locals.py::TestCanonicalLookups::test_canonical_lookup PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_argument_and_keyword_argument PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_encoded_argument_and_keyword_argument PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_explicit_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_keyword_argument PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_keyword_argument_with_encoded_url PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_kwargs_from_root PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_many_remainders PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_args_with_url_encoded_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_encoded_variable_args PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_args_with_last_encoded_kwarg PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_args_with_last_kwarg PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_args_with_middle_arg PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_args_with_multiple_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_args_with_multiple_encoded_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_args_with_multiple_encoded_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_args_with_multiple_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_encoded_positional_args_and_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_missing PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_all_args PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_all_url_encoded_args PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_and_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_one_arg PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_one_url_encoded_arg PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_too_many_args PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_with_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_with_encoded_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_with_encoded_str_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_with_string_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_positional_args_with_url_encoded_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_optional_url_encoded PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_positional_arguments PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_positional_arguments_with_dictionary_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_positional_arguments_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_positional_arguments_with_url_encode PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_positional_arguments_with_url_encoded_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_positional_url_encoded_arguments_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_variable_args PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_variable_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_variable_kwargs_with_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_variable_kwargs_with_encoded_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_variable_kwargs_with_explicit_encoded_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_variable_kwargs_with_explicit_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_multiple_with_url_encoded_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_no_remainder PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_one_remainder PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_optional_arg PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_optional_arg_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_optional_arg_with_multiple_dictionary_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_optional_arg_with_multiple_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_optional_arg_with_multiple_url_encoded_dictionary_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_optional_arg_with_multiple_url_encoded_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_optional_arg_with_url_encoded_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_path_with_explicit_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_positional_args_with_dictionary_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_positional_args_with_url_encoded_dictionary_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_post_many_remainders PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_post_many_remainders_with_many_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_post_remainder PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_post_remainder_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_post_three_remainders PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_remainder_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_remainder_with_many_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_required_argument PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_single_argument PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_single_argument_with_encoded_url PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_two_arguments PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_two_remainders PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_url_encoded_positional_args PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_all PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_all_with_one_extra PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_all_with_two_extras PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_args PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_args_with_dict_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_args_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_mixed PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_mixed_explicit PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_post PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_post_mixed PASSED pecan/tests/test_no_thread_locals.py::TestControllerArguments::test_variable_post_with_kwargs PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_custom_action PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_custom_method_type PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_custom_method_type_with_method_parameter PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_delete_method PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_delete_with_method_parameter PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_delete_with_method_parameter_and_post PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_get_all PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_get_delete PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_get_one PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_invalid_custom_action PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_named_action PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_named_nested_action PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_nested_controller_with_trailing_slash PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_nested_controller_without_trailing_slash PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_nested_post PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_options PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_options_with_method_parameter PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_other_custom_action PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_other_custom_action_with_method_parameter PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_post PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_put PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_put_with_method_parameter_and_get PASSED pecan/tests/test_no_thread_locals.py::TestRestController::test_put_with_method_parameter_and_post PASSED pecan/tests/test_no_thread_locals.py::TestHooks::test_basic_isolated_hook PASSED pecan/tests/test_no_thread_locals.py::TestHooks::test_basic_multi_hook PASSED pecan/tests/test_no_thread_locals.py::TestHooks::test_basic_single_hook PASSED pecan/tests/test_no_thread_locals.py::TestHooks::test_isolated_hook_with_global_hook PASSED pecan/tests/test_no_thread_locals.py::TestHooks::test_on_error_response_hook PASSED pecan/tests/test_no_thread_locals.py::TestHooks::test_partial_hooks PASSED pecan/tests/test_no_thread_locals.py::TestHooks::test_prioritized_hooks PASSED pecan/tests/test_no_thread_locals.py::TestGeneric::test_generics_with_im_self_default PASSED pecan/tests/test_no_thread_locals.py::TestGeneric::test_generics_with_im_self_with_extra_args PASSED pecan/tests/test_no_thread_locals.py::TestGeneric::test_generics_with_im_self_with_method PASSED pecan/tests/test_no_thread_locals.py::TestGeneric::test_generics_with_im_self_with_path PASSED pecan/tests/test_rest.py::TestRestController::test_405_with_lookup PASSED pecan/tests/test_rest.py::TestRestController::test_bad_rest PASSED pecan/tests/test_rest.py::TestRestController::test_basic_rest PASSED pecan/tests/test_rest.py::TestRestController::test_complicated_nested_rest PASSED pecan/tests/test_rest.py::TestRestController::test_custom_delete PASSED pecan/tests/test_rest.py::TestRestController::test_custom_with_trailing_slash PASSED pecan/tests/test_rest.py::TestRestController::test_dynamic_rest_lookup PASSED pecan/tests/test_rest.py::TestRestController::test_get_with_var_args PASSED pecan/tests/test_rest.py::TestRestController::test_getall_with_lookup PASSED pecan/tests/test_rest.py::TestRestController::test_getall_with_trailing_slash PASSED pecan/tests/test_rest.py::TestRestController::test_method_not_allowed_delete PASSED pecan/tests/test_rest.py::TestRestController::test_method_not_allowed_get PASSED pecan/tests/test_rest.py::TestRestController::test_method_not_allowed_post PASSED pecan/tests/test_rest.py::TestRestController::test_method_not_allowed_put PASSED pecan/tests/test_rest.py::TestRestController::test_nested_get_all PASSED pecan/tests/test_rest.py::TestRestController::test_nested_get_all_with_lookup PASSED pecan/tests/test_rest.py::TestRestController::test_nested_rest_with_default PASSED pecan/tests/test_rest.py::TestRestController::test_nested_rest_with_lookup PASSED pecan/tests/test_rest.py::TestRestController::test_nested_rest_with_missing_intermediate_id PASSED pecan/tests/test_rest.py::TestRestController::test_post_with_kwargs_only PASSED pecan/tests/test_rest.py::TestRestController::test_proper_allow_header_multiple_gets PASSED pecan/tests/test_rest.py::TestRestController::test_rest_with_non_utf_8_body PASSED pecan/tests/test_rest.py::TestRestController::test_rest_with_utf8_endpoint PASSED pecan/tests/test_rest.py::TestRestController::test_rest_with_utf8_uri PASSED pecan/tests/test_rest.py::TestRestController::test_simple_nested_rest PASSED pecan/tests/test_rest.py::TestRestController::test_sub_nested_rest PASSED pecan/tests/test_rest.py::TestRestController::test_sub_nested_rest_with_overwrites PASSED pecan/tests/test_rest.py::TestExplicitRoute::test_alternate_route PASSED pecan/tests/test_scaffolds.py::TestPecanScaffold::test_normalize_pkg_name PASSED pecan/tests/test_scaffolds.py::TestScaffoldUtils::test_copy_dir PASSED pecan/tests/test_scaffolds.py::TestScaffoldUtils::test_copy_dir_with_file_content_substitution PASSED pecan/tests/test_scaffolds.py::TestScaffoldUtils::test_copy_dir_with_filename_substitution PASSED pecan/tests/test_scaffolds.py::TestScaffoldUtils::test_destination_directory_already_exists PASSED pecan/tests/test_scaffolds.py::TestScaffoldUtils::test_destination_directory_levels_deep PASSED pecan/tests/test_secure.py::TestSecure::test_secure_attribute PASSED pecan/tests/test_secure.py::TestSecure::test_secure_obj_only_failure PASSED pecan/tests/test_secure.py::TestSecure::test_secured_generic_controller PASSED pecan/tests/test_secure.py::TestSecure::test_secured_generic_controller_lambda PASSED pecan/tests/test_secure.py::TestSecure::test_secured_generic_controller_secure_attribute PASSED pecan/tests/test_secure.py::TestSecure::test_secured_generic_controller_secure_attribute_with_unlocked PASSED pecan/tests/test_secure.py::TestSecure::test_simple_secure PASSED pecan/tests/test_secure.py::TestSecure::test_state_attribute PASSED pecan/tests/test_secure.py::TestSecure::test_unlocked_attribute PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_cyclical_protection PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_independent_check_failure PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_independent_check_success PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_layered_protection PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_lookup_to_wrapped_attribute_on_self PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_mixed_protection PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_protected_lookup PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_secret_through_lookup PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_secured_notfound_lookup PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_sub_of_both_not_secret PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_unlocked_attribute_in_insecure PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_unlocked_lookup PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_wrapped_attribute_failure PASSED pecan/tests/test_secure.py::TestObjectPathSecurity::test_wrapped_attribute_success PASSED pecan/tests/test_secure.py::SecureControllerSharedPermissionsRegression::test_inherited_security PASSED pecan/tests/test_templating.py::TestTemplate::test_available PASSED pecan/tests/test_templating.py::TestTemplate::test_create_bad PASSED pecan/tests/test_templating.py::TestTemplate::test_extra_vars PASSED pecan/tests/test_templating.py::TestTemplate::test_update_extra_vars PASSED pecan/tests/test_templating.py::TestTemplateLineFormat::test_format_line_context PASSED pecan/tests/test_util.py::TestArgSpec::test_class_based_decorator PASSED pecan/tests/test_util.py::TestArgSpec::test_decorator_with_args PASSED pecan/tests/test_util.py::TestArgSpec::test_multiple_decorators PASSED pecan/tests/test_util.py::TestArgSpec::test_nested_cells PASSED pecan/tests/test_util.py::TestArgSpec::test_no_decorator PASSED pecan/tests/test_util.py::TestArgSpec::test_simple_decorator PASSED pecan/tests/test_util.py::TestArgSpec::test_simple_wrapper PASSED pecan/tests/middleware/test_errordocument.py::TestErrorDocumentMiddleware::test_error_endpoint_with_query_string PASSED pecan/tests/middleware/test_errordocument.py::TestErrorDocumentMiddleware::test_error_with_recursion_loop PASSED pecan/tests/middleware/test_errordocument.py::TestErrorDocumentMiddleware::test_hit_error_page PASSED pecan/tests/middleware/test_errordocument.py::TestErrorDocumentMiddleware::test_middleware_routes_to_404_message PASSED pecan/tests/middleware/test_errordocument.py::TestErrorDocumentMiddleware::test_original_exception PASSED pecan/tests/middleware/test_recursive.py::TestRecursiveMiddleware::test_ForwardRequestException PASSED pecan/tests/middleware/test_recursive.py::TestRecursiveMiddleware::test_ForwardRequest_environ PASSED pecan/tests/middleware/test_recursive.py::TestRecursiveMiddleware::test_ForwardRequest_factory PASSED pecan/tests/middleware/test_recursive.py::TestRecursiveMiddleware::test_ForwardRequest_url PASSED pecan/tests/middleware/test_recursive.py::TestRecursiveMiddleware::test_ForwardRequest_url_with_params PASSED pecan/tests/middleware/test_static.py::TestStaticFileMiddleware::test_date_dumping_on_unix_timestamps PASSED pecan/tests/middleware/test_static.py::TestStaticFileMiddleware::test_file_can_be_closed PASSED pecan/tests/middleware/test_static.py::TestStaticFileMiddleware::test_file_can_be_found PASSED pecan/tests/middleware/test_static.py::TestStaticFileMiddleware::test_file_can_be_iterated_over PASSED pecan/tests/middleware/test_static.py::TestStaticFileMiddleware::test_mime_type_works_for_png_files PASSED pecan/tests/middleware/test_static.py::TestStaticFileMiddleware::test_no_file_found_causes_passthrough PASSED pecan/tests/middleware/test_static.py::TestStaticFileMiddleware::test_separator_sanitization_still_finds_file PASSED =================================== FAILURES =================================== _______________________ TestCommandManager.test_commands _______________________ self = def test_commands(self): from pecan.commands import ServeCommand, ShellCommand, CreateCommand from pecan.commands.base import CommandManager m = CommandManager() > assert m.commands['serve'] == ServeCommand E KeyError: 'serve' CommandManager = CreateCommand = ServeCommand = ShellCommand = m = self = pecan/tests/test_commands.py:10: KeyError _______________________ TestCommandRunner.test_commands ________________________ self = def test_commands(self): from pecan.commands import ( ServeCommand, ShellCommand, CreateCommand, CommandRunner ) runner = CommandRunner() > assert runner.commands['serve'] == ServeCommand E KeyError: 'serve' CommandRunner = CreateCommand = ServeCommand = ShellCommand = runner = self = pecan/tests/test_commands.py:22: KeyError __________________________ TestCommandRunner.test_run __________________________ def parse_known_args(self, args=None, namespace=None): if args is None: # args default to the system args args = _sys.argv[1:] else: # make sure that args are mutable args = list(args) # default Namespace built from parser defaults if namespace is None: namespace = Namespace() # add any action defaults that aren't present for action in self._actions: if action.dest is not SUPPRESS: if not hasattr(namespace, action.dest): if action.default is not SUPPRESS: setattr(namespace, action.dest, action.default) # add any parser defaults that aren't present for dest in self._defaults: if not hasattr(namespace, dest): setattr(namespace, dest, self._defaults[dest]) # parse the arguments and exit if there are any errors if self.exit_on_error: try: > namespace, args = self._parse_known_args(args, namespace) /usr/lib/python3.10/argparse.py:1854: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=, conflict_handler='error', add_help=True) arg_strings = ['serve', 'missing_file.py'] namespace = Namespace(command_name=None) def _parse_known_args(self, arg_strings, namespace): # replace arg strings that are file references if self.fromfile_prefix_chars is not None: arg_strings = self._read_args_from_files(arg_strings) # map all mutually exclusive arguments to the other arguments # they can't occur with action_conflicts = {} for mutex_group in self._mutually_exclusive_groups: group_actions = mutex_group._group_actions for i, mutex_action in enumerate(mutex_group._group_actions): conflicts = action_conflicts.setdefault(mutex_action, []) conflicts.extend(group_actions[:i]) conflicts.extend(group_actions[i + 1:]) # find all option indices, and determine the arg_string_pattern # which has an 'O' if there is an option at an index, # an 'A' if there is an argument, or a '-' if there is a '--' option_string_indices = {} arg_string_pattern_parts = [] arg_strings_iter = iter(arg_strings) for i, arg_string in enumerate(arg_strings_iter): # all args after -- are non-options if arg_string == '--': arg_string_pattern_parts.append('-') for arg_string in arg_strings_iter: arg_string_pattern_parts.append('A') # otherwise, add the arg to the arg strings # and note the index if it was an option else: option_tuple = self._parse_optional(arg_string) if option_tuple is None: pattern = 'A' else: option_string_indices[i] = option_tuple pattern = 'O' arg_string_pattern_parts.append(pattern) # join the pieces together to form the pattern arg_strings_pattern = ''.join(arg_string_pattern_parts) # converts arg strings to the appropriate and then takes the action seen_actions = set() seen_non_default_actions = set() def take_action(action, argument_strings, option_string=None): seen_actions.add(action) argument_values = self._get_values(action, argument_strings) # error if this argument is not allowed with other previously # seen arguments, assuming that actions that use the default # value don't really count as "present" if argument_values is not action.default: seen_non_default_actions.add(action) for conflict_action in action_conflicts.get(action, []): if conflict_action in seen_non_default_actions: msg = _('not allowed with argument %s') action_name = _get_action_name(conflict_action) raise ArgumentError(action, msg % action_name) # take the action if we didn't receive a SUPPRESS value # (e.g. from a default) if argument_values is not SUPPRESS: action(self, namespace, argument_values, option_string) # function to convert arg_strings into an optional action def consume_optional(start_index): # get the optional identified at this index option_tuple = option_string_indices[start_index] action, option_string, explicit_arg = option_tuple # identify additional optionals in the same arg string # (e.g. -xyz is the same as -x -y -z if no args are required) match_argument = self._match_argument action_tuples = [] while True: # if we found no optional action, skip it if action is None: extras.append(arg_strings[start_index]) return start_index + 1 # if there is an explicit argument, try to match the # optional's string arguments to only this if explicit_arg is not None: arg_count = match_argument(action, 'A') # if the action is a single-dash option and takes no # arguments, try to parse more single-dash options out # of the tail of the option string chars = self.prefix_chars if arg_count == 0 and option_string[1] not in chars: action_tuples.append((action, [], option_string)) char = option_string[0] option_string = char + explicit_arg[0] new_explicit_arg = explicit_arg[1:] or None optionals_map = self._option_string_actions if option_string in optionals_map: action = optionals_map[option_string] explicit_arg = new_explicit_arg else: msg = _('ignored explicit argument %r') raise ArgumentError(action, msg % explicit_arg) # if the action expect exactly one argument, we've # successfully matched the option; exit the loop elif arg_count == 1: stop = start_index + 1 args = [explicit_arg] action_tuples.append((action, args, option_string)) break # error if a double-dash option did not use the # explicit argument else: msg = _('ignored explicit argument %r') raise ArgumentError(action, msg % explicit_arg) # if there is no explicit argument, try to match the # optional's string arguments with the following strings # if successful, exit the loop else: start = start_index + 1 selected_patterns = arg_strings_pattern[start:] arg_count = match_argument(action, selected_patterns) stop = start + arg_count args = arg_strings[start:stop] action_tuples.append((action, args, option_string)) break # add the Optional to the list and return the index at which # the Optional's string args stopped assert action_tuples for action, args, option_string in action_tuples: take_action(action, args, option_string) return stop # the list of Positionals left to be parsed; this is modified # by consume_positionals() positionals = self._get_positional_actions() # function to convert arg_strings into positional actions def consume_positionals(start_index): # match as many Positionals as possible match_partial = self._match_arguments_partial selected_pattern = arg_strings_pattern[start_index:] arg_counts = match_partial(positionals, selected_pattern) # slice off the appropriate arg strings for each Positional # and add the Positional and its args to the list for action, arg_count in zip(positionals, arg_counts): args = arg_strings[start_index: start_index + arg_count] start_index += arg_count take_action(action, args) # slice off the Positionals that we just parsed and return the # index at which the Positionals' string args stopped positionals[:] = positionals[len(arg_counts):] return start_index # consume Positionals and Optionals alternately, until we have # passed the last option string extras = [] start_index = 0 if option_string_indices: max_option_string_index = max(option_string_indices) else: max_option_string_index = -1 while start_index <= max_option_string_index: # consume any Positionals preceding the next option next_option_string_index = min([ index for index in option_string_indices if index >= start_index]) if start_index != next_option_string_index: positionals_end_index = consume_positionals(start_index) # only try to parse the next optional if we didn't consume # the option string during the positionals parsing if positionals_end_index > start_index: start_index = positionals_end_index continue else: start_index = positionals_end_index # if we consumed all the positionals we could and we're not # at the index of an option string, there were extra arguments if start_index not in option_string_indices: strings = arg_strings[start_index:next_option_string_index] extras.extend(strings) start_index = next_option_string_index # consume the next optional and any arguments for it start_index = consume_optional(start_index) # consume any positionals following the last Optional > stop_index = consume_positionals(start_index) action_conflicts = {} arg_string = 'missing_file.py' arg_string_pattern_parts = ['A', 'A'] arg_strings = ['serve', 'missing_file.py'] arg_strings_iter = arg_strings_pattern = 'AA' consume_optional = .consume_optional at 0x4004e4f400> consume_positionals = .consume_positionals at 0x4004e4fe20> extras = [] i = 1 max_option_string_index = -1 namespace = Namespace(command_name=None) option_string_indices = {} option_tuple = None pattern = 'A' positionals = [_SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command')] seen_actions = {_SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command')} seen_non_default_actions = set() self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=, conflict_handler='error', add_help=True) start_index = 0 take_action = .take_action at 0x4004e4fc70> /usr/lib/python3.10/argparse.py:2066: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ start_index = 2 def consume_positionals(start_index): # match as many Positionals as possible match_partial = self._match_arguments_partial selected_pattern = arg_strings_pattern[start_index:] arg_counts = match_partial(positionals, selected_pattern) # slice off the appropriate arg strings for each Positional # and add the Positional and its args to the list for action, arg_count in zip(positionals, arg_counts): args = arg_strings[start_index: start_index + arg_count] start_index += arg_count > take_action(action, args) action = _SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command') arg_count = 2 arg_counts = [2] arg_strings = ['serve', 'missing_file.py'] arg_strings_pattern = 'AA' args = ['serve', 'missing_file.py'] match_partial = , conflict_handler='error', add_help=True)> positionals = [_SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command')] selected_pattern = 'AA' self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=, conflict_handler='error', add_help=True) start_index = 2 take_action = .take_action at 0x4004e4fc70> /usr/lib/python3.10/argparse.py:2022: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ action = _SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command') argument_strings = ['serve', 'missing_file.py'], option_string = None def take_action(action, argument_strings, option_string=None): seen_actions.add(action) > argument_values = self._get_values(action, argument_strings) action = _SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command') action_conflicts = {} argument_strings = ['serve', 'missing_file.py'] namespace = Namespace(command_name=None) option_string = None seen_actions = {_SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command')} seen_non_default_actions = set() self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=, conflict_handler='error', add_help=True) /usr/lib/python3.10/argparse.py:1915: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=, conflict_handler='error', add_help=True) action = _SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command') arg_strings = ['serve', 'missing_file.py'] def _get_values(self, action, arg_strings): # for everything but PARSER, REMAINDER args, strip out first '--' if action.nargs not in [PARSER, REMAINDER]: try: arg_strings.remove('--') except ValueError: pass # optional argument produces a default when not present if not arg_strings and action.nargs == OPTIONAL: if action.option_strings: value = action.const else: value = action.default if isinstance(value, str): value = self._get_value(action, value) self._check_value(action, value) # when nargs='*' on a positional, if there were no command-line # args, use the default if it is anything other than None elif (not arg_strings and action.nargs == ZERO_OR_MORE and not action.option_strings): if action.default is not None: value = action.default else: value = arg_strings self._check_value(action, value) # single argument or optional argument produces a single value elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]: arg_string, = arg_strings value = self._get_value(action, arg_string) self._check_value(action, value) # REMAINDER arguments convert all values, checking none elif action.nargs == REMAINDER: value = [self._get_value(action, v) for v in arg_strings] # PARSER arguments convert all values, but check only the first elif action.nargs == PARSER: value = [self._get_value(action, v) for v in arg_strings] > self._check_value(action, value[0]) action = _SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command') arg_strings = ['serve', 'missing_file.py'] self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=, conflict_handler='error', add_help=True) value = ['serve', 'missing_file.py'] /usr/lib/python3.10/argparse.py:2456: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=, conflict_handler='error', add_help=True) action = _SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command') value = 'serve' def _check_value(self, action, value): # converted value must be one of the choices (if specified) if action.choices is not None and value not in action.choices: args = {'value': value, 'choices': ', '.join(map(repr, action.choices))} msg = _('invalid choice: %(value)r (choose from %(choices)s)') > raise ArgumentError(action, msg % args) E argparse.ArgumentError: argument command: invalid choice: 'serve' (choose from ) action = _SubParsersAction(option_strings=[], dest='command_name', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='command') args = {'choices': '', 'value': 'serve'} msg = 'invalid choice: %(value)r (choose from %(choices)s)' self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=, conflict_handler='error', add_help=True) value = 'serve' /usr/lib/python3.10/argparse.py:2503: ArgumentError During handling of the above exception, another exception occurred: self = def test_run(self): from pecan.commands import CommandRunner runner = CommandRunner() > self.assertRaises( RuntimeError, runner.run, ['serve', 'missing_file.py'] ) CommandRunner = runner = self = pecan/tests/test_commands.py:29: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pecan/commands/base.py:90: in run ns = self.parser.parse_args(args) /usr/lib/python3.10/argparse.py:1821: in parse_args args, argv = self.parse_known_args(args, namespace) /usr/lib/python3.10/argparse.py:1857: in parse_known_args self.error(str(err)) pecan/commands/base.py:25: in error self.exit(2, '%s: %s\n' % (self.prog, message)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def exit(self, status=0, message=None): if message: self._print_message(message, _sys.stderr) > _sys.exit(status) E SystemExit: 2 /usr/lib/python3.10/argparse.py:2565: SystemExit =============================== warnings summary =============================== pecan/core.py:331 /build/python-pecan/src/pecan-1.4.1/pecan/core.py:331: DeprecationWarning: invalid escape sequence '\*' ''' pecan/routing.py:49 /build/python-pecan/src/pecan-1.4.1/pecan/routing.py:49: DeprecationWarning: invalid escape sequence '\(' '^[0-9a-zA-Z-_$\(\)\.~!,;:*+@=]+$', route pecan/middleware/debug.py:24 /build/python-pecan/src/pecan-1.4.1/pecan/middleware/debug.py:24: DeprecationWarning: invalid escape sequence '\g' yield self.body_re.sub(b('\g<1>%s' % __CONFIG_HELP__), part) pecan/tests/test_commands.py: 2496 warnings /usr/lib/python3.10/site-packages/packaging/version.py:111: DeprecationWarning: Creating a LegacyVersion has been deprecated and will be removed in the next major release warnings.warn( pecan/tests/test_commands.py::TestCommandManager::test_commands /build/python-pecan/src/pecan-1.4.1/pecan/commands/create.py:27: RuntimeWarning: Unable to load scaffold base = pecan.scaffolds:BaseScaffold: The 'logutils>=0.3' distribution was not found and is required by the application warn( pecan/tests/test_commands.py::TestCommandManager::test_commands /build/python-pecan/src/pecan-1.4.1/pecan/commands/create.py:27: RuntimeWarning: Unable to load scaffold rest-api = pecan.scaffolds:RestAPIScaffold: The 'logutils>=0.3' distribution was not found and is required by the application warn( pecan/tests/test_commands.py::TestCommandManager::test_commands pecan/tests/test_commands.py::TestCommandRunner::test_commands pecan/tests/test_commands.py::TestCommandRunner::test_run /build/python-pecan/src/pecan-1.4.1/pecan/commands/base.py:51: RuntimeWarning: Unable to load plugin serve = pecan.commands:ServeCommand: The 'logutils>=0.3' distribution was not found and is required by the application warn("Unable to load plugin %s: %s" % (ep, e), RuntimeWarning) pecan/tests/test_commands.py::TestCommandManager::test_commands pecan/tests/test_commands.py::TestCommandRunner::test_commands pecan/tests/test_commands.py::TestCommandRunner::test_run /build/python-pecan/src/pecan-1.4.1/pecan/commands/base.py:51: RuntimeWarning: Unable to load plugin shell = pecan.commands:ShellCommand: The 'logutils>=0.3' distribution was not found and is required by the application warn("Unable to load plugin %s: %s" % (ep, e), RuntimeWarning) pecan/tests/test_commands.py::TestCommandManager::test_commands pecan/tests/test_commands.py::TestCommandRunner::test_commands pecan/tests/test_commands.py::TestCommandRunner::test_run /build/python-pecan/src/pecan-1.4.1/pecan/commands/base.py:51: RuntimeWarning: Unable to load plugin create = pecan.commands:CreateCommand: The 'logutils>=0.3' distribution was not found and is required by the application warn("Unable to load plugin %s: %s" % (ep, e), RuntimeWarning) pecan/tests/test_conf.py::TestConf::test_config_from_file pecan/tests/test_conf.py::TestConf::test_config_illegal_ids pecan/tests/test_conf.py::TestConf::test_config_with_bad_import pecan/tests/test_conf.py::TestConf::test_config_with_non_package_relative_import pecan/tests/test_conf.py::TestConf::test_update_force_dict pecan/tests/test_conf.py::TestConf::test_update_set_config pecan/tests/test_conf.py::TestConf::test_update_set_default_config pecan/tests/test_conf.py::TestGlobalConfig::test_overwrite_from_file pecan/tests/test_conf.py::TestGlobalConfig::test_paint_from_file :283: DeprecationWarning: the load_module() method is deprecated and slated for removal in Python 3.12; use exec_module() instead pecan/tests/test_no_thread_locals.py::TestRestController::test_custom_method_type pecan/tests/test_rest.py::TestRestController::test_basic_rest /usr/lib/python3.10/site-packages/webtest/lint.py:366: WSGIWarning: Unknown REQUEST_METHOD: 'RESET' warnings.warn( -- Docs: https://docs.pytest.org/en/stable/warnings.html =========================== short test summary info ============================ SKIPPED [1] pecan/tests/test_base.py:1815: Genshi not installed SKIPPED [1] pecan/tests/test_base.py:1848: Kajiki not installed FAILED pecan/tests/test_commands.py::TestCommandManager::test_commands - KeyE... FAILED pecan/tests/test_commands.py::TestCommandRunner::test_commands - KeyEr... FAILED pecan/tests/test_commands.py::TestCommandRunner::test_run - SystemExit: 2 ====== 3 failed, 539 passed, 2 skipped, 2521 warnings in 79.45s (0:01:19) ====== ==> ERROR: A failure occurred in check().  Aborting...