Coverage report: 100%

Files Functions Classes

coverage.py v7.14.3, created at 2026-07-06 15:01 +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% 2 0 0   100% 0 0   100%
src/app/secure_system.py InMemoryUserRepository.save   100% 5 0 0   100% 2 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 ResilientDatabase.health_check   100% 8 0 0   100% 2 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 ResilientRedis.health_check   100% 7 0 0   100% 2 0   100%
src/taipanstack/bridges/db_bridge.py (no function)   100% 38 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 _execute_with_retries   100% 9 0 0   100% 6 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% 62 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_security_hooks   100% 12 0 0   100% 10 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% 14 0 0   100% 0 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% 11 0 0   100% 4 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% 49 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_free_threading_available   100% 9 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% 60 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 get_optimization_profile   100% 12 0 0   100% 6 0   100%
src/taipanstack/core/optimizations.py _apply_gc_tuning   100% 6 0 0   100% 0 0   100%
src/taipanstack/core/optimizations.py _apply_gc_freeze   100% 12 0 0   100% 6 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% 46 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% 11 0 0   100% 2 0   100%
src/taipanstack/core/result.py safe.async_wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/result.py safe.wrapper   100% 4 0 0   100% 0 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   100% 2 0 0   100% 0 0   100%
src/taipanstack/core/result.py safe_from.decorator   100% 9 0 0   100% 2 0   100%
src/taipanstack/core/result.py safe_from.decorator.async_wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/result.py safe_from.decorator.wrapper   100% 4 0 0   100% 0 0   100%
src/taipanstack/core/result.py _collect_list   100% 4 0 0   100% 0 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% 5 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% 19 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 AdaptiveCircuitBreaker.__init__   100% 12 0 0   100% 4 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._evaluate_trip   100% 9 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.evaluate_result   100% 4 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% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_breaker.py (no function)   100% 36 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_delay   100% 7 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.metrics   100% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/adaptive_retry.py (no function)   100% 27 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% 9 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._acquire_permit   100% 13 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py Bulkhead.execute   100% 17 0 0   100% 4 0   100%
src/taipanstack/resilience/adaptive/bulkhead.py (no function)   100% 24 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.with_bulkhead   100% 4 0 0   100% 2 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% 4 0 0   100% 2 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% 7 0 0   100% 0 0   100%
src/taipanstack/resilience/adaptive/orchestrator.py ResilienceOrchestrator._execute_with_bulkhead   100% 17 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._execute_with_timeout   100% 9 0 0   100% 2 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% 43 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 CircuitBreakerError.__init__   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreakerConfig._check_finite   100% 2 0 0   100% 2 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% 1 0 0   100% 0 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_elapsed_time   100% 9 0 0   100% 6 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._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% 2 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% 2 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% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.reset   100% 9 0 0   100% 0 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% 1 0 0   100% 0 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% 6 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.__call__   100% 9 0 0   100% 2 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.__call__.async_wrapper   100% 16 0 0   100% 4 0   100%
src/taipanstack/resilience/circuit_breaker.py CircuitBreaker.__call__.wrapper   100% 16 0 0   100% 4 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% 89 0 5   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 fallback   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py fallback.decorator   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py fallback.decorator.async_wrapper   100% 15 0 0   100% 6 0   100%
src/taipanstack/resilience/resilience.py fallback.decorator.sync_wrapper   100% 15 0 0   100% 6 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 timeout   100% 2 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py timeout.decorator   100% 7 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py timeout.decorator.async_wrapper   100% 13 0 0   100% 2 0   100%
src/taipanstack/resilience/resilience.py timeout.decorator.sync_wrapper   100% 20 0 0   100% 6 0   100%
src/taipanstack/resilience/resilience.py timeout.decorator.sync_wrapper.worker   100% 5 0 0   100% 0 0   100%
src/taipanstack/resilience/resilience.py (no function)   100% 17 0 10   100% 0 0   100%
src/taipanstack/resilience/retry.py _handle_retry_exception   100% 12 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% 2 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 _calculate_base_delay   100% 13 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 _apply_jitter   100% 9 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 retry   100% 4 0 0   100% 0 0   100%
src/taipanstack/resilience/retry.py retry.decorator   100% 9 0 0   100% 2 0   100%
src/taipanstack/resilience/retry.py retry.decorator.async_wrapper   100% 20 0 0   100% 10 0   100%
src/taipanstack/resilience/retry.py retry.decorator.wrapper   100% 20 0 0   100% 10 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._should_retry   100% 10 0 0   100% 6 0   100%
src/taipanstack/resilience/retry.py Retrier.__exit__   100% 7 0 0   100% 4 0   100%
src/taipanstack/resilience/retry.py (no function)   100% 58 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% 3 0 0   100% 0 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% 14 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 _parse_env   100% 11 0 0   100% 6 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% 6 0 0   100% 0 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% 25 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% 4 0 0   100% 0 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 _force_open_breaker   100% 12 0 0   100% 4 0   100%
src/taipanstack/resilience/watchdogs/health_pinger.py (no function)   100% 23 0 0   100% 0 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% 4 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% 25 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 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% 12 0 0   100% 6 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% 11 0 0   100% 6 0   100%
src/taipanstack/security/decorators.py timeout   100% 5 0 0   100% 2 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% 4 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 _timeout_with_thread   100% 12 0 0   100% 4 0   100%
src/taipanstack/security/decorators.py _timeout_with_thread.target   100% 4 0 0   100% 0 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% 8 0 0   100% 4 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% 8 0 0   100% 6 0   100%
src/taipanstack/security/decorators.py (no function)   100% 24 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 _clean_filename_end   100% 7 0 0   100% 4 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 _check_env_sensitive   100% 7 0 0   100% 6 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 _has_invalid_url_chars   100% 3 0 0   100% 2 0   100%
src/taipanstack/security/guards.py _check_ssrf_url_characters   100% 3 0 0   100% 2 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 _validate_ssrf_url_parse   100% 10 0 0   100% 4 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% 62 0 0   100% 0 0   100%
src/taipanstack/security/jwt.py encode_jwt   100% 7 0 0   100% 6 0   100%
src/taipanstack/security/jwt.py _validate_jwt_algorithms   100% 5 0 0   100% 6 0   100%
src/taipanstack/security/jwt.py _validate_jwt_audience   100% 2 0 0   100% 2 0   100%
src/taipanstack/security/jwt.py decode_jwt   100% 5 0 0   100% 2 0   100%
src/taipanstack/security/jwt.py (no function)   100% 14 0 2   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% 1 0 0   100% 0 0   100%
src/taipanstack/security/models.py _mask_collection   100% 9 0 0   100% 8 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% 22 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 verify_password   100% 11 0 0   100% 8 0   100%
src/taipanstack/security/password.py (no function)   100% 15 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 _validate_string_params   100% 6 0 0   100% 4 0   100%
src/taipanstack/security/sanitizers.py sanitize_string   100% 10 0 0   100% 4 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_filename_safe   100% 1 0 0   100% 0 0   100%
src/taipanstack/security/sanitizers.py _finalize_filename   100% 5 0 0   100% 4 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 _apply_base_dir_constraint   100% 12 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% 42 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% 20 0 0   100% 0 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 _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% 3 0 0   100% 2 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% 35 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 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% 8 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py cached.get_cache_key   100% 4 0 0   100% 0 0   100%
src/taipanstack/utils/cache.py cached.get_cache_key._make_hashable   100% 8 0 0   100% 6 0   100%
src/taipanstack/utils/cache.py cached.decorator   100% 7 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py cached.decorator.async_wrapper   100% 24 0 0   100% 6 0   100%
src/taipanstack/utils/cache.py cached.decorator.sync_wrapper   100% 9 0 0   100% 2 0   100%
src/taipanstack/utils/cache.py (no function)   100% 17 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_async_semaphore   100% 14 0 0   100% 4 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% 22 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_read_path_and_size   100% 11 0 0   100% 6 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% 16 0 0   100% 8 0   100%
src/taipanstack/utils/filesystem.py (no function)   100% 45 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 _redact_set   100% 9 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% 48 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.__init__   100% 9 0 0   100% 4 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% 2 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._apply_new_tokens   100% 11 0 0   100% 6 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._add_tokens   100% 13 0 0   100% 8 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._try_consume   100% 9 0 0   100% 6 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter._process_consumption   100% 7 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py RateLimiter.consume   100% 9 0 0   100% 4 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 rate_limit   100% 2 0 0   100% 0 0   100%
src/taipanstack/utils/rate_limit.py rate_limit.decorator   100% 8 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py rate_limit.decorator.async_wrapper   100% 6 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py rate_limit.decorator.wrapper   100% 7 0 0   100% 2 0   100%
src/taipanstack/utils/rate_limit.py (no function)   100% 26 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 _filter_environment   100% 5 0 0   100% 2 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 _validate_timeout   100% 2 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% 29 0 0   100% 0 0   100%
Total     100% 3989 0 147   100% 1104 0   100%

No items found using the specified filter.