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.
- {haiway-0.26.1 → haiway-0.27.0}/PKG-INFO +1 -1
- {haiway-0.26.1 → haiway-0.27.0}/junit/test-results.xml +1 -1
- {haiway-0.26.1 → haiway-0.27.0}/pyproject.toml +1 -1
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/__init__.py +10 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/__init__.py +2 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/access.py +4 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/observability.py +11 -1
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/observability.py +8 -2
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/opentelemetry/observability.py +60 -14
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/__init__.py +12 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/collections.py +31 -31
- haiway-0.27.0/src/haiway/utils/formatting.py +268 -0
- haiway-0.27.0/src/haiway/utils/metadata.py +480 -0
- haiway-0.27.0/tests/test_metadata.py +364 -0
- {haiway-0.26.1 → haiway-0.27.0}/uv.lock +48 -48
- haiway-0.26.1/src/haiway/utils/formatting.py +0 -178
- {haiway-0.26.1 → haiway-0.27.0}/.claude/settings.json +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/.github/workflows/ci.yml +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/.github/workflows/publish.yml +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/.gitignore +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/CLAUDE.md +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/LICENSE +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/Makefile +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/README.md +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/config/pre-push +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/guidelines/functionalities.md +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/guidelines/llms.txt +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/guidelines/packages.md +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/guidelines/state.md +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/disposables.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/identifier.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/presets.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/state.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/tasks.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/context/types.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/__init__.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/asynchrony.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/caching.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/concurrent.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/files.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/retries.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/throttling.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/helpers/timeouting.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/opentelemetry/__init__.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/py.typed +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/__init__.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/attributes.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/immutable.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/path.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/requirement.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/structure.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/state/validation.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/types/__init__.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/types/default.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/types/missing.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/always.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/env.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/logs.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/mimic.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/noop.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/queue.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/src/haiway/utils/stream.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/__init__.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_async_queue.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_async_stream.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_attribute_path.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_attribute_requirement.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_auto_retry.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_cache.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_context.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_context_presets.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_disposables.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_execute_concurrently.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_process_concurrently.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_state.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_state_typing.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_state_validation.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_stream_concurrently.py +0 -0
- {haiway-0.26.1 → haiway-0.27.0}/tests/test_streaming.py +0 -0
- {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.
|
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.
|
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
|
8
|
-
|
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
|
-
|
274
|
-
|
275
|
-
name
|
276
|
-
|
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
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
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",
|