============================= 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 = <pecan.tests.test_commands.TestCommandManager testMethod=test_commands>

    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 = <class 'pecan.commands.base.CommandManager'>
CreateCommand = <class 'pecan.commands.create.CreateCommand'>
ServeCommand = <class 'pecan.commands.serve.ServeCommand'>
ShellCommand = <class 'pecan.commands.shell.ShellCommand'>
m          = <pecan.commands.base.CommandManager object at 0x40040d86d0>
self       = <pecan.tests.test_commands.TestCommandManager testMethod=test_commands>

pecan/tests/test_commands.py:10: KeyError
_______________________ TestCommandRunner.test_commands ________________________

self = <pecan.tests.test_commands.TestCommandRunner testMethod=test_commands>

    def test_commands(self):
        from pecan.commands import (
            ServeCommand, ShellCommand, CreateCommand, CommandRunner
        )
        runner = CommandRunner()
>       assert runner.commands['serve'] == ServeCommand
E       KeyError: 'serve'

CommandRunner = <class 'pecan.commands.base.CommandRunner'>
CreateCommand = <class 'pecan.commands.create.CreateCommand'>
ServeCommand = <class 'pecan.commands.serve.ServeCommand'>
ShellCommand = <class 'pecan.commands.shell.ShellCommand'>
runner     = <pecan.commands.base.CommandRunner object at 0x400501eb30>
self       = <pecan.tests.test_commands.TestCommandRunner testMethod=test_commands>

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=<class 'argparse.HelpFormatter'>, 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 = <list_iterator object at 0x4005102470>
arg_strings_pattern = 'AA'
consume_optional = <function ArgumentParser._parse_known_args.<locals>.consume_optional at 0x4004e4f400>
consume_positionals = <function ArgumentParser._parse_known_args.<locals>.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=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
start_index = 0
take_action = <function ArgumentParser._parse_known_args.<locals>.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 = <bound method ArgumentParser._match_arguments_partial of HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, 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=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
start_index = 2
take_action = <function ArgumentParser._parse_known_args.<locals>.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=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)

/usr/lib/python3.10/argparse.py:1915: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = HelpfulArgumentParser(prog='py.test', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, 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=<class 'argparse.HelpFormatter'>, 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=<class 'argparse.HelpFormatter'>, 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=<class 'argparse.HelpFormatter'>, 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 = <pecan.tests.test_commands.TestCommandRunner testMethod=test_run>

    def test_run(self):
        from pecan.commands import CommandRunner
        runner = CommandRunner()
>       self.assertRaises(
            RuntimeError,
            runner.run,
            ['serve', 'missing_file.py']
        )

CommandRunner = <class 'pecan.commands.base.CommandRunner'>
runner     = <pecan.commands.base.CommandRunner object at 0x4005102350>
self       = <pecan.tests.test_commands.TestCommandRunner testMethod=test_run>

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
  <frozen importlib._bootstrap>: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) ======
[1m[31m==> ERROR:[m[1m A failure occurred in check().[m
[1m    Aborting...[m
