Coverage report: 100%

Files Functions Classes

coverage.py v7.13.5, created at 2026-05-12 21:18 +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% 1 0 0   100% 0 0   100%
src / app / secure_system.py InMemoryUserRepository.save   100% 1 0 0   100% 0 0   100%
src / app / secure_system.py InMemoryUserRepository.get_by_id   100% 1 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% 11 0 0   100% 0 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% 35 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._handle_attempt_failure   100% 8 0 0   100% 4 0   100%
src / taipanstack / bridges / db_bridge.py ResilientDatabase._execute_loop   100% 12 0 0   100% 4 0   100%
src / taipanstack / bridges / db_bridge.py ResilientDatabase.execute   100% 10 0 0   100% 8 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.execute   100% 15 0 0   100% 8 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% 31 0 3   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% 8 0 0   100% 6 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 safe_request   100% 11 0 0   100% 8 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% 11 0 0   100% 8 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% 60 0 2   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% 5 0 0   100% 4 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_safety_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 generate_pre_commit_config   100% 12 0 0   100% 10 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% 13 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% 30 0 2   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% 10 0 0   100% 4 0   100%
src / taipanstack / core / compat.py _check_mimalloc_available   100% 8 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% 3 0 0   100% 0 0   100%
src / taipanstack / core / compat.py (no function)   100% 59 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% 14 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% 8 0 0   100% 4 0   100%
src / taipanstack / core / optimizations.py _apply_experimental   100% 8 0 0   100% 6 0   100%
src / taipanstack / core / optimizations.py apply_optimizations   100% 21 0 0   100% 12 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% 45 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_results   100% 15 0 0   100% 10 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% 8 0 0   100% 4 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% 8 0 0   100% 4 0   100%
src / taipanstack / core / result.py (no function)   100% 18 0 34   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% 10 0 0   100% 2 0   100%
src / taipanstack / resilience / adaptive / adaptive_breaker.py AdaptiveCircuitBreaker.state   100% 7 0 0   100% 4 0   100%
src / taipanstack / resilience / adaptive / adaptive_breaker.py AdaptiveCircuitBreaker._evaluate_trip   100% 11 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% 6 0 0   100% 4 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% 31 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.metrics   100% 13 0 0   100% 2 0   100%
src / taipanstack / resilience / adaptive / adaptive_retry.py (no function)   100% 26 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.execute   100% 20 0 0   100% 2 0   100%
src / taipanstack / resilience / adaptive / bulkhead.py (no function)   100% 21 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.execute   100% 20 0 0   100% 4 0   100%
src / taipanstack / resilience / adaptive / orchestrator.py ResilienceOrchestrator._evaluate_circuit_breaker   100% 6 0 0   100% 6 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% 5 0 0   100% 2 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._execute_with_retries   100% 14 0 0   100% 8 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% 7 0 0   100% 6 0   100%
src / taipanstack / resilience / adaptive / orchestrator.py (no function)   100% 34 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.__post_init__   100% 6 0 0   100% 6 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._notify_state_change   100% 7 0 0   100% 4 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker._handle_open_state   100% 14 0 0   100% 4 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker._handle_attempt_half_open   100% 9 0 0   100% 4 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker._should_attempt   100% 13 0 0   100% 8 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker._handle_success_half_open   100% 13 0 0   100% 4 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker._record_success   100% 11 0 0   100% 8 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% 14 0 0   100% 4 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker._update_failure_metrics   100% 8 0 0   100% 4 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker._record_failure   100% 14 0 0   100% 10 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker.reset   100% 6 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._decrement_half_open   100% 7 0 0   100% 4 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% 10 0 0   100% 2 0   100%
src / taipanstack / resilience / circuit_breaker.py CircuitBreaker.__call__.wrapper   100% 10 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% 70 0 4   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% 11 0 0   100% 4 0   100%
src / taipanstack / resilience / resilience.py fallback.decorator.sync_wrapper   100% 11 0 0   100% 4 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% 7 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 8   100% 0 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 _apply_jitter   100% 12 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 retry   100% 3 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% 22 0 0   100% 10 0   100%
src / taipanstack / resilience / retry.py retry.decorator.wrapper   100% 22 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.__exit__   100% 16 0 0   100% 8 0   100%
src / taipanstack / resilience / retry.py (no function)   100% 52 0 4   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% 0 0 5   100% 0 0   100%
src / taipanstack / resilience / watchdogs / _base.py (no function)   100% 13 0 3   100% 0 0   100%
src / taipanstack / resilience / watchdogs / config_watcher.py _hash_file   100% 5 0 0   100% 0 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 _load_file_data   100% 10 0 0   100% 4 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% 9 0 0   100% 6 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% 11 0 0   100% 8 0   100%
src / taipanstack / resilience / watchdogs / config_watcher.py ConfigWatcher._run   100% 7 0 0   100% 6 0   100%
src / taipanstack / resilience / watchdogs / config_watcher.py (no function)   100% 22 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% 10 0 0   100% 6 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% 8 0 0   100% 4 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% 4 0 0   100% 2 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% 6 0 0   100% 4 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 ValidatorFunc.__call__   100% 0 0 2   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% 27 0 1   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 guard_path_traversal   100% 9 0 0   100% 4 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 guard_env_variable   100% 13 0 0   100% 8 0   100%
src / taipanstack / security / guards.py _validate_ssrf_url_type_and_length   100% 7 0 0   100% 6 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_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% 47 0 0   100% 0 0   100%
src / taipanstack / security / jwt.py encode_jwt   100% 3 0 0   100% 2 0   100%
src / taipanstack / security / jwt.py decode_jwt   100% 3 0 0   100% 2 0   100%
src / taipanstack / security / jwt.py (no function)   100% 12 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_data   100% 9 0 0   100% 8 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% 20 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 sanitize_string   100% 11 0 0   100% 6 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 sanitize_filename   100% 10 0 0   100% 6 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 _normalize_path_input   100% 11 0 0   100% 8 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% 5 0 0   100% 0 0   100%
src / taipanstack / security / sanitizers.py _sanitize_env_multiline   100% 3 0 0   100% 2 0   100%
src / taipanstack / security / sanitizers.py _sanitize_env_singleline   100% 3 0 0   100% 2 0   100%
src / taipanstack / security / sanitizers.py sanitize_env_value   100% 10 0 0   100% 8 0   100%
src / taipanstack / security / sanitizers.py _sanitize_sql_identifier_slow_path   100% 9 0 0   100% 6 0   100%
src / taipanstack / security / sanitizers.py sanitize_sql_identifier   100% 8 0 0   100% 6 0   100%
src / taipanstack / security / sanitizers.py (no function)   100% 38 0 0   100% 0 0   100%
src / taipanstack / security / types.py _validate_safe_url   100% 5 0 0   100% 4 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 _sanitize_safe_html   100% 1 0 0   100% 0 0   100%
src / taipanstack / security / types.py _validate_safe_sql_identifier   100% 3 0 0   100% 2 0   100%
src / taipanstack / security / types.py (no function)   100% 27 0 0   100% 0 0   100%
src / taipanstack / security / validators.py _validate_type   100% 4 0 0   100% 2 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% 5 0 0   100% 0 0   100%
src / taipanstack / security / validators.py _check_version_format   100% 13 0 0   100% 8 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_basics   100% 10 0 0   100% 6 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% 30 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 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% 10 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% 36 0 0   100% 16 0   100%
src / taipanstack / utils / cache.py cached.decorator.sync_wrapper   100% 19 0 0   100% 10 0   100%
src / taipanstack / utils / cache.py (no function)   100% 15 0 6   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 _handle_async_concurrency   100% 4 0 0   100% 0 0   100%
src / taipanstack / utils / concurrency.py _handle_async_concurrency.async_wrapper   100% 15 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% 13 0 0   100% 6 0   100%
src / taipanstack / utils / concurrency.py limit_concurrency   100% 6 0 0   100% 4 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% 16 0 6   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 safe_read   100% 14 0 0   100% 8 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% 17 0 0   100% 4 0   100%
src / taipanstack / utils / filesystem.py safe_write   100% 13 0 0   100% 6 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% 42 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   100% 16 0 0   100% 12 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% 1 0 0   100% 0 0   100%
src / taipanstack / utils / logging.py _get_log_format   100% 7 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% 41 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_bucket_state   100% 6 0 0   100% 2 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% 6 0 0   100% 2 0   100%
src / taipanstack / utils / rate_limit.py RateLimiter._add_tokens   100% 11 0 0   100% 4 0   100%
src / taipanstack / utils / rate_limit.py RateLimiter._try_consume   100% 4 0 0   100% 2 0   100%
src / taipanstack / utils / rate_limit.py RateLimiter.consume   100% 10 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% 3 0 0   100% 2 0   100%
src / taipanstack / utils / rate_limit.py rate_limit.decorator.wrapper   100% 4 0 0   100% 2 0   100%
src / taipanstack / utils / rate_limit.py (no function)   100% 23 0 6   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% 3594 0 143   100% 1008 0   100%

No items found using the specified filter.