From ca304ae0469fa0723205484450ceaafd056b184e Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Fri, 13 Sep 2024 15:54:00 -0700 Subject: [PATCH] robocorp: rm package (now langchain-sema4) (#26471) --- libs/partners/robocorp/.gitignore | 1 - libs/partners/robocorp/LICENSE | 21 - libs/partners/robocorp/Makefile | 59 - libs/partners/robocorp/README.md | 17 - .../robocorp/langchain_robocorp/__init__.py | 5 - .../robocorp/langchain_robocorp/_common.py | 175 -- .../robocorp/langchain_robocorp/_prompts.py | 18 - .../robocorp/langchain_robocorp/py.typed | 0 .../robocorp/langchain_robocorp/toolkits.py | 249 --- libs/partners/robocorp/poetry.lock | 872 -------- libs/partners/robocorp/pyproject.toml | 86 - .../robocorp/scripts/check_imports.py | 17 - .../partners/robocorp/scripts/lint_imports.sh | 17 - libs/partners/robocorp/tests/__init__.py | 0 .../tests/integration_tests/__init__.py | 0 .../tests/integration_tests/test_compile.py | 7 - .../robocorp/tests/unit_tests/__init__.py | 0 .../robocorp/tests/unit_tests/_fixtures.py | 73 - .../tests/unit_tests/_openapi.fixture.json | 411 ---- .../tests/unit_tests/_openapi2.fixture.json | 387 ---- .../tests/unit_tests/_openapi3.fixture.json | 1891 ----------------- .../robocorp/tests/unit_tests/test_common.py | 25 - .../robocorp/tests/unit_tests/test_imports.py | 9 - .../tests/unit_tests/test_toolkits.py | 187 -- 24 files changed, 4527 deletions(-) delete mode 100644 libs/partners/robocorp/.gitignore delete mode 100644 libs/partners/robocorp/LICENSE delete mode 100644 libs/partners/robocorp/Makefile delete mode 100644 libs/partners/robocorp/README.md delete mode 100644 libs/partners/robocorp/langchain_robocorp/__init__.py delete mode 100644 libs/partners/robocorp/langchain_robocorp/_common.py delete mode 100644 libs/partners/robocorp/langchain_robocorp/_prompts.py delete mode 100644 libs/partners/robocorp/langchain_robocorp/py.typed delete mode 100644 libs/partners/robocorp/langchain_robocorp/toolkits.py delete mode 100644 libs/partners/robocorp/poetry.lock delete mode 100644 libs/partners/robocorp/pyproject.toml delete mode 100644 libs/partners/robocorp/scripts/check_imports.py delete mode 100755 libs/partners/robocorp/scripts/lint_imports.sh delete mode 100644 libs/partners/robocorp/tests/__init__.py delete mode 100644 libs/partners/robocorp/tests/integration_tests/__init__.py delete mode 100644 libs/partners/robocorp/tests/integration_tests/test_compile.py delete mode 100644 libs/partners/robocorp/tests/unit_tests/__init__.py delete mode 100644 libs/partners/robocorp/tests/unit_tests/_fixtures.py delete mode 100644 libs/partners/robocorp/tests/unit_tests/_openapi.fixture.json delete mode 100644 libs/partners/robocorp/tests/unit_tests/_openapi2.fixture.json delete mode 100644 libs/partners/robocorp/tests/unit_tests/_openapi3.fixture.json delete mode 100644 libs/partners/robocorp/tests/unit_tests/test_common.py delete mode 100644 libs/partners/robocorp/tests/unit_tests/test_imports.py delete mode 100644 libs/partners/robocorp/tests/unit_tests/test_toolkits.py diff --git a/libs/partners/robocorp/.gitignore b/libs/partners/robocorp/.gitignore deleted file mode 100644 index bee8a64b79a99..0000000000000 --- a/libs/partners/robocorp/.gitignore +++ /dev/null @@ -1 +0,0 @@ -__pycache__ diff --git a/libs/partners/robocorp/LICENSE b/libs/partners/robocorp/LICENSE deleted file mode 100644 index 426b65090341f..0000000000000 --- a/libs/partners/robocorp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 LangChain, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/libs/partners/robocorp/Makefile b/libs/partners/robocorp/Makefile deleted file mode 100644 index 3153282b2994f..0000000000000 --- a/libs/partners/robocorp/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -.PHONY: all format lint test tests integration_tests docker_tests help extended_tests - -# Default target executed when no arguments are given to make. -all: help - -# Define a variable for the test file path. -TEST_FILE ?= tests/unit_tests/ -integration_test integration_tests: TEST_FILE=tests/integration_tests/ - -test tests integration_test integration_tests: - poetry run pytest $(TEST_FILE) - -test_watch: - poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE) - - -###################### -# LINTING AND FORMATTING -###################### - -# Define a variable for Python and notebook files. -PYTHON_FILES=. -MYPY_CACHE=.mypy_cache -lint format: PYTHON_FILES=. -lint_diff format_diff: PYTHON_FILES=$(shell git diff --relative=libs/partners/action-server --name-only --diff-filter=d master | grep -E '\.py$$|\.ipynb$$') -lint_package: PYTHON_FILES=langchain_robocorp -lint_tests: PYTHON_FILES=tests -lint_tests: MYPY_CACHE=.mypy_cache_test - -lint lint_diff lint_package lint_tests: - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES) - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff - [ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) - -format format_diff: - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES) - -spell_check: - poetry run codespell --toml pyproject.toml - -spell_fix: - poetry run codespell --toml pyproject.toml -w - -check_imports: $(shell find langchain_robocorp -name '*.py') - poetry run python ./scripts/check_imports.py $^ - -###################### -# HELP -###################### - -help: - @echo '----' - @echo 'check_imports - check imports' - @echo 'format - run code formatters' - @echo 'lint - run linters' - @echo 'test - run unit tests' - @echo 'tests - run unit tests' - @echo 'test TEST_FILE= - run all tests in file' diff --git a/libs/partners/robocorp/README.md b/libs/partners/robocorp/README.md deleted file mode 100644 index cf9486b6b17b7..0000000000000 --- a/libs/partners/robocorp/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# langchain-robocorp - -| Note: this package is deprecated in favor of the renamed `langchain-sema4` package ([repo](https://github.com/langchain-ai/langchain-sema4), [package](https://pypi.org/project/langchain-sema4/)). | -|-| - -This package contains the LangChain integrations for [Robocorp Action Server](https://github.com/robocorp/robocorp). -Action Server enables an agent to execute actions in the real world. - -## Installation - -```bash -pip install -U langchain-robocorp -``` - -## Action Server Toolkit - -See [ActionServerToolkit](https://python.langchain.com/docs/integrations/tools/robocorp) for detailed documentation. diff --git a/libs/partners/robocorp/langchain_robocorp/__init__.py b/libs/partners/robocorp/langchain_robocorp/__init__.py deleted file mode 100644 index 0ad79d15d5126..0000000000000 --- a/libs/partners/robocorp/langchain_robocorp/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from langchain_robocorp.toolkits import ActionServerToolkit - -__all__ = [ - "ActionServerToolkit", -] diff --git a/libs/partners/robocorp/langchain_robocorp/_common.py b/libs/partners/robocorp/langchain_robocorp/_common.py deleted file mode 100644 index 3ff0b4af2292f..0000000000000 --- a/libs/partners/robocorp/langchain_robocorp/_common.py +++ /dev/null @@ -1,175 +0,0 @@ -import time -from dataclasses import dataclass -from typing import Any, Dict, List, Set, Tuple, Union, cast - -from langchain_core.utils.json_schema import dereference_refs -from langchain_core.utils.pydantic import is_basemodel_instance -from pydantic import ( - BaseModel, - Field, - create_model, -) - - -@dataclass(frozen=True) -class ReducedOpenAPISpec: - """A reduced OpenAPI spec. - - This is reduced representation for OpenAPI specs. - - Attributes: - servers: The servers in the spec. - description: The description of the spec. - endpoints: The endpoints in the spec. - """ - - servers: List[dict] - description: str - endpoints: List[Tuple[str, dict]] - - -def reduce_openapi_spec(url: str, spec: dict) -> ReducedOpenAPISpec: - """Simplify OpenAPI spec to only required information for the agent""" - - # 1. Consider only GET and POST - endpoints = [ - (route, docs) - for route, operation in spec["paths"].items() - for operation_name, docs in operation.items() - if operation_name in ["get", "post"] - ] - - # 2. Replace any refs so that complete docs are retrieved. - # Note: probably want to do this post-retrieval, it blows up the size of the spec. - - # 3. Strip docs down to required request args + happy path response. - def reduce_endpoint_docs(docs: dict) -> dict: - out = {} - if docs.get("summary"): - out["summary"] = docs.get("summary") - if docs.get("operationId"): - out["operationId"] = docs.get("operationId") - if docs.get("description"): - out["description"] = docs.get("description") - if docs.get("parameters"): - out["parameters"] = [ - parameter - for parameter in docs.get("parameters", []) - if parameter.get("required") - ] - if "200" in docs["responses"]: - out["responses"] = docs["responses"]["200"] - if docs.get("requestBody"): - out["requestBody"] = docs.get("requestBody") - return out - - endpoints = [ - (name, reduce_endpoint_docs(dereference_refs(docs, full_schema=spec))) - for name, docs in endpoints - ] - - return ReducedOpenAPISpec( - servers=[ - { - "url": url, - } - ], - description=spec["info"].get("description", ""), - endpoints=endpoints, - ) - - -type_mapping = { - "string": str, - "integer": int, - "number": float, - "object": dict, - "array": list, - "boolean": bool, - "null": type(None), -} - - -def get_schema(endpoint_spec: dict) -> dict: - return ( - endpoint_spec.get("requestBody", {}) - .get("content", {}) - .get("application/json", {}) - .get("schema", {}) - ) - - -def create_field( - schema: dict, required: bool, created_model_names: Set[str] -) -> Tuple[Any, Any]: - """ - Creates a Pydantic field based on the schema definition. - """ - if "anyOf" in schema: - field_types = [ - create_field(sub_schema, required, created_model_names)[0] - for sub_schema in schema["anyOf"] - ] - if len(field_types) == 1: - field_type = field_types[0] # Simplified handling - else: - field_type = Union[tuple(field_types)] - else: - field_type = type_mapping.get(schema.get("type", "string"), str) - - description = schema.get("description", "") - - # Handle nested objects - if schema.get("type") == "object": - nested_fields = { - k: create_field(v, k in schema.get("required", []), created_model_names) - for k, v in schema.get("properties", {}).items() - } - model_name = schema.get("title", f"NestedModel{time.time()}") - if model_name in created_model_names: - # needs to be unique - model_name = model_name + str(time.time()) - nested_model = create_model(model_name, **nested_fields) # type: ignore - created_model_names.add(model_name) - return nested_model, Field(... if required else None, description=description) - - # Handle arrays - elif schema.get("type") == "array": - item_type, _ = create_field( - schema["items"], required=True, created_model_names=created_model_names - ) - return List[item_type], Field( # type: ignore - ... if required else None, description=description - ) - - # Other types - return field_type, Field(... if required else None, description=description) - - -def get_param_fields(endpoint_spec: dict) -> dict: - """Get an OpenAPI endpoint parameter details""" - schema = get_schema(endpoint_spec) - properties = schema.get("properties", {}) - required_fields = schema.get("required", []) - - fields = {} - created_model_names: Set[str] = set() - for key, value in properties.items(): - is_required = key in required_fields - field_info = create_field(value, is_required, created_model_names) - fields[key] = field_info - - return fields - - -def model_to_dict( - item: Union[BaseModel, List, Dict[str, Any]], -) -> Any: - if is_basemodel_instance(item): - return cast(BaseModel, item).dict() - elif isinstance(item, dict): - return {key: model_to_dict(value) for key, value in item.items()} - elif isinstance(item, list): - return [model_to_dict(element) for element in item] - else: - return item diff --git a/libs/partners/robocorp/langchain_robocorp/_prompts.py b/libs/partners/robocorp/langchain_robocorp/_prompts.py deleted file mode 100644 index fc1ea32303f87..0000000000000 --- a/libs/partners/robocorp/langchain_robocorp/_prompts.py +++ /dev/null @@ -1,18 +0,0 @@ -API_CONTROLLER_PROMPT = ( - "You are turning user input into a json query" - """ for an API request tool. - -The final output to the tool should be a json string with a single key "data". -The value of "data" should be a dictionary of key-value pairs you want """ - """to POST to the url. -Always use double quotes for strings in the json string. -Always respond only with the json object and nothing else. - -Here is documentation on the API: -Base url: {api_url} -Endpoint documentation: -{api_docs} - -User Input: {input} -""" -) diff --git a/libs/partners/robocorp/langchain_robocorp/py.typed b/libs/partners/robocorp/langchain_robocorp/py.typed deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/libs/partners/robocorp/langchain_robocorp/toolkits.py b/libs/partners/robocorp/langchain_robocorp/toolkits.py deleted file mode 100644 index 3e9f9dfbfbfe0..0000000000000 --- a/libs/partners/robocorp/langchain_robocorp/toolkits.py +++ /dev/null @@ -1,249 +0,0 @@ -"""Robocorp Action Server toolkit.""" - -from __future__ import annotations - -import json -from typing import Any, Callable, Dict, List, Optional, TypedDict -from urllib.parse import urljoin - -import requests -from langchain_core.callbacks import CallbackManagerForToolRun -from langchain_core.callbacks.base import BaseCallbackHandler -from langchain_core.callbacks.manager import CallbackManager -from langchain_core.language_models.chat_models import BaseChatModel -from langchain_core.output_parsers import StrOutputParser -from langchain_core.prompts import PromptTemplate -from langchain_core.runnables import Runnable, RunnablePassthrough -from langchain_core.tools import BaseTool, StructuredTool, Tool -from langchain_core.tracers.context import _tracing_v2_is_enabled -from langsmith import Client -from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, create_model - -from langchain_robocorp._common import ( - get_param_fields, - model_to_dict, - reduce_openapi_spec, -) -from langchain_robocorp._prompts import ( - API_CONTROLLER_PROMPT, -) - -LLM_TRACE_HEADER = "X-action-trace" - - -class RunDetailsCallbackHandler(BaseCallbackHandler): - """Callback handler to add run details to the run.""" - - def __init__(self, run_details: dict) -> None: - """Initialize the callback handler. - - Args: - run_details (dict): Run details. - """ - self.run_details = run_details - - def on_tool_start( - self, - serialized: Dict[str, Any], - input_str: str, - **kwargs: Any, - ) -> None: - if "parent_run_id" in kwargs: - self.run_details["run_id"] = kwargs["parent_run_id"] - else: - if "run_id" in self.run_details: - self.run_details.pop("run_id") - - -class ToolInputSchema(BaseModel): - """Tool input schema.""" - - question: str = Field(...) - - -class ToolArgs(TypedDict): - """Tool arguments.""" - - name: str - description: str - callback_manager: CallbackManager - - -class ActionServerRequestTool(BaseTool): - """Requests POST tool with LLM-instructed extraction of truncated responses.""" - - name: str = "action_server_request" - """Tool name.""" - description: str = "Useful to make requests to Action Server API" - """Tool description.""" - endpoint: str - """"Action API endpoint""" - action_request: Callable[[str], str] - """Action request execution""" - - def _run( - self, query: str, run_manager: Optional[CallbackManagerForToolRun] = None - ) -> str: - try: - json_text = query[query.find("{") : query.rfind("}") + 1] - payload = json.loads(json_text) - - except json.JSONDecodeError as e: - raise e - - return self.action_request(self.endpoint, **payload["data"]) - - async def _arun(self, text: str) -> str: - raise NotImplementedError() - - -class ActionServerToolkit(BaseModel): - """Toolkit exposing Robocorp Action Server provided actions as individual tools.""" - - url: str = Field(exclude=True) - """Action Server URL""" - api_key: str = Field(exclude=True, default="") - """Action Server request API key""" - additional_headers: dict = Field(exclude=True, default_factory=dict) - """Additional headers to be passed to the Action Server""" - report_trace: bool = Field(exclude=True, default=False) - """Enable reporting Langsmith trace to Action Server runs""" - _run_details: dict = PrivateAttr({}) - - model_config = ConfigDict( - arbitrary_types_allowed=True, - ) - - def get_tools( - self, - llm: Optional[BaseChatModel] = None, - callback_manager: Optional[CallbackManager] = None, - ) -> List[BaseTool]: - """ - Get Action Server actions as a toolkit - - :param llm: Optionally pass a model to return single input tools - :param callback_manager: Callback manager to be passed to tools - """ - - # Fetch and format the API spec - try: - spec_url = urljoin(self.url, "openapi.json") - response = requests.get(spec_url) - json_spec = response.json() - api_spec = reduce_openapi_spec(self.url, json_spec) - except Exception: - raise ValueError( - f"Failed to fetch OpenAPI schema from Action Server - {self.url}" - ) - - # Prepare request tools - self._run_details: dict = {} - - # Prepare callback manager - if callback_manager is None: - callback_manager = CallbackManager([]) - callbacks: List[BaseCallbackHandler] = [] - - if _tracing_v2_is_enabled(): - callbacks.append(RunDetailsCallbackHandler(self._run_details)) - - for callback in callbacks: - callback_manager.add_handler(callback) - - toolkit: List[BaseTool] = [] - - # Prepare tools - for endpoint, docs in api_spec.endpoints: - if not endpoint.startswith("/api/actions"): - continue - - tool_args: ToolArgs = { - "name": docs["operationId"], - "description": docs["description"], - "callback_manager": callback_manager, - } - - if llm: - tool = self._get_unstructured_tool(endpoint, docs, tool_args, llm) - else: - tool = self._get_structured_tool(endpoint, docs, tool_args) - - toolkit.append(tool) - - return toolkit - - def _get_unstructured_tool( - self, - endpoint: str, - docs: dict, - tool_args: ToolArgs, - llm: BaseChatModel, - ) -> BaseTool: - request_tool = ActionServerRequestTool( - action_request=self._action_request, endpoint=endpoint - ) - - prompt_variables = { - "api_url": self.url, - } - - tool_name = tool_args["name"] - tool_docs = json.dumps(docs, indent=4) - prompt_variables["api_docs"] = f"{tool_name}: \n{tool_docs}" - - prompt = PromptTemplate( - template=API_CONTROLLER_PROMPT, - input_variables=["input"], - partial_variables=prompt_variables, - ) - - chain: Runnable = ( - {"input": RunnablePassthrough()} - | prompt - | llm - | StrOutputParser() - | request_tool - ) - - return Tool(func=chain.invoke, args_schema=ToolInputSchema, **tool_args) - - def _get_structured_tool( - self, endpoint: str, docs: dict, tools_args: ToolArgs - ) -> BaseTool: - fields = get_param_fields(docs) - _DynamicToolInputSchema = create_model("DynamicToolInputSchema", **fields) - - def dynamic_func(**data: dict[str, Any]) -> str: - return self._action_request(endpoint, **model_to_dict(data)) - - dynamic_func.__name__ = tools_args["name"] - dynamic_func.__doc__ = tools_args["description"] - - return StructuredTool( - func=dynamic_func, - args_schema=_DynamicToolInputSchema, - **tools_args, - ) - - def _action_request(self, endpoint: str, **data: dict[str, Any]) -> str: - headers = { - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json", - **self.additional_headers, - } - - try: - if self.report_trace and "run_id" in self._run_details: - client = Client() - run = client.read_run(self._run_details["run_id"]) - if run.url: - headers[LLM_TRACE_HEADER] = run.url - except Exception: - pass - - url = urljoin(self.url, endpoint) - - response = requests.post(url, headers=headers, data=json.dumps(data)) - - return response.text diff --git a/libs/partners/robocorp/poetry.lock b/libs/partners/robocorp/poetry.lock deleted file mode 100644 index 315f706a0c1de..0000000000000 --- a/libs/partners/robocorp/poetry.lock +++ /dev/null @@ -1,872 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[[package]] -name = "certifi" -version = "2024.7.4" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "codespell" -version = "2.3.0" -description = "Codespell" -optional = false -python-versions = ">=3.8" -files = [ - {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, - {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, -] - -[package.extras] -dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] -hard-encoding-detection = ["chardet"] -toml = ["tomli"] -types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "freezegun" -version = "1.5.1" -description = "Let your Python tests travel through time" -optional = false -python-versions = ">=3.7" -files = [ - {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, - {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, -] - -[package.dependencies] -python-dateutil = ">=2.7" - -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - -[[package]] -name = "langchain-core" -version = "0.2.38" -description = "Building applications with LLMs through composability" -optional = false -python-versions = ">=3.9,<4.0" -files = [] -develop = true - -[package.dependencies] -jsonpatch = "^1.33" -langsmith = "^0.1.75" -packaging = ">=23.2,<25" -pydantic = [ - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, -] -PyYAML = ">=5.3" -tenacity = "^8.1.0,!=8.4.0" -typing-extensions = ">=4.7" - -[package.source] -type = "directory" -url = "../../core" - -[[package]] -name = "langsmith" -version = "0.1.93" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langsmith-0.1.93-py3-none-any.whl", hash = "sha256:811210b9d5f108f36431bd7b997eb9476a9ecf5a2abd7ddbb606c1cdcf0f43ce"}, - {file = "langsmith-0.1.93.tar.gz", hash = "sha256:285b6ad3a54f50fa8eb97b5f600acc57d0e37e139dd8cf2111a117d0435ba9b4"}, -] - -[package.dependencies] -orjson = ">=3.9.14,<4.0.0" -pydantic = [ - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, -] -requests = ">=2,<3" - -[[package]] -name = "mypy" -version = "1.11.0" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3824187c99b893f90c845bab405a585d1ced4ff55421fdf5c84cb7710995229"}, - {file = "mypy-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:96f8dbc2c85046c81bcddc246232d500ad729cb720da4e20fce3b542cab91287"}, - {file = "mypy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a5d8d8dd8613a3e2be3eae829ee891b6b2de6302f24766ff06cb2875f5be9c6"}, - {file = "mypy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72596a79bbfb195fd41405cffa18210af3811beb91ff946dbcb7368240eed6be"}, - {file = "mypy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:35ce88b8ed3a759634cb4eb646d002c4cef0a38f20565ee82b5023558eb90c00"}, - {file = "mypy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:98790025861cb2c3db8c2f5ad10fc8c336ed2a55f4daf1b8b3f877826b6ff2eb"}, - {file = "mypy-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25bcfa75b9b5a5f8d67147a54ea97ed63a653995a82798221cca2a315c0238c1"}, - {file = "mypy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bea2a0e71c2a375c9fa0ede3d98324214d67b3cbbfcbd55ac8f750f85a414e3"}, - {file = "mypy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2b3d36baac48e40e3064d2901f2fbd2a2d6880ec6ce6358825c85031d7c0d4d"}, - {file = "mypy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8e2e43977f0e09f149ea69fd0556623919f816764e26d74da0c8a7b48f3e18a"}, - {file = "mypy-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d44c1e44a8be986b54b09f15f2c1a66368eb43861b4e82573026e04c48a9e20"}, - {file = "mypy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cea3d0fb69637944dd321f41bc896e11d0fb0b0aa531d887a6da70f6e7473aba"}, - {file = "mypy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a83ec98ae12d51c252be61521aa5731f5512231d0b738b4cb2498344f0b840cd"}, - {file = "mypy-1.11.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7b73a856522417beb78e0fb6d33ef89474e7a622db2653bc1285af36e2e3e3d"}, - {file = "mypy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:f2268d9fcd9686b61ab64f077be7ffbc6fbcdfb4103e5dd0cc5eaab53a8886c2"}, - {file = "mypy-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:940bfff7283c267ae6522ef926a7887305945f716a7704d3344d6d07f02df850"}, - {file = "mypy-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:14f9294528b5f5cf96c721f231c9f5b2733164e02c1c018ed1a0eff8a18005ac"}, - {file = "mypy-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7b54c27783991399046837df5c7c9d325d921394757d09dbcbf96aee4649fe9"}, - {file = "mypy-1.11.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65f190a6349dec29c8d1a1cd4aa71284177aee5949e0502e6379b42873eddbe7"}, - {file = "mypy-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbe286303241fea8c2ea5466f6e0e6a046a135a7e7609167b07fd4e7baf151bf"}, - {file = "mypy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104e9c1620c2675420abd1f6c44bab7dd33cc85aea751c985006e83dcd001095"}, - {file = "mypy-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f006e955718ecd8d159cee9932b64fba8f86ee6f7728ca3ac66c3a54b0062abe"}, - {file = "mypy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:becc9111ca572b04e7e77131bc708480cc88a911adf3d0239f974c034b78085c"}, - {file = "mypy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6801319fe76c3f3a3833f2b5af7bd2c17bb93c00026a2a1b924e6762f5b19e13"}, - {file = "mypy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c1a184c64521dc549324ec6ef7cbaa6b351912be9cb5edb803c2808a0d7e85ac"}, - {file = "mypy-1.11.0-py3-none-any.whl", hash = "sha256:56913ec8c7638b0091ef4da6fcc9136896914a9d60d54670a75880c3e5b99ace"}, - {file = "mypy-1.11.0.tar.gz", hash = "sha256:93743608c7348772fdc717af4aeee1997293a1ad04bc0ea6efa15bf65385c538"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -mypyc = ["setuptools (>=50)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "orjson" -version = "3.10.6" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = false -python-versions = ">=3.8" -files = [ - {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, - {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, - {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, - {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, - {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, - {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, - {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, - {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, - {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, - {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, - {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, - {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, - {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, - {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, - {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, - {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, - {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, - {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, - {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, - {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, - {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, - {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, - {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, - {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, - {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, - {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, -] - -[[package]] -name = "packaging" -version = "24.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pydantic" -version = "2.8.2" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, -] - -[package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" -typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, -] - -[package.extras] -email = ["email-validator (>=2.0.0)"] - -[[package]] -name = "pydantic-core" -version = "2.20.1" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pytest" -version = "7.4.4" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.21.2" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest_asyncio-0.21.2-py3-none-any.whl", hash = "sha256:ab664c88bb7998f711d8039cacd4884da6430886ae8bbd4eded552ed2004f16b"}, - {file = "pytest_asyncio-0.21.2.tar.gz", hash = "sha256:d67738fc232b94b326b9d060750beb16e0074210b98dd8b58a5239fa2a154f45"}, -] - -[package.dependencies] -pytest = ">=7.0.0" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] - -[[package]] -name = "pytest-mock" -version = "3.14.0" -description = "Thin-wrapper around the mock package for easier use with pytest" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, - {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, -] - -[package.dependencies] -pytest = ">=6.2.5" - -[package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] - -[[package]] -name = "pytest-watcher" -version = "0.3.5" -description = "Automatically rerun your tests on file modifications" -optional = false -python-versions = ">=3.7.0,<4.0.0" -files = [ - {file = "pytest_watcher-0.3.5-py3-none-any.whl", hash = "sha256:af00ca52c7be22dc34c0fd3d7ffef99057207a73b05dc5161fe3b2fe91f58130"}, - {file = "pytest_watcher-0.3.5.tar.gz", hash = "sha256:8896152460ba2b1a8200c12117c6611008ec96c8b2d811f0a05ab8a82b043ff8"}, -] - -[package.dependencies] -tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} -watchdog = ">=2.0.0" - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pyyaml" -version = "6.0.1" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "ruff" -version = "0.5.5" -description = "An extremely fast Python linter and code formatter, written in Rust." -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruff-0.5.5-py3-none-linux_armv6l.whl", hash = "sha256:605d589ec35d1da9213a9d4d7e7a9c761d90bba78fc8790d1c5e65026c1b9eaf"}, - {file = "ruff-0.5.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00817603822a3e42b80f7c3298c8269e09f889ee94640cd1fc7f9329788d7bf8"}, - {file = "ruff-0.5.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:187a60f555e9f865a2ff2c6984b9afeffa7158ba6e1eab56cb830404c942b0f3"}, - {file = "ruff-0.5.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe26fc46fa8c6e0ae3f47ddccfbb136253c831c3289bba044befe68f467bfb16"}, - {file = "ruff-0.5.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ad25dd9c5faac95c8e9efb13e15803cd8bbf7f4600645a60ffe17c73f60779b"}, - {file = "ruff-0.5.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f70737c157d7edf749bcb952d13854e8f745cec695a01bdc6e29c29c288fc36e"}, - {file = "ruff-0.5.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:cfd7de17cef6ab559e9f5ab859f0d3296393bc78f69030967ca4d87a541b97a0"}, - {file = "ruff-0.5.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a09b43e02f76ac0145f86a08e045e2ea452066f7ba064fd6b0cdccb486f7c3e7"}, - {file = "ruff-0.5.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0b856cb19c60cd40198be5d8d4b556228e3dcd545b4f423d1ad812bfdca5884"}, - {file = "ruff-0.5.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3687d002f911e8a5faf977e619a034d159a8373514a587249cc00f211c67a091"}, - {file = "ruff-0.5.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ac9dc814e510436e30d0ba535f435a7f3dc97f895f844f5b3f347ec8c228a523"}, - {file = "ruff-0.5.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:af9bdf6c389b5add40d89b201425b531e0a5cceb3cfdcc69f04d3d531c6be74f"}, - {file = "ruff-0.5.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d40a8533ed545390ef8315b8e25c4bb85739b90bd0f3fe1280a29ae364cc55d8"}, - {file = "ruff-0.5.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cab904683bf9e2ecbbe9ff235bfe056f0eba754d0168ad5407832928d579e7ab"}, - {file = "ruff-0.5.5-py3-none-win32.whl", hash = "sha256:696f18463b47a94575db635ebb4c178188645636f05e934fdf361b74edf1bb2d"}, - {file = "ruff-0.5.5-py3-none-win_amd64.whl", hash = "sha256:50f36d77f52d4c9c2f1361ccbfbd09099a1b2ea5d2b2222c586ab08885cf3445"}, - {file = "ruff-0.5.5-py3-none-win_arm64.whl", hash = "sha256:3191317d967af701f1b73a31ed5788795936e423b7acce82a2b63e26eb3e89d6"}, - {file = "ruff-0.5.5.tar.gz", hash = "sha256:cc5516bdb4858d972fbc31d246bdb390eab8df1a26e2353be2dbc0c2d7f5421a"}, -] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "syrupy" -version = "4.6.1" -description = "Pytest Snapshot Test Utility" -optional = false -python-versions = ">=3.8.1,<4" -files = [ - {file = "syrupy-4.6.1-py3-none-any.whl", hash = "sha256:203e52f9cb9fa749cf683f29bd68f02c16c3bc7e7e5fe8f2fc59bdfe488ce133"}, - {file = "syrupy-4.6.1.tar.gz", hash = "sha256:37a835c9ce7857eeef86d62145885e10b3cb9615bc6abeb4ce404b3f18e1bb36"}, -] - -[package.dependencies] -pytest = ">=7.0.0,<9.0.0" - -[[package]] -name = "tenacity" -version = "8.5.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, - {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "types-requests" -version = "2.32.0.20240712" -description = "Typing stubs for requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-requests-2.32.0.20240712.tar.gz", hash = "sha256:90c079ff05e549f6bf50e02e910210b98b8ff1ebdd18e19c873cd237737c1358"}, - {file = "types_requests-2.32.0.20240712-py3-none-any.whl", hash = "sha256:f754283e152c752e46e70942fa2a146b5bc70393522257bb85bd1ef7e019dcc3"}, -] - -[package.dependencies] -urllib3 = ">=2" - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "urllib3" -version = "2.2.2" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "watchdog" -version = "4.0.1" -description = "Filesystem events monitoring" -optional = false -python-versions = ">=3.8" -files = [ - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, - {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, - {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, - {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, - {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, -] - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.9,<4.0" -content-hash = "a684f0e24648e9106bbb7d79554a71fca47235b61961159872a5d72267406aab" diff --git a/libs/partners/robocorp/pyproject.toml b/libs/partners/robocorp/pyproject.toml deleted file mode 100644 index b385c5eeb9af2..0000000000000 --- a/libs/partners/robocorp/pyproject.toml +++ /dev/null @@ -1,86 +0,0 @@ -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" - -[tool.poetry] -name = "langchain-robocorp" -version = "0.0.10" -description = "An integration package connecting Robocorp Action Server and LangChain" -authors = [] -readme = "README.md" -repository = "https://github.com/langchain-ai/langchain" -license = "MIT" - -[tool.mypy] -disallow_untyped_defs = "True" - -[tool.poetry.urls] -"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/robocorp" - -[tool.poetry.dependencies] -python = ">=3.9,<4.0" -langchain-core = "^0.3.0.dev" -requests = "^2.31.0" -types-requests = "^2.31.0.6" -pydantic = ">=2,<3" - -[tool.ruff.lint] -select = ["E", "F", "I", "T201"] - -[tool.coverage.run] -omit = ["tests/*"] - -[tool.pytest.ini_options] -addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5" -markers = [ - "requires: mark tests as requiring a specific library", - "asyncio: mark tests as requiring asyncio", - "compile: mark placeholder test used to compile integration tests without running them", -] -asyncio_mode = "auto" - -[tool.poetry.group.test] -optional = true - -[tool.poetry.group.codespell] -optional = true - -[tool.poetry.group.test_integration] -optional = true - -[tool.poetry.group.lint] -optional = true - -[tool.poetry.group.dev] -optional = true - -[tool.poetry.group.test.dependencies] -pytest = "^7.3.0" -freezegun = "^1.2.2" -pytest-mock = "^3.10.0" -syrupy = "^4.0.2" -pytest-watcher = "^0.3.4" -pytest-asyncio = "^0.21.1" - -[tool.poetry.group.codespell.dependencies] -codespell = "^2.2.0" - -[tool.poetry.group.test_integration.dependencies] - -[tool.poetry.group.lint.dependencies] -ruff = "^0.5" - -[tool.poetry.group.typing.dependencies] -mypy = "^1.10" - -[tool.poetry.group.test.dependencies.langchain-core] -path = "../../core" -develop = true - -[tool.poetry.group.dev.dependencies.langchain-core] -path = "../../core" -develop = true - -[tool.poetry.group.typing.dependencies.langchain-core] -path = "../../core" -develop = true diff --git a/libs/partners/robocorp/scripts/check_imports.py b/libs/partners/robocorp/scripts/check_imports.py deleted file mode 100644 index 58a460c149353..0000000000000 --- a/libs/partners/robocorp/scripts/check_imports.py +++ /dev/null @@ -1,17 +0,0 @@ -import sys -import traceback -from importlib.machinery import SourceFileLoader - -if __name__ == "__main__": - files = sys.argv[1:] - has_failure = False - for file in files: - try: - SourceFileLoader("x", file).load_module() - except Exception: - has_failure = True - print(file) # noqa: T201 - traceback.print_exc() - print() # noqa: T201 - - sys.exit(1 if has_failure else 0) diff --git a/libs/partners/robocorp/scripts/lint_imports.sh b/libs/partners/robocorp/scripts/lint_imports.sh deleted file mode 100755 index 695613c7ba8fd..0000000000000 --- a/libs/partners/robocorp/scripts/lint_imports.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -set -eu - -# Initialize a variable to keep track of errors -errors=0 - -# make sure not importing from langchain or langchain_experimental -git --no-pager grep '^from langchain\.' . && errors=$((errors+1)) -git --no-pager grep '^from langchain_experimental\.' . && errors=$((errors+1)) - -# Decide on an exit status based on the errors -if [ "$errors" -gt 0 ]; then - exit 1 -else - exit 0 -fi diff --git a/libs/partners/robocorp/tests/__init__.py b/libs/partners/robocorp/tests/__init__.py deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/libs/partners/robocorp/tests/integration_tests/__init__.py b/libs/partners/robocorp/tests/integration_tests/__init__.py deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/libs/partners/robocorp/tests/integration_tests/test_compile.py b/libs/partners/robocorp/tests/integration_tests/test_compile.py deleted file mode 100644 index 33ecccdfa0fbd..0000000000000 --- a/libs/partners/robocorp/tests/integration_tests/test_compile.py +++ /dev/null @@ -1,7 +0,0 @@ -import pytest - - -@pytest.mark.compile -def test_placeholder() -> None: - """Used for compiling integration tests without running any real tests.""" - pass diff --git a/libs/partners/robocorp/tests/unit_tests/__init__.py b/libs/partners/robocorp/tests/unit_tests/__init__.py deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/libs/partners/robocorp/tests/unit_tests/_fixtures.py b/libs/partners/robocorp/tests/unit_tests/_fixtures.py deleted file mode 100644 index d48bf7bcc3adc..0000000000000 --- a/libs/partners/robocorp/tests/unit_tests/_fixtures.py +++ /dev/null @@ -1,73 +0,0 @@ -from typing import Any, List, Optional - -from langchain_core.callbacks.manager import CallbackManagerForLLMRun -from langchain_core.language_models.chat_models import BaseChatModel -from langchain_core.messages import AIMessage, BaseMessage -from langchain_core.outputs import ChatGeneration, ChatResult - - -class FakeChatLLMT(BaseChatModel): - @property - def _llm_type(self) -> str: - return "fake-openai-chat-model" - - def _generate( - self, - messages: List[BaseMessage], - stop: Optional[List[str]] = None, - run_manager: Optional[CallbackManagerForLLMRun] = None, - **kwargs: Any, - ) -> ChatResult: - return ChatResult( - generations=[ - ChatGeneration( - message=AIMessage( - content="", - additional_kwargs={ - "function_call": { - "name": "accept", - "arguments": '{\n "draft": "turtles"\n}', - } - }, - ) - ) - ] - ) - - -openapi_endpoint_doc_mock = { - "summary": "Test Action", - "operationId": "test_action", - "description": "Greets an employee", - "responses": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Test Action", - "description": "The greeting", - } - } - }, - }, - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of the employee", - } - }, - "type": "object", - "required": ["name"], - "title": "TestActionInput", - } - } - }, - "required": True, - }, -} diff --git a/libs/partners/robocorp/tests/unit_tests/_openapi.fixture.json b/libs/partners/robocorp/tests/unit_tests/_openapi.fixture.json deleted file mode 100644 index 9278644f16cc3..0000000000000 --- a/libs/partners/robocorp/tests/unit_tests/_openapi.fixture.json +++ /dev/null @@ -1,411 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Robocorp Actions Server", - "description": "Robocorp Actions Server", - "version": "0.1.0" - }, - "paths": { - "/api/actions/test/test-action/run": { - "post": { - "summary": "Test Action", - "description": "Greets an employee", - "operationId": "test_action", - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TestActionInput" } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Test Action", - "description": "The greeting" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } - } - } - } - } - } - }, - "/api/runs": { - "get": { - "summary": "List Runs", - "operationId": "list_runs_api_runs_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { "$ref": "#/components/schemas/Run" }, - "type": "array", - "title": "Response List Runs Api Runs Get" - } - } - } - } - } - } - }, - "/api/runs/{run_id}": { - "get": { - "summary": "Show Run", - "operationId": "show_run_api_runs__run_id__get", - "parameters": [ - { - "name": "run_id", - "in": "path", - "required": true, - "schema": { "type": "string", "title": "ID for run" } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Run" } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } - } - } - } - } - } - }, - "/api/runs/{run_id}/artifacts": { - "get": { - "summary": "Get Run Artifacts", - "operationId": "get_run_artifacts_api_runs__run_id__artifacts_get", - "parameters": [ - { - "name": "run_id", - "in": "path", - "required": true, - "schema": { "type": "string", "title": "ID for run" } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { "$ref": "#/components/schemas/ArtifactInfo" }, - "description": "Provides a list with the artifacts available\nfor a given run (i.e.: [{'name': '__action_server_output.txt', 'size_in_bytes': 22}])\n", - "title": "Response Get Run Artifacts Api Runs Run Id Artifacts Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } - } - } - } - } - } - }, - "/api/runs/{run_id}/log.html": { - "get": { - "summary": "Get Run Log Html", - "operationId": "get_run_log_html_api_runs__run_id__log_html_get", - "parameters": [ - { - "name": "run_id", - "in": "path", - "required": true, - "schema": { "type": "string", "title": "ID for run" } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { "application/json": { "schema": {} } } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } - } - } - } - } - } - }, - "/api/runs/{run_id}/artifacts/text-content": { - "get": { - "summary": "Get Run Artifact Text", - "operationId": "get_run_artifact_text_api_runs__run_id__artifacts_text_content_get", - "parameters": [ - { - "name": "run_id", - "in": "path", - "required": true, - "schema": { "type": "string", "title": "ID for run" } - }, - { - "name": "artifact_names", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { "type": "array", "items": { "type": "string" } }, - { "type": "null" } - ], - "title": "Artifact names for which the content should be gotten." - } - }, - { - "name": "artifact_name_regexp", - "in": "query", - "required": false, - "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], - "title": "A regexp to match artifact names." - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { "type": "string" }, - "title": "Response Get Run Artifact Text Api Runs Run Id Artifacts Text Content Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } - } - } - } - } - } - }, - "/api/runs/{run_id}/artifacts/binary-content": { - "get": { - "summary": "Get Run Artifact Binary", - "operationId": "get_run_artifact_binary_api_runs__run_id__artifacts_binary_content_get", - "parameters": [ - { - "name": "run_id", - "in": "path", - "required": true, - "schema": { "type": "string", "title": "ID for run" } - }, - { - "name": "artifact_name", - "in": "query", - "required": true, - "schema": { - "type": "string", - "title": "Artifact name for which the content should be gotten." - } - } - ], - "responses": { - "200": { "description": "Successful Response" }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } - } - } - } - } - } - }, - "/api/actionPackages": { - "get": { - "summary": "List Action Packages", - "operationId": "list_action_packages_api_actionPackages_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { "$ref": "#/components/schemas/ActionPackageApi" }, - "type": "array", - "title": "Response List Action Packages Api Actionpackages Get" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Action": { - "properties": { - "id": { "type": "string", "title": "Id" }, - "action_package_id": { - "type": "string", - "title": "Action Package Id" - }, - "name": { "type": "string", "title": "Name" }, - "docs": { "type": "string", "title": "Docs" }, - "file": { "type": "string", "title": "File" }, - "lineno": { "type": "integer", "title": "Lineno" }, - "input_schema": { "type": "string", "title": "Input Schema" }, - "output_schema": { "type": "string", "title": "Output Schema" }, - "enabled": { "type": "boolean", "title": "Enabled", "default": true }, - "is_consequential": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], - "title": "Is Consequential" - } - }, - "type": "object", - "required": [ - "id", - "action_package_id", - "name", - "docs", - "file", - "lineno", - "input_schema", - "output_schema" - ], - "title": "Action" - }, - "ActionPackageApi": { - "properties": { - "id": { "type": "string", "title": "Id" }, - "name": { "type": "string", "title": "Name" }, - "actions": { - "items": { "$ref": "#/components/schemas/Action" }, - "type": "array", - "title": "Actions" - } - }, - "type": "object", - "required": ["id", "name", "actions"], - "title": "ActionPackageApi" - }, - "ArtifactInfo": { - "properties": { - "name": { "type": "string", "title": "Name" }, - "size_in_bytes": { "type": "integer", "title": "Size In Bytes" } - }, - "type": "object", - "required": ["name", "size_in_bytes"], - "title": "ArtifactInfo" - }, - "HTTPValidationError": { - "properties": { - "errors": { - "items": { "$ref": "#/components/schemas/ValidationError" }, - "type": "array", - "title": "Errors" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "Run": { - "properties": { - "id": { "type": "string", "title": "Id" }, - "status": { "type": "integer", "title": "Status" }, - "action_id": { "type": "string", "title": "Action Id" }, - "start_time": { "type": "string", "title": "Start Time" }, - "run_time": { - "anyOf": [{ "type": "number" }, { "type": "null" }], - "title": "Run Time" - }, - "inputs": { "type": "string", "title": "Inputs" }, - "result": { - "anyOf": [{ "type": "string" }, { "type": "null" }], - "title": "Result" - }, - "error_message": { - "anyOf": [{ "type": "string" }, { "type": "null" }], - "title": "Error Message" - }, - "relative_artifacts_dir": { - "type": "string", - "title": "Relative Artifacts Dir" - }, - "numbered_id": { "type": "integer", "title": "Numbered Id" } - }, - "type": "object", - "required": [ - "id", - "status", - "action_id", - "start_time", - "run_time", - "inputs", - "result", - "error_message", - "relative_artifacts_dir", - "numbered_id" - ], - "title": "Run" - }, - "TestActionInput": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of the employee" - } - }, - "type": "object", - "required": ["name"], - "title": "TestActionInput" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] }, - "type": "array", - "title": "Location" - }, - "msg": { "type": "string", "title": "Message" }, - "type": { "type": "string", "title": "Error Type" } - }, - "type": "object", - "required": ["loc", "msg", "type"], - "title": "ValidationError" - } - } - } -} diff --git a/libs/partners/robocorp/tests/unit_tests/_openapi2.fixture.json b/libs/partners/robocorp/tests/unit_tests/_openapi2.fixture.json deleted file mode 100644 index f97c5c680df4b..0000000000000 --- a/libs/partners/robocorp/tests/unit_tests/_openapi2.fixture.json +++ /dev/null @@ -1,387 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Robocorp Action Server", - "version": "0.1.0" - }, - "servers": [ - { - "url": "https://hosted-actions.onrender.com" - } - ], - "paths": { - "/api/actions/google-sheet-gmail/get-google-spreadsheet-schema/run": { - "post": { - "summary": "Get Google Spreadsheet Schema", - "description": "Action to get necessary information to be able to work with a Google Sheet Spreadsheets correctly.\nUse this action minimum once before anything else, to learn about the structure\nof the Spreadsheet. Method will return the first few rows of each Sheet as an example.", - "operationId": "get_google_spreadsheet_schema", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": {}, - "type": "object" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Get Google Spreadsheet Schema", - "description": "Names of the sheets, and a couple of first rows from each sheet to explain the context." - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "HTTPBearer": [] - } - ] - } - }, - "/api/actions/google-sheet-gmail/create-new-google-sheet/run": { - "post": { - "summary": "Create New Google Sheet", - "description": "Creates a new empty Sheet in user's Google Spreadsheet.", - "operationId": "create_new_google_sheet", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of the Sheet. You must refer to this Sheet name later when adding or reading date from the Sheet." - } - }, - "type": "object", - "required": [ - "name" - ] - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Create New Google Sheet", - "description": "True if operation was success, and False if it failed." - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "HTTPBearer": [] - } - ] - } - }, - "/api/actions/google-sheet-gmail/add-sheet-rows/run": { - "post": { - "summary": "Add Sheet Rows", - "description": "Action to add multiple rows to the Google sheet. Get the sheets with get_google_spreadsheet_schema if you don't know\nthe names or data structure. Make sure the values are in correct columns (needs to be ordered the same as in the sample).\nStrictly adhere to the schema.", - "operationId": "add_sheet_rows", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "sheet": { - "type": "string", - "title": "Sheet", - "description": "Name of the sheet where the data is added to" - }, - "rows_to_add": { - "properties": { - "rows": { - "items": { - "properties": { - "columns": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Columns", - "description": "The columns that make up the row" - } - }, - "type": "object", - "required": [ - "columns" - ], - "title": "Row" - }, - "type": "array", - "title": "Rows", - "description": "The rows that need to be added" - } - }, - "type": "object", - "required": [ - "rows" - ], - "title": "Rows To Add", - "description": "the rows to be added to the sheet" - } - }, - "type": "object", - "required": [ - "sheet", - "rows_to_add" - ] - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Add Sheet Rows", - "description": "The result of the operation." - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "HTTPBearer": [] - } - ] - } - }, - "/api/actions/google-sheet-gmail/get-sheet-contents/run": { - "post": { - "summary": "Get Sheet Contents", - "description": "Get all content from the chosen Google Spreadsheet Sheet.", - "operationId": "get_sheet_contents", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "sheet": { - "type": "string", - "title": "Sheet", - "description": "Name of the sheet from which to get the data" - } - }, - "type": "object", - "required": [ - "sheet" - ] - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Get Sheet Contents", - "description": "Sheet data as string, rows separated by newlines" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "HTTPBearer": [] - } - ] - } - }, - "/api/actions/google-sheet-gmail/send-email-via-gmail/run": { - "post": { - "summary": "Send Email Via Gmail", - "description": "Sends an email using Gmail SMTP with an App Password for authentication.", - "operationId": "send_email_via_gmail", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "subject": { - "type": "string", - "title": "Subject", - "description": "Email subject" - }, - "body": { - "type": "string", - "title": "Body", - "description": "Email body content" - }, - "recipient": { - "type": "string", - "title": "Recipient", - "description": "Recipient email address" - } - }, - "type": "object", - "required": [ - "subject", - "body", - "recipient" - ] - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Send Email Via Gmail", - "description": "Information if the send was successful or not" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "HTTPBearer": [] - } - ], - "x-openai-isConsequential": true - } - } - }, - "components": { - "securitySchemes": { - "HTTPBearer": { - "type": "http", - "scheme": "bearer" - } - }, - "schemas": { - "HTTPValidationError": { - "properties": { - "errors": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Errors" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - } - } - } -} \ No newline at end of file diff --git a/libs/partners/robocorp/tests/unit_tests/_openapi3.fixture.json b/libs/partners/robocorp/tests/unit_tests/_openapi3.fixture.json deleted file mode 100644 index 97f07b218769e..0000000000000 --- a/libs/partners/robocorp/tests/unit_tests/_openapi3.fixture.json +++ /dev/null @@ -1,1891 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Sema4.ai Action Server", - "version": "0.11.0" - }, - "servers": [ - { - "url": "http://localhost:8806" - } - ], - "paths": { - "/api/actions/google-calendar/create-event/run": { - "post": { - "summary": "Create Event", - "description": "Creates a new event in the specified calendar.", - "operationId": "create_event", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "event": { - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "The id of the event." - }, - "summary": { - "type": "string", - "title": "Summary", - "description": "A short summary of the event's purpose." - }, - "location": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Location", - "description": "The physical location of the event." - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "A more detailed description of the event." - }, - "start": { - "allOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - } - ], - "description": "The (inclusive) start time of the event." - }, - "end": { - "allOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - } - ], - "description": "The (exclusive) end time of the event." - }, - "recurrence": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Recurrence", - "description": "A list of RRULE, EXRULE, RDATE, and EXDATE lines for a recurring event." - }, - "attendees": { - "anyOf": [ - { - "items": { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - }, - "optional": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Optional", - "description": "Whether this is an optional attendee." - }, - "responseStatus": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Responsestatus", - "description": "The response status of the attendee." - }, - "organizer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Organizer", - "description": "Whether the attendee is the organizer of the event." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Attendee" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Attendees", - "description": "A list of attendees." - }, - "reminders": { - "anyOf": [ - { - "properties": { - "useDefault": { - "type": "boolean", - "title": "Usedefault", - "description": "Indicates whether to use the default reminders." - }, - "overrides": { - "anyOf": [ - { - "items": { - "properties": { - "method": { - "type": "string", - "title": "Method", - "description": "The method of the reminder (email or popup)." - }, - "minutes": { - "type": "integer", - "title": "Minutes", - "description": "The number of minutes before the event when the reminder should occur." - } - }, - "type": "object", - "required": [ - "method", - "minutes" - ], - "title": "ReminderOverride" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Overrides", - "description": "A list of overrides for the reminders." - } - }, - "type": "object", - "required": [ - "useDefault" - ], - "title": "Reminder" - }, - { - "type": "null" - } - ], - "description": "Reminders settings for the event." - }, - "organizer": { - "allOf": [ - { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Identity" - } - ], - "description": "The organizer of the event." - } - }, - "type": "object", - "required": [ - "id", - "summary", - "start", - "end", - "organizer" - ], - "title": "Event", - "description": "JSON representation of the Google Calendar V3 event." - }, - "calendar_id": { - "type": "string", - "title": "Calendar Id", - "description": "Calendar identifier which can be found by listing all calendars action.\nDefault value is \"primary\" which indicates the calendar where the user is currently logged in.", - "default": "primary" - } - }, - "type": "object", - "required": [ - "event" - ] - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "The id of the event." - }, - "summary": { - "type": "string", - "title": "Summary", - "description": "A short summary of the event's purpose." - }, - "location": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Location", - "description": "The physical location of the event." - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "A more detailed description of the event." - }, - "start": { - "allOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - } - ], - "description": "The (inclusive) start time of the event." - }, - "end": { - "allOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - } - ], - "description": "The (exclusive) end time of the event." - }, - "recurrence": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Recurrence", - "description": "A list of RRULE, EXRULE, RDATE, and EXDATE lines for a recurring event." - }, - "attendees": { - "anyOf": [ - { - "items": { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - }, - "optional": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Optional", - "description": "Whether this is an optional attendee." - }, - "responseStatus": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Responsestatus", - "description": "The response status of the attendee." - }, - "organizer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Organizer", - "description": "Whether the attendee is the organizer of the event." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Attendee" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Attendees", - "description": "A list of attendees." - }, - "reminders": { - "anyOf": [ - { - "properties": { - "useDefault": { - "type": "boolean", - "title": "Usedefault", - "description": "Indicates whether to use the default reminders." - }, - "overrides": { - "anyOf": [ - { - "items": { - "properties": { - "method": { - "type": "string", - "title": "Method", - "description": "The method of the reminder (email or popup)." - }, - "minutes": { - "type": "integer", - "title": "Minutes", - "description": "The number of minutes before the event when the reminder should occur." - } - }, - "type": "object", - "required": [ - "method", - "minutes" - ], - "title": "ReminderOverride" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Overrides", - "description": "A list of overrides for the reminders." - } - }, - "type": "object", - "required": [ - "useDefault" - ], - "title": "Reminder" - }, - { - "type": "null" - } - ], - "description": "Reminders settings for the event." - }, - "organizer": { - "allOf": [ - { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Identity" - } - ], - "description": "The organizer of the event." - } - }, - "type": "object", - "required": [ - "id", - "summary", - "start", - "end", - "organizer" - ], - "title": "Response for Create Event", - "description": "The newly created event." - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "x-openai-isConsequential": true - } - }, - "/api/actions/google-calendar/list-events/run": { - "post": { - "summary": "List Events", - "description": "List all events in the user's primary calendar between the given dates.\nTo aggregate all events across calendars, call this method for each calendar returned by list_calendars endpoint.", - "operationId": "list_events", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "calendar_id": { - "type": "string", - "title": "Calendar Id", - "description": "Calendar identifier which can be found by listing all calendars action.\nDefault value is \"primary\" which indicates the calendar where the user is currently logged in.", - "default": "primary" - }, - "query": { - "type": "string", - "title": "Query", - "description": "Free text search terms to find events that match these terms in summary, description, location,\nattendee's name / email or working location information.", - "default": "" - }, - "start_date": { - "type": "string", - "title": "Start Date", - "description": "Upper bound (exclusive) for an event's start time to filter by.\nMust be an RFC3339 timestamp with mandatory time zone offset.", - "default": "" - }, - "end_date": { - "type": "string", - "title": "End Date", - "description": "Lower bound (exclusive) for an event's end time to filter by.\nMust be an RFC3339 timestamp with mandatory time zone offset.", - "default": "" - } - }, - "type": "object" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "properties": { - "result": { - "anyOf": [ - { - "properties": { - "events": { - "items": { - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "The id of the event." - }, - "summary": { - "type": "string", - "title": "Summary", - "description": "A short summary of the event's purpose." - }, - "location": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Location", - "description": "The physical location of the event." - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "A more detailed description of the event." - }, - "start": { - "allOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - } - ], - "description": "The (inclusive) start time of the event." - }, - "end": { - "allOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - } - ], - "description": "The (exclusive) end time of the event." - }, - "recurrence": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Recurrence", - "description": "A list of RRULE, EXRULE, RDATE, and EXDATE lines for a recurring event." - }, - "attendees": { - "anyOf": [ - { - "items": { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - }, - "optional": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Optional", - "description": "Whether this is an optional attendee." - }, - "responseStatus": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Responsestatus", - "description": "The response status of the attendee." - }, - "organizer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Organizer", - "description": "Whether the attendee is the organizer of the event." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Attendee" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Attendees", - "description": "A list of attendees." - }, - "reminders": { - "anyOf": [ - { - "properties": { - "useDefault": { - "type": "boolean", - "title": "Usedefault", - "description": "Indicates whether to use the default reminders." - }, - "overrides": { - "anyOf": [ - { - "items": { - "properties": { - "method": { - "type": "string", - "title": "Method", - "description": "The method of the reminder (email or popup)." - }, - "minutes": { - "type": "integer", - "title": "Minutes", - "description": "The number of minutes before the event when the reminder should occur." - } - }, - "type": "object", - "required": [ - "method", - "minutes" - ], - "title": "ReminderOverride" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Overrides", - "description": "A list of overrides for the reminders." - } - }, - "type": "object", - "required": [ - "useDefault" - ], - "title": "Reminder" - }, - { - "type": "null" - } - ], - "description": "Reminders settings for the event." - }, - "organizer": { - "allOf": [ - { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Identity" - } - ], - "description": "The organizer of the event." - } - }, - "type": "object", - "required": [ - "id", - "summary", - "start", - "end", - "organizer" - ], - "title": "Event" - }, - "type": "array", - "title": "Events" - } - }, - "type": "object", - "required": [ - "events" - ], - "title": "EventList" - }, - { - "type": "null" - } - ], - "description": "The result for the action if it ran successfully" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Error", - "description": "The error message if the action failed for some reason" - } - }, - "type": "object", - "title": "Response for List Events", - "description": "A list of calendar events that match the query, if defined." - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "x-openai-isConsequential": false - } - }, - "/api/actions/google-calendar/list-calendars/run": { - "post": { - "summary": "List Calendars", - "description": "List all calendars that the user is subscribed to.", - "operationId": "list_calendars", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": {}, - "type": "object" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "properties": { - "result": { - "anyOf": [ - { - "properties": { - "calendars": { - "items": { - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "The id of the calendar." - }, - "summary": { - "type": "string", - "title": "Summary", - "description": "The name or summary of the calendar." - }, - "timeZone": { - "type": "string", - "title": "Timezone", - "description": "The timezone the calendar is set to, such as 'Europe/Bucharest'." - }, - "selected": { - "type": "boolean", - "title": "Selected", - "description": "A boolean indicating if the calendar is selected by the user in their UI." - }, - "accessRole": { - "type": "string", - "title": "Accessrole", - "description": "The access role of the user with respect to the calendar, e.g., 'owner'." - } - }, - "type": "object", - "required": [ - "id", - "summary", - "timeZone", - "selected", - "accessRole" - ], - "title": "Calendar" - }, - "type": "array", - "title": "Calendars" - } - }, - "type": "object", - "required": [ - "calendars" - ], - "title": "CalendarList" - }, - { - "type": "null" - } - ], - "description": "The result for the action if it ran successfully" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Error", - "description": "The error message if the action failed for some reason" - } - }, - "type": "object", - "title": "Response for List Calendars", - "description": "A list of calendars." - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "x-openai-isConsequential": false - } - }, - "/api/actions/google-calendar/update-event/run": { - "post": { - "summary": "Update Event", - "description": "Update an existing Google Calendar event with dynamic arguments.", - "operationId": "update_event", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "event_id": { - "type": "string", - "title": "Event Id", - "description": "Identifier of the event to update. Can be found by listing events in all calendars." - }, - "updates": { - "properties": { - "summary": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Summary", - "description": "A short summary of the event's purpose." - }, - "location": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Location", - "description": "The physical location of the event." - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "A more detailed description of the event." - }, - "start": { - "anyOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - }, - { - "type": "null" - } - ], - "description": "The (inclusive) start time of the event." - }, - "end": { - "anyOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - }, - { - "type": "null" - } - ], - "description": "The (exclusive) end time of the event." - }, - "attendees": { - "anyOf": [ - { - "items": { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - }, - "optional": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Optional", - "description": "Whether this is an optional attendee." - }, - "responseStatus": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Responsestatus", - "description": "The response status of the attendee." - }, - "organizer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Organizer", - "description": "Whether the attendee is the organizer of the event." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Attendee" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Attendees", - "description": "A list of attendees consisting in email and whether they are mandatory to participate or not." - } - }, - "type": "object", - "title": "Updates", - "description": "A dictionary containing the event attributes to update.\nPossible keys include 'summary', 'description', 'start', 'end', and 'attendees'." - }, - "calendar_id": { - "type": "string", - "title": "Calendar Id", - "description": "Identifier of the calendar where the event is.\nDefault value is \"primary\" which indicates the calendar where the user is currently logged in.", - "default": "primary" - } - }, - "type": "object", - "required": [ - "event_id", - "updates" - ] - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "properties": { - "result": { - "anyOf": [ - { - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "The id of the event." - }, - "summary": { - "type": "string", - "title": "Summary", - "description": "A short summary of the event's purpose." - }, - "location": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Location", - "description": "The physical location of the event." - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "A more detailed description of the event." - }, - "start": { - "allOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - } - ], - "description": "The (inclusive) start time of the event." - }, - "end": { - "allOf": [ - { - "properties": { - "date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date", - "description": "The date, in the format 'yyyy-mm-dd', if this is an all-day event." - }, - "dateTime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Datetime", - "description": "The start or end time of the event." - }, - "timeZone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Timezone", - "description": "The time zone in which the time is specified, formatted as IANA Time Zone Database. For single events this field is optional." - } - }, - "type": "object", - "title": "EventDateTime" - } - ], - "description": "The (exclusive) end time of the event." - }, - "recurrence": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Recurrence", - "description": "A list of RRULE, EXRULE, RDATE, and EXDATE lines for a recurring event." - }, - "attendees": { - "anyOf": [ - { - "items": { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - }, - "optional": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Optional", - "description": "Whether this is an optional attendee." - }, - "responseStatus": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Responsestatus", - "description": "The response status of the attendee." - }, - "organizer": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Organizer", - "description": "Whether the attendee is the organizer of the event." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Attendee" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Attendees", - "description": "A list of attendees." - }, - "reminders": { - "anyOf": [ - { - "properties": { - "useDefault": { - "type": "boolean", - "title": "Usedefault", - "description": "Indicates whether to use the default reminders." - }, - "overrides": { - "anyOf": [ - { - "items": { - "properties": { - "method": { - "type": "string", - "title": "Method", - "description": "The method of the reminder (email or popup)." - }, - "minutes": { - "type": "integer", - "title": "Minutes", - "description": "The number of minutes before the event when the reminder should occur." - } - }, - "type": "object", - "required": [ - "method", - "minutes" - ], - "title": "ReminderOverride" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Overrides", - "description": "A list of overrides for the reminders." - } - }, - "type": "object", - "required": [ - "useDefault" - ], - "title": "Reminder" - }, - { - "type": "null" - } - ], - "description": "Reminders settings for the event." - }, - "organizer": { - "allOf": [ - { - "properties": { - "email": { - "type": "string", - "title": "Email", - "description": "The email address of the identity." - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "description": "The display name of the identity." - } - }, - "type": "object", - "required": [ - "email" - ], - "title": "Identity" - } - ], - "description": "The organizer of the event." - } - }, - "type": "object", - "required": [ - "id", - "summary", - "start", - "end", - "organizer" - ], - "title": "Event" - }, - { - "type": "null" - } - ], - "description": "The result for the action if it ran successfully" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Error", - "description": "The error message if the action failed for some reason" - } - }, - "type": "object", - "title": "Response for Update Event", - "description": "Updated event details." - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "x-openai-isConsequential": true - } - } - }, - "components": { - "schemas": { - "HTTPValidationError": { - "properties": { - "errors": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Errors" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - } - } - } -} diff --git a/libs/partners/robocorp/tests/unit_tests/test_common.py b/libs/partners/robocorp/tests/unit_tests/test_common.py deleted file mode 100644 index 4da240c23c4ba..0000000000000 --- a/libs/partners/robocorp/tests/unit_tests/test_common.py +++ /dev/null @@ -1,25 +0,0 @@ -"""Test common functions.""" - -import json -import unittest -from pathlib import Path - -from langchain_robocorp._common import reduce_openapi_spec - -from ._fixtures import openapi_endpoint_doc_mock - - -class TestReduceOpenAPISpec(unittest.TestCase): - maxDiff = None - - def test_reduce_openapi_spec(self) -> None: - with Path(__file__).with_name("_openapi.fixture.json").open("r") as file: - original = json.load(file) - - output = reduce_openapi_spec("https://foo.bar", original) - - self.assertEqual(output.servers, [{"url": "https://foo.bar"}]) - self.assertEqual(output.description, "Robocorp Actions Server") - - self.assertEqual(len(output.endpoints), 8) - self.assertEqual(output.endpoints[0][1], openapi_endpoint_doc_mock) diff --git a/libs/partners/robocorp/tests/unit_tests/test_imports.py b/libs/partners/robocorp/tests/unit_tests/test_imports.py deleted file mode 100644 index d5662ea8f4b44..0000000000000 --- a/libs/partners/robocorp/tests/unit_tests/test_imports.py +++ /dev/null @@ -1,9 +0,0 @@ -from langchain_robocorp import __all__ - -EXPECTED_ALL = [ - "ActionServerToolkit", -] - - -def test_all_imports() -> None: - assert sorted(EXPECTED_ALL) == sorted(__all__) diff --git a/libs/partners/robocorp/tests/unit_tests/test_toolkits.py b/libs/partners/robocorp/tests/unit_tests/test_toolkits.py deleted file mode 100644 index cf8e63128f2de..0000000000000 --- a/libs/partners/robocorp/tests/unit_tests/test_toolkits.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Test toolkit integration.""" - -import json -from pathlib import Path -from unittest.mock import MagicMock, patch - -from langchain_core.utils.function_calling import ( - convert_to_openai_function, - convert_to_openai_tool, -) - -from langchain_robocorp.toolkits import ActionServerToolkit - -from ._fixtures import FakeChatLLMT - - -def test_initialization() -> None: - """Test toolkit initialization.""" - ActionServerToolkit(url="http://localhost", llm=FakeChatLLMT()) # type: ignore[call-arg] - - -def test_get_tools_success() -> None: - # Setup - toolkit_instance = ActionServerToolkit( - url="http://example.com", api_key="dummy_key" - ) - - fixture_path = Path(__file__).with_name("_openapi2.fixture.json") - - with patch( - "langchain_robocorp.toolkits.requests.get" - ) as mocked_get, fixture_path.open("r") as f: - data = json.load(f) # Using json.load directly on the file object - mocked_response = MagicMock() - mocked_response.json.return_value = data - mocked_response.status_code = 200 - mocked_response.headers = {"Content-Type": "application/json"} - mocked_get.return_value = mocked_response - - # Execute - tools = toolkit_instance.get_tools() - - # Verify - assert len(tools) == 5 - - tool = tools[2] - assert tool.name == "add_sheet_rows" - assert tool.description == ( - "Action to add multiple rows to the Google sheet. " - "Get the sheets with get_google_spreadsheet_schema if you don't know" - "\nthe names or data structure. Make sure the values are in correct" - """ columns (needs to be ordered the same as in the sample). -Strictly adhere to the schema.""" - ) - - openai_func_spec = convert_to_openai_function(tool) - - assert isinstance( - openai_func_spec, dict - ), "openai_func_spec should be a dictionary." - assert set(openai_func_spec.keys()) == { - "description", - "name", - "parameters", - }, "Top-level keys mismatch." - - assert openai_func_spec["description"] == tool.description - assert openai_func_spec["name"] == tool.name - - assert isinstance( - openai_func_spec["parameters"], dict - ), "Parameters should be a dictionary." - - params = openai_func_spec["parameters"] - assert set(params.keys()) == { - "type", - "properties", - "required", - }, "Parameters keys mismatch." - assert params["type"] == "object", "`type` in parameters should be 'object'." - assert isinstance( - params["properties"], dict - ), "`properties` should be a dictionary." - assert isinstance(params["required"], list), "`required` should be a list." - - assert set(params["required"]) == { - "sheet", - "rows_to_add", - }, "Required fields mismatch." - - assert set(params["properties"].keys()) == {"sheet", "rows_to_add"} - - desc = "The columns that make up the row" - expected = { - "description": "the rows to be added to the sheet", - "allOf": [ - { - "title": "Rows To Add", - "type": "object", - "properties": { - "rows": { - "title": "Rows", - "description": "The rows that need to be added", - "type": "array", - "items": { - "title": "Row", - "type": "object", - "properties": { - "columns": { - "title": "Columns", - "description": desc, - "type": "array", - "items": {"type": "string"}, - } - }, - "required": ["columns"], - }, - } - }, - "required": ["rows"], - } - ], - } - assert params["properties"]["rows_to_add"] == expected - - -def test_get_tools_with_complex_inputs() -> None: - toolkit_instance = ActionServerToolkit( - url="http://example.com", api_key="dummy_key" - ) - - fixture_path = Path(__file__).with_name("_openapi3.fixture.json") - - with patch( - "langchain_robocorp.toolkits.requests.get" - ) as mocked_get, fixture_path.open("r") as f: - data = json.load(f) # Using json.load directly on the file object - mocked_response = MagicMock() - mocked_response.json.return_value = data - mocked_response.status_code = 200 - mocked_response.headers = {"Content-Type": "application/json"} - mocked_get.return_value = mocked_response - - # Execute - tools = toolkit_instance.get_tools() - assert len(tools) == 4 - - tool = tools[0] - assert tool.name == "create_event" - assert tool.description == "Creates a new event in the specified calendar." - - all_tools_as_openai_tools = [convert_to_openai_tool(t) for t in tools] - openai_tool_spec = all_tools_as_openai_tools[0]["function"] - - assert isinstance( - openai_tool_spec, dict - ), "openai_func_spec should be a dictionary." - assert set(openai_tool_spec.keys()) == { - "description", - "name", - "parameters", - }, "Top-level keys mismatch." - - assert openai_tool_spec["description"] == tool.description - assert openai_tool_spec["name"] == tool.name - - assert isinstance( - openai_tool_spec["parameters"], dict - ), "Parameters should be a dictionary." - - params = openai_tool_spec["parameters"] - assert set(params.keys()) == { - "type", - "properties", - "required", - }, "Parameters keys mismatch." - assert params["type"] == "object", "`type` in parameters should be 'object'." - assert isinstance( - params["properties"], dict - ), "`properties` should be a dictionary." - assert isinstance(params["required"], list), "`required` should be a list." - - assert set(params["required"]) == { - "event", - }, "Required fields mismatch." - - assert set(params["properties"].keys()) == {"calendar_id", "event"}