Coverage report: 100%

Files Functions Classes

coverage.py v7.15.1, created at 2026-10-13 20:52 +0000

      Statements   Branches   Total
File function   coverage statements missing excluded   coverage branches partial   coverage
src/app/__init__.py (no function)   100% 1 0 0   100% 0 0   100%
src/app/main.py greet   100% 1 0 0   100% 0 0   100%
src/app/main.py main   100% 2 0 0   100% 0 0   100%
src/app/main.py (no function)   100% 5 0 2   100% 0 0   100%
src/app/secure_system.py UserNotFoundError.__init__   100% 2 0 0   100% 0 0   100%
src/app/secure_system.py UserAlreadyExistsError.__init__   100% 2 0 0   100% 0 0   100%
src/app/secure_system.py UserCreationError.__init__   100% 2 0 0   100% 0 0   100%
src/app/secure_system.py UserRepository.save   100% 0 0 7   100% 0 0   100%
src/app/secure_system.py UserRepository.get_by_id   100% 0 0 10   100% 0 0   100%
src/app/secure_system.py InMemoryUserRepository.__init__   100% 4 0 0   100% 0 0   100%
src/app/secure_system.py InMemoryUserRepository.save   100% 15 0 0   100% 6 0   100%
src/app/secure_system.py InMemoryUserRepository.get_by_id   100% 2 0 0   100% 0 0   100%
src/app/secure_system.py UserService.__init__   100% 1 0 0   100% 0 0   100%
src/app/secure_system.py UserService.create_user   100% 18 0 0   100% 4 0   100%
src/app/secure_system.py UserService.get_user   100% 6 0 0   100% 2 0   100%
src/app/secure_system.py (no function)   100% 36 0 4   100% 0 0   100%
src/taipanstack/__init__.py (no function)   100% 5 0 0   100% 0 0   100%
src/taipanstack/bridges/__init__.py (no function)   100% 5 0 0   100% 0 0   100%
src/taipanstack/bridges/_imports.py require_dependency   100% 6 0 0   100% 0 0   100%
src/taipanstack/bridges/_imports.py get_attr_or_err   100% 4 0 0   100% 0 0   100%
src/taipanstack/bridges/_imports.py (no function)   100% 5 0 0   100% 0 0   100%
src/taipanstack/bridges/db_bridge.py _breaker_is_open   100% 3 0 0   100% 2 0   100%
src/taipanstack/bridges/db_bridge.py ResilientDatabase.__init__   100% 3 0 0   100% 0 0   100%
src/taipanstack/bridges/db_bridge.py ResilientDatabase._check_db_dependencies   100% 3 0 0   100% 2 0   100%
src/taipanstack/bridges/db_bridge.py ResilientDatabase._check_breaker_gate   100% 5 0 0   100% 4 0   100%
src/taipanstack/bridges/db_bridge.py ResilientDatabase._handle_attempt_failure   100% 8 0 0   100% 4 0   100%
src/taipanstack/bridges/db_bridge.py ResilientDatabase._execute_single_attempt   100% 6 0 0   100% 0 0   100%
src/taipanstack/bridges/db_bridge.py ResilientDatabase._process_attempt   100% 6 0 0   100% 2 0   100%
src/taipanstack/bridges/db_bridge.py ResilientDatabase._execute_loop   100% 9 0 0   100% 6 0   100%
src/taipanstack/bridges/db_bridge.py ResilientDatabase.execute   100% 10 0 0   100% 6 0   100%
src/taipanstack/bridges/db_bridge.py ResilientRedis.__init__   100% 2 0 0   100% 0 0   100%
src/taipanstack/bridges/db_bridge.py ResilientRedis._check_redis_dependencies   100% 3 0 0   100% 2 0   100%
src/taipanstack/bridges/db_bridge.py ResilientRedis._check_breaker_gate   100% 5 0 0   100% 4 0   100%
src/taipanstack/bridges/db_bridge.py ResilientRedis._execute_command   100% 9 0 0   100% 2 0   100%
src/taipanstack/bridges/db_bridge.py ResilientRedis.execute   100% 7 0 0   100% 4 0   100%
src/taipanstack/bridges/db_bridge.py (no function)   100% 35 0 5   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py _check_circuit_breaker   100% 3 0 0   100% 2 0   100%
src/taipanstack/bridges/http_bridge.py _check_ssrf   100% 6 0 0   100% 4 0   100%
src/taipanstack/bridges/http_bridge.py _should_retry_status   100% 1 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py _handle_http_exception   100% 7 0 0   100% 4 0   100%
src/taipanstack/bridges/http_bridge.py _execute_single_attempt   100% 12 0 0   100% 4 0   100%
src/taipanstack/bridges/http_bridge.py _process_attempt_outcome   100% 5 0 0   100% 4 0   100%
src/taipanstack/bridges/http_bridge.py _get_max_attempts   100% 1 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py _execute_with_retries   100% 8 0 0   100% 4 0   100%
src/taipanstack/bridges/http_bridge.py _check_preconditions   100% 8 0 0   100% 6 0   100%
src/taipanstack/bridges/http_bridge.py safe_request   100% 7 0 0   100% 4 0   100%
src/taipanstack/bridges/http_bridge.py safe_request._do_request   100% 4 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.__init__   100% 7 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.__aenter__   100% 5 0 0   100% 2 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.__aexit__   100% 3 0 0   100% 2 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.request   100% 7 0 0   100% 4 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.request._do_request   100% 4 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.get   100% 1 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.post   100% 1 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.put   100% 1 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.delete   100% 1 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py SafeHttpClient.patch   100% 1 0 0   100% 0 0   100%
src/taipanstack/bridges/http_bridge.py (no function)   100% 64 0 4   100% 0 0   100%
src/taipanstack/bridges/web_bridge.py SecurityHeadersConfig.to_headers   100% 1 0 0   100% 0 0   100%
src/taipanstack/bridges/web_bridge.py result_to_response   100% 3 0 0   100% 2 0   100%
src/taipanstack/bridges/web_bridge.py _send_json_response   100% 6 0 0   100% 2 0   100%
src/taipanstack/bridges/web_bridge.py TaipanMiddleware.__init__   100% 4 0 0   100% 0 0   100%
src/taipanstack/bridges/web_bridge.py TaipanMiddleware._wrap_send_with_security_headers   100% 5 0 0   100% 2 0   100%
src/taipanstack/bridges/web_bridge.py TaipanMiddleware._wrap_send_with_security_headers.send_with_headers   100% 6 0 0   100% 2 0   100%
src/taipanstack/bridges/web_bridge.py TaipanMiddleware._handle_rate_limit   100% 6 0 0   100% 2 0   100%
src/taipanstack/bridges/web_bridge.py TaipanMiddleware.__call__   100% 11 0 0   100% 4 0   100%
src/taipanstack/bridges/web_bridge.py (no function)   100% 30 0 0   100% 0 0   100%
src/taipanstack/config/__init__.py (no function)   100% 3 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_ruff_config   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_mypy_config   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_pytest_config   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_coverage_config   100% 0 0 1   100% 0 0   100%
src/taipanstack/config/generators.py generate_pyproject_config   100% 3 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_bandit_hook   100% 2 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_pip_audit_hook   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_semgrep_hook   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_detect_secrets_hook   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _generate_paranoid_hooks   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/generators.py _collect_standard_security_hooks   100% 6 0 0   100% 6 0   100%
src/taipanstack/config/generators.py _collect_additional_security_hooks   100% 4 0 0   100% 4 0   100%
src/taipanstack/config/generators.py _collect_security_hooks   100% 4 0 0   100% 0 0   100%
src/taipanstack/config/generators.py generate_pre_commit_config   100% 2 0 0   100% 0 0   100%
src/taipanstack/config/generators.py generate_security_policy   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/generators.py (no function)   100% 16 0 0   100% 0 0   100%
src/taipanstack/config/models.py _check_python_version_format   100% 4 0 0   100% 2 0   100%
src/taipanstack/config/models.py _check_python_minimum_version   100% 4 0 0   100% 2 0   100%
src/taipanstack/config/models.py StackConfig.validate_project_name   100% 6 0 0   100% 2 0   100%
src/taipanstack/config/models.py StackConfig.validate_python_version   100% 5 0 0   100% 0 0   100%
src/taipanstack/config/models.py StackConfig.validate_project_dir   100% 6 0 0   100% 2 0   100%
src/taipanstack/config/models.py StackConfig.validate_config_consistency   100% 5 0 0   100% 2 0   100%
src/taipanstack/config/models.py StackConfig.to_target_version   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/models.py (no function)   100% 51 0 0   100% 0 0   100%
src/taipanstack/config/version_config.py VersionRecommendations.to_dict   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/version_config.py _get_311_recommendations   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/version_config.py _get_312_recommendations   100% 1 0 0   100% 0 0   100%
src/taipanstack/config/version_config.py _get_313_recommendations   100% 2 0 0   100% 0 0   100%
src/taipanstack/config/version_config.py _get_314_recommendations   100% 2 0 0   100% 0 0   100%
src/taipanstack/config/version_config.py get_version_recommendations   100% 7 0 0   100% 6 0   100%
src/taipanstack/config/version_config.py (no function)   100% 29 0 0   100% 0 0   100%
src/taipanstack/core/__init__.py (no function)   100% 3 0 0   100% 0 0   100%
src/taipanstack/core/compat.py _check_jit_available   100% 6 0 0   100% 2 0   100%
src/taipanstack/core/compat.py _check_nogil_flag   100% 6 0 0   100% 2 0   100%
src/taipanstack/core/compat.py _check_disable_gil_config   100% 5 0 0   100% 0 0   100%
src/taipanstack/core/compat.py _check_free_threading_available   100% 6 0 0   100% 4 0   100%
src/taipanstack/core/compat.py _check_mimalloc_available   100% 7 0 0   100% 2 0   100%
src/taipanstack/core/compat.py _check_tail_call_interpreter   100% 1 0 0   100% 0 0   100%
src/taipanstack/core/compat.py is_experimental_enabled   100% 5 0 0   100% 2 0   100%
src/taipanstack/core/compat.py get_optimization_level   100% 8 0 0   100% 2 0   100%
src/taipanstack/core/compat.py PythonFeatures.to_dict   100% 1 0 0   100% 0 0   100%
src/taipanstack/core/compat.py _get_version_tier   100% 7 0 0   100% 6 0   100%
src/taipanstack/core/compat.py _get_build_features   100% 1 0 0   100% 0 0   100%
src/taipanstack/core/compat.py _get_language_features   100% 1 0 0   100% 0 0   100%
src/taipanstack/core/compat.py get_features   100% 10 0 0   100% 2 0   100%
src/taipanstack/core/compat.py get_python_info   100% 2 0 0   100% 0 0   100%
src/taipanstack/core/compat.py (no function)   100% 62 0 0   100% 0 0   100%
src/taipanstack/core/optimizations.py OptimizationResult.to_dict   100% 1 0 0   100% 0 0   100%
src/taipanstack/core/optimizations.py _get_base_profile   100% 7 0 0   100% 6 0   100%
src/taipanstack/core/optimizations.py _build_aggressive_profile   100% 1 0 0   100% 0 0   100%
src/taipanstack/core/optimizations.py _determine_optimization_profile   100% 5 0 0   100% 4 0   100%
src/taipanstack/core/optimizations.py get_optimization_profile   100% 8 0 0   100% 2 0   100%
src/taipanstack/core/optimizations.py _apply_gc_tuning   100% 6 0 0   100% 0 0   100%
src/taipanstack/core/optimizations.py _should_skip_gc_freeze   100% 6 0 0   100% 4 0   100%
src/taipanstack/core/optimizations.py _apply_gc_freeze   100% 7 0 0   100% 2 0   100%
src/taipanstack/core/optimizations.py _apply_experimental   100% 8 0 0   100% 6 0   100%
src/taipanstack/core/optimizations.py _log_optimization_summary   100% 6 0 0   100% 6 0   100%
src/taipanstack/core/optimizations.py apply_optimizations   100% 16 0 0   100% 6 0   100%
src/taipanstack/core/optimizations.py get_recommended_thread_pool_size   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/optimizations.py (no function)   100% 48 0 0   100% 0 0   100%
src/taipanstack/core/result.py _safe_async_wrapper   100% 5 0 0   100% 0 0   100%
src/taipanstack/core/result.py _safe_async_wrapper.async_wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/result.py _safe_sync_wrapper   100% 5 0 0   100% 0 0   100%
src/taipanstack/core/result.py _safe_sync_wrapper.wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/result.py safe   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py safe   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py safe   100% 3 0 0   100% 2 0   100%
src/taipanstack/core/result.py SafeFromDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py SafeFromDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py _safe_from_async_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/core/result.py _safe_from_async_wrapper.async_wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/result.py _safe_from_sync_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/core/result.py _safe_from_sync_wrapper.wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/result.py safe_from   100% 2 0 0   100% 0 0   100%
src/taipanstack/core/result.py safe_from.decorator   100% 3 0 0   100% 2 0   100%
src/taipanstack/core/result.py _extract_ok_values   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/result.py _collect_list   100% 6 0 0   100% 4 0   100%
src/taipanstack/core/result.py _collect_iterable   100% 11 0 0   100% 6 0   100%
src/taipanstack/core/result.py collect_results   100% 6 0 0   100% 4 0   100%
src/taipanstack/core/result.py map_async   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py map_async   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py map_async   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py map_async   100% 3 0 0   100% 2 0   100%
src/taipanstack/core/result.py and_then_async   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py and_then_async   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py and_then_async   100% 0 0 1   100% 0 0   100%
src/taipanstack/core/result.py and_then_async   100% 3 0 0   100% 2 0   100%
src/taipanstack/core/result.py (no function)   100% 26 0 35   100% 0 0   100%
src/taipanstack/resilience/__init__.py (no function)   100% 6 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/__init__.py (no function)   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py _build_adaptive_metrics   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker.__init__   100% 8 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._validate_min_throughput   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._validate_recovery_timeout   100% 7 0 0   100% 6 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._calculate_elapsed_time   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._check_half_open_transition   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker.state   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._calculate_error_rate   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._get_safe_target_rate   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._transition_to_open   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._get_safe_min_throughput   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker._evaluate_trip   100% 10 0 0   100% 6 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker.record_success   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker.record_failure   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker.should_allow   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker.reset   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py AdaptiveCircuitBreaker.metrics   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py (no function)   100% 40 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry.__init__   100% 6 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry.record_outcome   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry._get_historical_delays   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry._calculate_fallback_delay   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry.get_delay   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry.to_retry_config   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry._calculate_delay_metrics   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry._compute_outcome_stats   100% 3 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry._get_outcome_stats   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py AdaptiveRetry.metrics   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py (no function)   100% 31 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py BulkheadFullError.__init__   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead.__init__   100% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._validate_max_concurrent   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._validate_max_queue   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._validate_timeout   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead.available_permits   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead.queued   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead.active   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._cleanup_acquire_task   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._get_acquire_coro   100% 6 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._close_coro_if_needed   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._wait_for_coro   100% 6 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._acquire_permit   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._attempt_acquire   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead._execute_with_permit   100% 9 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead.execute   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py _wait_for_permit_task   100% 9 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py (no function)   100% 36 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator.__init__   100% 8 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._validate_timeout_param   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator.with_bulkhead   100% 3 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator.with_circuit_breaker   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator.with_retry   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator.with_timeout   100% 3 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator.with_fallback   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._acquire_bulkhead   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._attempt_bulkhead_acquire   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._execute_bulkhead_inner   100% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._execute_with_bulkhead   100% 7 0 0   100% 4 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator.execute   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._evaluate_adaptive_breaker   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._evaluate_standard_breaker   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._evaluate_circuit_breaker   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._record_success_outcome   100% 6 0 0   100% 6 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._record_failure_outcome   100% 6 0 0   100% 6 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._calculate_retry_delay   100% 5 0 0   100% 4 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._execute_inner   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._handle_retry_failure   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._handle_circuit_breaker_open   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._execute_single_attempt   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._check_circuit_breaker_for_attempt   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._process_retry_attempt   100% 11 0 0   100% 6 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._execute_with_retries   100% 9 0 0   100% 6 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._run_fn_with_timeout   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._process_timeout_success_result   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._execute_with_timeout   100% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._apply_fallback   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py (no function)   100% 48 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreakerDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreakerDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py StructlogProtocol.error   100% 0 0 2   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py StructlogProtocol.warning   100% 0 0 2   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py _safe_str   100% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreakerError.__init__   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreakerConfig._check_finite   100% 5 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreakerConfig.__post_init__   100% 3 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._is_valid_metric   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._get_safe_threshold   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._check_finite_val   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._validate_thresholds   100% 3 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.__init__   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.state   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.failure_count   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._log_callback_failure   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._log_structlog_warning   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._notify_state_change   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._get_safe_timeout   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._calculate_safe_elapsed   100% 10 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._compute_elapsed   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._calculate_elapsed_time   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._transition_to_half_open   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._evaluate_open_timeout   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._get_valid_elapsed   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._handle_open_state   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._handle_attempt_half_open   100% 7 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._acquire_lock   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._safe_release   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._evaluate_state_for_attempt   100% 8 0 0   100% 6 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._should_attempt   100% 8 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._handle_success_half_open   100% 11 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._get_success_state_change   100% 7 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._record_success   100% 7 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._handle_failure_half_open   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._handle_failure_closed   100% 10 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._increment_failure_count   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._update_failure_metrics   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._get_failure_state_change   100% 5 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._is_excluded_exception   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._record_failure   100% 11 0 0   100% 6 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.reset   100% 15 0 0   100% 6 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._is_failure_exception   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._process_result   100% 8 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._is_valid_half_open_attempts   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._safe_decrement_half_open_attempts   100% 7 0 0   100% 6 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._decrement_half_open   100% 10 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._handle_exception_in_call   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._execute_async_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._execute_async_wrapper.async_wrapper   100% 10 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._execute_sync_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker._execute_sync_wrapper.wrapper   100% 10 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.__call__   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py circuit_breaker   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py circuit_breaker.decorator   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py (no function)   100% 101 0 12   100% 0 0   100%
src/taipanstack/resilience/resilience.py FallbackDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/resilience/resilience.py FallbackDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/resilience/resilience.py _handle_fallback_exception   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py _process_fallback_result   100% 5 0 0   100% 4 0   100%
src/taipanstack/resilience/resilience.py _run_fallback_async   100% 11 0 0   100% 4 0   100%
src/taipanstack/resilience/resilience.py _execute_fallback_async_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py _execute_fallback_async_wrapper.async_wrapper   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py _run_fallback_sync   100% 11 0 0   100% 4 0   100%
src/taipanstack/resilience/resilience.py _execute_fallback_sync_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py _execute_fallback_sync_wrapper.sync_wrapper   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py fallback   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py fallback.decorator   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py TimeoutDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/resilience/resilience.py TimeoutDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/resilience/resilience.py _handle_timeout_exception   100% 7 0 0   100% 6 0   100%
src/taipanstack/resilience/resilience.py _is_valid_timeout_value   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py _validate_timeout   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py _run_async_with_timeout   100% 8 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py _execute_timeout_async_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py _execute_timeout_async_wrapper.async_wrapper   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py _process_sync_timeout_result   100% 8 0 0   100% 6 0   100%
src/taipanstack/resilience/resilience.py _run_sync_with_timeout   100% 10 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py _run_sync_with_timeout.worker   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py _execute_timeout_sync_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py _execute_timeout_sync_wrapper.sync_wrapper   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py timeout   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py timeout.decorator   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py (no function)   100% 35 0 10   100% 0 0   100%
src/taipanstack/resilience/retry.py _safe_str   100% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _is_retryable_exception   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _handle_retry_exception   100% 9 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py RetryDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/resilience/retry.py RetryDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/resilience/retry.py _validate_finite_or_default   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py RetryConfig.__post_init__   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py RetryError.__init__   100% 3 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _is_valid_number   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _compute_exponential_delay   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _calculate_base_delay   100% 9 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py _compute_jitter_amount   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _add_jitter_to_delay   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _apply_jitter   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py calculate_delay   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _log_retry_callback_failure   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _log_retry_attempt_fallback   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _invoke_retry_callback   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _log_retry_attempt   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _log_all_failed   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _raise_retry_error   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _ensure_tuple   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py _validate_retry_exceptions   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py _is_critical_sleep_exception   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _sleep_for_retry_async   100% 9 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _sleep_for_retry_sync   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _process_retry_attempt_async   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _process_retry_attempt_sync   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _check_result_for_retry   100% 4 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py _get_max_attempts   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _handle_retry_failure_result   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py _handle_retry_exception_sync   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py _handle_retry_exception_async   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py _run_retry_async   100% 14 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py _execute_async_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _execute_async_wrapper.async_wrapper   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _run_retry_sync   100% 14 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py _execute_sync_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py _execute_sync_wrapper.wrapper   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py retry   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py retry.decorator   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py retry_on_exception   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py Retrier.__init__   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py Retrier.__enter__   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py Retrier._increment_attempt   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py Retrier._is_matching_exception   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py Retrier._should_retry   100% 5 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py Retrier._handle_exception   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py Retrier._sleep_for_retry   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py Retrier.__exit__   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py (no function)   100% 82 0 5   100% 0 0   100%
src/taipanstack/resilience/watchdogs/__init__.py (no function)   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/_base.py BaseWatcher.__init__   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/_base.py BaseWatcher.is_running   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/_base.py BaseWatcher.start   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/_base.py BaseWatcher.stop   100% 8 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/_base.py BaseWatcher._loop   100% 9 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/_base.py BaseWatcher._run   100% 0 0 5   100% 0 0   100%
src/taipanstack/resilience/watchdogs/_base.py BaseWatcher._get_extra_repr   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/_base.py BaseWatcher.__repr__   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/_base.py (no function)   100% 15 0 2   100% 0 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py _hash_file   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py _is_valid_env_line   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py _parse_env_line   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py _parse_env   100% 7 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py _parse_json   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py _read_file_content   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py _parse_content_by_extension   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py _load_file_data   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py validate_config   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py ConfigWatcher.__init__   100% 8 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py ConfigWatcher._process_hash_result   100% 6 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py ConfigWatcher._detect_changes   100% 7 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py ConfigWatcher._handle_validation_success   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py ConfigWatcher._handle_validation_failure   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py ConfigWatcher._validate_and_apply   100% 7 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py ConfigWatcher._run   100% 5 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/config_watcher.py (no function)   100% 28 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py check_target   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py check_all   100% 8 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py HealthPinger.__init__   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py HealthPinger._process_target   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py HealthPinger._check_and_open_breaker   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py HealthPinger._notify_health_change   100% 5 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py HealthPinger._update_target_status   100% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py HealthPinger._run   100% 1 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py _simulate_failures_to_open   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py _force_state_to_open   100% 11 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py _force_open_breaker   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py (no function)   100% 26 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py _validate_interval   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py _validate_threshold   100% 2 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py check_resources   100% 5 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py ResourceWatcher.__init__   100% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py ResourceWatcher.start   100% 3 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py ResourceWatcher._check_threshold   100% 4 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py ResourceWatcher._handle_snapshot   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py ResourceWatcher._run   100% 4 0 0   100% 2 0   100%
src/taipanstack/resilience/watchdogs/resource_watcher.py (no function)   100% 28 0 0   100% 0 0   100%
src/taipanstack/security/__init__.py (no function)   100% 9 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py _apply_single_validator   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py _validate_bound_arguments   100% 7 0 0   100% 6 0   100%
src/taipanstack/security/decorators.py _handle_guarded_exception   100% 7 0 0   100% 6 0   100%
src/taipanstack/security/decorators.py _check_bound_types   100% 5 0 0   100% 6 0   100%
src/taipanstack/security/decorators.py OperationTimeoutError.__init__   100% 3 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py ValidationError.__init__   100% 3 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py validate_inputs   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py validate_inputs.decorator   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py validate_inputs.decorator.wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py guard_exceptions   100% 3 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py guard_exceptions.decorator   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py guard_exceptions.decorator.wrapper   100% 5 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py _validate_timeout_seconds   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/decorators.py _is_signal_supported   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py timeout   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py timeout.decorator   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py timeout.decorator.wrapper   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/decorators.py _timeout_with_signal   100% 7 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py _timeout_with_signal.handler   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py _check_thread_timeout   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/decorators.py _check_thread_exception   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/decorators.py _timeout_with_thread   100% 10 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py _timeout_with_thread.target   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py _build_deprecation_message   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/decorators.py deprecated   100% 3 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py deprecated.decorator   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py deprecated.decorator.wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py require_type   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py require_type.decorator   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py require_type.decorator.wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/decorators.py (no function)   100% 33 0 0   100% 0 0   100%
src/taipanstack/security/guards.py SecurityError.__init__   100% 3 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _check_traversal_patterns   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _resolve_and_check_bounds   100% 8 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_symlink_safety   100% 9 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _check_path_types   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _check_path_lengths   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _validate_path_types   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _check_path_null_bytes   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _resolve_base_dir   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py guard_path_traversal   100% 9 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_command_not_empty   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_command_null_bytes   100% 3 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _check_command_patterns   100% 7 0 0   100% 6 0   100%
src/taipanstack/security/guards.py _check_allowed_commands   100% 7 0 0   100% 4 0   100%
src/taipanstack/security/guards.py guard_command_injection   100% 6 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _check_filename_null_bytes   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _is_invalid_filename_end_char   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _clean_filename_end   100% 4 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _normalize_ext   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _check_denied_extension   100% 5 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _check_allowed_extension   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/guards.py guard_file_extension   100% 10 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_env_denied   100% 5 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _is_env_allowed   100% 4 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_env_sensitive   100% 5 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _check_env_var_type   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_env_var_length   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_env_var_content   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _validate_env_var_name   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/guards.py guard_env_variable   100% 8 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_ssrf_url_length   100% 7 0 0   100% 6 0   100%
src/taipanstack/security/guards.py _is_invalid_url_char   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _has_invalid_url_chars   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _fully_unquote_url   100% 7 0 0   100% 4 0   100%
src/taipanstack/security/guards.py _check_ssrf_url_characters   100% 8 0 0   100% 6 0   100%
src/taipanstack/security/guards.py _validate_ssrf_url_type_and_length   100% 4 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _create_ssrf_error   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _is_scheme_allowed   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _has_obfuscated_hostname   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _validate_parsed_ssrf_url   100% 7 0 0   100% 6 0   100%
src/taipanstack/security/guards.py _validate_ssrf_url_parse   100% 5 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _validate_ssrf_url   100% 4 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _is_ip_address_unsafe_bounds   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _is_ip_address_safe   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _is_ip_safe   100% 5 0 0   100% 0 0   100%
src/taipanstack/security/guards.py _check_ip_safety   100% 9 0 0   100% 4 0   100%
src/taipanstack/security/guards.py guard_ssrf   100% 7 0 0   100% 4 0   100%
src/taipanstack/security/guards.py (no function)   100% 69 0 0   100% 0 0   100%
src/taipanstack/security/jwt.py _validate_encode_payload   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/jwt.py _validate_encode_secret   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/jwt.py _validate_encode_algorithm   100% 7 0 0   100% 6 0   100%
src/taipanstack/security/jwt.py encode_jwt   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/jwt.py _check_disallowed_algorithm   100% 8 0 0   100% 6 0   100%
src/taipanstack/security/jwt.py _validate_jwt_algorithms   100% 6 0 0   100% 6 0   100%
src/taipanstack/security/jwt.py _validate_jwt_audience_item   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/jwt.py _validate_jwt_audience_collection   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/jwt.py _validate_jwt_audience   100% 8 0 0   100% 6 0   100%
src/taipanstack/security/jwt.py decode_jwt   100% 7 0 0   100% 4 0   100%
src/taipanstack/security/jwt.py (no function)   100% 24 0 2   100% 0 0   100%
src/taipanstack/security/models.py _is_sensitive_key   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/models.py _mask_dict   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/models.py _mask_list   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/models.py _mask_tuple   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/models.py _mask_set   100% 12 0 0   100% 4 0   100%
src/taipanstack/security/models.py _mask_sequence   100% 7 0 0   100% 6 0   100%
src/taipanstack/security/models.py _mask_collection   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/models.py _mask_data   100% 5 0 0   100% 4 0   100%
src/taipanstack/security/models.py SecureBaseModel.__str__   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/models.py SecureBaseModel.__repr_args__   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/models.py SecureBaseModel.model_dump   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/models.py SecureBaseModel.model_dump_json   100% 5 0 0   100% 2 0   100%
src/taipanstack/security/models.py (no function)   100% 25 0 2   100% 0 0   100%
src/taipanstack/security/password.py _get_password_str   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/password.py hash_password   100% 8 0 0   100% 4 0   100%
src/taipanstack/security/password.py _verify_legacy_pbkdf2   100% 14 0 0   100% 4 0   100%
src/taipanstack/security/password.py _verify_argon2   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/password.py _is_valid_password_string   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/password.py verify_password   100% 9 0 0   100% 6 0   100%
src/taipanstack/security/password.py (no function)   100% 16 0 0   100% 0 0   100%
src/taipanstack/security/sanitizers.py _handle_html   100% 6 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _handle_unicode   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _check_string_length   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _check_max_length_param   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _is_valid_max_length_type   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _validate_string_params   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _enforce_max_length   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py sanitize_string   100% 8 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _get_filename_from_path   100% 4 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _has_valid_extension   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/sanitizers.py _extract_stem_and_suffix   100% 7 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _remove_invalid_chars   100% 10 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _collapse_replacements   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _truncate_filename   100% 8 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _is_valid_length_and_not_dot   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _has_safe_characters   100% 5 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _is_filename_safe   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _handle_reserved_names   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _finalize_filename   100% 4 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _check_filename_type_str   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _check_filename_types   100% 5 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _check_filename_length   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _validate_filename_params   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/sanitizers.py sanitize_filename   100% 9 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _get_stem   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/sanitizers.py _is_safe_path_part   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/sanitizers.py _handle_dot_dot   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _handle_normal_part   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _process_path_part   100% 4 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _clean_path_parts   100% 5 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _resolve_sanitized_path   100% 5 0 0   100% 0 0   100%
src/taipanstack/security/sanitizers.py _apply_base_dir_constraint   100% 8 0 0   100% 6 0   100%
src/taipanstack/security/sanitizers.py _process_string_path   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _check_pathlike_length   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py _normalize_path_input   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _reconstruct_path   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py _validate_path_depth   100% 4 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py sanitize_path   100% 7 0 0   100% 2 0   100%
src/taipanstack/security/sanitizers.py (no function)   100% 47 0 0   100% 0 0   100%
src/taipanstack/security/types.py _validate_safe_url   100% 4 0 0   100% 2 0   100%
src/taipanstack/security/types.py _validate_safe_path   100% 5 0 0   100% 0 0   100%
src/taipanstack/security/types.py _validate_safe_command   100% 5 0 0   100% 0 0   100%
src/taipanstack/security/types.py _validate_safe_project_name   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/types.py _validate_safe_url_format   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/types.py (no function)   100% 18 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _get_type_name   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/validators.py _validate_type   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _check_project_name_length   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _build_project_name_pattern   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _build_invalid_chars_msg   100% 3 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _check_project_name_chars   100% 7 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _check_project_name_reserved   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/validators.py validate_project_name   100% 8 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _check_version_string_safety   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _check_version_regex_pattern   100% 7 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _check_version_format   100% 2 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _check_version_numbers   100% 11 0 0   100% 4 0   100%
src/taipanstack/security/validators.py validate_python_version   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _has_control_chars   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _has_invalid_chars   100% 5 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _check_email_basics   100% 9 0 0   100% 6 0   100%
src/taipanstack/security/validators.py _check_email_format   100% 5 0 0   100% 2 0   100%
src/taipanstack/security/validators.py _check_email_parts   100% 7 0 0   100% 4 0   100%
src/taipanstack/security/validators.py validate_email   100% 4 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _check_url_length   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _has_invalid_url_chars   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _fully_unquote_url   100% 8 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _check_url_characters   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/validators.py _check_url_basics   100% 3 0 0   100% 0 0   100%
src/taipanstack/security/validators.py _check_scheme   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/validators.py _check_tld   100% 5 0 0   100% 2 0   100%
src/taipanstack/security/validators.py _check_url_domain   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/validators.py validate_url   100% 9 0 0   100% 0 0   100%
src/taipanstack/security/validators.py (no function)   100% 40 0 0   100% 0 0   100%
src/taipanstack/utils/__init__.py (no function)   100% 11 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _check_cache   100% 7 0 0   100% 4 0   100%
src/taipanstack/utils/cache.py _update_cache   100% 5 0 0   100% 4 0   100%
src/taipanstack/utils/cache.py _hash_sequence   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _hash_dict   100% 3 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _hash_set   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _make_hashable   100% 8 0 0   100% 6 0   100%
src/taipanstack/utils/cache.py _get_cache_key   100% 3 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _is_valid_ttl_type   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _is_valid_ttl_value   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _validate_ttl   100% 2 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py _validate_max_size   100% 2 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py _validate_ttl_max_size   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _get_or_create_lock   100% 5 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py _release_lock   100% 4 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py _execute_cached_async_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _execute_cached_async_wrapper.async_wrapper   100% 16 0 0   100% 4 0   100%
src/taipanstack/utils/cache.py _execute_cached_sync_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py _execute_cached_sync_wrapper.sync_wrapper   100% 8 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py CacheDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/utils/cache.py CacheDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/utils/cache.py cached   100% 6 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py cached.decorator   100% 5 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py (no function)   100% 34 0 8   100% 0 0   100%
src/taipanstack/utils/circuit_breaker.py (no function)   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/concurrency.py OverloadError.__init__   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/concurrency.py ConcurrencyLimitDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/utils/concurrency.py ConcurrencyLimitDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/utils/concurrency.py _acquire_with_timeout   100% 6 0 0   100% 0 0   100%
src/taipanstack/utils/concurrency.py _acquire_no_timeout   100% 4 0 0   100% 2 0   100%
src/taipanstack/utils/concurrency.py _acquire_async_semaphore   100% 6 0 0   100% 2 0   100%
src/taipanstack/utils/concurrency.py _handle_async_concurrency   100% 4 0 0   100% 0 0   100%
src/taipanstack/utils/concurrency.py _handle_async_concurrency.async_wrapper   100% 6 0 0   100% 2 0   100%
src/taipanstack/utils/concurrency.py _acquire_sync_semaphore   100% 9 0 0   100% 4 0   100%
src/taipanstack/utils/concurrency.py _handle_sync_concurrency   100% 4 0 0   100% 0 0   100%
src/taipanstack/utils/concurrency.py _handle_sync_concurrency.wrapper   100% 6 0 0   100% 2 0   100%
src/taipanstack/utils/concurrency.py _validate_max_tasks   100% 2 0 0   100% 2 0   100%
src/taipanstack/utils/concurrency.py _validate_timeout   100% 2 0 0   100% 2 0   100%
src/taipanstack/utils/concurrency.py _validate_limit_concurrency_args   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/concurrency.py limit_concurrency   100% 3 0 0   100% 0 0   100%
src/taipanstack/utils/concurrency.py limit_concurrency.decorator   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/concurrency.py (no function)   100% 24 0 8   100% 0 0   100%
src/taipanstack/utils/context.py get_correlation_id   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/context.py set_correlation_id   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/context.py correlation_scope   100% 4 0 0   100% 0 0   100%
src/taipanstack/utils/context.py (no function)   100% 9 0 0   100% 0 0   100%
src/taipanstack/utils/filesystem.py FileNotFoundErr.message   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/filesystem.py NotAFileErr.message   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/filesystem.py _validate_path   100% 7 0 0   100% 4 0   100%
src/taipanstack/utils/filesystem.py FileTooLargeErr.message   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/filesystem.py _check_file_size   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/filesystem.py _check_read_path_and_size   100% 7 0 0   100% 2 0   100%
src/taipanstack/utils/filesystem.py safe_read   100% 9 0 0   100% 2 0   100%
src/taipanstack/utils/filesystem.py _validate_safe_write_path   100% 7 0 0   100% 4 0   100%
src/taipanstack/utils/filesystem.py _sanitize_write_path   100% 4 0 0   100% 2 0   100%
src/taipanstack/utils/filesystem.py _perform_atomic_write   100% 15 0 0   100% 4 0   100%
src/taipanstack/utils/filesystem.py _prepare_write_dir   100% 2 0 0   100% 2 0   100%
src/taipanstack/utils/filesystem.py _create_write_backup   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/filesystem.py safe_write   100% 10 0 0   100% 2 0   100%
src/taipanstack/utils/filesystem.py ensure_dir   100% 7 0 0   100% 2 0   100%
src/taipanstack/utils/filesystem.py _get_missing_parents   100% 11 0 0   100% 6 0   100%
src/taipanstack/utils/filesystem.py (no function)   100% 47 0 0   100% 0 0   100%
src/taipanstack/utils/logging.py _is_sensitive   100% 5 0 0   100% 4 0   100%
src/taipanstack/utils/logging.py _redact_mapping   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/logging.py _redact_list   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/logging.py _redact_tuple   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/logging.py _is_unhashable   100% 5 0 0   100% 0 0   100%
src/taipanstack/utils/logging.py _redact_set   100% 5 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py _redact_iterable   100% 7 0 0   100% 6 0   100%
src/taipanstack/utils/logging.py _redact_collection   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py _redact   100% 7 0 0   100% 6 0   100%
src/taipanstack/utils/logging.py _redact_dict   100% 6 0 0   100% 6 0   100%
src/taipanstack/utils/logging.py mask_sensitive_data_processor   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/logging.py correlation_id_processor   100% 4 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.__init__   100% 9 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.bind   100% 4 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.unbind   100% 5 0 0   100% 4 0   100%
src/taipanstack/utils/logging.py StackLogger._format_message   100% 6 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.debug   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.info   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.warning   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.error   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.critical   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py StackLogger.exception   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py _configure_structlog   100% 5 0 0   100% 4 0   100%
src/taipanstack/utils/logging.py _get_log_format   100% 5 0 0   100% 4 0   100%
src/taipanstack/utils/logging.py setup_logging   100% 8 0 0   100% 4 0   100%
src/taipanstack/utils/logging.py get_logger   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/logging.py log_operation   100% 3 0 0   100% 0 0   100%
src/taipanstack/utils/logging.py log_operation._log_context   100% 15 0 0   100% 2 0   100%
src/taipanstack/utils/logging.py (no function)   100% 51 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimitError.__init__   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._is_finite_number   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._validate_finite   100% 2 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._validate_positive   100% 4 0 0   100% 4 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._validate_init_params   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter.__init__   100% 6 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._is_valid_time_window   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._is_valid_capacity   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._is_valid_bucket_state   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._calculate_new_tokens   100% 5 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._validate_token_types   100% 4 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._update_tokens_value   100% 10 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._apply_new_tokens   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._calculate_elapsed   100% 9 0 0   100% 4 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._add_tokens   100% 12 0 0   100% 8 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._check_tokens_validity   100% 6 0 0   100% 4 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._try_consume   100% 10 0 0   100% 4 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._get_current_time   100% 4 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._validate_and_add_tokens   100% 7 0 0   100% 6 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._process_consumption   100% 4 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._is_valid_token_amount   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._acquire_lock_safe   100% 4 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter.consume   100% 10 0 0   100% 6 0   100%
src/taipanstack/utils/rate_limit.py RateLimitDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimitDecorator.__call__   100% 0 0 1   100% 0 0   100%
src/taipanstack/utils/rate_limit.py _async_rate_limit_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py _async_rate_limit_wrapper.async_wrapper   100% 6 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py _sync_rate_limit_wrapper   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py _sync_rate_limit_wrapper.wrapper   100% 6 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py rate_limit   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py rate_limit.decorator   100% 6 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py (no function)   100% 43 0 8   100% 0 0   100%
src/taipanstack/utils/resilience.py (no function)   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/retry.py (no function)   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/serialization.py default_encoder   100% 7 0 0   100% 6 0   100%
src/taipanstack/utils/serialization.py (no function)   100% 3 0 0   100% 0 0   100%
src/taipanstack/utils/subprocess.py SafeCommandResult.success   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/subprocess.py SafeCommandResult.raise_on_error   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/subprocess.py _validate_and_resolve_command   100% 11 0 0   100% 6 0   100%
src/taipanstack/utils/subprocess.py _get_allowed_keys   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/subprocess.py _get_env_to_filter   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/subprocess.py _build_filtered_env   100% 3 0 0   100% 2 0   100%
src/taipanstack/utils/subprocess.py _filter_environment   100% 3 0 0   100% 0 0   100%
src/taipanstack/utils/subprocess.py _extract_timeout_stdout   100% 5 0 0   100% 4 0   100%
src/taipanstack/utils/subprocess.py _execute_command   100% 8 0 0   100% 0 0   100%
src/taipanstack/utils/subprocess.py _validate_cwd   100% 6 0 0   100% 4 0   100%
src/taipanstack/utils/subprocess.py _handle_dry_run   100% 1 0 0   100% 0 0   100%
src/taipanstack/utils/subprocess.py _check_timeout_type   100% 2 0 0   100% 2 0   100%
src/taipanstack/utils/subprocess.py _check_timeout_value   100% 2 0 0   100% 2 0   100%
src/taipanstack/utils/subprocess.py _validate_timeout   100% 4 0 0   100% 2 0   100%
src/taipanstack/utils/subprocess.py run_safe_command   100% 10 0 0   100% 4 0   100%
src/taipanstack/utils/subprocess.py (no function)   100% 33 0 0   100% 0 0   100%
Total     100% 4551 0 158   100% 1264 0   100%

No items found using the specified filter.