haiway 0.26.0__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.0 → haiway-0.27.0}/PKG-INFO +1 -1
  2. {haiway-0.26.0 → haiway-0.27.0}/junit/test-results.xml +1 -1
  3. {haiway-0.26.0 → haiway-0.27.0}/pyproject.toml +1 -1
  4. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/__init__.py +10 -0
  5. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/__init__.py +2 -0
  6. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/access.py +4 -0
  7. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/observability.py +11 -1
  8. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/concurrent.py +8 -9
  9. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/files.py +4 -4
  10. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/observability.py +8 -2
  11. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/opentelemetry/observability.py +60 -14
  12. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/__init__.py +12 -0
  13. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/collections.py +31 -31
  14. haiway-0.27.0/src/haiway/utils/formatting.py +268 -0
  15. haiway-0.27.0/src/haiway/utils/metadata.py +480 -0
  16. haiway-0.27.0/tests/test_metadata.py +364 -0
  17. {haiway-0.26.0 → haiway-0.27.0}/uv.lock +48 -48
  18. haiway-0.26.0/src/haiway/utils/formatting.py +0 -178
  19. {haiway-0.26.0 → haiway-0.27.0}/.claude/settings.json +0 -0
  20. {haiway-0.26.0 → haiway-0.27.0}/.github/workflows/ci.yml +0 -0
  21. {haiway-0.26.0 → haiway-0.27.0}/.github/workflows/publish.yml +0 -0
  22. {haiway-0.26.0 → haiway-0.27.0}/.gitignore +0 -0
  23. {haiway-0.26.0 → haiway-0.27.0}/CLAUDE.md +0 -0
  24. {haiway-0.26.0 → haiway-0.27.0}/LICENSE +0 -0
  25. {haiway-0.26.0 → haiway-0.27.0}/Makefile +0 -0
  26. {haiway-0.26.0 → haiway-0.27.0}/README.md +0 -0
  27. {haiway-0.26.0 → haiway-0.27.0}/config/pre-push +0 -0
  28. {haiway-0.26.0 → haiway-0.27.0}/guidelines/functionalities.md +0 -0
  29. {haiway-0.26.0 → haiway-0.27.0}/guidelines/llms.txt +0 -0
  30. {haiway-0.26.0 → haiway-0.27.0}/guidelines/packages.md +0 -0
  31. {haiway-0.26.0 → haiway-0.27.0}/guidelines/state.md +0 -0
  32. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/disposables.py +0 -0
  33. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/identifier.py +0 -0
  34. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/presets.py +0 -0
  35. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/state.py +0 -0
  36. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/tasks.py +0 -0
  37. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/context/types.py +0 -0
  38. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/__init__.py +0 -0
  39. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/asynchrony.py +0 -0
  40. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/caching.py +0 -0
  41. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/retries.py +0 -0
  42. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/throttling.py +0 -0
  43. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/helpers/timeouting.py +0 -0
  44. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/opentelemetry/__init__.py +0 -0
  45. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/py.typed +0 -0
  46. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/state/__init__.py +0 -0
  47. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/state/attributes.py +0 -0
  48. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/state/immutable.py +0 -0
  49. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/state/path.py +0 -0
  50. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/state/requirement.py +0 -0
  51. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/state/structure.py +0 -0
  52. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/state/validation.py +0 -0
  53. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/types/__init__.py +0 -0
  54. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/types/default.py +0 -0
  55. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/types/missing.py +0 -0
  56. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/always.py +0 -0
  57. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/env.py +0 -0
  58. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/logs.py +0 -0
  59. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/mimic.py +0 -0
  60. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/noop.py +0 -0
  61. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/queue.py +0 -0
  62. {haiway-0.26.0 → haiway-0.27.0}/src/haiway/utils/stream.py +0 -0
  63. {haiway-0.26.0 → haiway-0.27.0}/tests/__init__.py +0 -0
  64. {haiway-0.26.0 → haiway-0.27.0}/tests/test_async_queue.py +0 -0
  65. {haiway-0.26.0 → haiway-0.27.0}/tests/test_async_stream.py +0 -0
  66. {haiway-0.26.0 → haiway-0.27.0}/tests/test_attribute_path.py +0 -0
  67. {haiway-0.26.0 → haiway-0.27.0}/tests/test_attribute_requirement.py +0 -0
  68. {haiway-0.26.0 → haiway-0.27.0}/tests/test_auto_retry.py +0 -0
  69. {haiway-0.26.0 → haiway-0.27.0}/tests/test_cache.py +0 -0
  70. {haiway-0.26.0 → haiway-0.27.0}/tests/test_context.py +0 -0
  71. {haiway-0.26.0 → haiway-0.27.0}/tests/test_context_presets.py +0 -0
  72. {haiway-0.26.0 → haiway-0.27.0}/tests/test_disposables.py +0 -0
  73. {haiway-0.26.0 → haiway-0.27.0}/tests/test_execute_concurrently.py +0 -0
  74. {haiway-0.26.0 → haiway-0.27.0}/tests/test_process_concurrently.py +0 -0
  75. {haiway-0.26.0 → haiway-0.27.0}/tests/test_state.py +0 -0
  76. {haiway-0.26.0 → haiway-0.27.0}/tests/test_state_typing.py +0 -0
  77. {haiway-0.26.0 → haiway-0.27.0}/tests/test_state_validation.py +0 -0
  78. {haiway-0.26.0 → haiway-0.27.0}/tests/test_stream_concurrently.py +0 -0
  79. {haiway-0.26.0 → haiway-0.27.0}/tests/test_streaming.py +0 -0
  80. {haiway-0.26.0 → 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.0
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.892" timestamp="2025-07-15T10:24:27.549791+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.000" /><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.001" /><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.001" /><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.001" /><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.0"
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
 
@@ -3,8 +3,8 @@ from collections.abc import (
3
3
  AsyncIterable,
4
4
  AsyncIterator,
5
5
  Callable,
6
- Collection,
7
6
  Coroutine,
7
+ Iterable,
8
8
  MutableSequence,
9
9
  Sequence,
10
10
  )
@@ -20,7 +20,7 @@ __all__ = (
20
20
 
21
21
 
22
22
  async def process_concurrently[Element]( # noqa: C901, PLR0912
23
- source: AsyncIterator[Element],
23
+ source: AsyncIterable[Element],
24
24
  /,
25
25
  handler: Callable[[Element], Coroutine[Any, Any, None]],
26
26
  *,
@@ -80,8 +80,7 @@ async def process_concurrently[Element]( # noqa: C901, PLR0912
80
80
  assert concurrent_tasks > 0 # nosec: B101
81
81
  running: set[Task[None]] = set()
82
82
  try:
83
- while True:
84
- element: Element = await anext(source)
83
+ async for element in source:
85
84
  running.add(ctx.spawn(handler, element))
86
85
  if len(running) < concurrent_tasks:
87
86
  continue # keep spawning tasks
@@ -132,7 +131,7 @@ async def process_concurrently[Element]( # noqa: C901, PLR0912
132
131
  async def execute_concurrently[Element, Result](
133
132
  handler: Callable[[Element], Coroutine[Any, Any, Result]],
134
133
  /,
135
- elements: Collection[Element],
134
+ elements: Iterable[Element],
136
135
  *,
137
136
  concurrent_tasks: int = 2,
138
137
  ) -> Sequence[Result]: ...
@@ -142,7 +141,7 @@ async def execute_concurrently[Element, Result](
142
141
  async def execute_concurrently[Element, Result](
143
142
  handler: Callable[[Element], Coroutine[Any, Any, Result]],
144
143
  /,
145
- elements: Collection[Element],
144
+ elements: Iterable[Element],
146
145
  *,
147
146
  concurrent_tasks: int = 2,
148
147
  return_exceptions: Literal[True],
@@ -152,7 +151,7 @@ async def execute_concurrently[Element, Result](
152
151
  async def execute_concurrently[Element, Result]( # noqa: C901
153
152
  handler: Callable[[Element], Coroutine[Any, Any, Result]],
154
153
  /,
155
- elements: Collection[Element],
154
+ elements: Iterable[Element],
156
155
  *,
157
156
  concurrent_tasks: int = 2,
158
157
  return_exceptions: bool = False,
@@ -175,8 +174,8 @@ async def execute_concurrently[Element, Result]( # noqa: C901
175
174
  ----------
176
175
  handler : Callable[[Element], Coroutine[Any, Any, Result]]
177
176
  A coroutine function that processes each element and returns a result.
178
- elements : Collection[Element]
179
- A collection of elements to process. The collection size determines
177
+ elements : Iterable[Element]
178
+ A source of elements to process. The source size determines
180
179
  the result sequence length.
181
180
  concurrent_tasks : int, default=2
182
181
  Maximum number of concurrent tasks. Must be greater than 0. Higher
@@ -188,7 +188,7 @@ class FileAccessing(Protocol):
188
188
  locking, and resource management.
189
189
  """
190
190
 
191
- async def __call__(
191
+ def __call__(
192
192
  self,
193
193
  path: Path | str,
194
194
  create: bool,
@@ -275,7 +275,7 @@ def _close_file_handle(
275
275
  os.close(file_handle)
276
276
 
277
277
 
278
- async def _file_access_context(
278
+ def _file_access_context(
279
279
  path: Path | str,
280
280
  create: bool,
281
281
  exclusive: bool,
@@ -375,7 +375,7 @@ class FileAccess(State):
375
375
  """
376
376
 
377
377
  @classmethod
378
- async def open(
378
+ def open(
379
379
  cls,
380
380
  path: Path | str,
381
381
  create: bool = False,
@@ -412,7 +412,7 @@ class FileAccess(State):
412
412
  If the file cannot be opened with the specified parameters, or if
413
413
  a file is already open in the current context scope
414
414
  """
415
- return await ctx.state(cls).accessing(
415
+ return ctx.state(cls).accessing(
416
416
  path,
417
417
  create=create,
418
418
  exclusive=exclusive,
@@ -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",