haiway 0.22.1__tar.gz → 0.23.1__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 (71) hide show
  1. {haiway-0.22.1 → haiway-0.23.1}/PKG-INFO +1 -1
  2. {haiway-0.22.1 → haiway-0.23.1}/junit/test-results.xml +1 -1
  3. {haiway-0.22.1 → haiway-0.23.1}/pyproject.toml +1 -1
  4. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/context/observability.py +2 -2
  5. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/context/state.py +1 -0
  6. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/observability.py +2 -3
  7. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/opentelemetry/observability.py +50 -14
  8. {haiway-0.22.1 → haiway-0.23.1}/uv.lock +1 -1
  9. {haiway-0.22.1 → haiway-0.23.1}/.github/workflows/ci.yml +0 -0
  10. {haiway-0.22.1 → haiway-0.23.1}/.github/workflows/publish.yml +0 -0
  11. {haiway-0.22.1 → haiway-0.23.1}/.gitignore +0 -0
  12. {haiway-0.22.1 → haiway-0.23.1}/CLAUDE.md +0 -0
  13. {haiway-0.22.1 → haiway-0.23.1}/LICENSE +0 -0
  14. {haiway-0.22.1 → haiway-0.23.1}/Makefile +0 -0
  15. {haiway-0.22.1 → haiway-0.23.1}/README.md +0 -0
  16. {haiway-0.22.1 → haiway-0.23.1}/config/pre-push +0 -0
  17. {haiway-0.22.1 → haiway-0.23.1}/guidelines/functionalities.md +0 -0
  18. {haiway-0.22.1 → haiway-0.23.1}/guidelines/llms.txt +0 -0
  19. {haiway-0.22.1 → haiway-0.23.1}/guidelines/packages.md +0 -0
  20. {haiway-0.22.1 → haiway-0.23.1}/guidelines/state.md +0 -0
  21. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/__init__.py +0 -0
  22. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/context/__init__.py +0 -0
  23. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/context/access.py +0 -0
  24. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/context/disposables.py +0 -0
  25. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/context/identifier.py +0 -0
  26. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/context/tasks.py +0 -0
  27. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/context/types.py +0 -0
  28. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/__init__.py +0 -0
  29. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/asynchrony.py +0 -0
  30. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/caching.py +0 -0
  31. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/concurrent.py +0 -0
  32. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/files.py +0 -0
  33. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/retries.py +0 -0
  34. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/throttling.py +0 -0
  35. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/timeouting.py +0 -0
  36. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/helpers/tracing.py +0 -0
  37. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/opentelemetry/__init__.py +0 -0
  38. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/py.typed +0 -0
  39. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/state/__init__.py +0 -0
  40. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/state/attributes.py +0 -0
  41. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/state/path.py +0 -0
  42. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/state/requirement.py +0 -0
  43. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/state/structure.py +0 -0
  44. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/state/validation.py +0 -0
  45. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/types/__init__.py +0 -0
  46. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/types/default.py +0 -0
  47. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/types/missing.py +0 -0
  48. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/__init__.py +0 -0
  49. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/always.py +0 -0
  50. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/collections.py +0 -0
  51. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/env.py +0 -0
  52. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/formatting.py +0 -0
  53. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/logs.py +0 -0
  54. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/mimic.py +0 -0
  55. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/noop.py +0 -0
  56. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/queue.py +0 -0
  57. {haiway-0.22.1 → haiway-0.23.1}/src/haiway/utils/stream.py +0 -0
  58. {haiway-0.22.1 → haiway-0.23.1}/tests/__init__.py +0 -0
  59. {haiway-0.22.1 → haiway-0.23.1}/tests/test_async_queue.py +0 -0
  60. {haiway-0.22.1 → haiway-0.23.1}/tests/test_async_stream.py +0 -0
  61. {haiway-0.22.1 → haiway-0.23.1}/tests/test_attribute_path.py +0 -0
  62. {haiway-0.22.1 → haiway-0.23.1}/tests/test_attribute_requirement.py +0 -0
  63. {haiway-0.22.1 → haiway-0.23.1}/tests/test_auto_retry.py +0 -0
  64. {haiway-0.22.1 → haiway-0.23.1}/tests/test_cache.py +0 -0
  65. {haiway-0.22.1 → haiway-0.23.1}/tests/test_context.py +0 -0
  66. {haiway-0.22.1 → haiway-0.23.1}/tests/test_disposables.py +0 -0
  67. {haiway-0.22.1 → haiway-0.23.1}/tests/test_process_concurrently.py +0 -0
  68. {haiway-0.22.1 → haiway-0.23.1}/tests/test_state.py +0 -0
  69. {haiway-0.22.1 → haiway-0.23.1}/tests/test_state_validation.py +0 -0
  70. {haiway-0.22.1 → haiway-0.23.1}/tests/test_streaming.py +0 -0
  71. {haiway-0.22.1 → haiway-0.23.1}/tests/test_timeout.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haiway
