haiway 0.26.1__tar.gz → 0.27.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. {haiway-0.26.1 → haiway-0.27.0}/PKG-INFO +1 -1
  2. {haiway-0.26.1 → haiway-0.27.0}/junit/test-results.xml +1 -1
  3. {haiway-0.26.1 → haiway-0.27.0}/pyproject.toml +1 -1
  4. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/__init__.py +10 -0
  5. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/__init__.py +2 -0
  6. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/access.py +4 -0
  7. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/observability.py +11 -1
  8. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/observability.py +8 -2
  9. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/opentelemetry/observability.py +60 -14
  10. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/__init__.py +12 -0
  11. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/collections.py +31 -31
  12. haiway-0.27.0/src/haiway/utils/formatting.py +268 -0
  13. haiway-0.27.0/src/haiway/utils/metadata.py +480 -0
  14. haiway-0.27.0/tests/test_metadata.py +364 -0
  15. {haiway-0.26.1 → haiway-0.27.0}/uv.lock +48 -48
  16. haiway-0.26.1/src/haiway/utils/formatting.py +0 -178
  17. {haiway-0.26.1 → haiway-0.27.0}/.claude/settings.json +0 -0
  18. {haiway-0.26.1 → haiway-0.27.0}/.github/workflows/ci.yml +0 -0
  19. {haiway-0.26.1 → haiway-0.27.0}/.github/workflows/publish.yml +0 -0
  20. {haiway-0.26.1 → haiway-0.27.0}/.gitignore +0 -0
  21. {haiway-0.26.1 → haiway-0.27.0}/CLAUDE.md +0 -0
  22. {haiway-0.26.1 → haiway-0.27.0}/LICENSE +0 -0
  23. {haiway-0.26.1 → haiway-0.27.0}/Makefile +0 -0
  24. {haiway-0.26.1 → haiway-0.27.0}/README.md +0 -0
  25. {haiway-0.26.1 → haiway-0.27.0}/config/pre-push +0 -0
  26. {haiway-0.26.1 → haiway-0.27.0}/guidelines/functionalities.md +0 -0
  27. {haiway-0.26.1 → haiway-0.27.0}/guidelines/llms.txt +0 -0
  28. {haiway-0.26.1 → haiway-0.27.0}/guidelines/packages.md +0 -0
  29. {haiway-0.26.1 → haiway-0.27.0}/guidelines/state.md +0 -0
  30. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/disposables.py +0 -0
  31. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/identifier.py +0 -0
  32. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/presets.py +0 -0
  33. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/state.py +0 -0
  34. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/tasks.py +0 -0
  35. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/types.py +0 -0
  36. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/__init__.py +0 -0
  37. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/asynchrony.py +0 -0
  38. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/caching.py +0 -0
  39. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/concurrent.py +0 -0
  40. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/files.py +0 -0
  41. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/retries.py +0 -0
  42. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/throttling.py +0 -0
  43. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/timeouting.py +0 -0
  44. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/opentelemetry/__init__.py +0 -0
  45. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/py.typed +0 -0
  46. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/__init__.py +0 -0
  47. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/attributes.py +0 -0
  48. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/immutable.py +0 -0
  49. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/path.py +0 -0
  50. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/requirement.py +0 -0
  51. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/structure.py +0 -0
  52. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/validation.py +0 -0
  53. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/types/__init__.py +0 -0
  54. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/types/default.py +0 -0
  55. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/types/missing.py +0 -0
  56. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/always.py +0 -0
  57. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/env.py +0 -0
  58. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/logs.py +0 -0
  59. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/mimic.py +0 -0
  60. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/noop.py +0 -0
  61. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/queue.py +0 -0
  62. {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/stream.py +0 -0
  63. {haiway-0.26.1 → haiway-0.27.0}/tests/__init__.py +0 -0
  64. {haiway-0.26.1 → haiway-0.27.0}/tests/test_async_queue.py +0 -0
  65. {haiway-0.26.1 → haiway-0.27.0}/tests/test_async_stream.py +0 -0
  66. {haiway-0.26.1 → haiway-0.27.0}/tests/test_attribute_path.py +0 -0
  67. {haiway-0.26.1 → haiway-0.27.0}/tests/test_attribute_requirement.py +0 -0
  68. {haiway-0.26.1 → haiway-0.27.0}/tests/test_auto_retry.py +0 -0
  69. {haiway-0.26.1 → haiway-0.27.0}/tests/test_cache.py +0 -0
  70. {haiway-0.26.1 → haiway-0.27.0}/tests/test_context.py +0 -0
  71. {haiway-0.26.1 → haiway-0.27.0}/tests/test_context_presets.py +0 -0
  72. {haiway-0.26.1 → haiway-0.27.0}/tests/test_disposables.py +0 -0
  73. {haiway-0.26.1 → haiway-0.27.0}/tests/test_execute_concurrently.py +0 -0
  74. {haiway-0.26.1 → haiway-0.27.0}/tests/test_process_concurrently.py +0 -0
  75. {haiway-0.26.1 → haiway-0.27.0}/tests/test_state.py +0 -0
  76. {haiway-0.26.1 → haiway-0.27.0}/tests/test_state_typing.py +0 -0
  77. {haiway-0.26.1 → haiway-0.27.0}/tests/test_state_validation.py +0 -0
  78. {haiway-0.26.1 → haiway-0.27.0}/tests/test_stream_concurrently.py +0 -0
  79. {haiway-0.26.1 → haiway-0.27.0}/tests/test_streaming.py +0 -0
  80. {haiway-0.26.1 → haiway-0.27.0}/tests/test_timeout.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haiway
3
- Version: 0.26.1
3
+ Version: 0.27.0
4
4
  Summary: Framework for dependency injection and state management within structured concurrency model.
5
5
  Project-URL: Homepage, https://miquido.com
6
6
  Project-URL: Repository, https://github.com/miquido/haiway.git
@@ -1 +1 @@
1
- <?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="203" time="3.881" timestamp="2025-07-18T14:04:03.122940+00:00" hostname="pkrvmq0rgcvqdmg"><testcase classname="tests.test_async_queue" name="test_fails_when_stream_fails" time="0.001" /><testcase classname="tests.test_async_queue" name="test_cancels_when_iteration_cancels" time="0.001" /><testcase classname="tests.test_async_queue" name="test_ends_when_stream_ends" time="0.001" /><testcase classname="tests.test_async_queue" name="test_buffers_values_when_not_reading" time="0.001" /><testcase classname="tests.test_async_queue" name="test_delivers_buffer_when_streaming_fails" time="0.001" /><testcase classname="tests.test_async_queue" name="test_delivers_updates_when_sending" time="0.001" /><testcase classname="tests.test_async_queue" name="test_fails_when_sending_to_finished" time="0.001" /><testcase classname="tests.test_async_queue" name="test_ignores_when_finishing_when_finished" time="0.001" /><testcase classname="tests.test_async_stream" name="test_fails_when_stream_fails" time="0.001" /><testcase classname="tests.test_async_stream" name="test_cancels_when_iteration_cancels" time="0.001" /><testcase classname="tests.test_async_stream" name="test_ends_when_stream_ends" time="0.001" /><testcase classname="tests.test_async_stream" name="test_finishes_without_buffer" time="0.001" /><testcase classname="tests.test_async_stream" name="test_fails_without_buffer" time="0.001" /><testcase classname="tests.test_async_stream" name="test_delivers_updates_when_sending" time="0.001" /><testcase classname="tests.test_async_stream" name="test_ignores_when_sending_to_finished" time="0.001" /><testcase classname="tests.test_async_stream" name="test_ignores_when_sending_to_failed" time="0.001" /><testcase classname="tests.test_async_stream" name="test_ignores_when_finishing_when_finished" time="0.001" /><testcase classname="tests.test_async_stream" name="test_delivers_all_when_sending_async" time="0.001" /><testcase classname="tests.test_attribute_path" name="test_id_path_points_to_self" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_attribute_path_points_to_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_nested_attribute_path_points_to_nested_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_recursive_attribute_path_points_to_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_list_item_path_points_to_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_tuple_item_path_points_to_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_mixed_tuple_item_path_points_to_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_dict_item_path_points_to_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_id_path_set_updates_self" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_attribute_path_set_updates_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_nested_attribute_path_set_updates_nested_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_recursive_attribute_set_updates_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_list_item_path_set_updates_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_tuple_item_path_set_updates_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_mixed_tuple_item_set_updates_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_dict_item_path_set_updates_item" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_equal_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_not_equal_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_contains_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_contains_any_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_contained_in_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_logical_and_or_requirements" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_filter" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_immutability" time="0.000" /><testcase classname="tests.test_auto_retry" name="test_returns_value_without_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_retries_with_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_logs_issue_with_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_fails_with_exceeding_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_fails_with_cancellation" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_retries_with_selected_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_fails_with_not_selected_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_returns_value_without_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_retries_with_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_fails_with_exceeding_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_fails_with_cancellation" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_fails_when_cancelled" time="0.021" /><testcase classname="tests.test_auto_retry" name="test_async_uses_delay_with_errors" time="0.102" /><testcase classname="tests.test_auto_retry" name="test_async_uses_computed_delay_with_errors" time="0.107" /><testcase classname="tests.test_auto_retry" name="test_async_logs_issue_with_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_retries_with_selected_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_fails_with_not_selected_errors" time="0.001" /><testcase classname="tests.test_cache" name="test_returns_cache_value_with_same_argument" time="0.001" /><testcase classname="tests.test_cache" name="test_returns_fresh_value_with_different_argument" time="0.000" /><testcase classname="tests.test_cache" name="test_returns_fresh_value_with_limit_exceed" time="0.000" /><testcase classname="tests.test_cache" name="test_returns_same_value_with_repeating_argument" time="0.000" /><testcase classname="tests.test_cache" name="test_fails_with_error" time="0.000" /><testcase classname="tests.test_cache" name="test_returns_fresh_value_with_expiration_time_exceed" time="0.021" /><testcase classname="tests.test_cache" name="test_async_returns_cache_value_with_same_argument" time="0.001" /><testcase classname="tests.test_cache" name="test_async_returns_fresh_value_with_different_argument" time="0.001" /><testcase classname="tests.test_cache" name="test_async_returns_fresh_value_with_limit_exceed" time="0.001" /><testcase classname="tests.test_cache" name="test_async_returns_same_value_with_repeating_argument" time="0.001" /><testcase classname="tests.test_cache" name="test_async_returns_fresh_value_with_expiration_time_exceed" time="0.021" /><testcase classname="tests.test_cache" name="test_async_cancel_waiting_does_not_cancel_task" time="0.502" /><testcase classname="tests.test_cache" name="test_async_expiration_does_not_cancel_task" time="0.021" /><testcase classname="tests.test_cache" name="test_async_fails_with_error" time="0.001" /><testcase classname="tests.test_context" name="test_state_is_available_according_to_context" time="0.001" /><testcase classname="tests.test_context" name="test_state_update_updates_local_context" time="0.001" /><testcase classname="tests.test_context" name="test_exceptions_are_propagated" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_creation" time="0.000" /><testcase classname="tests.test_context_presets" name="test_preset_with_state" time="0.000" /><testcase classname="tests.test_context_presets" name="test_preset_with_disposable" time="0.000" /><testcase classname="tests.test_context_presets" name="test_preset_extended" time="0.000" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_static_state" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_state_factory" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_multiple_states_factory" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_disposables" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_multiple_disposables" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_mixed_state_and_disposables" time="0.001" /><testcase classname="tests.test_context_presets" name="test_registry_creation" time="0.000" /><testcase classname="tests.test_context_presets" name="test_registry_immutable" time="0.000" /><testcase classname="tests.test_context_presets" name="test_scope_with_preset" time="0.001" /><testcase classname="tests.test_context_presets" name="test_scope_preset_with_override" time="0.001" /><testcase classname="tests.test_context_presets" name="test_scope_preset_not_found" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_with_async_state_factory" time="0.021" /><testcase classname="tests.test_context_presets" name="test_preset_with_disposable_lifecycle" time="0.001" /><testcase classname="tests.test_context_presets" name="test_nested_preset_registries" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_with_mixed_state_sources" time="0.011" /><testcase classname="tests.test_context_presets" name="test_direct_preset_parameter" time="0.001" /><testcase classname="tests.test_context_presets" name="test_direct_preset_with_explicit_state_override" time="0.001" /><testcase classname="tests.test_context_presets" name="test_direct_preset_with_disposables" time="0.001" /><testcase classname="tests.test_context_presets" name="test_direct_preset_vs_registry" time="0.001" /><testcase classname="tests.test_context_presets" name="test_direct_preset_none_falls_back_to_registry" time="0.001" /><testcase classname="tests.test_disposables" name="test_empty_initialization" time="0.000" /><testcase classname="tests.test_disposables" name="test_single_disposable_initialization" time="0.000" /><testcase classname="tests.test_disposables" name="test_multiple_disposables_initialization" time="0.000" /><testcase classname="tests.test_disposables" name="test_cannot_set_attributes" time="0.000" /><testcase classname="tests.test_disposables" name="test_cannot_delete_attributes" time="0.000" /><testcase classname="tests.test_disposables" name="test_empty_disposables_is_falsy" time="0.000" /><testcase classname="tests.test_disposables" name="test_non_empty_disposables_is_truthy" time="0.000" /><testcase classname="tests.test_disposables" name="test_setup_with_no_disposables" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_with_disposable_returning_none" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_with_disposable_returning_single_state" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_with_disposable_returning_multiple_states" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_with_multiple_disposables_mixed_returns" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_sets_loop_correctly" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_no_disposables" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_successful_cleanup" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_exception_context" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_multiple_exceptions_creates_group" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_single_exception_is_risen" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_resets_loop_even_on_exception" time="0.001" /><testcase classname="tests.test_disposables" name="test_same_loop_cleanup" time="0.001" /><testcase classname="tests.test_disposables" name="test_exception_during_setup_phase" time="0.001" /><testcase classname="tests.test_disposables" name="test_assertion_on_doubleprepare" time="0.001" /><testcase classname="tests.test_disposables" name="test_assertion_on_dispose_withoutprepare" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_processes_all_elements" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_preserves_order" time="0.302" /><testcase classname="tests.test_execute_concurrently" name="test_handles_empty_collection" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_propagates_handler_exceptions" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_returns_exceptions_when_configured" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_cancels_running_tasks_on_cancellation" time="0.101" /><testcase classname="tests.test_execute_concurrently" name="test_respects_concurrency_limit" time="0.202" /><testcase classname="tests.test_execute_concurrently" name="test_works_with_different_types" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_handles_mixed_success_and_failure" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_works_with_sets_and_tuples" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_exception_details_preserved" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_processes_all_elements" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_processes_elements_concurrently" time="0.302" /><testcase classname="tests.test_process_concurrently" name="test_handles_empty_source" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_propagates_handler_exceptions" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_ignores_handler_exceptions_when_configured" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_handles_source_exception" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_cancels_running_tasks_on_cancellation" time="0.101" /><testcase classname="tests.test_process_concurrently" name="test_respects_concurrency_limit" time="0.202" /><testcase classname="tests.test_process_concurrently" name="test_processes_elements_from_queue" time="0.052" /><testcase classname="tests.test_state" name="test_basic_initializes_with_arguments" time="0.002" /><testcase classname="tests.test_state" name="test_basic_initializes_with_defaults" time="0.001" /><testcase classname="tests.test_state" name="test_basic_equals_checks_properties" time="0.000" /><testcase classname="tests.test_state" name="test_basic_initializes_with_arguments_and_defaults" time="0.001" /><testcase classname="tests.test_state" name="test_parametrized_initializes_with_proper_parameters" time="0.000" /><testcase classname="tests.test_state" name="test_nested_initializes_with_proper_arguments" time="0.001" /><testcase classname="tests.test_state" name="test_dict_skips_missing_properties" time="0.000" /><testcase classname="tests.test_state" name="test_initialization_allows_missing_properties" time="0.000" /><testcase classname="tests.test_state" name="test_generic_subtypes_validation" time="0.002" /><testcase classname="tests.test_state" name="test_copying_leaves_same_object" time="0.000" /><testcase classname="tests.test_state" name="test_hash_consistency_with_missing_values" time="0.000" /><testcase classname="tests.test_state" name="test_hash_with_unhashable_attributes" time="0.001" /><testcase classname="tests.test_state" name="test_hash_with_dict_key_order_independence" time="0.000" /><testcase classname="tests.test_state" name="test_hash_with_custom_objects" time="0.000" /><testcase classname="tests.test_state" name="test_hash_performance_with_many_attributes" time="0.000" /><testcase classname="tests.test_state" name="test_hash_with_nested_unhashable_collections" time="0.000" /><testcase classname="tests.test_state" name="test_hash_stability_across_instances" time="0.000" /><testcase classname="tests.test_state" name="test_hash_excludes_missing_values" time="0.000" /><testcase classname="tests.test_state_typing" name="test_state_typing_subclass_and_instance_checks" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_basic_types" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_none_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_missing_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_literal_type" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_enum_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_sequence_type" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_set_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_mapping_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_tuple_type" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_union_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_callable_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_typed_dict" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_state_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_complex_types" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_recursive_state" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_generic_state" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validation_error_messages" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validation_any_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_with_defaults" time="0.000" /><testcase classname="tests.test_state_validation" name="test_attribute_validator_direct_usage" time="0.000" /><testcase classname="tests.test_state_validation" name="test_unsupported_type_annotation" time="0.000" /><testcase classname="tests.test_stream_concurrently" name="test_merges_two_streams" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_interleaves_based_on_timing" time="0.152" /><testcase classname="tests.test_stream_concurrently" name="test_handles_empty_iterators" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_handles_different_lengths" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_propagates_exceptions_from_source_a" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_propagates_exceptions_from_source_b" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_cancellation_cancels_both_sources" time="0.202" /><testcase classname="tests.test_stream_concurrently" name="test_works_with_different_types" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_immediate_yield" time="0.601" /><testcase classname="tests.test_stream_concurrently" name="test_concurrent_execution" time="0.201" /><testcase classname="tests.test_streaming" name="test_fails_when_generator_fails" time="0.001" /><testcase classname="tests.test_streaming" name="test_cancels_when_iteration_cancels" time="0.001" /><testcase classname="tests.test_streaming" name="test_ends_when_generator_ends" time="0.001" /><testcase classname="tests.test_streaming" name="test_delivers_updates_when_generating" time="0.001" /><testcase classname="tests.test_streaming" name="test_streaming_context_variables_access_is_preserved" time="0.001" /><testcase classname="tests.test_streaming" name="test_nested_streaming_streams_correctly" time="0.001" /><testcase classname="tests.test_timeout" name="test_returns_result_when_returning_value" time="0.001" /><testcase classname="tests.test_timeout" name="test_raises_with_error" time="0.001" /><testcase classname="tests.test_timeout" name="test_raises_with_cancel" time="0.011" /><testcase classname="tests.test_timeout" name="test_raises_with_timeout" time="0.011" /></testsuite></testsuites>
1
+ <?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="246" time="3.959" timestamp="2025-07-22T13:32:36.495440+00:00" hostname="pkrvmq0rgcvqdmg"><testcase classname="tests.test_async_queue" name="test_fails_when_stream_fails" time="0.002" /><testcase classname="tests.test_async_queue" name="test_cancels_when_iteration_cancels" time="0.001" /><testcase classname="tests.test_async_queue" name="test_ends_when_stream_ends" time="0.001" /><testcase classname="tests.test_async_queue" name="test_buffers_values_when_not_reading" time="0.001" /><testcase classname="tests.test_async_queue" name="test_delivers_buffer_when_streaming_fails" time="0.001" /><testcase classname="tests.test_async_queue" name="test_delivers_updates_when_sending" time="0.001" /><testcase classname="tests.test_async_queue" name="test_fails_when_sending_to_finished" time="0.001" /><testcase classname="tests.test_async_queue" name="test_ignores_when_finishing_when_finished" time="0.001" /><testcase classname="tests.test_async_stream" name="test_fails_when_stream_fails" time="0.001" /><testcase classname="tests.test_async_stream" name="test_cancels_when_iteration_cancels" time="0.001" /><testcase classname="tests.test_async_stream" name="test_ends_when_stream_ends" time="0.001" /><testcase classname="tests.test_async_stream" name="test_finishes_without_buffer" time="0.001" /><testcase classname="tests.test_async_stream" name="test_fails_without_buffer" time="0.001" /><testcase classname="tests.test_async_stream" name="test_delivers_updates_when_sending" time="0.001" /><testcase classname="tests.test_async_stream" name="test_ignores_when_sending_to_finished" time="0.001" /><testcase classname="tests.test_async_stream" name="test_ignores_when_sending_to_failed" time="0.001" /><testcase classname="tests.test_async_stream" name="test_ignores_when_finishing_when_finished" time="0.001" /><testcase classname="tests.test_async_stream" name="test_delivers_all_when_sending_async" time="0.001" /><testcase classname="tests.test_attribute_path" name="test_id_path_points_to_self" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_attribute_path_points_to_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_nested_attribute_path_points_to_nested_attribute" time="0.001" /><testcase classname="tests.test_attribute_path" name="test_recursive_attribute_path_points_to_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_list_item_path_points_to_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_tuple_item_path_points_to_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_mixed_tuple_item_path_points_to_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_dict_item_path_points_to_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_id_path_set_updates_self" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_attribute_path_set_updates_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_nested_attribute_path_set_updates_nested_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_recursive_attribute_set_updates_attribute" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_list_item_path_set_updates_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_tuple_item_path_set_updates_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_mixed_tuple_item_set_updates_item" time="0.000" /><testcase classname="tests.test_attribute_path" name="test_dict_item_path_set_updates_item" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_equal_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_not_equal_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_contains_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_contains_any_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_contained_in_requirement" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_logical_and_or_requirements" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_filter" time="0.000" /><testcase classname="tests.test_attribute_requirement" name="test_immutability" time="0.000" /><testcase classname="tests.test_auto_retry" name="test_returns_value_without_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_retries_with_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_logs_issue_with_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_fails_with_exceeding_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_fails_with_cancellation" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_retries_with_selected_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_fails_with_not_selected_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_returns_value_without_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_retries_with_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_fails_with_exceeding_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_fails_with_cancellation" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_fails_when_cancelled" time="0.021" /><testcase classname="tests.test_auto_retry" name="test_async_uses_delay_with_errors" time="0.102" /><testcase classname="tests.test_auto_retry" name="test_async_uses_computed_delay_with_errors" time="0.107" /><testcase classname="tests.test_auto_retry" name="test_async_logs_issue_with_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_retries_with_selected_errors" time="0.001" /><testcase classname="tests.test_auto_retry" name="test_async_fails_with_not_selected_errors" time="0.001" /><testcase classname="tests.test_cache" name="test_returns_cache_value_with_same_argument" time="0.001" /><testcase classname="tests.test_cache" name="test_returns_fresh_value_with_different_argument" time="0.000" /><testcase classname="tests.test_cache" name="test_returns_fresh_value_with_limit_exceed" time="0.000" /><testcase classname="tests.test_cache" name="test_returns_same_value_with_repeating_argument" time="0.000" /><testcase classname="tests.test_cache" name="test_fails_with_error" time="0.000" /><testcase classname="tests.test_cache" name="test_returns_fresh_value_with_expiration_time_exceed" time="0.021" /><testcase classname="tests.test_cache" name="test_async_returns_cache_value_with_same_argument" time="0.001" /><testcase classname="tests.test_cache" name="test_async_returns_fresh_value_with_different_argument" time="0.001" /><testcase classname="tests.test_cache" name="test_async_returns_fresh_value_with_limit_exceed" time="0.001" /><testcase classname="tests.test_cache" name="test_async_returns_same_value_with_repeating_argument" time="0.001" /><testcase classname="tests.test_cache" name="test_async_returns_fresh_value_with_expiration_time_exceed" time="0.021" /><testcase classname="tests.test_cache" name="test_async_cancel_waiting_does_not_cancel_task" time="0.502" /><testcase classname="tests.test_cache" name="test_async_expiration_does_not_cancel_task" time="0.021" /><testcase classname="tests.test_cache" name="test_async_fails_with_error" time="0.001" /><testcase classname="tests.test_context" name="test_state_is_available_according_to_context" time="0.001" /><testcase classname="tests.test_context" name="test_state_update_updates_local_context" time="0.001" /><testcase classname="tests.test_context" name="test_exceptions_are_propagated" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_creation" time="0.000" /><testcase classname="tests.test_context_presets" name="test_preset_with_state" time="0.000" /><testcase classname="tests.test_context_presets" name="test_preset_with_disposable" time="0.000" /><testcase classname="tests.test_context_presets" name="test_preset_extended" time="0.000" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_static_state" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_state_factory" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_multiple_states_factory" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_disposables" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_with_multiple_disposables" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_prepare_mixed_state_and_disposables" time="0.001" /><testcase classname="tests.test_context_presets" name="test_registry_creation" time="0.000" /><testcase classname="tests.test_context_presets" name="test_registry_immutable" time="0.000" /><testcase classname="tests.test_context_presets" name="test_scope_with_preset" time="0.001" /><testcase classname="tests.test_context_presets" name="test_scope_preset_with_override" time="0.001" /><testcase classname="tests.test_context_presets" name="test_scope_preset_not_found" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_with_async_state_factory" time="0.021" /><testcase classname="tests.test_context_presets" name="test_preset_with_disposable_lifecycle" time="0.001" /><testcase classname="tests.test_context_presets" name="test_nested_preset_registries" time="0.001" /><testcase classname="tests.test_context_presets" name="test_preset_with_mixed_state_sources" time="0.011" /><testcase classname="tests.test_context_presets" name="test_direct_preset_parameter" time="0.001" /><testcase classname="tests.test_context_presets" name="test_direct_preset_with_explicit_state_override" time="0.001" /><testcase classname="tests.test_context_presets" name="test_direct_preset_with_disposables" time="0.001" /><testcase classname="tests.test_context_presets" name="test_direct_preset_vs_registry" time="0.001" /><testcase classname="tests.test_context_presets" name="test_direct_preset_none_falls_back_to_registry" time="0.001" /><testcase classname="tests.test_disposables" name="test_empty_initialization" time="0.000" /><testcase classname="tests.test_disposables" name="test_single_disposable_initialization" time="0.000" /><testcase classname="tests.test_disposables" name="test_multiple_disposables_initialization" time="0.000" /><testcase classname="tests.test_disposables" name="test_cannot_set_attributes" time="0.000" /><testcase classname="tests.test_disposables" name="test_cannot_delete_attributes" time="0.000" /><testcase classname="tests.test_disposables" name="test_empty_disposables_is_falsy" time="0.000" /><testcase classname="tests.test_disposables" name="test_non_empty_disposables_is_truthy" time="0.000" /><testcase classname="tests.test_disposables" name="test_setup_with_no_disposables" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_with_disposable_returning_none" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_with_disposable_returning_single_state" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_with_disposable_returning_multiple_states" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_with_multiple_disposables_mixed_returns" time="0.001" /><testcase classname="tests.test_disposables" name="test_setup_sets_loop_correctly" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_no_disposables" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_successful_cleanup" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_exception_context" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_multiple_exceptions_creates_group" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_with_single_exception_is_risen" time="0.001" /><testcase classname="tests.test_disposables" name="test_dispose_resets_loop_even_on_exception" time="0.001" /><testcase classname="tests.test_disposables" name="test_same_loop_cleanup" time="0.001" /><testcase classname="tests.test_disposables" name="test_exception_during_setup_phase" time="0.001" /><testcase classname="tests.test_disposables" name="test_assertion_on_doubleprepare" time="0.001" /><testcase classname="tests.test_disposables" name="test_assertion_on_dispose_withoutprepare" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_processes_all_elements" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_preserves_order" time="0.303" /><testcase classname="tests.test_execute_concurrently" name="test_handles_empty_collection" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_propagates_handler_exceptions" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_returns_exceptions_when_configured" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_cancels_running_tasks_on_cancellation" time="0.101" /><testcase classname="tests.test_execute_concurrently" name="test_respects_concurrency_limit" time="0.202" /><testcase classname="tests.test_execute_concurrently" name="test_works_with_different_types" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_handles_mixed_success_and_failure" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_works_with_sets_and_tuples" time="0.001" /><testcase classname="tests.test_execute_concurrently" name="test_exception_details_preserved" time="0.001" /><testcase classname="tests.test_metadata" name="test_meta_empty_is_singleton" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_basic_construction" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_construction_validates_values" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_of_with_none_returns_empty" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_of_with_existing_meta_returns_same" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_of_with_mapping_validates" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_from_mapping" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_from_json_valid" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_from_json_invalid" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_to_json" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_to_mapping" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_kind_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_kind" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_name_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_name" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_description_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_description" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_identifier_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_identifier" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_origin_identifier_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_origin_identifier" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_predecessor_identifier_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_predecessor_identifier" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_successor_identifier_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_successor_identifier" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_tags_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_tags_new" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_tags_append" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_has_tags" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_creation_property" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_with_creation" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_merged_with" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_merged_with_none" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_merged_with_meta_instance" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_excluding" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_excluding_none" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_updated" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_immutability" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_mapping_interface" time="0.000" /><testcase classname="tests.test_metadata" name="test_meta_copy_returns_same_instance" time="0.000" /><testcase classname="tests.test_metadata" name="test__validated_meta_value_primitives" time="0.000" /><testcase classname="tests.test_metadata" name="test__validated_meta_value_collections" time="0.000" /><testcase classname="tests.test_metadata" name="test__validated_meta_value_invalid" time="0.000" /><testcase classname="tests.test_process_concurrently" name="test_processes_all_elements" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_processes_elements_concurrently" time="0.303" /><testcase classname="tests.test_process_concurrently" name="test_handles_empty_source" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_propagates_handler_exceptions" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_ignores_handler_exceptions_when_configured" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_handles_source_exception" time="0.001" /><testcase classname="tests.test_process_concurrently" name="test_cancels_running_tasks_on_cancellation" time="0.101" /><testcase classname="tests.test_process_concurrently" name="test_respects_concurrency_limit" time="0.202" /><testcase classname="tests.test_process_concurrently" name="test_processes_elements_from_queue" time="0.052" /><testcase classname="tests.test_state" name="test_basic_initializes_with_arguments" time="0.002" /><testcase classname="tests.test_state" name="test_basic_initializes_with_defaults" time="0.001" /><testcase classname="tests.test_state" name="test_basic_equals_checks_properties" time="0.000" /><testcase classname="tests.test_state" name="test_basic_initializes_with_arguments_and_defaults" time="0.000" /><testcase classname="tests.test_state" name="test_parametrized_initializes_with_proper_parameters" time="0.001" /><testcase classname="tests.test_state" name="test_nested_initializes_with_proper_arguments" time="0.001" /><testcase classname="tests.test_state" name="test_dict_skips_missing_properties" time="0.000" /><testcase classname="tests.test_state" name="test_initialization_allows_missing_properties" time="0.000" /><testcase classname="tests.test_state" name="test_generic_subtypes_validation" time="0.002" /><testcase classname="tests.test_state" name="test_copying_leaves_same_object" time="0.000" /><testcase classname="tests.test_state" name="test_hash_consistency_with_missing_values" time="0.000" /><testcase classname="tests.test_state" name="test_hash_with_unhashable_attributes" time="0.001" /><testcase classname="tests.test_state" name="test_hash_with_dict_key_order_independence" time="0.000" /><testcase classname="tests.test_state" name="test_hash_with_custom_objects" time="0.000" /><testcase classname="tests.test_state" name="test_hash_performance_with_many_attributes" time="0.001" /><testcase classname="tests.test_state" name="test_hash_with_nested_unhashable_collections" time="0.000" /><testcase classname="tests.test_state" name="test_hash_stability_across_instances" time="0.000" /><testcase classname="tests.test_state" name="test_hash_excludes_missing_values" time="0.000" /><testcase classname="tests.test_state_typing" name="test_state_typing_subclass_and_instance_checks" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_basic_types" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_none_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_missing_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_literal_type" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_enum_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_sequence_type" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_set_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_mapping_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_tuple_type" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_union_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_callable_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_typed_dict" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_state_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_complex_types" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validator_recursive_state" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_generic_state" time="0.001" /><testcase classname="tests.test_state_validation" name="test_validation_error_messages" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validation_any_type" time="0.000" /><testcase classname="tests.test_state_validation" name="test_validator_with_defaults" time="0.000" /><testcase classname="tests.test_state_validation" name="test_attribute_validator_direct_usage" time="0.001" /><testcase classname="tests.test_state_validation" name="test_unsupported_type_annotation" time="0.000" /><testcase classname="tests.test_stream_concurrently" name="test_merges_two_streams" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_interleaves_based_on_timing" time="0.152" /><testcase classname="tests.test_stream_concurrently" name="test_handles_empty_iterators" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_handles_different_lengths" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_propagates_exceptions_from_source_a" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_propagates_exceptions_from_source_b" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_cancellation_cancels_both_sources" time="0.202" /><testcase classname="tests.test_stream_concurrently" name="test_works_with_different_types" time="0.001" /><testcase classname="tests.test_stream_concurrently" name="test_immediate_yield" time="0.601" /><testcase classname="tests.test_stream_concurrently" name="test_concurrent_execution" time="0.201" /><testcase classname="tests.test_streaming" name="test_fails_when_generator_fails" time="0.001" /><testcase classname="tests.test_streaming" name="test_cancels_when_iteration_cancels" time="0.001" /><testcase classname="tests.test_streaming" name="test_ends_when_generator_ends" time="0.001" /><testcase classname="tests.test_streaming" name="test_delivers_updates_when_generating" time="0.001" /><testcase classname="tests.test_streaming" name="test_streaming_context_variables_access_is_preserved" time="0.001" /><testcase classname="tests.test_streaming" name="test_nested_streaming_streams_correctly" time="0.001" /><testcase classname="tests.test_timeout" name="test_returns_result_when_returning_value" time="0.001" /><testcase classname="tests.test_timeout" name="test_raises_with_error" time="0.001" /><testcase classname="tests.test_timeout" name="test_raises_with_cancel" time="0.011" /><testcase classname="tests.test_timeout" name="test_raises_with_timeout" time="0.011" /></testsuite></testsuites>
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
  [project]
6
6
  name = "haiway"
7
7
  description = "Framework for dependency injection and state management within structured concurrency model."
8
- version = "0.26.1"
8
+ version = "0.27.0"
9
9
  readme = "README.md"
10
10
  maintainers = [
11
11
  { name = "Kacper Kaliński", email = "kacper.kalinski@miquido.com" },
@@ -37,8 +37,13 @@ from haiway.types import (
37
37
  unwrap_missing,
38
38
  )
39
39
  from haiway.utils import (
40
+ META_EMPTY,
40
41
  AsyncQueue,
41
42
  AsyncStream,
43
+ Meta,
44
+ MetaTags,
45
+ MetaValue,
46
+ MetaValues,
42
47
  always,
43
48
  as_dict,
44
49
  as_list,
@@ -59,6 +64,7 @@ from haiway.utils import (
59
64
  )
60
65
 
61
66
  __all__ = (
67
+ "META_EMPTY",
62
68
  "MISSING",
63
69
  "AsyncQueue",
64
70
  "AsyncStream",
@@ -73,6 +79,10 @@ __all__ = (
73
79
  "FileAccess",
74
80
  "Immutable",
75
81
  "LoggerObservability",
82
+ "Meta",
83
+ "MetaTags",
84
+ "MetaValue",
85
+ "MetaValues",
76
86
  "Missing",
77
87
  "MissingContext",
78
88
  "MissingState",
@@ -9,6 +9,7 @@ from haiway.context.observability import (
9
9
  ObservabilityEventRecording,
10
10
  ObservabilityLevel,
11
11
  ObservabilityLogRecording,
12
+ ObservabilityMetricKind,
12
13
  ObservabilityMetricRecording,
13
14
  ObservabilityScopeEntering,
14
15
  ObservabilityScopeExiting,
@@ -33,6 +34,7 @@ __all__ = (
33
34
  "ObservabilityEventRecording",
34
35
  "ObservabilityLevel",
35
36
  "ObservabilityLogRecording",
37
+ "ObservabilityMetricKind",
36
38
  "ObservabilityMetricRecording",
37
39
  "ObservabilityScopeEntering",
38
40
  "ObservabilityScopeExiting",
@@ -25,6 +25,7 @@ from haiway.context.observability import (
25
25
  ObservabilityAttribute,
26
26
  ObservabilityContext,
27
27
  ObservabilityLevel,
28
+ ObservabilityMetricKind,
28
29
  )
29
30
 
30
31
  # Import after other imports to avoid circular dependencies
@@ -990,6 +991,7 @@ class ctx:
990
991
  metric: str | None = None,
991
992
  value: float | int | None = None,
992
993
  unit: str | None = None,
994
+ kind: ObservabilityMetricKind | None = None,
993
995
  attributes: Mapping[str, ObservabilityAttribute] | None = None,
994
996
  ) -> None:
995
997
  if event is not None:
@@ -1003,11 +1005,13 @@ class ctx:
1003
1005
  elif metric is not None:
1004
1006
  assert event is None # nosec: B101
1005
1007
  assert value is not None # nosec: B101
1008
+ assert kind is not None # nosec: B101
1006
1009
  ObservabilityContext.record_metric(
1007
1010
  level,
1008
1011
  metric,
1009
1012
  value=value,
1010
1013
  unit=unit,
1014
+ kind=kind,
1011
1015
  attributes=attributes or {},
1012
1016
  )
1013
1017
 
@@ -7,7 +7,7 @@ from logging import INFO as INFO_LOGGING
7
7
  from logging import WARNING as WARNING_LOGGING
8
8
  from logging import Logger, getLogger
9
9
  from types import TracebackType
10
- from typing import Any, ClassVar, Protocol, Self, runtime_checkable
10
+ from typing import Any, ClassVar, Literal, Protocol, Self, runtime_checkable
11
11
  from uuid import UUID, uuid4
12
12
 
13
13
  from haiway.context.identifier import ScopeIdentifier
@@ -23,6 +23,7 @@ __all__ = (
23
23
  "ObservabilityEventRecording",
24
24
  "ObservabilityLevel",
25
25
  "ObservabilityLogRecording",
26
+ "ObservabilityMetricKind",
26
27
  "ObservabilityMetricRecording",
27
28
  "ObservabilityScopeEntering",
28
29
  "ObservabilityScopeExiting",
@@ -118,6 +119,9 @@ class ObservabilityEventRecording(Protocol):
118
119
  ) -> None: ...
119
120
 
120
121
 
122
+ type ObservabilityMetricKind = Literal["counter", "histogram", "gauge"]
123
+
124
+
121
125
  @runtime_checkable
122
126
  class ObservabilityMetricRecording(Protocol):
123
127
  """
@@ -136,6 +140,7 @@ class ObservabilityMetricRecording(Protocol):
136
140
  metric: str,
137
141
  value: float | int,
138
142
  unit: str | None,
143
+ kind: ObservabilityMetricKind,
139
144
  attributes: Mapping[str, ObservabilityAttribute],
140
145
  ) -> None: ...
141
146
 
@@ -278,6 +283,7 @@ def _logger_observability(
278
283
  metric: str,
279
284
  value: float | int,
280
285
  unit: str | None,
286
+ kind: ObservabilityMetricKind,
281
287
  attributes: Mapping[str, ObservabilityAttribute],
282
288
  ) -> None:
283
289
  if attributes:
@@ -553,6 +559,7 @@ class ObservabilityContext(Immutable):
553
559
  *,
554
560
  value: float | int,
555
561
  unit: str | None,
562
+ kind: ObservabilityMetricKind,
556
563
  attributes: Mapping[str, ObservabilityAttribute],
557
564
  ) -> None:
558
565
  """
@@ -571,6 +578,8 @@ class ObservabilityContext(Immutable):
571
578
  The numeric value of the metric
572
579
  unit: str | None
573
580
  Optional unit for the metric (e.g., "ms", "bytes")
581
+ kind: ObservabilityMetricKind
582
+ The metric kind defining its value handling.
574
583
  attributes: Mapping[str, ObservabilityAttribute]
575
584
  Key-value attributes associated with the metric
576
585
  """
@@ -584,6 +593,7 @@ class ObservabilityContext(Immutable):
584
593
  metric=metric,
585
594
  value=value,
586
595
  unit=unit,
596
+ kind=kind,
587
597
  attributes=attributes,
588
598
  )
589
599
 
@@ -4,8 +4,13 @@ from time import monotonic
4
4
  from typing import Any
5
5
  from uuid import UUID, uuid4
6
6
 
7
- from haiway.context import Observability, ObservabilityLevel, ScopeIdentifier
8
- from haiway.context.observability import ObservabilityAttribute
7
+ from haiway.context import (
8
+ Observability,
9
+ ObservabilityAttribute,
10
+ ObservabilityLevel,
11
+ ObservabilityMetricKind,
12
+ ScopeIdentifier,
13
+ )
9
14
  from haiway.utils.formatting import format_str
10
15
 
11
16
  __all__ = ("LoggerObservability",)
@@ -189,6 +194,7 @@ def LoggerObservability( # noqa: C901, PLR0915
189
194
  metric: str,
190
195
  value: float | int,
191
196
  unit: str | None,
197
+ kind: ObservabilityMetricKind,
192
198
  attributes: Mapping[str, ObservabilityAttribute],
193
199
  ) -> None:
194
200
  assert root_scope is not None # nosec: B101
@@ -12,7 +12,7 @@ from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter
12
12
  from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
13
13
  from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
14
14
  from opentelemetry.metrics._internal import Meter
15
- from opentelemetry.metrics._internal.instrument import Counter
15
+ from opentelemetry.metrics._internal.instrument import Counter, Gauge, Histogram
16
16
  from opentelemetry.sdk._logs import LoggerProvider
17
17
  from opentelemetry.sdk._logs._internal import LogRecord
18
18
  from opentelemetry.sdk._logs._internal.export import (
@@ -33,6 +33,7 @@ from haiway.context import (
33
33
  Observability,
34
34
  ObservabilityAttribute,
35
35
  ObservabilityLevel,
36
+ ObservabilityMetricKind,
36
37
  ScopeIdentifier,
37
38
  ctx,
38
39
  )
@@ -54,6 +55,8 @@ class ScopeStore:
54
55
  "_completed",
55
56
  "_counters",
56
57
  "_exited",
58
+ "_gauges",
59
+ "_histograms",
57
60
  "_token",
58
61
  "context",
59
62
  "identifier",
@@ -91,6 +94,8 @@ class ScopeStore:
91
94
  self.identifier: ScopeIdentifier = identifier
92
95
  self.nested: list[ScopeStore] = []
93
96
  self._counters: dict[str, Counter] = {}
97
+ self._histograms: dict[str, Histogram] = {}
98
+ self._gauges: dict[str, Gauge] = {}
94
99
  self._exited: bool = False
95
100
  self._completed: bool = False
96
101
  self.span: Span = span
@@ -251,6 +256,7 @@ class ScopeStore:
251
256
  *,
252
257
  value: float | int,
253
258
  unit: str | None,
259
+ kind: ObservabilityMetricKind,
254
260
  attributes: Mapping[str, ObservabilityAttribute],
255
261
  ) -> None:
256
262
  """
@@ -267,23 +273,59 @@ class ScopeStore:
267
273
  The value to add to the metric
268
274
  unit : str | None
269
275
  The unit of the metric (if any)
276
+ kind: ObservabilityMetricKind
277
+ The metric kind defining its value handling.
270
278
  attributes : Mapping[str, ObservabilityAttribute]
271
279
  Attributes to attach to the metric
272
280
  """
273
- if name not in self._counters:
274
- self._counters[name] = self.meter.create_counter(
275
- name=name,
276
- unit=unit or "",
277
- )
281
+ match kind:
282
+ case "counter":
283
+ if name not in self._counters:
284
+ self._counters[name] = self.meter.create_counter(
285
+ name=name,
286
+ unit=unit or "",
287
+ )
288
+
289
+ self._counters[name].add(
290
+ value,
291
+ attributes={
292
+ key: cast(Any, value)
293
+ for key, value in attributes.items()
294
+ if value is not None and value is not MISSING
295
+ },
296
+ )
278
297
 
279
- self._counters[name].add(
280
- value,
281
- attributes={
282
- key: cast(Any, value)
283
- for key, value in attributes.items()
284
- if value is not None and value is not MISSING
285
- },
286
- )
298
+ case "histogram":
299
+ if name not in self._histograms:
300
+ self._histograms[name] = self.meter.create_histogram(
301
+ name=name,
302
+ unit=unit or "",
303
+ )
304
+
305
+ self._histograms[name].record(
306
+ value,
307
+ attributes={
308
+ key: cast(Any, value)
309
+ for key, value in attributes.items()
310
+ if value is not None and value is not MISSING
311
+ },
312
+ )
313
+
314
+ case "gauge":
315
+ if name not in self._gauges:
316
+ self._gauges[name] = self.meter.create_gauge(
317
+ name=name,
318
+ unit=unit or "",
319
+ )
320
+
321
+ self._gauges[name].set(
322
+ value,
323
+ attributes={
324
+ key: cast(Any, value)
325
+ for key, value in attributes.items()
326
+ if value is not None and value is not MISSING
327
+ },
328
+ )
287
329
 
288
330
  def record_attributes(
289
331
  self,
@@ -589,6 +631,7 @@ class OpenTelemetry:
589
631
  metric: str,
590
632
  value: float | int,
591
633
  unit: str | None,
634
+ kind: ObservabilityMetricKind,
592
635
  attributes: Mapping[str, ObservabilityAttribute],
593
636
  ) -> None:
594
637
  """
@@ -609,6 +652,8 @@ class OpenTelemetry:
609
652
  The numeric value of the metric
610
653
  unit: str | None
611
654
  Optional unit for the metric (e.g., "ms", "bytes")
655
+ kind: ObservabilityMetricKind
656
+ The metric kind defining its value handling.
612
657
  attributes: Mapping[str, ObservabilityAttribute]
613
658
  Key-value attributes associated with the metric
614
659
  """
@@ -622,6 +667,7 @@ class OpenTelemetry:
622
667
  metric,
623
668
  value=value,
624
669
  unit=unit,
670
+ kind=kind,
625
671
  attributes=attributes,
626
672
  )
627
673
 
@@ -11,14 +11,26 @@ from haiway.utils.env import (
11
11
  )
12
12
  from haiway.utils.formatting import format_str
13
13
  from haiway.utils.logs import setup_logging
14
+ from haiway.utils.metadata import (
15
+ META_EMPTY,
16
+ Meta,
17
+ MetaTags,
18
+ MetaValue,
19
+ MetaValues,
20
+ )
14
21
  from haiway.utils.mimic import mimic_function
15
22
  from haiway.utils.noop import async_noop, noop
16
23
  from haiway.utils.queue import AsyncQueue
17
24
  from haiway.utils.stream import AsyncStream
18
25
 
19
26
  __all__ = (
27
+ "META_EMPTY",
20
28
  "AsyncQueue",
21
29
  "AsyncStream",
30
+ "Meta",
31
+ "MetaTags",
32
+ "MetaValue",
33
+ "MetaValues",
22
34
  "always",
23
35
  "as_dict",
24
36
  "as_list",