coco-framework 0.1.0__py3-none-any.whl
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.
- coco/__init__.py +3 -0
- coco/agents/__init__.py +9 -0
- coco/agents/_subagent_transformer.py +307 -0
- coco/agents/factory.py +2164 -0
- coco/agents/middleware/__init__.py +100 -0
- coco/agents/middleware/_execution.py +385 -0
- coco/agents/middleware/_redaction.py +454 -0
- coco/agents/middleware/_retry.py +134 -0
- coco/agents/middleware/_trace_policy.py +61 -0
- coco/agents/middleware/context_editing.py +306 -0
- coco/agents/middleware/file_search.py +433 -0
- coco/agents/middleware/human_in_the_loop.py +680 -0
- coco/agents/middleware/internal_call_transformer.py +108 -0
- coco/agents/middleware/model_call_limit.py +267 -0
- coco/agents/middleware/model_fallback.py +417 -0
- coco/agents/middleware/model_retry.py +327 -0
- coco/agents/middleware/pii.py +878 -0
- coco/agents/middleware/provider_tool_search.py +307 -0
- coco/agents/middleware/shell_tool.py +949 -0
- coco/agents/middleware/summarization.py +910 -0
- coco/agents/middleware/todo.py +357 -0
- coco/agents/middleware/tool_call_limit.py +495 -0
- coco/agents/middleware/tool_emulator.py +251 -0
- coco/agents/middleware/tool_error.py +209 -0
- coco/agents/middleware/tool_retry.py +421 -0
- coco/agents/middleware/tool_selection.py +515 -0
- coco/agents/middleware/types.py +2201 -0
- coco/agents/structured_output.py +472 -0
- coco/chat_models/__init__.py +7 -0
- coco/chat_models/base.py +1082 -0
- coco/embeddings/__init__.py +18 -0
- coco/embeddings/base.py +279 -0
- coco/mcp/__init__.py +36 -0
- coco/mcp/adapter.py +245 -0
- coco/mcp/elicitation.py +394 -0
- coco/mcp/tools.py +307 -0
- coco/messages/__init__.py +73 -0
- coco/py.typed +0 -0
- coco/rate_limiters/__init__.py +13 -0
- coco/tools/__init__.py +22 -0
- coco/tools/tool_node.py +20 -0
- coco_anthropic/__init__.py +15 -0
- coco_anthropic/_client_utils.py +81 -0
- coco_anthropic/_compat.py +228 -0
- coco_anthropic/_sdk_compat.py +124 -0
- coco_anthropic/_version.py +3 -0
- coco_anthropic/chat_models.py +3349 -0
- coco_anthropic/data/__init__.py +1 -0
- coco_anthropic/data/_profiles.py +491 -0
- coco_anthropic/data/profile_augmentations.toml +69 -0
- coco_anthropic/experimental.py +140 -0
- coco_anthropic/llms.py +428 -0
- coco_anthropic/middleware/__init__.py +25 -0
- coco_anthropic/middleware/anthropic_tools.py +1197 -0
- coco_anthropic/middleware/bash.py +84 -0
- coco_anthropic/middleware/file_search.py +360 -0
- coco_anthropic/middleware/prompt_caching.py +276 -0
- coco_anthropic/output_parsers.py +93 -0
- coco_anthropic/py.typed +0 -0
- coco_core/__init__.py +20 -0
- coco_core/_api/__init__.py +87 -0
- coco_core/_api/beta_decorator.py +266 -0
- coco_core/_api/deprecation.py +637 -0
- coco_core/_api/internal.py +23 -0
- coco_core/_api/path.py +50 -0
- coco_core/_import_utils.py +41 -0
- coco_core/_protocol.py +625 -0
- coco_core/_security/__init__.py +36 -0
- coco_core/_security/_exceptions.py +9 -0
- coco_core/_security/_policy.py +313 -0
- coco_core/_security/_ssrf_protection.py +155 -0
- coco_core/_security/_transport.py +254 -0
- coco_core/agents.py +258 -0
- coco_core/caches.py +272 -0
- coco_core/callbacks/__init__.py +132 -0
- coco_core/callbacks/base.py +1229 -0
- coco_core/callbacks/file.py +266 -0
- coco_core/callbacks/manager.py +2826 -0
- coco_core/callbacks/stdout.py +123 -0
- coco_core/callbacks/streaming_stdout.py +154 -0
- coco_core/callbacks/usage.py +124 -0
- coco_core/chat_history.py +267 -0
- coco_core/chat_loaders.py +26 -0
- coco_core/chat_sessions.py +19 -0
- coco_core/cross_encoders.py +18 -0
- coco_core/document_loaders/__init__.py +36 -0
- coco_core/document_loaders/base.py +155 -0
- coco_core/document_loaders/blob_loaders.py +38 -0
- coco_core/documents/__init__.py +55 -0
- coco_core/documents/base.py +347 -0
- coco_core/documents/compressor.py +74 -0
- coco_core/documents/transformers.py +79 -0
- coco_core/embeddings/__init__.py +31 -0
- coco_core/embeddings/embeddings.py +78 -0
- coco_core/embeddings/fake.py +129 -0
- coco_core/env.py +22 -0
- coco_core/example_selectors/__init__.py +47 -0
- coco_core/example_selectors/base.py +60 -0
- coco_core/example_selectors/length_based.py +131 -0
- coco_core/example_selectors/semantic_similarity.py +366 -0
- coco_core/exceptions.py +166 -0
- coco_core/globals.py +72 -0
- coco_core/indexing/__init__.py +53 -0
- coco_core/indexing/api.py +954 -0
- coco_core/indexing/base.py +661 -0
- coco_core/indexing/in_memory.py +104 -0
- coco_core/language_models/__init__.py +116 -0
- coco_core/language_models/_compat_bridge.py +844 -0
- coco_core/language_models/_utils.py +343 -0
- coco_core/language_models/base.py +500 -0
- coco_core/language_models/chat_model_stream.py +1525 -0
- coco_core/language_models/chat_models.py +2748 -0
- coco_core/language_models/fake.py +137 -0
- coco_core/language_models/fake_chat_models.py +396 -0
- coco_core/language_models/llms.py +1569 -0
- coco_core/language_models/model_profile.py +183 -0
- coco_core/load/__init__.py +44 -0
- coco_core/load/_validation.py +191 -0
- coco_core/load/dump.py +120 -0
- coco_core/load/load.py +828 -0
- coco_core/load/mapping.py +1097 -0
- coco_core/load/serializable.py +406 -0
- coco_core/messages/__init__.py +198 -0
- coco_core/messages/ai.py +854 -0
- coco_core/messages/base.py +518 -0
- coco_core/messages/block_translators/__init__.py +112 -0
- coco_core/messages/block_translators/anthropic.py +534 -0
- coco_core/messages/block_translators/bedrock.py +108 -0
- coco_core/messages/block_translators/bedrock_converse.py +329 -0
- coco_core/messages/block_translators/coco_v0.py +303 -0
- coco_core/messages/block_translators/google_genai.py +610 -0
- coco_core/messages/block_translators/google_vertexai.py +21 -0
- coco_core/messages/block_translators/groq.py +157 -0
- coco_core/messages/block_translators/openai.py +1089 -0
- coco_core/messages/chat.py +64 -0
- coco_core/messages/content.py +1488 -0
- coco_core/messages/function.py +62 -0
- coco_core/messages/human.py +70 -0
- coco_core/messages/modifier.py +33 -0
- coco_core/messages/system.py +70 -0
- coco_core/messages/tool.py +418 -0
- coco_core/messages/utils.py +2442 -0
- coco_core/output_parsers/__init__.py +101 -0
- coco_core/output_parsers/base.py +361 -0
- coco_core/output_parsers/format_instructions.py +16 -0
- coco_core/output_parsers/json.py +139 -0
- coco_core/output_parsers/list.py +249 -0
- coco_core/output_parsers/openai_functions.py +324 -0
- coco_core/output_parsers/openai_tools.py +383 -0
- coco_core/output_parsers/pydantic.py +141 -0
- coco_core/output_parsers/string.py +63 -0
- coco_core/output_parsers/transform.py +175 -0
- coco_core/output_parsers/xml.py +301 -0
- coco_core/outputs/__init__.py +66 -0
- coco_core/outputs/chat_generation.py +147 -0
- coco_core/outputs/chat_result.py +39 -0
- coco_core/outputs/generation.py +80 -0
- coco_core/outputs/llm_result.py +112 -0
- coco_core/outputs/run_info.py +22 -0
- coco_core/prompt_values.py +161 -0
- coco_core/prompts/__init__.py +101 -0
- coco_core/prompts/base.py +508 -0
- coco_core/prompts/chat.py +1495 -0
- coco_core/prompts/dict.py +177 -0
- coco_core/prompts/few_shot.py +483 -0
- coco_core/prompts/few_shot_with_templates.py +239 -0
- coco_core/prompts/image.py +177 -0
- coco_core/prompts/loading.py +296 -0
- coco_core/prompts/message.py +97 -0
- coco_core/prompts/prompt.py +312 -0
- coco_core/prompts/string.py +399 -0
- coco_core/prompts/structured.py +214 -0
- coco_core/py.typed +0 -0
- coco_core/rate_limiters.py +254 -0
- coco_core/retrievers.py +328 -0
- coco_core/runnables/__init__.py +136 -0
- coco_core/runnables/base.py +6725 -0
- coco_core/runnables/branch.py +457 -0
- coco_core/runnables/config.py +712 -0
- coco_core/runnables/configurable.py +710 -0
- coco_core/runnables/fallbacks.py +663 -0
- coco_core/runnables/graph.py +741 -0
- coco_core/runnables/graph_ascii.py +366 -0
- coco_core/runnables/graph_mermaid.py +503 -0
- coco_core/runnables/graph_png.py +215 -0
- coco_core/runnables/history.py +631 -0
- coco_core/runnables/passthrough.py +849 -0
- coco_core/runnables/retry.py +379 -0
- coco_core/runnables/router.py +239 -0
- coco_core/runnables/schema.py +188 -0
- coco_core/runnables/utils.py +798 -0
- coco_core/stores.py +291 -0
- coco_core/structured_query.py +203 -0
- coco_core/sys_info.py +154 -0
- coco_core/tools/__init__.py +95 -0
- coco_core/tools/base.py +1948 -0
- coco_core/tools/convert.py +497 -0
- coco_core/tools/render.py +67 -0
- coco_core/tools/retriever.py +94 -0
- coco_core/tools/simple.py +208 -0
- coco_core/tools/structured.py +322 -0
- coco_core/tracers/__init__.py +47 -0
- coco_core/tracers/_compat.py +95 -0
- coco_core/tracers/_context.py +337 -0
- coco_core/tracers/_streaming.py +53 -0
- coco_core/tracers/base.py +955 -0
- coco_core/tracers/coco.py +279 -0
- coco_core/tracers/context.py +205 -0
- coco_core/tracers/core.py +766 -0
- coco_core/tracers/event_stream.py +1101 -0
- coco_core/tracers/log_stream.py +765 -0
- coco_core/tracers/memory_stream.py +200 -0
- coco_core/tracers/root_listeners.py +130 -0
- coco_core/tracers/run_collector.py +40 -0
- coco_core/tracers/schemas.py +14 -0
- coco_core/tracers/stdout.py +205 -0
- coco_core/utils/__init__.py +111 -0
- coco_core/utils/_gateway.py +274 -0
- coco_core/utils/_merge.py +218 -0
- coco_core/utils/aiter.py +357 -0
- coco_core/utils/env.py +86 -0
- coco_core/utils/formatting.py +80 -0
- coco_core/utils/function_calling.py +869 -0
- coco_core/utils/html.py +132 -0
- coco_core/utils/image.py +15 -0
- coco_core/utils/input.py +82 -0
- coco_core/utils/interactive_env.py +12 -0
- coco_core/utils/iter.py +229 -0
- coco_core/utils/json.py +230 -0
- coco_core/utils/json_schema.py +273 -0
- coco_core/utils/mustache.py +706 -0
- coco_core/utils/pydantic.py +631 -0
- coco_core/utils/strings.py +69 -0
- coco_core/utils/usage.py +61 -0
- coco_core/utils/utils.py +528 -0
- coco_core/utils/uuid.py +57 -0
- coco_core/vectorstores/__init__.py +53 -0
- coco_core/vectorstores/base.py +1111 -0
- coco_core/vectorstores/in_memory.py +546 -0
- coco_core/vectorstores/utils.py +163 -0
- coco_core/version.py +3 -0
- coco_framework-0.1.0.dist-info/METADATA +184 -0
- coco_framework-0.1.0.dist-info/RECORD +400 -0
- coco_framework-0.1.0.dist-info/WHEEL +4 -0
- coco_framework-0.1.0.dist-info/licenses/LICENSE +24 -0
- coco_framework-0.1.0.dist-info/licenses/NOTICE +15 -0
- coco_graph/_internal/__init__.py +4 -0
- coco_graph/_internal/_cache.py +31 -0
- coco_graph/_internal/_config.py +474 -0
- coco_graph/_internal/_constants.py +140 -0
- coco_graph/_internal/_fields.py +213 -0
- coco_graph/_internal/_future.py +220 -0
- coco_graph/_internal/_pydantic.py +275 -0
- coco_graph/_internal/_queue.py +124 -0
- coco_graph/_internal/_replay.py +90 -0
- coco_graph/_internal/_retry.py +29 -0
- coco_graph/_internal/_runnable.py +969 -0
- coco_graph/_internal/_scratchpad.py +19 -0
- coco_graph/_internal/_serde.py +253 -0
- coco_graph/_internal/_timeout.py +25 -0
- coco_graph/_internal/_typing.py +54 -0
- coco_graph/cache/base/__init__.py +48 -0
- coco_graph/cache/base/py.typed +0 -0
- coco_graph/cache/memory/__init__.py +73 -0
- coco_graph/cache/redis/__init__.py +144 -0
- coco_graph/cache/sqlite/__init__.py +120 -0
- coco_graph/callbacks.py +394 -0
- coco_graph/channels/__init__.py +29 -0
- coco_graph/channels/any_value.py +72 -0
- coco_graph/channels/base.py +121 -0
- coco_graph/channels/binop.py +155 -0
- coco_graph/channels/delta.py +202 -0
- coco_graph/channels/ephemeral_value.py +79 -0
- coco_graph/channels/last_value.py +151 -0
- coco_graph/channels/named_barrier_value.py +167 -0
- coco_graph/channels/topic.py +94 -0
- coco_graph/channels/untracked_value.py +73 -0
- coco_graph/checkpoint/base/__init__.py +861 -0
- coco_graph/checkpoint/base/id.py +109 -0
- coco_graph/checkpoint/base/py.typed +0 -0
- coco_graph/checkpoint/memory/__init__.py +698 -0
- coco_graph/checkpoint/memory/py.typed +0 -0
- coco_graph/checkpoint/postgres/__init__.py +602 -0
- coco_graph/checkpoint/postgres/_ainternal.py +23 -0
- coco_graph/checkpoint/postgres/_internal.py +21 -0
- coco_graph/checkpoint/postgres/aio.py +691 -0
- coco_graph/checkpoint/postgres/base.py +666 -0
- coco_graph/checkpoint/postgres/py.typed +0 -0
- coco_graph/checkpoint/postgres/shallow.py +967 -0
- coco_graph/checkpoint/serde/__init__.py +0 -0
- coco_graph/checkpoint/serde/_msgpack.py +97 -0
- coco_graph/checkpoint/serde/base.py +64 -0
- coco_graph/checkpoint/serde/encrypted.py +80 -0
- coco_graph/checkpoint/serde/event_hooks.py +52 -0
- coco_graph/checkpoint/serde/jsonplus.py +883 -0
- coco_graph/checkpoint/serde/py.typed +0 -0
- coco_graph/checkpoint/serde/types.py +68 -0
- coco_graph/checkpoint/sqlite/__init__.py +645 -0
- coco_graph/checkpoint/sqlite/_delta.py +172 -0
- coco_graph/checkpoint/sqlite/aio.py +738 -0
- coco_graph/checkpoint/sqlite/py.typed +0 -0
- coco_graph/checkpoint/sqlite/utils.py +116 -0
- coco_graph/config.py +196 -0
- coco_graph/constants.py +64 -0
- coco_graph/errors.py +241 -0
- coco_graph/func/__init__.py +620 -0
- coco_graph/graph/__init__.py +12 -0
- coco_graph/graph/_branch.py +225 -0
- coco_graph/graph/_node.py +103 -0
- coco_graph/graph/message.py +437 -0
- coco_graph/graph/state.py +1978 -0
- coco_graph/graph/ui.py +227 -0
- coco_graph/managed/__init__.py +3 -0
- coco_graph/managed/base.py +31 -0
- coco_graph/managed/is_last_step.py +24 -0
- coco_graph/prebuilt/__init__.py +23 -0
- coco_graph/prebuilt/_tool_call_stream.py +117 -0
- coco_graph/prebuilt/_tool_call_transformer.py +165 -0
- coco_graph/prebuilt/chat_agent_executor.py +1015 -0
- coco_graph/prebuilt/interrupt.py +105 -0
- coco_graph/prebuilt/py.typed +0 -0
- coco_graph/prebuilt/tool_node.py +2030 -0
- coco_graph/prebuilt/tool_validator.py +221 -0
- coco_graph/pregel/__init__.py +3 -0
- coco_graph/pregel/_algo.py +1460 -0
- coco_graph/pregel/_call.py +298 -0
- coco_graph/pregel/_checkpoint.py +331 -0
- coco_graph/pregel/_config.py +0 -0
- coco_graph/pregel/_draw.py +294 -0
- coco_graph/pregel/_executor.py +223 -0
- coco_graph/pregel/_io.py +174 -0
- coco_graph/pregel/_log.py +3 -0
- coco_graph/pregel/_loop.py +1988 -0
- coco_graph/pregel/_messages.py +461 -0
- coco_graph/pregel/_read.py +312 -0
- coco_graph/pregel/_retry.py +854 -0
- coco_graph/pregel/_runner.py +941 -0
- coco_graph/pregel/_tools.py +268 -0
- coco_graph/pregel/_utils.py +221 -0
- coco_graph/pregel/_validate.py +120 -0
- coco_graph/pregel/_write.py +192 -0
- coco_graph/pregel/debug.py +302 -0
- coco_graph/pregel/main.py +4364 -0
- coco_graph/pregel/protocol.py +288 -0
- coco_graph/pregel/types.py +38 -0
- coco_graph/py.typed +0 -0
- coco_graph/runtime.py +350 -0
- coco_graph/store/base/__init__.py +1322 -0
- coco_graph/store/base/batch.py +371 -0
- coco_graph/store/base/embed.py +436 -0
- coco_graph/store/base/py.typed +0 -0
- coco_graph/store/memory/__init__.py +592 -0
- coco_graph/store/memory/py.typed +0 -0
- coco_graph/store/postgres/__init__.py +4 -0
- coco_graph/store/postgres/aio.py +592 -0
- coco_graph/store/postgres/base.py +1480 -0
- coco_graph/store/postgres/py.typed +0 -0
- coco_graph/store/sqlite/__init__.py +4 -0
- coco_graph/store/sqlite/aio.py +632 -0
- coco_graph/store/sqlite/base.py +1514 -0
- coco_graph/stream/__init__.py +45 -0
- coco_graph/stream/_convert.py +32 -0
- coco_graph/stream/_mux.py +523 -0
- coco_graph/stream/_types.py +330 -0
- coco_graph/stream/run_stream.py +735 -0
- coco_graph/stream/stream_channel.py +341 -0
- coco_graph/stream/transformers.py +1039 -0
- coco_graph/types.py +1079 -0
- coco_graph/typing.py +48 -0
- coco_graph/utils/__init__.py +1 -0
- coco_graph/utils/config.py +4 -0
- coco_graph/utils/runnable.py +3 -0
- coco_graph/version.py +13 -0
- coco_graph/warnings.py +69 -0
- coco_openai/__init__.py +20 -0
- coco_openai/_compat.py +45 -0
- coco_openai/_version.py +3 -0
- coco_openai/chat_models/__init__.py +6 -0
- coco_openai/chat_models/_client_utils.py +684 -0
- coco_openai/chat_models/_compat.py +525 -0
- coco_openai/chat_models/azure.py +1227 -0
- coco_openai/chat_models/base.py +5654 -0
- coco_openai/chat_models/codex.py +557 -0
- coco_openai/chatgpt_oauth.py +1063 -0
- coco_openai/data/__init__.py +1 -0
- coco_openai/data/_profiles.py +1655 -0
- coco_openai/data/profile_augmentations.toml +127 -0
- coco_openai/embeddings/__init__.py +6 -0
- coco_openai/embeddings/azure.py +240 -0
- coco_openai/embeddings/base.py +820 -0
- coco_openai/llms/__init__.py +6 -0
- coco_openai/llms/azure.py +249 -0
- coco_openai/llms/base.py +919 -0
- coco_openai/middleware/__init__.py +11 -0
- coco_openai/middleware/openai_moderation.py +484 -0
- coco_openai/output_parsers/__init__.py +9 -0
- coco_openai/output_parsers/tools.py +9 -0
- coco_openai/py.typed +0 -0
- coco_openai/tools/__init__.py +5 -0
- coco_openai/tools/custom_tool.py +111 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"""Helper functions for marking parts of the Coco API as beta.
|
|
2
|
+
|
|
3
|
+
This module was loosely adapted from matplotlib's [`_api/deprecation.py`](https://github.com/matplotlib/matplotlib/blob/main/lib/matplotlib/_api/deprecation.py)
|
|
4
|
+
module.
|
|
5
|
+
|
|
6
|
+
!!! warning
|
|
7
|
+
|
|
8
|
+
This module is for internal use only. Do not use it in your own code. We may change
|
|
9
|
+
the API at any time with no warning.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import contextlib
|
|
13
|
+
import functools
|
|
14
|
+
import inspect
|
|
15
|
+
import warnings
|
|
16
|
+
from collections.abc import Callable, Generator
|
|
17
|
+
from typing import Any, TypeVar, cast
|
|
18
|
+
|
|
19
|
+
from coco_core._api.internal import is_caller_internal
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class CocoBetaWarning(DeprecationWarning):
|
|
23
|
+
"""A class for issuing beta warnings for Coco users."""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# PUBLIC API
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
T = TypeVar("T", bound=Callable[..., Any] | type | property)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def beta(
|
|
33
|
+
*,
|
|
34
|
+
message: str = "",
|
|
35
|
+
name: str = "",
|
|
36
|
+
obj_type: str = "",
|
|
37
|
+
addendum: str = "",
|
|
38
|
+
) -> Callable[[T], T]:
|
|
39
|
+
"""Decorator to mark a function, a class, or a property as beta.
|
|
40
|
+
|
|
41
|
+
When marking a classmethod, a staticmethod, or a property, the `@beta` decorator
|
|
42
|
+
should go *under* `@classmethod` and `@staticmethod` (i.e., `beta` should directly
|
|
43
|
+
decorate the underlying callable), but *over* `@property`.
|
|
44
|
+
|
|
45
|
+
When marking a class `C` intended to be used as a base class in a multiple
|
|
46
|
+
inheritance hierarchy, `C` *must* define an `__init__` method (if `C` instead
|
|
47
|
+
inherited its `__init__` from its own base class, then `@beta` would mess up
|
|
48
|
+
`__init__` inheritance when installing its own (annotation-emitting) `C.__init__`).
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
message: Override the default beta message.
|
|
52
|
+
|
|
53
|
+
The %(since)s, %(name)s, %(alternative)s, %(obj_type)s, %(addendum)s, and
|
|
54
|
+
%(removal)s format specifiers will be replaced by the values of the
|
|
55
|
+
respective arguments passed to this function.
|
|
56
|
+
name: The name of the beta object.
|
|
57
|
+
obj_type: The object type being beta.
|
|
58
|
+
addendum: Additional text appended directly to the final message.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
A decorator which can be used to mark functions or classes as beta.
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
```python
|
|
65
|
+
@beta
|
|
66
|
+
def the_function_to_annotate():
|
|
67
|
+
pass
|
|
68
|
+
```
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
def beta(
|
|
72
|
+
obj: T,
|
|
73
|
+
*,
|
|
74
|
+
_obj_type: str = obj_type,
|
|
75
|
+
_name: str = name,
|
|
76
|
+
_message: str = message,
|
|
77
|
+
_addendum: str = addendum,
|
|
78
|
+
) -> T:
|
|
79
|
+
"""Implementation of the decorator returned by `beta`."""
|
|
80
|
+
|
|
81
|
+
def emit_warning() -> None:
|
|
82
|
+
"""Emit the warning."""
|
|
83
|
+
warn_beta(
|
|
84
|
+
message=_message,
|
|
85
|
+
name=_name,
|
|
86
|
+
obj_type=_obj_type,
|
|
87
|
+
addendum=_addendum,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
warned = False
|
|
91
|
+
|
|
92
|
+
def warning_emitting_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
93
|
+
"""Wrapper for the original wrapped callable that emits a warning.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
*args: The positional arguments to the function.
|
|
97
|
+
**kwargs: The keyword arguments to the function.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
The return value of the function being wrapped.
|
|
101
|
+
"""
|
|
102
|
+
nonlocal warned
|
|
103
|
+
if not warned and not is_caller_internal():
|
|
104
|
+
warned = True
|
|
105
|
+
emit_warning()
|
|
106
|
+
return wrapped(*args, **kwargs)
|
|
107
|
+
|
|
108
|
+
async def awarning_emitting_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
109
|
+
"""Same as warning_emitting_wrapper, but for async functions."""
|
|
110
|
+
nonlocal warned
|
|
111
|
+
if not warned and not is_caller_internal():
|
|
112
|
+
warned = True
|
|
113
|
+
emit_warning()
|
|
114
|
+
return await wrapped(*args, **kwargs)
|
|
115
|
+
|
|
116
|
+
if isinstance(obj, type):
|
|
117
|
+
if not _obj_type:
|
|
118
|
+
_obj_type = "class"
|
|
119
|
+
wrapped = obj.__init__ # type: ignore[misc]
|
|
120
|
+
_name = _name or obj.__qualname__
|
|
121
|
+
old_doc = obj.__doc__
|
|
122
|
+
|
|
123
|
+
def finalize(_: Callable[..., Any], new_doc: str, /) -> T:
|
|
124
|
+
"""Finalize the annotation of a class."""
|
|
125
|
+
# Can't set new_doc on some extension objects.
|
|
126
|
+
with contextlib.suppress(AttributeError):
|
|
127
|
+
obj.__doc__ = new_doc
|
|
128
|
+
|
|
129
|
+
def warn_if_direct_instance(
|
|
130
|
+
self: Any, *args: Any, **kwargs: Any
|
|
131
|
+
) -> Any:
|
|
132
|
+
"""Warn that the class is in beta."""
|
|
133
|
+
nonlocal warned
|
|
134
|
+
if not warned and type(self) is obj and not is_caller_internal():
|
|
135
|
+
warned = True
|
|
136
|
+
emit_warning()
|
|
137
|
+
return wrapped(self, *args, **kwargs)
|
|
138
|
+
|
|
139
|
+
obj.__init__ = functools.wraps(obj.__init__)( # type: ignore[misc]
|
|
140
|
+
warn_if_direct_instance
|
|
141
|
+
)
|
|
142
|
+
return obj
|
|
143
|
+
|
|
144
|
+
elif isinstance(obj, property):
|
|
145
|
+
if not _obj_type:
|
|
146
|
+
_obj_type = "attribute"
|
|
147
|
+
wrapped = None
|
|
148
|
+
_name = _name or (obj.fget and obj.fget.__qualname__) or "<property>"
|
|
149
|
+
old_doc = obj.__doc__
|
|
150
|
+
|
|
151
|
+
# `obj.fget`/`fset`/`fdel` are typed `Callable | None`, so the `and`
|
|
152
|
+
# short-circuits guard the calls for the type checker. Each wrapper is
|
|
153
|
+
# only installed when its accessor is truthy (see `finalize` below), so
|
|
154
|
+
# the guards never short-circuit at runtime — do not "simplify" them
|
|
155
|
+
# away or mypy's `warn_unreachable` will flag the accessor as `None`.
|
|
156
|
+
def _fget(instance: Any) -> Any:
|
|
157
|
+
if instance is not None:
|
|
158
|
+
emit_warning()
|
|
159
|
+
return obj.fget and obj.fget(instance)
|
|
160
|
+
|
|
161
|
+
def _fset(instance: Any, value: Any) -> None:
|
|
162
|
+
if instance is not None:
|
|
163
|
+
emit_warning()
|
|
164
|
+
obj.fset and obj.fset(instance, value)
|
|
165
|
+
|
|
166
|
+
def _fdel(instance: Any) -> None:
|
|
167
|
+
if instance is not None:
|
|
168
|
+
emit_warning()
|
|
169
|
+
obj.fdel and obj.fdel(instance)
|
|
170
|
+
|
|
171
|
+
def finalize(_: Callable[..., Any], new_doc: str, /) -> T:
|
|
172
|
+
"""Finalize the property."""
|
|
173
|
+
return cast(
|
|
174
|
+
"T",
|
|
175
|
+
property(
|
|
176
|
+
fget=_fget if obj.fget else None,
|
|
177
|
+
fset=_fset if obj.fset else None,
|
|
178
|
+
fdel=_fdel if obj.fdel else None,
|
|
179
|
+
doc=new_doc,
|
|
180
|
+
),
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
else:
|
|
184
|
+
_name = _name or obj.__qualname__
|
|
185
|
+
if not _obj_type:
|
|
186
|
+
# edge case: when a function is within another function
|
|
187
|
+
# within a test, this will call it a "method" not a "function"
|
|
188
|
+
_obj_type = "function" if "." not in _name else "method"
|
|
189
|
+
wrapped = obj
|
|
190
|
+
old_doc = wrapped.__doc__
|
|
191
|
+
|
|
192
|
+
def finalize(wrapper: Callable[..., Any], new_doc: str, /) -> T:
|
|
193
|
+
"""Wrap the wrapped function using the wrapper and update the docstring.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
wrapper: The wrapper function.
|
|
197
|
+
new_doc: The new docstring.
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
The wrapped function.
|
|
201
|
+
"""
|
|
202
|
+
wrapper = functools.wraps(wrapped)(wrapper)
|
|
203
|
+
wrapper.__doc__ = new_doc
|
|
204
|
+
return cast("T", wrapper)
|
|
205
|
+
|
|
206
|
+
old_doc = inspect.cleandoc(old_doc or "").strip("\n") or ""
|
|
207
|
+
components = [message, addendum]
|
|
208
|
+
details = " ".join([component.strip() for component in components if component])
|
|
209
|
+
new_doc = f".. beta::\n {details}\n\n{old_doc}\n"
|
|
210
|
+
|
|
211
|
+
if inspect.iscoroutinefunction(obj):
|
|
212
|
+
return finalize(awarning_emitting_wrapper, new_doc)
|
|
213
|
+
return finalize(warning_emitting_wrapper, new_doc)
|
|
214
|
+
|
|
215
|
+
return beta
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
@contextlib.contextmanager
|
|
219
|
+
def suppress_coco_beta_warning() -> Generator[None, None, None]:
|
|
220
|
+
"""Context manager to suppress `CocoDeprecationWarning`."""
|
|
221
|
+
with warnings.catch_warnings():
|
|
222
|
+
warnings.simplefilter("ignore", CocoBetaWarning)
|
|
223
|
+
yield
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def warn_beta(
|
|
227
|
+
*,
|
|
228
|
+
message: str = "",
|
|
229
|
+
name: str = "",
|
|
230
|
+
obj_type: str = "",
|
|
231
|
+
addendum: str = "",
|
|
232
|
+
) -> None:
|
|
233
|
+
"""Display a standardized beta annotation.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
message: Override the default beta message.
|
|
237
|
+
|
|
238
|
+
The %(name)s, %(obj_type)s, %(addendum)s format specifiers will be replaced
|
|
239
|
+
by the values of the respective arguments passed to this function.
|
|
240
|
+
name: The name of the annotated object.
|
|
241
|
+
obj_type: The object type being annotated.
|
|
242
|
+
addendum: Additional text appended directly to the final message.
|
|
243
|
+
"""
|
|
244
|
+
if not message:
|
|
245
|
+
message = ""
|
|
246
|
+
|
|
247
|
+
if obj_type:
|
|
248
|
+
message += f"The {obj_type} `{name}`"
|
|
249
|
+
else:
|
|
250
|
+
message += f"`{name}`"
|
|
251
|
+
|
|
252
|
+
message += " is in beta. It is actively being worked on, so the API may change."
|
|
253
|
+
|
|
254
|
+
if addendum:
|
|
255
|
+
message += f" {addendum}"
|
|
256
|
+
|
|
257
|
+
warning = CocoBetaWarning(message)
|
|
258
|
+
warnings.warn(warning, category=CocoBetaWarning, stacklevel=4)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def surface_coco_beta_warnings() -> None:
|
|
262
|
+
"""Unmute Coco beta warnings."""
|
|
263
|
+
warnings.filterwarnings(
|
|
264
|
+
"default",
|
|
265
|
+
category=CocoBetaWarning,
|
|
266
|
+
)
|