3
- Version: 0.22.1
3
+ Version: 0.23.1
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="159" time="1.948" timestamp="2025-06-18T12:25:24.482293+00:00" hostname="pkrvmxyh4eaekms"><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.101" /><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.020" /><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_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.001" /><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_with_real_async_context_managers" time="0.001" /><testcase classname="tests.test_disposables" name="test_nested_disposables_usage" 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_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.001" /><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.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.001" /><testcase classname="tests.test_state" name="test_generic_subtypes_validation" time="0.001" /><testcase classname="tests.test_state" name="test_copying_leaves_same_object" time="0.001" /><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.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.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.000" /><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.001" /><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.001" /><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_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="159" time="1.986" timestamp="2025-06-25T10:34:18.551105+00:00" hostname="pkrvmxyh4eaekms"><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.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_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.001" /><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_with_real_async_context_managers" time="0.001" /><testcase classname="tests.test_disposables" name="test_nested_disposables_usage" 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_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.000" /><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.001" /><testcase classname="tests.test_state" name="test_generic_subtypes_validation" time="0.001" /><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.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.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.000" /><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.001" /><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.001" /><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.001" /><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_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.22.1"
8
+ version = "0.23.1"
9
9
  readme = "README.md"
10
10
  maintainers = [
11
11
  { name = "Kacper Kaliński", email = "kacper.kalinski@miquido.com" },
@@ -403,7 +403,7 @@ def _logger_observability(
403
403
  f"[{trace_id_hex}] {scope.unique_name} Recorded attributes: {format_str(attributes)}",
404
404
  )
405
405
 
406
- def scope_entering[Metric: State](
406
+ def scope_entering(
407
407
  scope: ScopeIdentifier,
408
408
  /,
409
409
  ) -> None:
@@ -412,7 +412,7 @@ def _logger_observability(
412
412
  f"[{trace_id_hex}] {scope.unique_name} Entering scope: {scope.label}",
413
413
  )
414
414
 
415
- def scope_exiting[Metric: State](
415
+ def scope_exiting(
416
416
  scope: ScopeIdentifier,
417
417
  /,
418
418
  *,
@@ -37,6 +37,7 @@ class ScopeState:
37
37
  "_state",
38
38
  {type(element): element for element in state},
39
39
  )
40
+ assert all(isinstance(value, State) for value in self._state.values()) # nosec: B101
40
41
  self._lock: Lock
41
42
  object.__setattr__(
42
43
  self,
@@ -6,7 +6,6 @@ from uuid import UUID, uuid4
6
6
 
7
7
  from haiway.context import Observability, ObservabilityLevel, ScopeIdentifier
8
8
  from haiway.context.observability import ObservabilityAttribute
9
- from haiway.state import State
10
9
  from haiway.utils.formatting import format_str
11
10
 
12
11
  __all__ = ("LoggerObservability",)
@@ -232,7 +231,7 @@ def LoggerObservability( # noqa: C901, PLR0915
232
231
  f"[{trace_id_hex}] {scope.unique_name} {attributes_str}",
233
232
  )
234
233
 
235
- def scope_entering[Metric: State](
234
+ def scope_entering(
236
235
  scope: ScopeIdentifier,
237
236
  /,
238
237
  ) -> None:
@@ -255,7 +254,7 @@ def LoggerObservability( # noqa: C901, PLR0915
255
254
  f"[{trace_id_hex}] {scope.unique_name} Entering scope: {scope.label}",
256
255
  )
257
256
 
258
- def scope_exiting[Metric: State](
257
+ def scope_exiting(
259
258
  scope: ScopeIdentifier,
260
259
  /,
261
260
  *,
@@ -1,5 +1,5 @@
1
1
  import os
2
- from collections.abc import Mapping
2
+ from collections.abc import Mapping, Sequence
3
3
  from typing import Any, ClassVar, Self, cast, final
4
4
  from uuid import UUID
5
5
 
@@ -26,12 +26,16 @@ from opentelemetry.sdk.metrics.export import ConsoleMetricExporter, PeriodicExpo
26
26
  from opentelemetry.sdk.resources import Resource
27
27
  from opentelemetry.sdk.trace import TracerProvider
28
28
  from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter, SpanExporter
29
- from opentelemetry.trace import Span, StatusCode, Tracer
30
- from opentelemetry.trace.span import SpanContext
31
-
32
- from haiway.context import Observability, ObservabilityLevel, ScopeIdentifier
33
- from haiway.context.observability import ObservabilityAttribute
34
- from haiway.state import State
29
+ from opentelemetry.sdk.trace.id_generator import RandomIdGenerator
30
+ from opentelemetry.trace import Link, Span, SpanContext, StatusCode, TraceFlags, Tracer
31
+
32
+ from haiway.context import (
33
+ Observability,
34
+ ObservabilityAttribute,
35
+ ObservabilityLevel,
36
+ ScopeIdentifier,
37
+ ctx,
38
+ )
35
39
  from haiway.types import MISSING
36
40
 
37
41
  __all__ = ("OpenTelemetry",)
@@ -437,6 +441,8 @@ class OpenTelemetry:
437
441
  def observability( # noqa: C901, PLR0915
438
442
  cls,
439
443
  level: ObservabilityLevel = ObservabilityLevel.INFO,
444
+ *,
445
+ external_trace_id: str | None = None,
440
446
  ) -> Observability:
441
447
  """
442
448
  Create an Observability implementation using OpenTelemetry.
@@ -449,6 +455,9 @@ class OpenTelemetry:
449
455
  ----------
450
456
  level : ObservabilityLevel, default=ObservabilityLevel.INFO
451
457
  The minimum observability level to record
458
+ external_trace_id : str | None, optional
459
+ External trace ID for distributed tracing context propagation.
460
+ If provided, the root span will be linked to this external trace.
452
461
 
453
462
  Returns
454
463
  -------
@@ -645,7 +654,7 @@ class OpenTelemetry:
645
654
 
646
655
  scopes[scope.scope_id].record_attributes(attributes)
647
656
 
648
- def scope_entering[Metric: State](
657
+ def scope_entering(
649
658
  scope: ScopeIdentifier,
650
659
  /,
651
660
  ) -> None:
@@ -678,17 +687,44 @@ class OpenTelemetry:
678
687
  scope_store: ScopeStore
679
688
  if root_scope is None:
680
689
  meter = metrics.get_meter(scope.label)
681
- context: Context = Context(
682
- **get_current(),
683
- # trace_id=scope.trace_id,
684
- # span_id=scope.scope_id,
685
- )
690
+ context: Context = get_current()
691
+
692
+ # Handle distributed tracing with external trace ID
693
+ links: Sequence[Link] | None = None
694
+ if external_trace_id is not None:
695
+ # Convert external trace ID to OpenTelemetry trace ID format
696
+ try:
697
+ # Generate a proper span ID for the external trace link
698
+ id_generator = RandomIdGenerator()
699
+
700
+ # Create a link to the external trace
701
+ links = (
702
+ Link(
703
+ SpanContext(
704
+ ( # Assume external_trace_id is a hex string, convert to int
705
+ int(external_trace_id, 16)
706
+ if isinstance(external_trace_id, str)
707
+ else int(external_trace_id)
708
+ ),
709
+ id_generator.generate_span_id(), # Generate proper span ID
710
+ True, # is_remote=True
711
+ TraceFlags.SAMPLED, # pyright: ignore[reportArgumentType]
712
+ )
713
+ ),
714
+ )
715
+
716
+ except (ValueError, TypeError):
717
+ ctx.log_warning(
718
+ "Failed to convert external trace ID to OpenTelemetry format"
719
+ )
720
+
686
721
  scope_store = ScopeStore(
687
722
  scope,
688
723
  context=context,
689
724
  span=tracer.start_span(
690
725
  name=scope.label,
691
726
  context=context,
727
+ links=links,
692
728
  ),
693
729
  meter=meter,
694
730
  logger=get_logger(scope.label),
@@ -711,7 +747,7 @@ class OpenTelemetry:
711
747
 
712
748
  scopes[scope.scope_id] = scope_store
713
749
 
714
- def scope_exiting[Metric: State](
750
+ def scope_exiting(
715
751
  scope: ScopeIdentifier,
716
752
  /,
717
753
  *,
@@ -114,7 +114,7 @@ wheels = [
114
114
 
115
115
  [[package]]
116
116
  name = "haiway"
117
- version = "0.22.1"
117
+ version = "0.23.1"
118
118
  source = { editable = "." }
119
119
 
120
120
  [package.optional-dependencies]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes