haiway 0.14.0__tar.gz → 0.15.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.14.0 → haiway-0.15.0}/PKG-INFO +1 -1
- {haiway-0.14.0 → haiway-0.15.0}/junit/test-results.xml +1 -1
- {haiway-0.14.0 → haiway-0.15.0}/pyproject.toml +4 -1
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/access.py +34 -18
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/state.py +42 -2
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/tasks.py +2 -1
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/helpers/asynchrony.py +4 -6
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/helpers/caching.py +1 -1
- {haiway-0.14.0 → haiway-0.15.0}/uv.lock +46 -46
- {haiway-0.14.0 → haiway-0.15.0}/.github/workflows/ci.yml +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/.github/workflows/publish.yml +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/.gitignore +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/LICENSE +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/Makefile +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/README.md +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/config/pre-push +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/.dockerignore +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/Dockerfile +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/Makefile +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/README.md +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/config/.env.example +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/config/unit.json +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/docker-compose.yml +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/pyproject.toml +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/features/__int__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/features/todos/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/features/todos/config.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/features/todos/state.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/features/todos/types.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/features/todos/user_tasks.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/integrations/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/integrations/postgres/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/integrations/postgres/client.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/integrations/postgres/config.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/integrations/postgres/state.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/integrations/postgres/types.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/migrations/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/migrations/__main__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/migrations/postgres/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/migrations/postgres/execution.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/migrations/postgres/migration_0.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/migrations/postgres/types.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/__main__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/application.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/config.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/middlewares/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/middlewares/context.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/routes/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/routes/technical.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/server/routes/todos.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/solutions/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/solutions/user_tasks/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/solutions/user_tasks/config.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/solutions/user_tasks/postgres.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/solutions/user_tasks/state.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/src/solutions/user_tasks/types.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/examples/fastAPI/uv.lock +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/guidelines/functionalities.md +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/guidelines/packages.md +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/disposables.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/identifier.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/logging.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/metrics.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/context/types.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/helpers/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/helpers/metrics.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/helpers/retries.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/helpers/throttling.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/helpers/timeouted.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/helpers/tracing.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/py.typed +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/state/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/state/attributes.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/state/path.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/state/requirement.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/state/structure.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/state/validation.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/types/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/types/default.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/types/frozen.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/types/missing.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/always.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/collections.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/env.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/freezing.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/logs.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/mimic.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/noop.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/queue.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/src/haiway/utils/stream.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/__init__.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/test_async_queue.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/test_async_stream.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/test_attribute_path.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/test_auto_retry.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/test_cache.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/test_context.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/test_state.py +0 -0
- {haiway-0.14.0 → haiway-0.15.0}/tests/test_streaming.py +0 -0
- {haiway-0.14.0 → haiway-0.15.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.15.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><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="88" time="1.
|
1
|
+
<?xml version="1.0" encoding="utf-8"?><testsuites><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="88" time="1.118" timestamp="2025-04-02T07:36:48.794161" hostname="fv-az1784-745"><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.001" /><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_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_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.001" /><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.002" /><testcase classname="tests.test_state" name="test_copying_leaves_same_object" time="0.001" /><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.012" /></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.15.0"
|
9
9
|
readme = "README.md"
|
10
10
|
maintainers = [
|
11
11
|
{ name = "Kacper Kaliński", email = "kacper.kalinski@miquido.com" },
|
@@ -44,6 +44,9 @@ extend-exclude = [".venv", ".git", ".cache"]
|
|
44
44
|
lint.select = ["E", "F", "A", "I", "B", "PL", "W", "C", "RUF", "UP"]
|
45
45
|
lint.ignore = ["A005"]
|
46
46
|
|
47
|
+
[tool.ruff.lint.pylint]
|
48
|
+
max-args = 12
|
49
|
+
|
47
50
|
[tool.ruff.lint.per-file-ignores]
|
48
51
|
"__init__.py" = ["F401", "E402"]
|
49
52
|
"./tests/*.py" = ["PLR2004"]
|
@@ -1,6 +1,7 @@
|
|
1
1
|
from asyncio import (
|
2
2
|
CancelledError,
|
3
3
|
Task,
|
4
|
+
TaskGroup,
|
4
5
|
current_task,
|
5
6
|
iscoroutinefunction,
|
6
7
|
)
|
@@ -45,6 +46,7 @@ class ScopeContext:
|
|
45
46
|
self,
|
46
47
|
label: str,
|
47
48
|
logger: Logger | None,
|
49
|
+
task_group: TaskGroup | None,
|
48
50
|
state: tuple[State, ...],
|
49
51
|
disposables: Disposables | None,
|
50
52
|
metrics: MetricsHandler | None,
|
@@ -64,8 +66,16 @@ class ScopeContext:
|
|
64
66
|
logger=logger,
|
65
67
|
),
|
66
68
|
)
|
67
|
-
|
68
|
-
|
69
|
+
self._task_group_context: TaskGroupContext | None
|
70
|
+
object.__setattr__(
|
71
|
+
self,
|
72
|
+
"_task_group_context",
|
73
|
+
TaskGroupContext(
|
74
|
+
task_group=task_group,
|
75
|
+
)
|
76
|
+
if task_group is not None or self._identifier.is_root
|
77
|
+
else None,
|
78
|
+
)
|
69
79
|
# prepare state context to capture current state
|
70
80
|
self._state_context: StateContext
|
71
81
|
object.__setattr__(
|
@@ -110,6 +120,9 @@ class ScopeContext:
|
|
110
120
|
)
|
111
121
|
|
112
122
|
def __enter__(self) -> str:
|
123
|
+
assert ( # nosec: B101
|
124
|
+
self._task_group_context is None or self._identifier.is_root
|
125
|
+
), "Can't enter synchronous context with task group"
|
113
126
|
assert self._disposables is None, "Can't enter synchronous context with disposables" # nosec: B101
|
114
127
|
self._identifier.__enter__()
|
115
128
|
self._logger_context.__enter__()
|
@@ -151,23 +164,19 @@ class ScopeContext:
|
|
151
164
|
async def __aenter__(self) -> str:
|
152
165
|
self._identifier.__enter__()
|
153
166
|
self._logger_context.__enter__()
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
"_task_group_context",
|
158
|
-
TaskGroupContext(),
|
159
|
-
)
|
160
|
-
await self._task_group_context.__aenter__()
|
167
|
+
|
168
|
+
if task_group := self._task_group_context:
|
169
|
+
await task_group.__aenter__()
|
161
170
|
|
162
171
|
# lazily initialize state to include disposables results
|
163
|
-
if self._disposables
|
172
|
+
if disposables := self._disposables:
|
164
173
|
assert self._state_context._token is None # nosec: B101
|
165
174
|
object.__setattr__(
|
166
175
|
self,
|
167
176
|
"_state_context",
|
168
177
|
StateContext(
|
169
178
|
state=self._state_context._state.updated(
|
170
|
-
await
|
179
|
+
await disposables.__aenter__(),
|
171
180
|
),
|
172
181
|
),
|
173
182
|
)
|
@@ -183,18 +192,19 @@ class ScopeContext:
|
|
183
192
|
exc_val: BaseException | None,
|
184
193
|
exc_tb: TracebackType | None,
|
185
194
|
) -> None:
|
186
|
-
if self._disposables
|
187
|
-
await
|
195
|
+
if disposables := self._disposables:
|
196
|
+
await disposables.__aexit__(
|
188
197
|
exc_type=exc_type,
|
189
198
|
exc_val=exc_val,
|
190
199
|
exc_tb=exc_tb,
|
191
200
|
)
|
192
201
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
202
|
+
if task_group := self._task_group_context:
|
203
|
+
await task_group.__aexit__(
|
204
|
+
exc_type=exc_type,
|
205
|
+
exc_val=exc_val,
|
206
|
+
exc_tb=exc_tb,
|
207
|
+
)
|
198
208
|
|
199
209
|
self._metrics_context.__exit__(
|
200
210
|
exc_type=exc_type,
|
@@ -278,6 +288,7 @@ class ctx:
|
|
278
288
|
*state: State,
|
279
289
|
disposables: Disposables | Iterable[Disposable] | None = None,
|
280
290
|
logger: Logger | None = None,
|
291
|
+
task_group: TaskGroup | None = None,
|
281
292
|
metrics: MetricsHandler | None = None,
|
282
293
|
) -> ScopeContext:
|
283
294
|
"""
|
@@ -302,6 +313,10 @@ class ctx:
|
|
302
313
|
logger used within the scope context, when not provided current logger will be used\
|
303
314
|
if any, otherwise the logger with the scope name will be requested.
|
304
315
|
|
316
|
+
task_group: TaskGroup | None
|
317
|
+
task group used for spawning and joining tasks within the context. Root scope will
|
318
|
+
always have task group created even when not set.
|
319
|
+
|
305
320
|
metrics_store: MetricsStore | None = None
|
306
321
|
metrics storage solution responsible for recording and storing metrics.\
|
307
322
|
Metrics recroding will be ignored if storage is not provided.
|
@@ -328,6 +343,7 @@ class ctx:
|
|
328
343
|
return ScopeContext(
|
329
344
|
label=label,
|
330
345
|
logger=logger,
|
346
|
+
task_group=task_group,
|
331
347
|
state=state,
|
332
348
|
disposables=resolved_disposables,
|
333
349
|
metrics=metrics,
|
@@ -1,10 +1,12 @@
|
|
1
|
-
from
|
1
|
+
from asyncio import iscoroutinefunction
|
2
|
+
from collections.abc import Callable, Coroutine, Iterable, MutableMapping
|
2
3
|
from contextvars import ContextVar, Token
|
3
4
|
from types import TracebackType
|
4
|
-
from typing import Any, Self, cast, final
|
5
|
+
from typing import Any, Self, cast, final, overload
|
5
6
|
|
6
7
|
from haiway.context.types import MissingContext, MissingState
|
7
8
|
from haiway.state import State
|
9
|
+
from haiway.utils.mimic import mimic_function
|
8
10
|
|
9
11
|
__all__ = [
|
10
12
|
"ScopeState",
|
@@ -179,3 +181,41 @@ class StateContext:
|
|
179
181
|
"_token",
|
180
182
|
None,
|
181
183
|
)
|
184
|
+
|
185
|
+
@overload
|
186
|
+
def __call__[Result, **Arguments](
|
187
|
+
self,
|
188
|
+
function: Callable[Arguments, Coroutine[Any, Any, Result]],
|
189
|
+
) -> Callable[Arguments, Coroutine[Any, Any, Result]]: ...
|
190
|
+
|
191
|
+
@overload
|
192
|
+
def __call__[Result, **Arguments](
|
193
|
+
self,
|
194
|
+
function: Callable[Arguments, Result],
|
195
|
+
) -> Callable[Arguments, Result]: ...
|
196
|
+
|
197
|
+
def __call__[Result, **Arguments](
|
198
|
+
self,
|
199
|
+
function: Callable[Arguments, Coroutine[Any, Any, Result]] | Callable[Arguments, Result],
|
200
|
+
) -> Callable[Arguments, Coroutine[Any, Any, Result]] | Callable[Arguments, Result]:
|
201
|
+
if iscoroutinefunction(function):
|
202
|
+
|
203
|
+
async def async_context(
|
204
|
+
*args: Arguments.args,
|
205
|
+
**kwargs: Arguments.kwargs,
|
206
|
+
) -> Result:
|
207
|
+
with self:
|
208
|
+
return await function(*args, **kwargs)
|
209
|
+
|
210
|
+
return mimic_function(function, within=async_context)
|
211
|
+
|
212
|
+
else:
|
213
|
+
|
214
|
+
def sync_context(
|
215
|
+
*args: Arguments.args,
|
216
|
+
**kwargs: Arguments.kwargs,
|
217
|
+
) -> Result:
|
218
|
+
with self:
|
219
|
+
return function(*args, **kwargs) # pyright: ignore[reportReturnType]
|
220
|
+
|
221
|
+
return mimic_function(function, within=sync_context) # pyright: ignore[reportReturnType]
|
@@ -40,12 +40,13 @@ class TaskGroupContext:
|
|
40
40
|
|
41
41
|
def __init__(
|
42
42
|
self,
|
43
|
+
task_group: TaskGroup | None = None,
|
43
44
|
) -> None:
|
44
45
|
self._group: TaskGroup
|
45
46
|
object.__setattr__(
|
46
47
|
self,
|
47
48
|
"_group",
|
48
|
-
TaskGroup(),
|
49
|
+
task_group if task_group is not None else TaskGroup(),
|
49
50
|
)
|
50
51
|
self._token: Token[TaskGroup] | None
|
51
52
|
object.__setattr__(
|
@@ -30,12 +30,10 @@ def wrap_async[**Args, Result](
|
|
30
30
|
|
31
31
|
|
32
32
|
@overload
|
33
|
-
def asynchronous[**Args, Result]() ->
|
34
|
-
Callable[
|
35
|
-
|
36
|
-
|
37
|
-
]
|
38
|
-
): ...
|
33
|
+
def asynchronous[**Args, Result]() -> Callable[
|
34
|
+
[Callable[Args, Result]],
|
35
|
+
Callable[Args, Coroutine[Any, Any, Result]],
|
36
|
+
]: ...
|
39
37
|
|
40
38
|
|
41
39
|
@overload
|
@@ -28,46 +28,46 @@ wheels = [
|
|
28
28
|
|
29
29
|
[[package]]
|
30
30
|
name = "coverage"
|
31
|
-
version = "7.
|
31
|
+
version = "7.8.0"
|
32
32
|
source = { registry = "https://pypi.org/simple" }
|
33
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
33
|
+
sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872 }
|
34
34
|
wheels = [
|
35
|
-
{ url = "https://files.pythonhosted.org/packages/
|
36
|
-
{ url = "https://files.pythonhosted.org/packages/
|
37
|
-
{ url = "https://files.pythonhosted.org/packages/
|
38
|
-
{ url = "https://files.pythonhosted.org/packages/
|
39
|
-
{ url = "https://files.pythonhosted.org/packages/
|
40
|
-
{ url = "https://files.pythonhosted.org/packages/
|
41
|
-
{ url = "https://files.pythonhosted.org/packages/
|
42
|
-
{ url = "https://files.pythonhosted.org/packages/
|
43
|
-
{ url = "https://files.pythonhosted.org/packages/
|
44
|
-
{ url = "https://files.pythonhosted.org/packages/
|
45
|
-
{ url = "https://files.pythonhosted.org/packages/
|
46
|
-
{ url = "https://files.pythonhosted.org/packages/
|
47
|
-
{ url = "https://files.pythonhosted.org/packages/
|
48
|
-
{ url = "https://files.pythonhosted.org/packages/
|
49
|
-
{ url = "https://files.pythonhosted.org/packages/
|
50
|
-
{ url = "https://files.pythonhosted.org/packages/
|
51
|
-
{ url = "https://files.pythonhosted.org/packages/
|
52
|
-
{ url = "https://files.pythonhosted.org/packages/
|
53
|
-
{ url = "https://files.pythonhosted.org/packages/
|
54
|
-
{ url = "https://files.pythonhosted.org/packages/
|
55
|
-
{ url = "https://files.pythonhosted.org/packages/
|
56
|
-
{ url = "https://files.pythonhosted.org/packages/
|
57
|
-
{ url = "https://files.pythonhosted.org/packages/
|
58
|
-
{ url = "https://files.pythonhosted.org/packages/
|
59
|
-
{ url = "https://files.pythonhosted.org/packages/
|
60
|
-
{ url = "https://files.pythonhosted.org/packages/
|
61
|
-
{ url = "https://files.pythonhosted.org/packages/
|
62
|
-
{ url = "https://files.pythonhosted.org/packages/
|
63
|
-
{ url = "https://files.pythonhosted.org/packages/
|
64
|
-
{ url = "https://files.pythonhosted.org/packages/
|
65
|
-
{ url = "https://files.pythonhosted.org/packages/
|
35
|
+
{ url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684 },
|
36
|
+
{ url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935 },
|
37
|
+
{ url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994 },
|
38
|
+
{ url = "https://files.pythonhosted.org/packages/54/80/039cc7f1f81dcbd01ea796d36d3797e60c106077e31fd1f526b85337d6a1/coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05", size = 242885 },
|
39
|
+
{ url = "https://files.pythonhosted.org/packages/10/e0/dc8355f992b6cc2f9dcd5ef6242b62a3f73264893bc09fbb08bfcab18eb4/coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a", size = 245142 },
|
40
|
+
{ url = "https://files.pythonhosted.org/packages/43/1b/33e313b22cf50f652becb94c6e7dae25d8f02e52e44db37a82de9ac357e8/coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6", size = 244906 },
|
41
|
+
{ url = "https://files.pythonhosted.org/packages/05/08/c0a8048e942e7f918764ccc99503e2bccffba1c42568693ce6955860365e/coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47", size = 243124 },
|
42
|
+
{ url = "https://files.pythonhosted.org/packages/5b/62/ea625b30623083c2aad645c9a6288ad9fc83d570f9adb913a2abdba562dd/coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe", size = 244317 },
|
43
|
+
{ url = "https://files.pythonhosted.org/packages/62/cb/3871f13ee1130a6c8f020e2f71d9ed269e1e2124aa3374d2180ee451cee9/coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545", size = 214170 },
|
44
|
+
{ url = "https://files.pythonhosted.org/packages/88/26/69fe1193ab0bfa1eb7a7c0149a066123611baba029ebb448500abd8143f9/coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b", size = 214969 },
|
45
|
+
{ url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708 },
|
46
|
+
{ url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981 },
|
47
|
+
{ url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495 },
|
48
|
+
{ url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538 },
|
49
|
+
{ url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561 },
|
50
|
+
{ url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633 },
|
51
|
+
{ url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712 },
|
52
|
+
{ url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000 },
|
53
|
+
{ url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195 },
|
54
|
+
{ url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998 },
|
55
|
+
{ url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541 },
|
56
|
+
{ url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767 },
|
57
|
+
{ url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997 },
|
58
|
+
{ url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708 },
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046 },
|
60
|
+
{ url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139 },
|
61
|
+
{ url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307 },
|
62
|
+
{ url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116 },
|
63
|
+
{ url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909 },
|
64
|
+
{ url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068 },
|
65
|
+
{ url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435 },
|
66
66
|
]
|
67
67
|
|
68
68
|
[[package]]
|
69
69
|
name = "haiway"
|
70
|
-
version = "0.
|
70
|
+
version = "0.15.0"
|
71
71
|
source = { editable = "." }
|
72
72
|
|
73
73
|
[package.optional-dependencies]
|
@@ -172,15 +172,15 @@ wheels = [
|
|
172
172
|
|
173
173
|
[[package]]
|
174
174
|
name = "pyright"
|
175
|
-
version = "1.1.
|
175
|
+
version = "1.1.398"
|
176
176
|
source = { registry = "https://pypi.org/simple" }
|
177
177
|
dependencies = [
|
178
178
|
{ name = "nodeenv" },
|
179
179
|
{ name = "typing-extensions" },
|
180
180
|
]
|
181
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
181
|
+
sdist = { url = "https://files.pythonhosted.org/packages/24/d6/48740f1d029e9fc4194880d1ad03dcf0ba3a8f802e0e166b8f63350b3584/pyright-1.1.398.tar.gz", hash = "sha256:357a13edd9be8082dc73be51190913e475fa41a6efb6ec0d4b7aab3bc11638d8", size = 3892675 }
|
182
182
|
wheels = [
|
183
|
-
{ url = "https://files.pythonhosted.org/packages/
|
183
|
+
{ url = "https://files.pythonhosted.org/packages/58/e0/5283593f61b3c525d6d7e94cfb6b3ded20b3df66e953acaf7bb4f23b3f6e/pyright-1.1.398-py3-none-any.whl", hash = "sha256:0a70bfd007d9ea7de1cf9740e1ad1a40a122592cfe22a3f6791b06162ad08753", size = 5780235 },
|
184
184
|
]
|
185
185
|
|
186
186
|
[[package]]
|
@@ -251,15 +251,15 @@ wheels = [
|
|
251
251
|
|
252
252
|
[[package]]
|
253
253
|
name = "rich"
|
254
|
-
version = "
|
254
|
+
version = "14.0.0"
|
255
255
|
source = { registry = "https://pypi.org/simple" }
|
256
256
|
dependencies = [
|
257
257
|
{ name = "markdown-it-py" },
|
258
258
|
{ name = "pygments" },
|
259
259
|
]
|
260
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
260
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 }
|
261
261
|
wheels = [
|
262
|
-
{ url = "https://files.pythonhosted.org/packages/
|
262
|
+
{ url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 },
|
263
263
|
]
|
264
264
|
|
265
265
|
[[package]]
|
@@ -289,11 +289,11 @@ wheels = [
|
|
289
289
|
|
290
290
|
[[package]]
|
291
291
|
name = "setuptools"
|
292
|
-
version = "
|
292
|
+
version = "78.1.0"
|
293
293
|
source = { registry = "https://pypi.org/simple" }
|
294
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
294
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a9/5a/0db4da3bc908df06e5efae42b44e75c81dd52716e10192ff36d0c1c8e379/setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54", size = 1367827 }
|
295
295
|
wheels = [
|
296
|
-
{ url = "https://files.pythonhosted.org/packages/
|
296
|
+
{ url = "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8", size = 1256108 },
|
297
297
|
]
|
298
298
|
|
299
299
|
[[package]]
|
@@ -310,9 +310,9 @@ wheels = [
|
|
310
310
|
|
311
311
|
[[package]]
|
312
312
|
name = "typing-extensions"
|
313
|
-
version = "4.
|
313
|
+
version = "4.13.0"
|
314
314
|
source = { registry = "https://pypi.org/simple" }
|
315
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
315
|
+
sdist = { url = "https://files.pythonhosted.org/packages/0e/3e/b00a62db91a83fff600de219b6ea9908e6918664899a2d85db222f4fbf19/typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b", size = 106520 }
|
316
316
|
wheels = [
|
317
|
-
{ url = "https://files.pythonhosted.org/packages/
|
317
|
+
{ url = "https://files.pythonhosted.org/packages/e0/86/39b65d676ec5732de17b7e3c476e45bb80ec64eb50737a8dce1a4178aba1/typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5", size = 45683 },
|
318
318
|
]
|
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
|
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
|
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
|
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
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|