From 9e658081fac64e770766d073480e4f33d694ac32 Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 5 Nov 2025 15:43:42 -0800 Subject: [PATCH 01/16] Update CI workflows and Poetry version Renamed check_diffs.yml to CI.yml and refactored workflow to remove dynamic directory detection, now explicitly linting and testing 'libs/oci' and 'libs/oracledb'. Updated Poetry version to 2.2.1 in all workflow files for consistency and added workflow_dispatch for manual CI triggers. --- .github/workflows/{check_diffs.yml => CI.yml} | 39 +++++++------------ .../workflows/_compile_integration_test.yml | 2 +- .github/workflows/_lint.yml | 2 +- .github/workflows/_test.yml | 2 +- 4 files changed, 16 insertions(+), 29 deletions(-) rename .github/workflows/{check_diffs.yml => CI.yml} (61%) diff --git a/.github/workflows/check_diffs.yml b/.github/workflows/CI.yml similarity index 61% rename from .github/workflows/check_diffs.yml rename to .github/workflows/CI.yml index b6f4891..5100775 100644 --- a/.github/workflows/check_diffs.yml +++ b/.github/workflows/CI.yml @@ -5,6 +5,7 @@ on: push: branches: [main] pull_request: + workflow_dispatch: # Allows manual triggering from GitHub UI # If another push to the same PR or branch happens while this workflow is still running, # cancel the earlier run in favor of the next run. @@ -17,31 +18,16 @@ concurrency: cancel-in-progress: true env: - POETRY_VERSION: "1.7.1" + POETRY_VERSION: "2.2.1" jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.10' - - id: files - uses: Ana06/get-changed-files@v2.2.0 - - id: set-matrix - run: | - python .github/scripts/check_diff.py ${{ steps.files.outputs.all }} >> $GITHUB_OUTPUT - outputs: - dirs-to-lint: ${{ steps.set-matrix.outputs.dirs-to-lint }} - dirs-to-test: ${{ steps.set-matrix.outputs.dirs-to-test }} lint: name: cd ${{ matrix.working-directory }} - needs: [ build ] - if: ${{ needs.build.outputs.dirs-to-lint != '[]' }} strategy: matrix: - working-directory: ${{ fromJson(needs.build.outputs.dirs-to-lint) }} + working-directory: + - "libs/oci" + - "libs/oracledb" uses: ./.github/workflows/_lint.yml with: working-directory: ${{ matrix.working-directory }} @@ -49,11 +35,11 @@ jobs: test: name: cd ${{ matrix.working-directory }} - needs: [ build ] - if: ${{ needs.build.outputs.dirs-to-test != '[]' }} strategy: matrix: - working-directory: ${{ fromJson(needs.build.outputs.dirs-to-test) }} + working-directory: + - "libs/oci" + - "libs/oracledb" uses: ./.github/workflows/_test.yml with: working-directory: ${{ matrix.working-directory }} @@ -61,18 +47,19 @@ jobs: compile-integration-tests: name: cd ${{ matrix.working-directory }} - needs: [ build ] - if: ${{ needs.build.outputs.dirs-to-test != '[]' }} strategy: matrix: - working-directory: ${{ fromJson(needs.build.outputs.dirs-to-test) }} + working-directory: + - "libs/oci" + - "libs/oracledb" uses: ./.github/workflows/_compile_integration_test.yml with: working-directory: ${{ matrix.working-directory }} secrets: inherit + ci_success: name: "CI Success" - needs: [build, lint, test, compile-integration-tests] + needs: [lint, test, compile-integration-tests] if: | always() runs-on: ubuntu-latest diff --git a/.github/workflows/_compile_integration_test.yml b/.github/workflows/_compile_integration_test.yml index 6f0d790..81d90c2 100644 --- a/.github/workflows/_compile_integration_test.yml +++ b/.github/workflows/_compile_integration_test.yml @@ -9,7 +9,7 @@ on: description: "From which folder this pipeline executes" env: - POETRY_VERSION: "1.7.1" + POETRY_VERSION: "2.2.1" jobs: build: diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index 7a2f9b1..86c2276 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -9,7 +9,7 @@ on: description: "From which folder this pipeline executes" env: - POETRY_VERSION: "1.7.1" + POETRY_VERSION: "2.2.1" WORKDIR: ${{ inputs.working-directory == '' && '.' || inputs.working-directory }} # This env var allows us to get inline annotations when ruff has complaints. diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 69265bc..337fefa 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -9,7 +9,7 @@ on: description: "From which folder this pipeline executes" env: - POETRY_VERSION: "1.7.1" + POETRY_VERSION: "2.2.1" jobs: build: From d74f1a0ec9edb610e5e9c941b54c9a898cd67cc2 Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Thu, 6 Nov 2025 15:27:04 -0800 Subject: [PATCH 02/16] Refactor OCI code to appease the lint god Simplify _lint.yml. Rephrase OCI code base to pass make lint checks. --- .github/workflows/_lint.yml | 45 +- libs/oci/Makefile | 8 +- .../chat_models/oci_data_science.py | 44 +- .../chat_models/oci_generative_ai.py | 191 +- ..._data_science_model_deployment_endpoint.py | 19 +- .../embeddings/oci_generative_ai.py | 27 +- ..._data_science_model_deployment_endpoint.py | 69 +- .../langchain_oci/llms/oci_generative_ai.py | 47 +- libs/oci/poetry.lock | 3969 +++++++++++------ libs/oci/pyproject.toml | 6 +- libs/oci/tests/conftest.py | 6 +- .../chat_models/test_tool_calling.py | 89 +- .../chat_models/test_oci_data_science.py | 28 +- .../chat_models/test_oci_generative_ai.py | 77 +- .../test_oci_model_deployment_endpoint.py | 4 +- .../test_oci_model_deployment_endpoint.py | 30 +- libs/oracledb/Makefile | 8 +- 17 files changed, 2772 insertions(+), 1895 deletions(-) diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index 86c2276..b3edfb2 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -42,17 +42,11 @@ jobs: working-directory: ${{ inputs.working-directory }} cache-key: lint-with-extras - - name: Check Poetry File - shell: bash + - name: Check Poetry configuration working-directory: ${{ inputs.working-directory }} run: | poetry check - - - name: Check lock file - shell: bash - working-directory: ${{ inputs.working-directory }} - run: | - poetry lock --check + poetry check --lock - name: Install dependencies # Also installs dev/lint/test/typing dependencies, to ensure we have @@ -65,38 +59,9 @@ jobs: # It doesn't matter how you change it, any change will cause a cache-bust. working-directory: ${{ inputs.working-directory }} run: | - poetry install --with lint,typing - - - name: Get .mypy_cache to speed up mypy - uses: actions/cache@v4 - env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2" - with: - path: | - ${{ env.WORKDIR }}/.mypy_cache - key: mypy-lint-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }} - - - - name: Analysing the code with our lint - working-directory: ${{ inputs.working-directory }} - run: | - make lint_package - - - name: Install unit+integration test dependencies - working-directory: ${{ inputs.working-directory }} - run: | - poetry install --with test,test_integration - - - name: Get .mypy_cache_test to speed up mypy - uses: actions/cache@v4 - env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2" - with: - path: | - ${{ env.WORKDIR }}/.mypy_cache_test - key: mypy-test-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }} + poetry install --with lint,typing,test,test_integration - - name: Analysing the code with our lint + - name: Run linting working-directory: ${{ inputs.working-directory }} run: | - make lint_tests + make lint diff --git a/libs/oci/Makefile b/libs/oci/Makefile index 413c9e4..da821d2 100644 --- a/libs/oci/Makefile +++ b/libs/oci/Makefile @@ -27,14 +27,14 @@ lint_tests: PYTHON_FILES=tests lint_tests: MYPY_CACHE=.mypy_cache_test lint lint_diff lint_package lint_tests: - poetry run ruff . - poetry run ruff format $(PYTHON_FILES) --diff - poetry run ruff --select I $(PYTHON_FILES) + poetry run ruff check . + poetry run ruff format $(PYTHON_FILES) --check --diff + poetry run ruff check --select I $(PYTHON_FILES) mkdir -p $(MYPY_CACHE); poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) format format_diff: poetry run ruff format $(PYTHON_FILES) - poetry run ruff --select I --fix $(PYTHON_FILES) + poetry run ruff check --select I --fix $(PYTHON_FILES) spell_check: poetry run codespell --toml pyproject.toml diff --git a/libs/oci/langchain_oci/chat_models/oci_data_science.py b/libs/oci/langchain_oci/chat_models/oci_data_science.py index 719c355..6b5eb90 100644 --- a/libs/oci/langchain_oci/chat_models/oci_data_science.py +++ b/libs/oci/langchain_oci/chat_models/oci_data_science.py @@ -275,8 +275,7 @@ def validate_openai(cls, values: Any) -> Any: """Checks if langchain_openai is installed.""" if not importlib.util.find_spec("langchain_openai"): raise ImportError( - "Could not import langchain_openai package. " - "Please install it with `pip install langchain_openai`." + "Could not import langchain_openai package. Please install it with `pip install langchain_openai`." ) return values @@ -303,9 +302,7 @@ def _default_params(self) -> Dict[str, Any]: "stream": self.streaming, } - def _headers( - self, is_async: Optional[bool] = False, body: Optional[dict] = None - ) -> Dict: + def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: """Construct and return the headers for a request. Args: @@ -357,17 +354,13 @@ def _generate( response = chat.invoke(messages) """ # noqa: E501 if self.streaming: - stream_iter = self._stream( - messages, stop=stop, run_manager=run_manager, **kwargs - ) + stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs) return generate_from_stream(stream_iter) requests_kwargs = kwargs.pop("requests_kwargs", {}) params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(messages, params) - res = self.completion_with_retry( - data=body, run_manager=run_manager, **requests_kwargs - ) + res = self.completion_with_retry(data=body, run_manager=run_manager, **requests_kwargs) return self._process_response(res.json()) def _stream( @@ -415,9 +408,7 @@ def _stream( params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(messages, params) # request json body - response = self.completion_with_retry( - data=body, run_manager=run_manager, stream=True, **requests_kwargs - ) + response = self.completion_with_retry(data=body, run_manager=run_manager, stream=True, **requests_kwargs) default_chunk_class = AIMessageChunk for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line, default_chunk_class) @@ -467,9 +458,7 @@ async def _agenerate( """ # noqa: E501 if self.streaming: - stream_iter = self._astream( - messages, stop=stop, run_manager=run_manager, **kwargs - ) + stream_iter = self._astream(messages, stop=stop, run_manager=run_manager, **kwargs) return await agenerate_from_stream(stream_iter) requests_kwargs = kwargs.pop("requests_kwargs", {}) @@ -593,19 +582,14 @@ def with_structured_output( else JsonOutputParser() ) else: - raise ValueError( - f"Unrecognized method argument. Expected `json_mode`." - f"Received: `{method}`." - ) + raise ValueError(f"Unrecognized method argument. Expected `json_mode`.Received: `{method}`.") if include_raw: parser_assign = RunnablePassthrough.assign( parsed=itemgetter("raw") | output_parser, parsing_error=lambda _: None ) parser_none = RunnablePassthrough.assign(parsed=lambda _: None) - parser_with_fallback = parser_assign.with_fallbacks( - [parser_none], exception_key="parsing_error" - ) + parser_with_fallback = parser_assign.with_fallbacks([parser_none], exception_key="parsing_error") return RunnableMap(raw=llm) | parser_with_fallback else: return llm | output_parser @@ -688,9 +672,7 @@ def _process_stream_response( if not isinstance(choice, dict): raise TypeError("Endpoint response is not well formed.") except (KeyError, IndexError, TypeError) as e: - raise ValueError( - "Error while formatting response payload for chat model of type" - ) from e + raise ValueError("Error while formatting response payload for chat model of type") from e chunk = _convert_delta_to_message_chunk(choice["delta"], default_chunk_cls) default_chunk_cls = chunk.__class__ @@ -702,9 +684,7 @@ def _process_stream_response( if usage is not None: gen_info.update({"usage": usage}) - return ChatGenerationChunk( - message=chunk, generation_info=gen_info if gen_info else None - ) + return ChatGenerationChunk(message=chunk, generation_info=gen_info if gen_info else None) def _process_response(self, response_json: dict) -> ChatResult: """Formats response in OpenAI spec. @@ -729,9 +709,7 @@ def _process_response(self, response_json: dict) -> ChatResult: if not isinstance(choices, list): raise TypeError("Endpoint response is not well formed.") except (KeyError, TypeError) as e: - raise ValueError( - "Error while formatting response payload for chat model of type" - ) from e + raise ValueError("Error while formatting response payload for chat model of type") from e for choice in choices: message = _convert_dict_to_message(choice["message"]) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index af6b6c7..c015448 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -106,9 +106,7 @@ def convert_oci_tool_call_to_langchain(tool_call: Any) -> ToolCall: return ToolCall( name=tool_call.name, - args=parsed - if "arguments" in tool_call.attribute_map - else tool_call.parameters, + args=parsed if "arguments" in tool_call.attribute_map else tool_call.parameters, id=tool_call.id if "id" in tool_call.attribute_map else uuid.uuid4().hex[:], ) @@ -178,18 +176,14 @@ def messages_to_oci_params(self, messages: Any, **kwargs: Any) -> Dict[str, Any] ... @abstractmethod - def convert_to_oci_tool( - self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool] - ) -> Dict[str, Any]: + def convert_to_oci_tool(self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]) -> Dict[str, Any]: """Convert a tool definition into the provider-specific OCI tool format.""" ... @abstractmethod def process_tool_choice( self, - tool_choice: Optional[ - Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], + tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], ) -> Optional[Any]: """Process tool choice parameter for the provider.""" ... @@ -262,9 +256,7 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: # Include tool calls if available if self.chat_tool_calls(response): - generation_info["tool_calls"] = self.format_response_tool_calls( - self.chat_tool_calls(response) - ) + generation_info["tool_calls"] = self.format_response_tool_calls(self.chat_tool_calls(response)) return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -344,9 +336,7 @@ def get_role(self, message: BaseMessage) -> str: return "TOOL" raise ValueError(f"Unknown message type: {type(message)}") - def messages_to_oci_params( - self, messages: Sequence[ChatMessage], **kwargs: Any - ) -> Dict[str, Any]: + def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) -> Dict[str, Any]: """ Convert LangChain messages to OCI parameters for Cohere. @@ -359,27 +349,18 @@ def messages_to_oci_params( for msg in messages[:-1]: role = self.get_role(msg) if role in ("USER", "SYSTEM"): - oci_chat_history.append( - self.oci_chat_message[role](message=msg.content) - ) + oci_chat_history.append(self.oci_chat_message[role](message=msg.content)) elif isinstance(msg, AIMessage): # Skip tool calls if forcing single step if msg.tool_calls and is_force_single_step: continue tool_calls = ( - [ - self.oci_tool_call(name=tc["name"], parameters=tc["args"]) - for tc in msg.tool_calls - ] + [self.oci_tool_call(name=tc["name"], parameters=tc["args"]) for tc in msg.tool_calls] if msg.tool_calls else None ) msg_content = msg.content if msg.content else " " - oci_chat_history.append( - self.oci_chat_message[role]( - message=msg_content, tool_calls=tool_calls - ) - ) + oci_chat_history.append(self.oci_chat_message[role](message=msg_content, tool_calls=tool_calls)) elif isinstance(msg, ToolMessage): oci_chat_history.append( self.oci_chat_message[self.get_role(msg)]( @@ -397,16 +378,12 @@ def messages_to_oci_params( for i, message in enumerate(messages[::-1]): current_turn.append(message) if isinstance(message, HumanMessage): - if len(messages) > i and isinstance( - messages[len(messages) - i - 2], ToolMessage - ): + if len(messages) > i and isinstance(messages[len(messages) - i - 2], ToolMessage): # add dummy message REPEATING the tool_result to avoid # the error about ToolMessage needing to be followed # by an AI message oci_chat_history.append( - self.oci_chat_message["CHATBOT"]( - message=messages[len(messages) - i - 2].content - ) + self.oci_chat_message["CHATBOT"](message=messages[len(messages) - i - 2].content) ) break current_turn = list(reversed(current_turn)) @@ -416,9 +393,7 @@ def messages_to_oci_params( for message in current_turn: if isinstance(message, ToolMessage): tool_msg = message - previous_ai_msgs = [ - m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls - ] + previous_ai_msgs = [m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls] if previous_ai_msgs: previous_ai_msg = previous_ai_msgs[-1] for lc_tool_call in previous_ai_msg.tool_calls: @@ -459,9 +434,7 @@ def convert_to_oci_tool( if isinstance(tool, BaseTool): return self.oci_tool( name=tool.name, - description=OCIUtils.remove_signature_from_tool_description( - tool.name, tool.description - ), + description=OCIUtils.remove_signature_from_tool_description(tool.name, tool.description), parameter_definitions={ p_name: self.oci_tool_param( description=p_def.get("description", ""), @@ -522,21 +495,14 @@ def convert_to_oci_tool( def process_tool_choice( self, - tool_choice: Optional[ - Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], + tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], ) -> Optional[Any]: """Cohere does not support tool choices.""" if tool_choice is not None: - raise ValueError( - "Tool choice is not supported for Cohere models." - "Please remove the tool_choice parameter." - ) + raise ValueError("Tool choice is not supported for Cohere models.Please remove the tool_choice parameter.") return None - def process_stream_tool_calls( - self, event_data: Dict, tool_call_ids: Set[str] - ) -> List[ToolCallChunk]: + def process_stream_tool_calls(self, event_data: Dict, tool_call_ids: Set[str]) -> List[ToolCallChunk]: """ Process Cohere stream tool calls and return them as ToolCallChunk objects. @@ -634,11 +600,9 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: # Include token usage if available if hasattr(response.data.chat_response, "usage") and response.data.chat_response.usage: generation_info["total_tokens"] = response.data.chat_response.usage.total_tokens - + if self.chat_tool_calls(response): - generation_info["tool_calls"] = self.format_response_tool_calls( - self.chat_tool_calls(response) - ) + generation_info["tool_calls"] = self.format_response_tool_calls(self.chat_tool_calls(response)) return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -714,9 +678,7 @@ def get_role(self, message: BaseMessage) -> str: return "TOOL" raise ValueError(f"Unknown message type: {type(message)}") - def messages_to_oci_params( - self, messages: List[BaseMessage], **kwargs: Any - ) -> Dict[str, Any]: + def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> Dict[str, Any]: """Convert LangChain messages to OCI chat parameters. Args: @@ -735,9 +697,7 @@ def messages_to_oci_params( role = self.get_role(message) if isinstance(message, ToolMessage): # For tool messages, wrap the content in a text content object. - tool_content = [ - self.oci_chat_message_text_content(text=str(message.content)) - ] + tool_content = [self.oci_chat_message_text_content(text=str(message.content))] if message.tool_call_id: oci_message = self.oci_chat_message[role]( content=tool_content, @@ -745,9 +705,7 @@ def messages_to_oci_params( ) else: oci_message = self.oci_chat_message[role](content=tool_content) - elif isinstance(message, AIMessage) and ( - message.tool_calls or message.additional_kwargs.get("tool_calls") - ): + elif isinstance(message, AIMessage) and (message.tool_calls or message.additional_kwargs.get("tool_calls")): # Process content and tool calls for assistant messages content = self._process_message_content(message.content) tool_calls = [] @@ -779,10 +737,7 @@ def messages_to_oci_params( # This addresses a known issue with Meta Llama models that # continue calling tools even after receiving results. - def _should_allow_more_tool_calls( - messages: List[BaseMessage], - max_tool_calls: int - ) -> bool: + def _should_allow_more_tool_calls(messages: List[BaseMessage], max_tool_calls: int) -> bool: """ Determine if the model should be allowed to call more tools. @@ -797,10 +752,7 @@ def _should_allow_more_tool_calls( max_tool_calls: Maximum number of tool calls before forcing stop """ # Count total tool calls made so far - tool_call_count = sum( - 1 for msg in messages - if isinstance(msg, ToolMessage) - ) + tool_call_count = sum(1 for msg in messages if isinstance(msg, ToolMessage)) # Safety limit: prevent runaway tool calling if tool_call_count >= max_tool_calls: @@ -809,12 +761,12 @@ def _should_allow_more_tool_calls( # Detect infinite loop: same tool called with same arguments in succession recent_calls = [] for msg in reversed(messages): - if hasattr(msg, 'tool_calls') and msg.tool_calls: + if hasattr(msg, "tool_calls") and msg.tool_calls: for tc in msg.tool_calls: # Create signature: (tool_name, sorted_args) try: - args_str = json.dumps(tc.get('args', {}), sort_keys=True) - signature = (tc.get('name', ''), args_str) + args_str = json.dumps(tc.get("args", {}), sort_keys=True) + signature = (tc.get("name", ""), args_str) # Check if this exact call was made in last 2 calls if signature in recent_calls[-2:]: @@ -841,9 +793,7 @@ def _should_allow_more_tool_calls( return result - def _process_message_content( - self, content: Union[str, List[Union[str, Dict]]] - ) -> List[Any]: + def _process_message_content(self, content: Union[str, List[Union[str, Dict]]]) -> List[Any]: """Process message content into OCI chat content format. Args: @@ -870,21 +820,15 @@ def _process_message_content( if item["type"] == "image_url": processed_content.append( self.oci_chat_message_image_content( - image_url=self.oci_chat_message_image_url( - url=item["image_url"]["url"] - ) + image_url=self.oci_chat_message_image_url(url=item["image_url"]["url"]) ) ) elif item["type"] == "text": - processed_content.append( - self.oci_chat_message_text_content(text=item["text"]) - ) + processed_content.append(self.oci_chat_message_text_content(text=item["text"])) else: raise ValueError(f"Unsupported content type: {item['type']}") else: - raise ValueError( - f"Content items must be str or dict, got: {type(item)}" - ) + raise ValueError(f"Content items must be str or dict, got: {type(item)}") return processed_content def convert_to_oci_tool( @@ -922,9 +866,7 @@ def convert_to_oci_tool( elif isinstance(tool, BaseTool): return self.oci_function_definition( name=tool.name, - description=OCIUtils.remove_signature_from_tool_description( - tool.name, tool.description - ), + description=OCIUtils.remove_signature_from_tool_description(tool.name, tool.description), parameters={ "type": "object", "properties": { @@ -934,11 +876,7 @@ def convert_to_oci_tool( } for p_name, p_def in tool.args.items() }, - "required": [ - p_name - for p_name, p_def in tool.args.items() - if "default" not in p_def - ], + "required": [p_name for p_name, p_def in tool.args.items() if "default" not in p_def], }, ) raise ValueError( @@ -949,9 +887,7 @@ def convert_to_oci_tool( def process_tool_choice( self, - tool_choice: Optional[ - Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], + tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], ) -> Optional[Any]: """Process tool choice for Meta provider. @@ -992,14 +928,9 @@ def process_tool_choice( elif isinstance(tool_choice, dict): # For Meta, we use ToolChoiceAuto for tool selection return self.oci_tool_choice_auto() - raise ValueError( - f"Unrecognized tool_choice type. Expected str, bool or dict. " - f"Received: {tool_choice}" - ) + raise ValueError(f"Unrecognized tool_choice type. Expected str, bool or dict. Received: {tool_choice}") - def process_stream_tool_calls( - self, event_data: Dict, tool_call_ids: Set[str] - ) -> List[ToolCallChunk]: + def process_stream_tool_calls(self, event_data: Dict, tool_call_ids: Set[str]) -> List[ToolCallChunk]: """ Process Meta stream tool calls and convert them to ToolCallChunks. @@ -1147,14 +1078,11 @@ def _prepare_request( except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. " - "Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." ) from ex oci_params = self._provider.messages_to_oci_params( - messages, - max_sequential_tool_calls=self.max_sequential_tool_calls, - **kwargs + messages, max_sequential_tool_calls=self.max_sequential_tool_calls, **kwargs ) oci_params["is_stream"] = stream @@ -1166,10 +1094,11 @@ def _prepare_request( # Warn if using max_tokens with OpenAI models if self.model_id and self.model_id.startswith("openai.") and "max_tokens" in _model_kwargs: import warnings + warnings.warn( - f"OpenAI models require 'max_completion_tokens' instead of 'max_tokens'.", + "OpenAI models require 'max_completion_tokens' instead of 'max_tokens'.", UserWarning, - stacklevel=2 + stacklevel=2, ) chat_params = {**_model_kwargs, **kwargs, **oci_params} @@ -1193,9 +1122,7 @@ def bind_tools( self, tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]], *, - tool_choice: Optional[ - Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ] = None, + tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]] = None, **kwargs: Any, ) -> Runnable[LanguageModelInput, BaseMessage]: """Bind tool-like objects to this chat model. @@ -1231,9 +1158,7 @@ def with_structured_output( self, schema: Optional[Union[Dict, Type[BaseModel]]] = None, *, - method: Literal[ - "function_calling", "json_schema", "json_mode" - ] = "function_calling", + method: Literal["function_calling", "json_schema", "json_mode"] = "function_calling", include_raw: bool = False, **kwargs: Any, ) -> Runnable[LanguageModelInput, Union[Dict, BaseModel]]: @@ -1254,7 +1179,7 @@ def with_structured_output( used. Note that if using "json_mode" then you must include instructions for formatting the output into the desired schema into the model call. If "json_schema" then it allows the user to pass a json schema (or pydantic) - to the model for structured output. + to the model for structured output. include_raw: If False then only the parsed structured output is returned. If an error occurs during model output parsing it will be raised. If True @@ -1294,9 +1219,7 @@ def with_structured_output( first_tool_only=True, # type: ignore[list-item] ) else: - output_parser = JsonOutputKeyToolsParser( - key_name=tool_name, first_tool_only=True - ) + output_parser = JsonOutputKeyToolsParser(key_name=tool_name, first_tool_only=True) elif method == "json_mode": llm = self.bind(response_format={"type": "JSON_OBJECT"}) output_parser = ( @@ -1310,18 +1233,16 @@ def with_structured_output( if is_pydantic_schema else schema ) - + response_json_schema = self._provider.oci_response_json_schema( name=json_schema_dict.get("title", "response"), description=json_schema_dict.get("description", ""), schema=json_schema_dict, - is_strict=True + is_strict=True, ) - - response_format_obj = self._provider.oci_json_schema_response_format( - json_schema=response_json_schema - ) - + + response_format_obj = self._provider.oci_json_schema_response_format(json_schema=response_json_schema) + llm = self.bind(response_format=response_format_obj) if is_pydantic_schema: output_parser = PydanticOutputParser(pydantic_object=schema) @@ -1338,9 +1259,7 @@ def with_structured_output( parsed=itemgetter("raw") | output_parser, parsing_error=lambda _: None ) parser_none = RunnablePassthrough.assign(parsed=lambda _: None) - parser_with_fallback = parser_assign.with_fallbacks( - [parser_none], exception_key="parsing_error" - ) + parser_with_fallback = parser_assign.with_fallbacks([parser_none], exception_key="parsing_error") return RunnableMap(raw=llm) | parser_with_fallback return llm | output_parser @@ -1372,9 +1291,7 @@ def _generate( response = llm.invoke(messages) """ if self.is_stream: - stream_iter = self._stream( - messages, stop=stop, run_manager=run_manager, **kwargs - ) + stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs) return generate_from_stream(stream_iter) request = self._prepare_request(messages, stop=stop, stream=False, **kwargs) @@ -1405,9 +1322,7 @@ def _generate( tool_calls=tool_calls, ) return ChatResult( - generations=[ - ChatGeneration(message=message, generation_info=generation_info) - ], + generations=[ChatGeneration(message=message, generation_info=generation_info)], llm_output=llm_output, ) @@ -1433,9 +1348,7 @@ def _stream( if not self._provider.is_chat_stream_end(event_data): # Process streaming content delta = self._provider.chat_stream_to_text(event_data) - tool_call_chunks = self._provider.process_stream_tool_calls( - event_data, tool_call_ids - ) + tool_call_chunks = self._provider.process_stream_tool_calls(event_data, tool_call_ids) chunk = ChatGenerationChunk( message=AIMessageChunk( diff --git a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py index 8f931f2..af49802 100644 --- a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py @@ -21,9 +21,7 @@ class TokenExpiredError(Exception): def _create_retry_decorator(llm) -> Callable[[Any], Any]: """Creates a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] - decorator = create_base_retry_decorator( - error_types=errors, max_retries=llm.max_retries - ) + decorator = create_base_retry_decorator(error_types=errors, max_retries=llm.max_retries) return decorator @@ -72,8 +70,7 @@ def validate_environment( # pylint: disable=no-self-argument except ImportError as ex: raise ImportError( - "Could not import ads python package. " - "Please install it with `pip install oracle_ads`." + "Could not import ads python package. Please install it with `pip install oracle_ads`." ) from ex if not values.get("auth", None): values["auth"] = ads.common.auth.default_signer() @@ -107,9 +104,7 @@ def _completion_with_retry(**kwargs: Any) -> Any: if response.status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err else: - raise ValueError( - f"Server error: {str(http_err)}. Message: {response.text}" - ) from http_err + raise ValueError(f"Server error: {str(http_err)}. Message: {response.text}") from http_err except Exception as e: raise ValueError(f"Error occurs by inference endpoint: {str(e)}") from e @@ -163,9 +158,7 @@ def _proceses_response(self, response: requests.Response) -> List[List[float]]: res_json = response.json() embeddings = res_json["data"][0]["embedding"] except Exception as e: - raise ValueError( - f"Error raised by inference API: {e}.\nResponse: {response.text}" - ) + raise ValueError(f"Error raised by inference API: {e}.\nResponse: {response.text}") return embeddings def embed_documents( @@ -185,9 +178,7 @@ def embed_documents( List of embeddings, one for each text. """ results = [] - _chunk_size = ( - len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size - ) + _chunk_size = len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size for i in range(0, len(texts), _chunk_size): response = self._embedding(texts[i : i + _chunk_size]) results.extend(response) diff --git a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py index edfb285..ca6a479 100644 --- a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py +++ b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py @@ -126,12 +126,8 @@ def validate_environment(cls, values: Dict) -> Dict: # pylint: disable=no-self- elif values["auth_type"] == OCIAuthType(2).name: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] - pk = oci.signer.load_private_key_from_file( - oci_config.get("key_file"), None - ) - with open( - oci_config.get("security_token_file"), encoding="utf-8" - ) as f: + pk = oci.signer.load_private_key_from_file(oci_config.get("key_file"), None) + with open(oci_config.get("security_token_file"), encoding="utf-8") as f: st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -139,28 +135,19 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] file_location=values["auth_file_location"], profile_name=values["auth_profile"], ) - client_kwargs["signer"] = make_security_token_signer( - oci_config=client_kwargs["config"] - ) + client_kwargs["signer"] = make_security_token_signer(oci_config=client_kwargs["config"]) elif values["auth_type"] == OCIAuthType(3).name: - client_kwargs["signer"] = ( - oci.auth.signers.InstancePrincipalsSecurityTokenSigner() - ) + client_kwargs["signer"] = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() elif values["auth_type"] == OCIAuthType(4).name: - client_kwargs["signer"] = ( - oci.auth.signers.get_resource_principals_signer() - ) + client_kwargs["signer"] = oci.auth.signers.get_resource_principals_signer() else: raise ValueError("Please provide valid value to auth_type") - values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( - **client_kwargs - ) + values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient(**client_kwargs) except ImportError as ex: raise ImportError( - "Could not import oci python package. " - "Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." ) from ex except Exception as e: raise ValueError( diff --git a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py index 9089be1..ee725ab 100644 --- a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py @@ -52,15 +52,11 @@ class ServerError(Exception): def _create_retry_decorator( llm: "BaseOCIModelDeployment", *, - run_manager: Optional[ - Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun] - ] = None, + run_manager: Optional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]] = None, ) -> Callable[[Any], Any]: """Create a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] - decorator = create_base_retry_decorator( - error_types=errors, max_retries=llm.max_retries, run_manager=run_manager - ) + decorator = create_base_retry_decorator(error_types=errors, max_retries=llm.max_retries, run_manager=run_manager) return decorator @@ -97,8 +93,7 @@ def validate_environment(cls, values: Dict) -> Dict: except ImportError as ex: raise ImportError( - "Could not import ads python package. " - "Please install it with `pip install oracle_ads`." + "Could not import ads python package. Please install it with `pip install oracle_ads`." ) from ex if not values.get("auth", None): @@ -111,9 +106,7 @@ def validate_environment(cls, values: Dict) -> Dict: ) return values - def _headers( - self, is_async: Optional[bool] = False, body: Optional[dict] = None - ) -> Dict: + def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: """Construct and return the headers for a request. Args: @@ -157,9 +150,7 @@ def _headers( return headers - def completion_with_retry( - self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any - ) -> Any: + def completion_with_retry(self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Any: """Use tenacity to retry the completion call.""" retry_decorator = _create_retry_decorator(self, run_manager=run_manager) @@ -194,9 +185,7 @@ def _completion_with_retry(**kwargs: Any) -> Any: f"url={self.endpoint},timeout={request_timeout},stream={stream}. " f"Additional request kwargs={kwargs}." ) - raise RuntimeError( - f"Error occurs by inference endpoint: {str(err)}" - ) from err + raise RuntimeError(f"Error occurs by inference endpoint: {str(err)}") from err return _completion_with_retry(**kwargs) @@ -250,9 +239,7 @@ async def _completion_with_retry(**kwargs: Any) -> Any: f"Stream mode={stream}. " f"Requests kwargs: url={self.endpoint}, timeout={request_timeout}." ) - raise RuntimeError( - f"Error occurs by inference endpoint: {str(err)}" - ) from err + raise RuntimeError(f"Error occurs by inference endpoint: {str(err)}") from err return await _completion_with_retry(**kwargs) @@ -287,17 +274,11 @@ def _check_response(self, response: Any) -> None: try: response.raise_for_status() except requests.exceptions.HTTPError as http_err: - status_code = ( - response.status_code - if hasattr(response, "status_code") - else response.status - ) + status_code = response.status_code if hasattr(response, "status_code") else response.status if status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err - raise ServerError( - f"Server error: {str(http_err)}. \nMessage: {response.text}" - ) from http_err + raise ServerError(f"Server error: {str(http_err)}. \nMessage: {response.text}") from http_err def _parse_stream(self, lines: Iterator[bytes]) -> Iterator[str]: """Parse a stream of byte lines and yield parsed string lines. @@ -383,9 +364,7 @@ def _refresh_signer(self) -> bool: Returns: bool: `True` if the token was successfully refreshed, `False` otherwise. """ - if self.auth.get("signer", None) and hasattr( - self.auth["signer"], "refresh_security_token" - ): + if self.auth.get("signer", None) and hasattr(self.auth["signer"], "refresh_security_token"): self.auth["signer"].refresh_security_token() return True return False @@ -491,9 +470,7 @@ def _identifying_params(self) -> Dict[str, Any]: **self._default_params, } - def _headers( - self, is_async: Optional[bool] = False, body: Optional[dict] = None - ) -> Dict: + def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: """Construct and return the headers for a request. Args: @@ -538,9 +515,7 @@ def _generate( body = self._construct_json_body(prompt, params) if self.streaming: generation = GenerationChunk(text="") - for chunk in self._stream( - prompt, stop=stop, run_manager=run_manager, **kwargs - ): + for chunk in self._stream(prompt, stop=stop, run_manager=run_manager, **kwargs): generation += chunk generations.append([generation]) else: @@ -580,9 +555,7 @@ async def _agenerate( body = self._construct_json_body(prompt, params) if self.streaming: generation = GenerationChunk(text="") - async for chunk in self._astream( - prompt, stop=stop, run_manager=run_manager, **kwargs - ): + async for chunk in self._astream(prompt, stop=stop, run_manager=run_manager, **kwargs): generation += chunk generations.append([generation]) else: @@ -629,9 +602,7 @@ def _stream( params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(prompt, params) - response = self.completion_with_retry( - data=body, run_manager=run_manager, stream=True, **requests_kwargs - ) + response = self.completion_with_retry(data=body, run_manager=run_manager, stream=True, **requests_kwargs) for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line) if run_manager: @@ -690,9 +661,7 @@ def _construct_json_body(self, prompt: str, params: dict) -> dict: **params, } - def _invocation_params( - self, stop: Optional[List[str]] = None, **kwargs: Any - ) -> dict: + def _invocation_params(self, stop: Optional[List[str]] = None, **kwargs: Any) -> dict: """Combines the invocation parameters with default parameters.""" params = self._default_params _model_kwargs = self.model_kwargs or {} @@ -865,9 +834,7 @@ def _default_params(self) -> Dict[str, Any]: "best_of": self.best_of, "max_new_tokens": self.max_tokens, "temperature": self.temperature, - "top_k": ( - self.k if self.k > 0 else None - ), # `top_k` must be strictly positive' + "top_k": (self.k if self.k > 0 else None), # `top_k` must be strictly positive' "top_p": self.p, "do_sample": self.do_sample, "return_full_text": self.return_full_text, @@ -907,9 +874,7 @@ def _process_response(self, response_json: dict) -> List[Generation]: try: text = response_json["generated_text"] except KeyError as e: - raise ValueError( - f"Error while formatting response payload.response_json={response_json}" - ) from e + raise ValueError(f"Error while formatting response payload.response_json={response_json}") from e return [Generation(text=text)] diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index 3649e87..41c0c90 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -22,10 +22,12 @@ class Provider(ABC): @property @abstractmethod - def stop_sequence_key(self) -> str: ... + def stop_sequence_key(self) -> str: + ... @abstractmethod - def completion_response_to_text(self, response: Any) -> str: ... + def completion_response_to_text(self, response: Any) -> str: + ... class CohereProvider(Provider): @@ -120,9 +122,7 @@ class OCIGenAIBase(BaseModel, ABC): """Maximum tool calls before forcing final answer. Prevents infinite loops while allowing multi-step orchestration.""" - model_config = ConfigDict( - extra="forbid", arbitrary_types_allowed=True, protected_namespaces=() - ) + model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, protected_namespaces=()) @pre_init def validate_environment(cls, values: Dict) -> Dict: @@ -152,12 +152,8 @@ def validate_environment(cls, values: Dict) -> Dict: elif values["auth_type"] == OCIAuthType(2).name: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] - pk = oci.signer.load_private_key_from_file( - oci_config.get("key_file"), None - ) - with open( - oci_config.get("security_token_file"), encoding="utf-8" - ) as f: + pk = oci.signer.load_private_key_from_file(oci_config.get("key_file"), None) + with open(oci_config.get("security_token_file"), encoding="utf-8") as f: st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -165,31 +161,19 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] file_location=values["auth_file_location"], profile_name=values["auth_profile"], ) - client_kwargs["signer"] = make_security_token_signer( - oci_config=client_kwargs["config"] - ) + client_kwargs["signer"] = make_security_token_signer(oci_config=client_kwargs["config"]) elif values["auth_type"] == OCIAuthType(3).name: - client_kwargs["signer"] = ( - oci.auth.signers.InstancePrincipalsSecurityTokenSigner() - ) + client_kwargs["signer"] = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() elif values["auth_type"] == OCIAuthType(4).name: - client_kwargs["signer"] = ( - oci.auth.signers.get_resource_principals_signer() - ) + client_kwargs["signer"] = oci.auth.signers.get_resource_principals_signer() else: - raise ValueError( - "Please provide valid value to auth_type, " - f"{values['auth_type']} is not valid." - ) + raise ValueError(f"Please provide valid value to auth_type, {values['auth_type']} is not valid.") - values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( - **client_kwargs - ) + values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient(**client_kwargs) except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. " - "Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." ) from ex except Exception as e: raise ValueError( @@ -301,10 +285,7 @@ def _prepare_invocation_object( _model_kwargs[self._provider.stop_sequence_key] = stop if self.model_id is None: - raise ValueError( - "model_id is required to call the model, " - "please provide the model_id." - ) + raise ValueError("model_id is required to call the model, please provide the model_id.") if self.model_id.startswith(CUSTOM_ENDPOINT_PREFIX): serving_mode = models.DedicatedServingMode(endpoint_id=self.model_id) diff --git a/libs/oci/poetry.lock b/libs/oci/poetry.lock index f3ac7b3..73cead7 100644 --- a/libs/oci/poetry.lock +++ b/libs/oci/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -14,98 +14,132 @@ files = [ [[package]] name = "aiohttp" -version = "3.12.15" +version = "3.13.2" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "aiohttp-3.12.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6fc902bff74d9b1879ad55f5404153e2b33a82e72a95c89cec5eb6cc9e92fbc"}, - {file = "aiohttp-3.12.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:098e92835b8119b54c693f2f88a1dec690e20798ca5f5fe5f0520245253ee0af"}, - {file = "aiohttp-3.12.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:40b3fee496a47c3b4a39a731954c06f0bd9bd3e8258c059a4beb76ac23f8e421"}, - {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ce13fcfb0bb2f259fb42106cdc63fa5515fb85b7e87177267d89a771a660b79"}, - {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3beb14f053222b391bf9cf92ae82e0171067cc9c8f52453a0f1ec7c37df12a77"}, - {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c39e87afe48aa3e814cac5f535bc6199180a53e38d3f51c5e2530f5aa4ec58c"}, - {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f1b4ce5bc528a6ee38dbf5f39bbf11dd127048726323b72b8e85769319ffc4"}, - {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1004e67962efabbaf3f03b11b4c43b834081c9e3f9b32b16a7d97d4708a9abe6"}, - {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8faa08fcc2e411f7ab91d1541d9d597d3a90e9004180edb2072238c085eac8c2"}, - {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fe086edf38b2222328cdf89af0dde2439ee173b8ad7cb659b4e4c6f385b2be3d"}, - {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:79b26fe467219add81d5e47b4a4ba0f2394e8b7c7c3198ed36609f9ba161aecb"}, - {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b761bac1192ef24e16706d761aefcb581438b34b13a2f069a6d343ec8fb693a5"}, - {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e153e8adacfe2af562861b72f8bc47f8a5c08e010ac94eebbe33dc21d677cd5b"}, - {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc49c4de44977aa8601a00edbf157e9a421f227aa7eb477d9e3df48343311065"}, - {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2776c7ec89c54a47029940177e75c8c07c29c66f73464784971d6a81904ce9d1"}, - {file = "aiohttp-3.12.15-cp310-cp310-win32.whl", hash = "sha256:2c7d81a277fa78b2203ab626ced1487420e8c11a8e373707ab72d189fcdad20a"}, - {file = "aiohttp-3.12.15-cp310-cp310-win_amd64.whl", hash = "sha256:83603f881e11f0f710f8e2327817c82e79431ec976448839f3cd05d7afe8f830"}, - {file = "aiohttp-3.12.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d3ce17ce0220383a0f9ea07175eeaa6aa13ae5a41f30bc61d84df17f0e9b1117"}, - {file = "aiohttp-3.12.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:010cc9bbd06db80fe234d9003f67e97a10fe003bfbedb40da7d71c1008eda0fe"}, - {file = "aiohttp-3.12.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f9d7c55b41ed687b9d7165b17672340187f87a773c98236c987f08c858145a9"}, - {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc4fbc61bb3548d3b482f9ac7ddd0f18c67e4225aaa4e8552b9f1ac7e6bda9e5"}, - {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7fbc8a7c410bb3ad5d595bb7118147dfbb6449d862cc1125cf8867cb337e8728"}, - {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74dad41b3458dbb0511e760fb355bb0b6689e0630de8a22b1b62a98777136e16"}, - {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b6f0af863cf17e6222b1735a756d664159e58855da99cfe965134a3ff63b0b0"}, - {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5b7fe4972d48a4da367043b8e023fb70a04d1490aa7d68800e465d1b97e493b"}, - {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6443cca89553b7a5485331bc9bedb2342b08d073fa10b8c7d1c60579c4a7b9bd"}, - {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c5f40ec615e5264f44b4282ee27628cea221fcad52f27405b80abb346d9f3f8"}, - {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2abbb216a1d3a2fe86dbd2edce20cdc5e9ad0be6378455b05ec7f77361b3ab50"}, - {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:db71ce547012a5420a39c1b744d485cfb823564d01d5d20805977f5ea1345676"}, - {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ced339d7c9b5030abad5854aa5413a77565e5b6e6248ff927d3e174baf3badf7"}, - {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7c7dd29c7b5bda137464dc9bfc738d7ceea46ff70309859ffde8c022e9b08ba7"}, - {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:421da6fd326460517873274875c6c5a18ff225b40da2616083c5a34a7570b685"}, - {file = "aiohttp-3.12.15-cp311-cp311-win32.whl", hash = "sha256:4420cf9d179ec8dfe4be10e7d0fe47d6d606485512ea2265b0d8c5113372771b"}, - {file = "aiohttp-3.12.15-cp311-cp311-win_amd64.whl", hash = "sha256:edd533a07da85baa4b423ee8839e3e91681c7bfa19b04260a469ee94b778bf6d"}, - {file = "aiohttp-3.12.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:802d3868f5776e28f7bf69d349c26fc0efadb81676d0afa88ed00d98a26340b7"}, - {file = "aiohttp-3.12.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444"}, - {file = "aiohttp-3.12.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8466151554b593909d30a0a125d638b4e5f3836e5aecde85b66b80ded1cb5b0d"}, - {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c"}, - {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6404dfc8cdde35c69aaa489bb3542fb86ef215fc70277c892be8af540e5e21c0"}, - {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ead1c00f8521a5c9070fcb88f02967b1d8a0544e6d85c253f6968b785e1a2ab"}, - {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6990ef617f14450bc6b34941dba4f12d5613cbf4e33805932f853fbd1cf18bfb"}, - {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545"}, - {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c"}, - {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aaa2234bb60c4dbf82893e934d8ee8dea30446f0647e024074237a56a08c01bd"}, - {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6d86a2fbdd14192e2f234a92d3b494dd4457e683ba07e5905a0b3ee25389ac9f"}, - {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a041e7e2612041a6ddf1c6a33b883be6a421247c7afd47e885969ee4cc58bd8d"}, - {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5015082477abeafad7203757ae44299a610e89ee82a1503e3d4184e6bafdd519"}, - {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:56822ff5ddfd1b745534e658faba944012346184fbfe732e0d6134b744516eea"}, - {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2acbbfff69019d9014508c4ba0401822e8bae5a5fdc3b6814285b71231b60f3"}, - {file = "aiohttp-3.12.15-cp312-cp312-win32.whl", hash = "sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1"}, - {file = "aiohttp-3.12.15-cp312-cp312-win_amd64.whl", hash = "sha256:b390ef5f62bb508a9d67cb3bba9b8356e23b3996da7062f1a57ce1a79d2b3d34"}, - {file = "aiohttp-3.12.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315"}, - {file = "aiohttp-3.12.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd"}, - {file = "aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4"}, - {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7"}, - {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d"}, - {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b"}, - {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d"}, - {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d"}, - {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645"}, - {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461"}, - {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9"}, - {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d"}, - {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693"}, - {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64"}, - {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51"}, - {file = "aiohttp-3.12.15-cp313-cp313-win32.whl", hash = "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0"}, - {file = "aiohttp-3.12.15-cp313-cp313-win_amd64.whl", hash = "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84"}, - {file = "aiohttp-3.12.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:691d203c2bdf4f4637792efbbcdcd157ae11e55eaeb5e9c360c1206fb03d4d98"}, - {file = "aiohttp-3.12.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e995e1abc4ed2a454c731385bf4082be06f875822adc4c6d9eaadf96e20d406"}, - {file = "aiohttp-3.12.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bd44d5936ab3193c617bfd6c9a7d8d1085a8dc8c3f44d5f1dcf554d17d04cf7d"}, - {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46749be6e89cd78d6068cdf7da51dbcfa4321147ab8e4116ee6678d9a056a0cf"}, - {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c643f4d75adea39e92c0f01b3fb83d57abdec8c9279b3078b68a3a52b3933b6"}, - {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a23918fedc05806966a2438489dcffccbdf83e921a1170773b6178d04ade142"}, - {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74bdd8c864b36c3673741023343565d95bfbd778ffe1eb4d412c135a28a8dc89"}, - {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a146708808c9b7a988a4af3821379e379e0f0e5e466ca31a73dbdd0325b0263"}, - {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7011a70b56facde58d6d26da4fec3280cc8e2a78c714c96b7a01a87930a9530"}, - {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3bdd6e17e16e1dbd3db74d7f989e8af29c4d2e025f9828e6ef45fbdee158ec75"}, - {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:57d16590a351dfc914670bd72530fd78344b885a00b250e992faea565b7fdc05"}, - {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bc9a0f6569ff990e0bbd75506c8d8fe7214c8f6579cca32f0546e54372a3bb54"}, - {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:536ad7234747a37e50e7b6794ea868833d5220b49c92806ae2d7e8a9d6b5de02"}, - {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f0adb4177fa748072546fb650d9bd7398caaf0e15b370ed3317280b13f4083b0"}, - {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14954a2988feae3987f1eb49c706bff39947605f4b6fa4027c1d75743723eb09"}, - {file = "aiohttp-3.12.15-cp39-cp39-win32.whl", hash = "sha256:b784d6ed757f27574dca1c336f968f4e81130b27595e458e69457e6878251f5d"}, - {file = "aiohttp-3.12.15-cp39-cp39-win_amd64.whl", hash = "sha256:86ceded4e78a992f835209e236617bffae649371c4a50d5e5a3987f237db84b8"}, - {file = "aiohttp-3.12.15.tar.gz", hash = "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2"}, + {file = "aiohttp-3.13.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2372b15a5f62ed37789a6b383ff7344fc5b9f243999b0cd9b629d8bc5f5b4155"}, + {file = "aiohttp-3.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7f8659a48995edee7229522984bd1009c1213929c769c2daa80b40fe49a180c"}, + {file = "aiohttp-3.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:939ced4a7add92296b0ad38892ce62b98c619288a081170695c6babe4f50e636"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6315fb6977f1d0dd41a107c527fee2ed5ab0550b7d885bc15fee20ccb17891da"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6e7352512f763f760baaed2637055c49134fd1d35b37c2dedfac35bfe5cf8725"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e09a0a06348a2dd73e7213353c90d709502d9786219f69b731f6caa0efeb46f5"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a09a6d073fb5789456545bdee2474d14395792faa0527887f2f4ec1a486a59d3"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b59d13c443f8e049d9e94099c7e412e34610f1f49be0f230ec656a10692a5802"}, + {file = "aiohttp-3.13.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:20db2d67985d71ca033443a1ba2001c4b5693fe09b0e29f6d9358a99d4d62a8a"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:960c2fc686ba27b535f9fd2b52d87ecd7e4fd1cf877f6a5cba8afb5b4a8bd204"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6c00dbcf5f0d88796151e264a8eab23de2997c9303dd7c0bf622e23b24d3ce22"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fed38a5edb7945f4d1bcabe2fcd05db4f6ec7e0e82560088b754f7e08d93772d"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:b395bbca716c38bef3c764f187860e88c724b342c26275bc03e906142fc5964f"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:204ffff2426c25dfda401ba08da85f9c59525cdc42bda26660463dd1cbcfec6f"}, + {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05c4dd3c48fb5f15db31f57eb35374cb0c09afdde532e7fb70a75aede0ed30f6"}, + {file = "aiohttp-3.13.2-cp310-cp310-win32.whl", hash = "sha256:e574a7d61cf10351d734bcddabbe15ede0eaa8a02070d85446875dc11189a251"}, + {file = "aiohttp-3.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:364f55663085d658b8462a1c3f17b2b84a5c2e1ba858e1b79bff7b2e24ad1514"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb"}, + {file = "aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592"}, + {file = "aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782"}, + {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8"}, + {file = "aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec"}, + {file = "aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc"}, + {file = "aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e"}, + {file = "aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169"}, + {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248"}, + {file = "aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e"}, + {file = "aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742"}, + {file = "aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e"}, + {file = "aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476"}, + {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23"}, + {file = "aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254"}, + {file = "aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a"}, + {file = "aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b"}, + {file = "aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61"}, + {file = "aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011"}, + {file = "aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4"}, + {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a"}, + {file = "aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940"}, + {file = "aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4"}, + {file = "aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673"}, + {file = "aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd"}, + {file = "aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e"}, + {file = "aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be"}, + {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c"}, + {file = "aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734"}, + {file = "aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f"}, + {file = "aiohttp-3.13.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7fbdf5ad6084f1940ce88933de34b62358d0f4a0b6ec097362dcd3e5a65a4989"}, + {file = "aiohttp-3.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7c3a50345635a02db61792c85bb86daffac05330f6473d524f1a4e3ef9d0046d"}, + {file = "aiohttp-3.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e87dff73f46e969af38ab3f7cb75316a7c944e2e574ff7c933bc01b10def7f5"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2adebd4577724dcae085665f294cc57c8701ddd4d26140504db622b8d566d7aa"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e036a3a645fe92309ec34b918394bb377950cbb43039a97edae6c08db64b23e2"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:23ad365e30108c422d0b4428cf271156dd56790f6dd50d770b8e360e6c5ab2e6"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1f9b2c2d4b9d958b1f9ae0c984ec1dd6b6689e15c75045be8ccb4011426268ca"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a92cf4b9bea33e15ecbaa5c59921be0f23222608143d025c989924f7e3e0c07"}, + {file = "aiohttp-3.13.2-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:070599407f4954021509193404c4ac53153525a19531051661440644728ba9a7"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:29562998ec66f988d49fb83c9b01694fa927186b781463f376c5845c121e4e0b"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4dd3db9d0f4ebca1d887d76f7cdbcd1116ac0d05a9221b9dad82c64a62578c4d"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d7bc4b7f9c4921eba72677cd9fedd2308f4a4ca3e12fab58935295ad9ea98700"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dacd50501cd017f8cccb328da0c90823511d70d24a323196826d923aad865901"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8b2f1414f6a1e0683f212ec80e813f4abef94c739fd090b66c9adf9d2a05feac"}, + {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04c3971421576ed24c191f610052bcb2f059e395bc2489dd99e397f9bc466329"}, + {file = "aiohttp-3.13.2-cp39-cp39-win32.whl", hash = "sha256:9f377d0a924e5cc94dc620bc6366fc3e889586a7f18b748901cf016c916e2084"}, + {file = "aiohttp-3.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:9c705601e16c03466cb72011bd1af55d68fa65b045356d8f96c216e5f6db0fa5"}, + {file = "aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca"}, ] [package.dependencies] @@ -119,7 +153,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "brotlicffi ; platform_python_implementation != \"CPython\""] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" @@ -151,14 +185,14 @@ files = [ [[package]] name = "anyio" -version = "4.8.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" +version = "4.11.0" +description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main", "test"] files = [ - {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, - {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, + {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, + {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, ] [package.dependencies] @@ -168,9 +202,7 @@ sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] -trio = ["trio (>=0.26.1)"] +trio = ["trio (>=0.31.0)"] [[package]] name = "async-timeout" @@ -187,229 +219,259 @@ files = [ [[package]] name = "attrs" -version = "25.1.0" +version = "25.4.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, - {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, + {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, + {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, ] -[package.extras] -benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] - [[package]] name = "certifi" -version = "2025.1.31" +version = "2025.10.5" description = "Python package for providing Mozilla's CA Bundle." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" groups = ["main", "test"] files = [ - {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, - {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, + {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, + {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, ] [[package]] name = "cffi" -version = "1.17.1" +version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "test"] files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, -] -markers = {test = "platform_python_implementation == \"PyPy\""} + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, +] +markers = {main = "platform_python_implementation != \"PyPy\""} [package.dependencies] -pycparser = "*" +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} [[package]] name = "charset-normalizer" -version = "3.4.1" +version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["main", "test"] files = [ - {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, - {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, - {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, ] [[package]] name = "circuitbreaker" -version = "2.0.0" +version = "2.1.3" description = "Python Circuit Breaker pattern implementation" optional = false python-versions = "*" groups = ["main"] files = [ - {file = "circuitbreaker-2.0.0-py2.py3-none-any.whl", hash = "sha256:c8c6f044b616cd5066368734ce4488020392c962b4bd2869d406d883c36d9859"}, - {file = "circuitbreaker-2.0.0.tar.gz", hash = "sha256:28110761ca81a2accbd6b33186bc8c433e69b0933d85e89f280028dbb8c1dd14"}, + {file = "circuitbreaker-2.1.3-py3-none-any.whl", hash = "sha256:87ba6a3ed03fdc7032bc175561c2b04d52ade9d5faf94ca2b035fbdc5e6b1dd1"}, + {file = "circuitbreaker-2.1.3.tar.gz", hash = "sha256:1a4baee510f7bea3c91b194dcce7c07805fe96c4423ed5594b75af438531d084"}, ] [[package]] @@ -445,75 +507,226 @@ files = [ [[package]] name = "coverage" -version = "7.6.12" +version = "7.10.7" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" groups = ["test"] -files = [ - {file = "coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8"}, - {file = "coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879"}, - {file = "coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe"}, - {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674"}, - {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb"}, - {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c"}, - {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c"}, - {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e"}, - {file = "coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425"}, - {file = "coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa"}, - {file = "coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015"}, - {file = "coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45"}, - {file = "coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702"}, - {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0"}, - {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f"}, - {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f"}, - {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d"}, - {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba"}, - {file = "coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f"}, - {file = "coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558"}, - {file = "coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad"}, - {file = "coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3"}, - {file = "coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574"}, - {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985"}, - {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750"}, - {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea"}, - {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3"}, - {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a"}, - {file = "coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95"}, - {file = "coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288"}, - {file = "coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1"}, - {file = "coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd"}, - {file = "coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9"}, - {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e"}, - {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4"}, - {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6"}, - {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3"}, - {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc"}, - {file = "coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3"}, - {file = "coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef"}, - {file = "coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e"}, - {file = "coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703"}, - {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0"}, - {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924"}, - {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b"}, - {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d"}, - {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827"}, - {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9"}, - {file = "coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3"}, - {file = "coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f"}, - {file = "coverage-7.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d"}, - {file = "coverage-7.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929"}, - {file = "coverage-7.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87"}, - {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c"}, - {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2"}, - {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd"}, - {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73"}, - {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86"}, - {file = "coverage-7.6.12-cp39-cp39-win32.whl", hash = "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31"}, - {file = "coverage-7.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57"}, - {file = "coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf"}, - {file = "coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953"}, - {file = "coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2"}, +markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" +files = [ + {file = "coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a"}, + {file = "coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5"}, + {file = "coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17"}, + {file = "coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b"}, + {file = "coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87"}, + {file = "coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e"}, + {file = "coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e"}, + {file = "coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df"}, + {file = "coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0"}, + {file = "coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13"}, + {file = "coverage-7.10.7-cp310-cp310-win32.whl", hash = "sha256:b51dcd060f18c19290d9b8a9dd1e0181538df2ce0717f562fff6cf74d9fc0b5b"}, + {file = "coverage-7.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:3a622ac801b17198020f09af3eaf45666b344a0d69fc2a6ffe2ea83aeef1d807"}, + {file = "coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59"}, + {file = "coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a"}, + {file = "coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699"}, + {file = "coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d"}, + {file = "coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e"}, + {file = "coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23"}, + {file = "coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab"}, + {file = "coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82"}, + {file = "coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2"}, + {file = "coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61"}, + {file = "coverage-7.10.7-cp311-cp311-win32.whl", hash = "sha256:972b9e3a4094b053a4e46832b4bc829fc8a8d347160eb39d03f1690316a99c14"}, + {file = "coverage-7.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:a7b55a944a7f43892e28ad4bc0561dfd5f0d73e605d1aa5c3c976b52aea121d2"}, + {file = "coverage-7.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:736f227fb490f03c6488f9b6d45855f8e0fd749c007f9303ad30efab0e73c05a"}, + {file = "coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417"}, + {file = "coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973"}, + {file = "coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c"}, + {file = "coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7"}, + {file = "coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6"}, + {file = "coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59"}, + {file = "coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b"}, + {file = "coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a"}, + {file = "coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb"}, + {file = "coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1"}, + {file = "coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256"}, + {file = "coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba"}, + {file = "coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf"}, + {file = "coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d"}, + {file = "coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b"}, + {file = "coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e"}, + {file = "coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b"}, + {file = "coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49"}, + {file = "coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911"}, + {file = "coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0"}, + {file = "coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f"}, + {file = "coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c"}, + {file = "coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f"}, + {file = "coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698"}, + {file = "coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843"}, + {file = "coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546"}, + {file = "coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c"}, + {file = "coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15"}, + {file = "coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4"}, + {file = "coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0"}, + {file = "coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0"}, + {file = "coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65"}, + {file = "coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541"}, + {file = "coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6"}, + {file = "coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999"}, + {file = "coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2"}, + {file = "coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a"}, + {file = "coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb"}, + {file = "coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb"}, + {file = "coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520"}, + {file = "coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32"}, + {file = "coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f"}, + {file = "coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a"}, + {file = "coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360"}, + {file = "coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69"}, + {file = "coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14"}, + {file = "coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe"}, + {file = "coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e"}, + {file = "coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd"}, + {file = "coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2"}, + {file = "coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681"}, + {file = "coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880"}, + {file = "coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63"}, + {file = "coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2"}, + {file = "coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d"}, + {file = "coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0"}, + {file = "coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699"}, + {file = "coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9"}, + {file = "coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f"}, + {file = "coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1"}, + {file = "coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0"}, + {file = "coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399"}, + {file = "coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235"}, + {file = "coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d"}, + {file = "coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a"}, + {file = "coverage-7.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3"}, + {file = "coverage-7.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc91b314cef27742da486d6839b677b3f2793dfe52b51bbbb7cf736d5c29281c"}, + {file = "coverage-7.10.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:567f5c155eda8df1d3d439d40a45a6a5f029b429b06648235f1e7e51b522b396"}, + {file = "coverage-7.10.7-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af88deffcc8a4d5974cf2d502251bc3b2db8461f0b66d80a449c33757aa9f40"}, + {file = "coverage-7.10.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7315339eae3b24c2d2fa1ed7d7a38654cba34a13ef19fbcb9425da46d3dc594"}, + {file = "coverage-7.10.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:912e6ebc7a6e4adfdbb1aec371ad04c68854cd3bf3608b3514e7ff9062931d8a"}, + {file = "coverage-7.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f49a05acd3dfe1ce9715b657e28d138578bc40126760efb962322c56e9ca344b"}, + {file = "coverage-7.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cce2109b6219f22ece99db7644b9622f54a4e915dad65660ec435e89a3ea7cc3"}, + {file = "coverage-7.10.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:f3c887f96407cea3916294046fc7dab611c2552beadbed4ea901cbc6a40cc7a0"}, + {file = "coverage-7.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:635adb9a4507c9fd2ed65f39693fa31c9a3ee3a8e6dc64df033e8fdf52a7003f"}, + {file = "coverage-7.10.7-cp39-cp39-win32.whl", hash = "sha256:5a02d5a850e2979b0a014c412573953995174743a3f7fa4ea5a6e9a3c5617431"}, + {file = "coverage-7.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:c134869d5ffe34547d14e174c866fd8fe2254918cc0a95e99052903bc1543e07"}, + {file = "coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260"}, + {file = "coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "coverage" +version = "7.11.0" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.10" +groups = ["test"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" +files = [ + {file = "coverage-7.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb53f1e8adeeb2e78962bade0c08bfdc461853c7969706ed901821e009b35e31"}, + {file = "coverage-7.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9a03ec6cb9f40a5c360f138b88266fd8f58408d71e89f536b4f91d85721d075"}, + {file = "coverage-7.11.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0d7f0616c557cbc3d1c2090334eddcbb70e1ae3a40b07222d62b3aa47f608fab"}, + {file = "coverage-7.11.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e44a86a47bbdf83b0a3ea4d7df5410d6b1a0de984fbd805fa5101f3624b9abe0"}, + {file = "coverage-7.11.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:596763d2f9a0ee7eec6e643e29660def2eef297e1de0d334c78c08706f1cb785"}, + {file = "coverage-7.11.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ef55537ff511b5e0a43edb4c50a7bf7ba1c3eea20b4f49b1490f1e8e0e42c591"}, + {file = "coverage-7.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cbabd8f4d0d3dc571d77ae5bdbfa6afe5061e679a9d74b6797c48d143307088"}, + {file = "coverage-7.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e24045453384e0ae2a587d562df2a04d852672eb63051d16096d3f08aa4c7c2f"}, + {file = "coverage-7.11.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:7161edd3426c8d19bdccde7d49e6f27f748f3c31cc350c5de7c633fea445d866"}, + {file = "coverage-7.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d4ed4de17e692ba6415b0587bc7f12bc80915031fc9db46a23ce70fc88c9841"}, + {file = "coverage-7.11.0-cp310-cp310-win32.whl", hash = "sha256:765c0bc8fe46f48e341ef737c91c715bd2a53a12792592296a095f0c237e09cf"}, + {file = "coverage-7.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:24d6f3128f1b2d20d84b24f4074475457faedc3d4613a7e66b5e769939c7d969"}, + {file = "coverage-7.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d58ecaa865c5b9fa56e35efc51d1014d4c0d22838815b9fce57a27dd9576847"}, + {file = "coverage-7.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b679e171f1c104a5668550ada700e3c4937110dbdd153b7ef9055c4f1a1ee3cc"}, + {file = "coverage-7.11.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ca61691ba8c5b6797deb221a0d09d7470364733ea9c69425a640f1f01b7c5bf0"}, + {file = "coverage-7.11.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:aef1747ede4bd8ca9cfc04cc3011516500c6891f1b33a94add3253f6f876b7b7"}, + {file = "coverage-7.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1839d08406e4cba2953dcc0ffb312252f14d7c4c96919f70167611f4dee2623"}, + {file = "coverage-7.11.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e0eb0a2dcc62478eb5b4cbb80b97bdee852d7e280b90e81f11b407d0b81c4287"}, + {file = "coverage-7.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bc1fbea96343b53f65d5351d8fd3b34fd415a2670d7c300b06d3e14a5af4f552"}, + {file = "coverage-7.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:214b622259dd0cf435f10241f1333d32caa64dbc27f8790ab693428a141723de"}, + {file = "coverage-7.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:258d9967520cca899695d4eb7ea38be03f06951d6ca2f21fb48b1235f791e601"}, + {file = "coverage-7.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cf9e6ff4ca908ca15c157c409d608da77a56a09877b97c889b98fb2c32b6465e"}, + {file = "coverage-7.11.0-cp311-cp311-win32.whl", hash = "sha256:fcc15fc462707b0680cff6242c48625da7f9a16a28a41bb8fd7a4280920e676c"}, + {file = "coverage-7.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:865965bf955d92790f1facd64fe7ff73551bd2c1e7e6b26443934e9701ba30b9"}, + {file = "coverage-7.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:5693e57a065760dcbeb292d60cc4d0231a6d4b6b6f6a3191561e1d5e8820b745"}, + {file = "coverage-7.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9c49e77811cf9d024b95faf86c3f059b11c0c9be0b0d61bc598f453703bd6fd1"}, + {file = "coverage-7.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a61e37a403a778e2cda2a6a39abcc895f1d984071942a41074b5c7ee31642007"}, + {file = "coverage-7.11.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c79cae102bb3b1801e2ef1511fb50e91ec83a1ce466b2c7c25010d884336de46"}, + {file = "coverage-7.11.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:16ce17ceb5d211f320b62df002fa7016b7442ea0fd260c11cec8ce7730954893"}, + {file = "coverage-7.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80027673e9d0bd6aef86134b0771845e2da85755cf686e7c7c59566cf5a89115"}, + {file = "coverage-7.11.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d3ffa07a08657306cd2215b0da53761c4d73cb54d9143b9303a6481ec0cd415"}, + {file = "coverage-7.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a3b6a5f8b2524fd6c1066bc85bfd97e78709bb5e37b5b94911a6506b65f47186"}, + {file = "coverage-7.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fcc0a4aa589de34bc56e1a80a740ee0f8c47611bdfb28cd1849de60660f3799d"}, + {file = "coverage-7.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dba82204769d78c3fd31b35c3d5f46e06511936c5019c39f98320e05b08f794d"}, + {file = "coverage-7.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81b335f03ba67309a95210caf3eb43bd6fe75a4e22ba653ef97b4696c56c7ec2"}, + {file = "coverage-7.11.0-cp312-cp312-win32.whl", hash = "sha256:037b2d064c2f8cc8716fe4d39cb705779af3fbf1ba318dc96a1af858888c7bb5"}, + {file = "coverage-7.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:d66c0104aec3b75e5fd897e7940188ea1892ca1d0235316bf89286d6a22568c0"}, + {file = "coverage-7.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:d91ebeac603812a09cf6a886ba6e464f3bbb367411904ae3790dfe28311b15ad"}, + {file = "coverage-7.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cc3f49e65ea6e0d5d9bd60368684fe52a704d46f9e7fc413918f18d046ec40e1"}, + {file = "coverage-7.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f39ae2f63f37472c17b4990f794035c9890418b1b8cca75c01193f3c8d3e01be"}, + {file = "coverage-7.11.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7db53b5cdd2917b6eaadd0b1251cf4e7d96f4a8d24e174bdbdf2f65b5ea7994d"}, + {file = "coverage-7.11.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10ad04ac3a122048688387828b4537bc9cf60c0bf4869c1e9989c46e45690b82"}, + {file = "coverage-7.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4036cc9c7983a2b1f2556d574d2eb2154ac6ed55114761685657e38782b23f52"}, + {file = "coverage-7.11.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ab934dd13b1c5e94b692b1e01bd87e4488cb746e3a50f798cb9464fd128374b"}, + {file = "coverage-7.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59a6e5a265f7cfc05f76e3bb53eca2e0dfe90f05e07e849930fecd6abb8f40b4"}, + {file = "coverage-7.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df01d6c4c81e15a7c88337b795bb7595a8596e92310266b5072c7e301168efbd"}, + {file = "coverage-7.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8c934bd088eed6174210942761e38ee81d28c46de0132ebb1801dbe36a390dcc"}, + {file = "coverage-7.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a03eaf7ec24078ad64a07f02e30060aaf22b91dedf31a6b24d0d98d2bba7f48"}, + {file = "coverage-7.11.0-cp313-cp313-win32.whl", hash = "sha256:695340f698a5f56f795b2836abe6fb576e7c53d48cd155ad2f80fd24bc63a040"}, + {file = "coverage-7.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:2727d47fce3ee2bac648528e41455d1b0c46395a087a229deac75e9f88ba5a05"}, + {file = "coverage-7.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:0efa742f431529699712b92ecdf22de8ff198df41e43aeaaadf69973eb93f17a"}, + {file = "coverage-7.11.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:587c38849b853b157706407e9ebdca8fd12f45869edb56defbef2daa5fb0812b"}, + {file = "coverage-7.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b971bdefdd75096163dd4261c74be813c4508477e39ff7b92191dea19f24cd37"}, + {file = "coverage-7.11.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:269bfe913b7d5be12ab13a95f3a76da23cf147be7fa043933320ba5625f0a8de"}, + {file = "coverage-7.11.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dadbcce51a10c07b7c72b0ce4a25e4b6dcb0c0372846afb8e5b6307a121eb99f"}, + {file = "coverage-7.11.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ed43fa22c6436f7957df036331f8fe4efa7af132054e1844918866cd228af6c"}, + {file = "coverage-7.11.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9516add7256b6713ec08359b7b05aeff8850c98d357784c7205b2e60aa2513fa"}, + {file = "coverage-7.11.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb92e47c92fcbcdc692f428da67db33337fa213756f7adb6a011f7b5a7a20740"}, + {file = "coverage-7.11.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d06f4fc7acf3cabd6d74941d53329e06bab00a8fe10e4df2714f0b134bfc64ef"}, + {file = "coverage-7.11.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:6fbcee1a8f056af07ecd344482f711f563a9eb1c2cad192e87df00338ec3cdb0"}, + {file = "coverage-7.11.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dbbf012be5f32533a490709ad597ad8a8ff80c582a95adc8d62af664e532f9ca"}, + {file = "coverage-7.11.0-cp313-cp313t-win32.whl", hash = "sha256:cee6291bb4fed184f1c2b663606a115c743df98a537c969c3c64b49989da96c2"}, + {file = "coverage-7.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a386c1061bf98e7ea4758e4313c0ab5ecf57af341ef0f43a0bf26c2477b5c268"}, + {file = "coverage-7.11.0-cp313-cp313t-win_arm64.whl", hash = "sha256:f9ea02ef40bb83823b2b04964459d281688fe173e20643870bb5d2edf68bc836"}, + {file = "coverage-7.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c770885b28fb399aaf2a65bbd1c12bf6f307ffd112d6a76c5231a94276f0c497"}, + {file = "coverage-7.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a3d0e2087dba64c86a6b254f43e12d264b636a39e88c5cc0a01a7c71bcfdab7e"}, + {file = "coverage-7.11.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73feb83bb41c32811973b8565f3705caf01d928d972b72042b44e97c71fd70d1"}, + {file = "coverage-7.11.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c6f31f281012235ad08f9a560976cc2fc9c95c17604ff3ab20120fe480169bca"}, + {file = "coverage-7.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9570ad567f880ef675673992222746a124b9595506826b210fbe0ce3f0499cd"}, + {file = "coverage-7.11.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8badf70446042553a773547a61fecaa734b55dc738cacf20c56ab04b77425e43"}, + {file = "coverage-7.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a09c1211959903a479e389685b7feb8a17f59ec5a4ef9afde7650bd5eabc2777"}, + {file = "coverage-7.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:5ef83b107f50db3f9ae40f69e34b3bd9337456c5a7fe3461c7abf8b75dd666a2"}, + {file = "coverage-7.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f91f927a3215b8907e214af77200250bb6aae36eca3f760f89780d13e495388d"}, + {file = "coverage-7.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdbcd376716d6b7fbfeedd687a6c4be019c5a5671b35f804ba76a4c0a778cba4"}, + {file = "coverage-7.11.0-cp314-cp314-win32.whl", hash = "sha256:bab7ec4bb501743edc63609320aaec8cd9188b396354f482f4de4d40a9d10721"}, + {file = "coverage-7.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d4ba9a449e9364a936a27322b20d32d8b166553bfe63059bd21527e681e2fad"}, + {file = "coverage-7.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:ce37f215223af94ef0f75ac68ea096f9f8e8c8ec7d6e8c346ee45c0d363f0479"}, + {file = "coverage-7.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f413ce6e07e0d0dc9c433228727b619871532674b45165abafe201f200cc215f"}, + {file = "coverage-7.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:05791e528a18f7072bf5998ba772fe29db4da1234c45c2087866b5ba4dea710e"}, + {file = "coverage-7.11.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cacb29f420cfeb9283b803263c3b9a068924474ff19ca126ba9103e1278dfa44"}, + {file = "coverage-7.11.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314c24e700d7027ae3ab0d95fbf8d53544fca1f20345fd30cd219b737c6e58d3"}, + {file = "coverage-7.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:630d0bd7a293ad2fc8b4b94e5758c8b2536fdf36c05f1681270203e463cbfa9b"}, + {file = "coverage-7.11.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e89641f5175d65e2dbb44db15fe4ea48fade5d5bbb9868fdc2b4fce22f4a469d"}, + {file = "coverage-7.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c9f08ea03114a637dab06cedb2e914da9dc67fa52c6015c018ff43fdde25b9c2"}, + {file = "coverage-7.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce9f3bde4e9b031eaf1eb61df95c1401427029ea1bfddb8621c1161dcb0fa02e"}, + {file = "coverage-7.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:e4dc07e95495923d6fd4d6c27bf70769425b71c89053083843fd78f378558996"}, + {file = "coverage-7.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:424538266794db2861db4922b05d729ade0940ee69dcf0591ce8f69784db0e11"}, + {file = "coverage-7.11.0-cp314-cp314t-win32.whl", hash = "sha256:4c1eeb3fb8eb9e0190bebafd0462936f75717687117339f708f395fe455acc73"}, + {file = "coverage-7.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b56efee146c98dbf2cf5cffc61b9829d1e94442df4d7398b26892a53992d3547"}, + {file = "coverage-7.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b5c2705afa83f49bd91962a4094b6b082f94aef7626365ab3f8f4bd159c5acf3"}, + {file = "coverage-7.11.0-py3-none-any.whl", hash = "sha256:4b7589765348d78fb4e5fb6ea35d07564e387da2fc5efff62e0222971f155f68"}, + {file = "coverage-7.11.0.tar.gz", hash = "sha256:167bd504ac1ca2af7ff3b81d245dfea0292c5032ebef9d66cc08a7d28c1b8050"}, ] [package.dependencies] @@ -529,6 +742,7 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = ">=3.7" groups = ["main"] +markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -572,239 +786,334 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "cryptography" +version = "45.0.7" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["main"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" +files = [ + {file = "cryptography-45.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3be4f21c6245930688bd9e162829480de027f8bf962ede33d4f8ba7d67a00cee"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:67285f8a611b0ebc0857ced2081e30302909f571a46bfa7a3cc0ad303fe015c6"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:577470e39e60a6cd7780793202e63536026d9b8641de011ed9d8174da9ca5339"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4bd3e5c4b9682bc112d634f2c6ccc6736ed3635fc3319ac2bb11d768cc5a00d8"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:465ccac9d70115cd4de7186e60cfe989de73f7bb23e8a7aa45af18f7412e75bf"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:16ede8a4f7929b4b7ff3642eba2bf79aa1d71f24ab6ee443935c0d269b6bc513"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8978132287a9d3ad6b54fcd1e08548033cc09dc6aacacb6c004c73c3eb5d3ac3"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b6a0e535baec27b528cb07a119f321ac024592388c5681a5ced167ae98e9fff3"}, + {file = "cryptography-45.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a24ee598d10befaec178efdff6054bc4d7e883f615bfbcd08126a0f4931c83a6"}, + {file = "cryptography-45.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa26fa54c0a9384c27fcdc905a2fb7d60ac6e47d14bc2692145f2b3b1e2cfdbd"}, + {file = "cryptography-45.0.7-cp311-abi3-win32.whl", hash = "sha256:bef32a5e327bd8e5af915d3416ffefdbe65ed975b646b3805be81b23580b57b8"}, + {file = "cryptography-45.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:3808e6b2e5f0b46d981c24d79648e5c25c35e59902ea4391a0dcb3e667bf7443"}, + {file = "cryptography-45.0.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bfb4c801f65dd61cedfc61a83732327fafbac55a47282e6f26f073ca7a41c3b2"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:81823935e2f8d476707e85a78a405953a03ef7b7b4f55f93f7c2d9680e5e0691"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3994c809c17fc570c2af12c9b840d7cea85a9fd3e5c0e0491f4fa3c029216d59"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dad43797959a74103cb59c5dac71409f9c27d34c8a05921341fb64ea8ccb1dd4"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ce7a453385e4c4693985b4a4a3533e041558851eae061a58a5405363b098fcd3"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b04f85ac3a90c227b6e5890acb0edbaf3140938dbecf07bff618bf3638578cf1"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:48c41a44ef8b8c2e80ca4527ee81daa4c527df3ecbc9423c41a420a9559d0e27"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f3df7b3d0f91b88b2106031fd995802a2e9ae13e02c36c1fc075b43f420f3a17"}, + {file = "cryptography-45.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd342f085542f6eb894ca00ef70236ea46070c8a13824c6bde0dfdcd36065b9b"}, + {file = "cryptography-45.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1993a1bb7e4eccfb922b6cd414f072e08ff5816702a0bdb8941c247a6b1b287c"}, + {file = "cryptography-45.0.7-cp37-abi3-win32.whl", hash = "sha256:18fcf70f243fe07252dcb1b268a687f2358025ce32f9f88028ca5c364b123ef5"}, + {file = "cryptography-45.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:7285a89df4900ed3bfaad5679b1e668cb4b38a8de1ccbfc84b05f34512da0a90"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:de58755d723e86175756f463f2f0bddd45cc36fbd62601228a3f8761c9f58252"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a20e442e917889d1a6b3c570c9e3fa2fdc398c20868abcea268ea33c024c4083"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:258e0dff86d1d891169b5af222d362468a9570e2532923088658aa866eb11130"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d97cf502abe2ab9eff8bd5e4aca274da8d06dd3ef08b759a8d6143f4ad65d4b4"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:c987dad82e8c65ebc985f5dae5e74a3beda9d0a2a4daf8a1115f3772b59e5141"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c13b1e3afd29a5b3b2656257f14669ca8fa8d7956d509926f0b130b600b50ab7"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a862753b36620af6fc54209264f92c716367f2f0ff4624952276a6bbd18cbde"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:06ce84dc14df0bf6ea84666f958e6080cdb6fe1231be2a51f3fc1267d9f3fb34"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d0c5c6bac22b177bf8da7435d9d27a6834ee130309749d162b26c3105c0795a9"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:2f641b64acc00811da98df63df7d59fd4706c0df449da71cb7ac39a0732b40ae"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:f5414a788ecc6ee6bc58560e85ca624258a55ca434884445440a810796ea0e0b"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f3d56f73595376f4244646dd5c5870c14c196949807be39e79e7bd9bac3da63"}, + {file = "cryptography-45.0.7.tar.gz", hash = "sha256:4b1654dfc64ea479c242508eb8c724044f1e964a47d1d1cacc5132292d851971"}, +] + +[package.dependencies] +cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs ; python_full_version >= \"3.8.0\"", "sphinx-rtd-theme (>=3.0.0) ; python_full_version >= \"3.8.0\""] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_full_version >= \"3.8.0\""] +pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi (>=2024)", "cryptography-vectors (==45.0.7)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test-randomorder = ["pytest-randomly"] + [[package]] name = "exceptiongroup" -version = "1.2.2" +version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "test"] markers = "python_version < \"3.11\"" files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, + {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, + {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + [package.extras] test = ["pytest (>=6)"] [[package]] name = "frozenlist" -version = "1.5.0" +version = "1.8.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, - {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, - {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, - {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, - {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, - {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, - {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, - {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, - {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, - {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, - {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, - {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, - {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, - {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, - {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, - {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, - {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, - {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, - {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, - {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, - {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, - {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, - {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, - {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, - {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, - {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, - {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, - {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, - {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, - {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, - {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, - {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, + {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011"}, + {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565"}, + {file = "frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450"}, + {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f"}, + {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7"}, + {file = "frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a"}, + {file = "frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6"}, + {file = "frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9"}, + {file = "frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581"}, + {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd"}, + {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967"}, + {file = "frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25"}, + {file = "frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b"}, + {file = "frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b"}, + {file = "frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b"}, + {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608"}, + {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa"}, + {file = "frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf"}, + {file = "frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746"}, + {file = "frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7"}, + {file = "frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5"}, + {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8"}, + {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed"}, + {file = "frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496"}, + {file = "frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231"}, + {file = "frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c"}, + {file = "frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714"}, + {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0"}, + {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888"}, + {file = "frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f"}, + {file = "frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e"}, + {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30"}, + {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7"}, + {file = "frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806"}, + {file = "frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0"}, + {file = "frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed"}, + {file = "frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a"}, + {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a"}, + {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd"}, + {file = "frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8b7138e5cd0647e4523d6685b0eac5d4be9a184ae9634492f25c6eb38c12a47"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a6483e309ca809f1efd154b4d37dc6d9f61037d6c6a81c2dc7a15cb22c8c5dca"}, + {file = "frozenlist-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b9290cf81e95e93fdf90548ce9d3c1211cf574b8e3f4b3b7cb0537cf2227068"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:59a6a5876ca59d1b63af8cd5e7ffffb024c3dc1e9cf9301b21a2e76286505c95"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dc4126390929823e2d2d9dc79ab4046ed74680360fc5f38b585c12c66cdf459"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:332db6b2563333c5671fecacd085141b5800cb866be16d5e3eb15a2086476675"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ff15928d62a0b80bb875655c39bf517938c7d589554cbd2669be42d97c2cb61"}, + {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7bf6cdf8e07c8151fba6fe85735441240ec7f619f935a5205953d58009aef8c6"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:48e6d3f4ec5c7273dfe83ff27c91083c6c9065af655dc2684d2c200c94308bb5"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:1a7607e17ad33361677adcd1443edf6f5da0ce5e5377b798fba20fae194825f3"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3a935c3a4e89c733303a2d5a7c257ea44af3a56c8202df486b7f5de40f37e1"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:940d4a017dbfed9daf46a3b086e1d2167e7012ee297fef9e1c545c4d022f5178"}, + {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b9be22a69a014bc47e78072d0ecae716f5eb56c15238acca0f43d6eb8e4a5bda"}, + {file = "frozenlist-1.8.0-cp39-cp39-win32.whl", hash = "sha256:1aa77cb5697069af47472e39612976ed05343ff2e84a3dcf15437b232cbfd087"}, + {file = "frozenlist-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:7398c222d1d405e796970320036b1b563892b65809d9e5261487bb2c7f7b5c6a"}, + {file = "frozenlist-1.8.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f3b365f31c6cd4af24545ca0a244a53688cad8834e32f56831c4923b50a103"}, + {file = "frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d"}, + {file = "frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad"}, ] [[package]] name = "greenlet" -version = "3.1.1" +version = "3.2.4" description = "Lightweight in-process concurrent programming" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" -files = [ - {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, - {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, - {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, - {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, - {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, - {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, - {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, - {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, - {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, - {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, - {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, - {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, - {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, - {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, - {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, - {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, - {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\"" +files = [ + {file = "greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f47617f698838ba98f4ff4189aef02e7343952df3a615f847bb575c3feb177a7"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af41be48a4f60429d5cad9d22175217805098a9ef7c40bfef44f7669fb9d74d8"}, + {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, + {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5"}, + {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, + {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d"}, + {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, + {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929"}, + {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, + {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, + {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269"}, + {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681"}, + {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, + {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28a3c6b7cd72a96f61b0e4b2a36f681025b60ae4779cc73c1535eb5f29560b10"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:52206cd642670b0b320a1fd1cbfd95bca0e043179c1d8a045f2c6109dfe973be"}, + {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, + {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, + {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, ] [package.extras] docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] +test = ["objgraph", "psutil", "setuptools"] [[package]] name = "h11" -version = "0.14.0" +version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main", "test"] files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] [[package]] name = "httpcore" -version = "1.0.7" +version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" groups = ["main", "test"] files = [ - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, ] [package.dependencies] certifi = "*" -h11 = ">=0.13,<0.15" +h11 = ">=0.16" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] @@ -814,14 +1123,14 @@ trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" -version = "0.27.2" +version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" groups = ["main", "test"] files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] [package.dependencies] @@ -829,7 +1138,6 @@ anyio = "*" certifi = "*" httpcore = "==1.*" idna = "*" -sniffio = "*" [package.extras] brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] @@ -840,29 +1148,68 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "idna" -version = "3.10" +version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" groups = ["main", "test"] files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, ] [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +[[package]] +name = "importlib-metadata" +version = "8.7.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.9" +groups = ["test"] +markers = "python_version == \"3.9\"" +files = [ + {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, + {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, +] + +[package.dependencies] +zipp = ">=3.20" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] + [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["test"] +markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.10" groups = ["test"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] [[package]] @@ -935,48 +1282,52 @@ xai = ["langchain-xai"] [[package]] name = "langchain-core" -version = "0.3.75" +version = "0.3.79" description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.9" +python-versions = "<4.0.0,>=3.9.0" groups = ["main", "test"] files = [ - {file = "langchain_core-0.3.75-py3-none-any.whl", hash = "sha256:03ca1fadf955ee3c7d5806a841f4b3a37b816acea5e61a7e6ba1298c05eea7f5"}, - {file = "langchain_core-0.3.75.tar.gz", hash = "sha256:ab0eb95a06ed6043f76162e6086b45037690cb70b7f090bd83b5ebb8a05b70ed"}, + {file = "langchain_core-0.3.79-py3-none-any.whl", hash = "sha256:92045bfda3e741f8018e1356f83be203ec601561c6a7becfefe85be5ddc58fdb"}, + {file = "langchain_core-0.3.79.tar.gz", hash = "sha256:024ba54a346dd9b13fb8b2342e0c83d0111e7f26fa01f545ada23ad772b55a60"}, ] [package.dependencies] -jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.3.45" -packaging = ">=23.2" -pydantic = ">=2.7.4" -PyYAML = ">=5.3" +jsonpatch = ">=1.33.0,<2.0.0" +langsmith = ">=0.3.45,<1.0.0" +packaging = ">=23.2.0,<26.0.0" +pydantic = ">=2.7.4,<3.0.0" +PyYAML = ">=5.3.0,<7.0.0" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" -typing-extensions = ">=4.7" +typing-extensions = ">=4.7.0,<5.0.0" [[package]] name = "langchain-tests" -version = "0.3.12" +version = "0.3.22" description = "Standard tests for LangChain implementations" optional = false -python-versions = "<4.0,>=3.9" +python-versions = "<4.0.0,>=3.9.0" groups = ["test"] files = [ - {file = "langchain_tests-0.3.12-py3-none-any.whl", hash = "sha256:c5b8c658ac5fe021855d4714f9e04e3209977d4ddd86101130183ca0eaede9be"}, - {file = "langchain_tests-0.3.12.tar.gz", hash = "sha256:f841f67ed296835e5827a44742341bb94886b938d9d05b4d09fb8c0bb513a9a5"}, + {file = "langchain_tests-0.3.22-py3-none-any.whl", hash = "sha256:b38173666236740343432ca1619fc7f742657649ff9e237ac89db5be921ee819"}, + {file = "langchain_tests-0.3.22.tar.gz", hash = "sha256:f4a57e5fdd9d4b0b30b7525f64cfaf959dc62f44b6825427abcce6bbbc83db72"}, ] [package.dependencies] -httpx = ">=0.25.0,<1" -langchain-core = ">=0.3.35,<1.0.0" +httpx = ">=0.28.1,<1.0.0" +langchain-core = ">=0.3.77,<2.0.0" numpy = [ - {version = ">=1.24.0,<2.0.0", markers = "python_version < \"3.12\""}, - {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""}, + {version = ">=1.26.2", markers = "python_version < \"3.13\""}, + {version = ">=2.1.0", markers = "python_version >= \"3.13\""}, ] -pytest = ">=7,<9" -pytest-asyncio = ">=0.20,<1" -pytest-socket = ">=0.6.0,<1" -syrupy = ">=4,<5" +pytest = ">=7.0.0,<9.0.0" +pytest-asyncio = ">=0.20.0,<2.0.0" +pytest-benchmark = "*" +pytest-codspeed = "*" +pytest-recording = "*" +pytest-socket = ">=0.7.0,<1.0.0" +syrupy = ">=4.0.0,<5.0.0" +vcrpy = ">=7.0.0,<8.0.0" [[package]] name = "langchain-text-splitters" @@ -995,14 +1346,15 @@ langchain-core = ">=0.3.75,<2.0.0" [[package]] name = "langsmith" -version = "0.4.27" +version = "0.4.37" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.9" groups = ["main", "test"] +markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" files = [ - {file = "langsmith-0.4.27-py3-none-any.whl", hash = "sha256:23708e6478d1c74ac0e428bbc92df6704993e34305fb62a0c64d2fefc35bd67f"}, - {file = "langsmith-0.4.27.tar.gz", hash = "sha256:6e8bbc425797202952d4e849431e6276e7985b44536ec0582eb96eaf9129c393"}, + {file = "langsmith-0.4.37-py3-none-any.whl", hash = "sha256:e34a94ce7277646299e4703a0f6e2d2c43647a28e8b800bb7ef82fd87a0ec766"}, + {file = "langsmith-0.4.37.tar.gz", hash = "sha256:d9a0eb6dd93f89843ac982c9f92be93cf2bcabbe19957f362c547766c7366c71"}, ] [package.dependencies] @@ -1015,112 +1367,260 @@ requests-toolbelt = ">=1.0.0" zstandard = ">=0.23.0" [package.extras] +claude-agent-sdk = ["claude-agent-sdk (>=0.1.0) ; python_version >= \"3.10\""] langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2)"] openai-agents = ["openai-agents (>=0.0.3)"] otel = ["opentelemetry-api (>=1.30.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0)", "opentelemetry-sdk (>=1.30.0)"] pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4)", "vcrpy (>=7.0.0)"] vcr = ["vcrpy (>=7.0.0)"] +[[package]] +name = "langsmith" +version = "0.4.41" +description = "Client library to connect to the LangSmith Observability and Evaluation Platform." +optional = false +python-versions = ">=3.10" +groups = ["main", "test"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" +files = [ + {file = "langsmith-0.4.41-py3-none-any.whl", hash = "sha256:5cdc554e5f0361bf791fdd5e8dea16d5ba9dfce09b3b8f8bba5e99450c569b27"}, + {file = "langsmith-0.4.41.tar.gz", hash = "sha256:b88d03bb157cf69d1afee250a658d847003babbbd9647f720edcc9b03a0857cd"}, +] + +[package.dependencies] +httpx = ">=0.23.0,<1" +orjson = {version = ">=3.9.14", markers = "platform_python_implementation != \"PyPy\""} +packaging = ">=23.2" +pydantic = ">=1,<3" +requests = ">=2.0.0" +requests-toolbelt = ">=1.0.0" +zstandard = ">=0.23.0" + +[package.extras] +claude-agent-sdk = ["claude-agent-sdk (>=0.1.0) ; python_version >= \"3.10\""] +langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2)"] +openai-agents = ["openai-agents (>=0.0.3)"] +otel = ["opentelemetry-api (>=1.30.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0)", "opentelemetry-sdk (>=1.30.0)"] +pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4)", "vcrpy (>=7.0.0)"] +vcr = ["vcrpy (>=7.0.0)"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +groups = ["test"] +markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.10" +groups = ["test"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" +files = [ + {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"}, + {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "markdown-it-pyrs", "mistletoe (>=1.0,<2.0)", "mistune (>=3.0,<4.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins (>=0.5.0)"] +profiling = ["gprof2dot"] +rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["test"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "multidict" -version = "6.1.0" +version = "6.7.0" description = "multidict implementation" optional = false -python-versions = ">=3.8" -groups = ["main"] +python-versions = ">=3.9" +groups = ["main", "test"] files = [ - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, - {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, - {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, - {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, - {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, - {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, - {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, - {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, - {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, - {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, - {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, - {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, - {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, - {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, - {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, + {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349"}, + {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e"}, + {file = "multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62"}, + {file = "multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111"}, + {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36"}, + {file = "multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85"}, + {file = "multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7"}, + {file = "multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721"}, + {file = "multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8"}, + {file = "multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b"}, + {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34"}, + {file = "multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff"}, + {file = "multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81"}, + {file = "multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45"}, + {file = "multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1"}, + {file = "multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a"}, + {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8"}, + {file = "multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4"}, + {file = "multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b"}, + {file = "multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159"}, + {file = "multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf"}, + {file = "multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd"}, + {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288"}, + {file = "multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17"}, + {file = "multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390"}, + {file = "multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb"}, + {file = "multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad"}, + {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762"}, + {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6"}, + {file = "multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d"}, + {file = "multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6"}, + {file = "multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b"}, + {file = "multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1"}, + {file = "multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f"}, + {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f"}, + {file = "multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885"}, + {file = "multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c"}, + {file = "multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718"}, + {file = "multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a"}, + {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9"}, + {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0"}, + {file = "multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13"}, + {file = "multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd"}, + {file = "multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40"}, + {file = "multidict-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e"}, + {file = "multidict-6.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e"}, + {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4"}, + {file = "multidict-6.7.0-cp39-cp39-win32.whl", hash = "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91"}, + {file = "multidict-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f"}, + {file = "multidict-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546"}, + {file = "multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3"}, + {file = "multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5"}, ] [package.dependencies] @@ -1128,48 +1628,55 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "mypy" -version = "1.15.0" +version = "1.18.2" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" groups = ["typing"] files = [ - {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, - {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, - {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"}, - {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"}, - {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"}, - {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"}, - {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"}, - {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"}, - {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"}, - {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"}, - {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"}, - {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"}, - {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"}, - {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"}, - {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"}, - {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"}, - {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"}, - {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"}, - {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"}, - {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"}, - {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"}, - {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"}, - {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"}, - {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"}, - {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"}, - {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"}, - {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"}, - {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"}, - {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"}, - {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"}, - {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"}, - {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"}, + {file = "mypy-1.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c"}, + {file = "mypy-1.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e"}, + {file = "mypy-1.18.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b"}, + {file = "mypy-1.18.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66"}, + {file = "mypy-1.18.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428"}, + {file = "mypy-1.18.2-cp310-cp310-win_amd64.whl", hash = "sha256:7fb95f97199ea11769ebe3638c29b550b5221e997c63b14ef93d2e971606ebed"}, + {file = "mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f"}, + {file = "mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341"}, + {file = "mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d"}, + {file = "mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86"}, + {file = "mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37"}, + {file = "mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8"}, + {file = "mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34"}, + {file = "mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764"}, + {file = "mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893"}, + {file = "mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914"}, + {file = "mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8"}, + {file = "mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074"}, + {file = "mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc"}, + {file = "mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e"}, + {file = "mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986"}, + {file = "mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d"}, + {file = "mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba"}, + {file = "mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544"}, + {file = "mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce"}, + {file = "mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d"}, + {file = "mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c"}, + {file = "mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb"}, + {file = "mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075"}, + {file = "mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf"}, + {file = "mypy-1.18.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25a9c8fb67b00599f839cf472713f54249a62efd53a54b565eb61956a7e3296b"}, + {file = "mypy-1.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2b9c7e284ee20e7598d6f42e13ca40b4928e6957ed6813d1ab6348aa3f47133"}, + {file = "mypy-1.18.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6985ed057513e344e43a26cc1cd815c7a94602fb6a3130a34798625bc2f07b6"}, + {file = "mypy-1.18.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f27105f1525ec024b5c630c0b9f36d5c1cc4d447d61fe51ff4bd60633f47ac"}, + {file = "mypy-1.18.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:030c52d0ea8144e721e49b1f68391e39553d7451f0c3f8a7565b59e19fcb608b"}, + {file = "mypy-1.18.2-cp39-cp39-win_amd64.whl", hash = "sha256:aa5e07ac1a60a253445797e42b8b2963c9675563a94f11291ab40718b016a7a0"}, + {file = "mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e"}, + {file = "mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b"}, ] [package.dependencies] mypy_extensions = ">=1.0.0" +pathspec = ">=0.9.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing_extensions = ">=4.6.0" @@ -1182,60 +1689,221 @@ reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "1.0.0" +version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" groups = ["typing"] 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"}, + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" groups = ["test"] -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" +files = [ + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, +] + +[[package]] +name = "numpy" +version = "2.2.6" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["test"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" and python_version < \"3.13\"" +files = [ + {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"}, + {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"}, + {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"}, + {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"}, + {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"}, + {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"}, + {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"}, + {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"}, + {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"}, + {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"}, + {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"}, + {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"}, +] + +[[package]] +name = "numpy" +version = "2.3.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["test"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "numpy-2.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb"}, + {file = "numpy-2.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f"}, + {file = "numpy-2.3.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36"}, + {file = "numpy-2.3.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032"}, + {file = "numpy-2.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7"}, + {file = "numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda"}, + {file = "numpy-2.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0"}, + {file = "numpy-2.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a"}, + {file = "numpy-2.3.4-cp311-cp311-win32.whl", hash = "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1"}, + {file = "numpy-2.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996"}, + {file = "numpy-2.3.4-cp311-cp311-win_arm64.whl", hash = "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c"}, + {file = "numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11"}, + {file = "numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9"}, + {file = "numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667"}, + {file = "numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef"}, + {file = "numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e"}, + {file = "numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a"}, + {file = "numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16"}, + {file = "numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786"}, + {file = "numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc"}, + {file = "numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32"}, + {file = "numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db"}, + {file = "numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966"}, + {file = "numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3"}, + {file = "numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197"}, + {file = "numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e"}, + {file = "numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7"}, + {file = "numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953"}, + {file = "numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37"}, + {file = "numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd"}, + {file = "numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646"}, + {file = "numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d"}, + {file = "numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc"}, + {file = "numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879"}, + {file = "numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562"}, + {file = "numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a"}, + {file = "numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6"}, + {file = "numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7"}, + {file = "numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0"}, + {file = "numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f"}, + {file = "numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64"}, + {file = "numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb"}, + {file = "numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c"}, + {file = "numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40"}, + {file = "numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e"}, + {file = "numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff"}, + {file = "numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f"}, + {file = "numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b"}, + {file = "numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7"}, + {file = "numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2"}, + {file = "numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52"}, + {file = "numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26"}, + {file = "numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc"}, + {file = "numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9"}, + {file = "numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868"}, + {file = "numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec"}, + {file = "numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3"}, + {file = "numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365"}, + {file = "numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252"}, + {file = "numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e"}, + {file = "numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0"}, + {file = "numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0"}, + {file = "numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f"}, + {file = "numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d"}, + {file = "numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6"}, + {file = "numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29"}, + {file = "numpy-2.3.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05"}, + {file = "numpy-2.3.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346"}, + {file = "numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e"}, + {file = "numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b"}, + {file = "numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847"}, + {file = "numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d"}, + {file = "numpy-2.3.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f"}, + {file = "numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a"}, ] [[package]] @@ -1263,243 +1931,316 @@ adk = ["docstring-parser (>=0.16) ; python_version >= \"3.10\" and python_versio [[package]] name = "orjson" -version = "3.10.15" +version = "3.11.4" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "test"] markers = "platform_python_implementation != \"PyPy\"" files = [ - {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061"}, - {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3"}, - {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d"}, - {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182"}, - {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e"}, - {file = "orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab"}, - {file = "orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806"}, - {file = "orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5"}, - {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b"}, - {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399"}, - {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388"}, - {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c"}, - {file = "orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e"}, - {file = "orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e"}, - {file = "orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514"}, - {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17"}, - {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b"}, - {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7"}, - {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a"}, - {file = "orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665"}, - {file = "orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa"}, - {file = "orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7"}, - {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8"}, - {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca"}, - {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561"}, - {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825"}, - {file = "orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890"}, - {file = "orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf"}, - {file = "orjson-3.10.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e8afd6200e12771467a1a44e5ad780614b86abb4b11862ec54861a82d677746"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9a18c500f19273e9e104cca8c1f0b40a6470bcccfc33afcc088045d0bf5ea6"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb00b7bfbdf5d34a13180e4805d76b4567025da19a197645ca746fc2fb536586"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33aedc3d903378e257047fee506f11e0833146ca3e57a1a1fb0ddb789876c1e1"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0099ae6aed5eb1fc84c9eb72b95505a3df4267e6962eb93cdd5af03be71c98"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c864a80a2d467d7786274fce0e4f93ef2a7ca4ff31f7fc5634225aaa4e9e98c"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c25774c9e88a3e0013d7d1a6c8056926b607a61edd423b50eb5c88fd7f2823ae"}, - {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e78c211d0074e783d824ce7bb85bf459f93a233eb67a5b5003498232ddfb0e8a"}, - {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:43e17289ffdbbac8f39243916c893d2ae41a2ea1a9cbb060a56a4d75286351ae"}, - {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:781d54657063f361e89714293c095f506c533582ee40a426cb6489c48a637b81"}, - {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6875210307d36c94873f553786a808af2788e362bd0cf4c8e66d976791e7b528"}, - {file = "orjson-3.10.15-cp38-cp38-win32.whl", hash = "sha256:305b38b2b8f8083cc3d618927d7f424349afce5975b316d33075ef0f73576b60"}, - {file = "orjson-3.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:5dd9ef1639878cc3efffed349543cbf9372bdbd79f478615a1c633fe4e4180d1"}, - {file = "orjson-3.10.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ffe19f3e8d68111e8644d4f4e267a069ca427926855582ff01fc012496d19969"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d433bf32a363823863a96561a555227c18a522a8217a6f9400f00ddc70139ae2"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da03392674f59a95d03fa5fb9fe3a160b0511ad84b7a3914699ea5a1b3a38da2"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a63bb41559b05360ded9132032239e47983a39b151af1201f07ec9370715c82"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3766ac4702f8f795ff3fa067968e806b4344af257011858cc3d6d8721588b53f"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a1c73dcc8fadbd7c55802d9aa093b36878d34a3b3222c41052ce6b0fc65f8e8"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b299383825eafe642cbab34be762ccff9fd3408d72726a6b2a4506d410a71ab3"}, - {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:abc7abecdbf67a173ef1316036ebbf54ce400ef2300b4e26a7b843bd446c2480"}, - {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3614ea508d522a621384c1d6639016a5a2e4f027f3e4a1c93a51867615d28829"}, - {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:295c70f9dc154307777ba30fe29ff15c1bcc9dfc5c48632f37d20a607e9ba85a"}, - {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:63309e3ff924c62404923c80b9e2048c1f74ba4b615e7584584389ada50ed428"}, - {file = "orjson-3.10.15-cp39-cp39-win32.whl", hash = "sha256:a2f708c62d026fb5340788ba94a55c23df4e1869fec74be455e0b2f5363b8507"}, - {file = "orjson-3.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:efcf6c735c3d22ef60c4aa27a5238f1a477df85e9b15f2142f9d669beb2d13fd"}, - {file = "orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e"}, + {file = "orjson-3.11.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3740bffd9816fc0326ddc406098a3a8f387e42223f5f455f2a02a9f834ead80c"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65fd2f5730b1bf7f350c6dc896173d3460d235c4be007af73986d7cd9a2acd23"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fdc3ae730541086158d549c97852e2eea6820665d4faf0f41bf99df41bc11ea"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e10b4d65901da88845516ce9f7f9736f9638d19a1d483b3883dc0182e6e5edba"}, + {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6a03a678085f64b97f9d4a9ae69376ce91a3a9e9b56a82b1580d8e1d501aff"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c82e4f0b1c712477317434761fbc28b044c838b6b1240d895607441412371ac"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d58c166a18f44cc9e2bad03a327dc2d1a3d2e85b847133cfbafd6bfc6719bd79"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94f206766bf1ea30e1382e4890f763bd1eefddc580e08fec1ccdc20ddd95c827"}, + {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:41bf25fb39a34cf8edb4398818523277ee7096689db352036a9e8437f2f3ee6b"}, + {file = "orjson-3.11.4-cp310-cp310-win32.whl", hash = "sha256:fa9627eba4e82f99ca6d29bc967f09aba446ee2b5a1ea728949ede73d313f5d3"}, + {file = "orjson-3.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:23ef7abc7fca96632d8174ac115e668c1e931b8fe4dde586e92a500bf1914dcc"}, + {file = "orjson-3.11.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e59d23cd93ada23ec59a96f215139753fbfe3a4d989549bcb390f8c00370b39"}, + {file = "orjson-3.11.4-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5c3aedecfc1beb988c27c79d52ebefab93b6c3921dbec361167e6559aba2d36d"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9e5301f1c2caa2a9a4a303480d79c9ad73560b2e7761de742ab39fe59d9175"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8873812c164a90a79f65368f8f96817e59e35d0cc02786a5356f0e2abed78040"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d7feb0741ebb15204e748f26c9638e6665a5fa93c37a2c73d64f1669b0ddc63"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ee5487fefee21e6910da4c2ee9eef005bee568a0879834df86f888d2ffbdd9"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d40d46f348c0321df01507f92b95a377240c4ec31985225a6668f10e2676f9a"}, + {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95713e5fc8af84d8edc75b785d2386f653b63d62b16d681687746734b4dfc0be"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad73ede24f9083614d6c4ca9a85fe70e33be7bf047ec586ee2363bc7418fe4d7"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:842289889de515421f3f224ef9c1f1efb199a32d76d8d2ca2706fa8afe749549"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3b2427ed5791619851c52a1261b45c233930977e7de8cf36de05636c708fa905"}, + {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c36e524af1d29982e9b190573677ea02781456b2e537d5840e4538a5ec41907"}, + {file = "orjson-3.11.4-cp311-cp311-win32.whl", hash = "sha256:87255b88756eab4a68ec61837ca754e5d10fa8bc47dc57f75cedfeaec358d54c"}, + {file = "orjson-3.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:e2d5d5d798aba9a0e1fede8d853fa899ce2cb930ec0857365f700dffc2c7af6a"}, + {file = "orjson-3.11.4-cp311-cp311-win_arm64.whl", hash = "sha256:6bb6bb41b14c95d4f2702bce9975fda4516f1db48e500102fc4d8119032ff045"}, + {file = "orjson-3.11.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d4371de39319d05d3f482f372720b841c841b52f5385bd99c61ed69d55d9ab50"}, + {file = "orjson-3.11.4-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e41fd3b3cac850eaae78232f37325ed7d7436e11c471246b87b2cd294ec94853"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600e0e9ca042878c7fdf189cf1b028fe2c1418cc9195f6cb9824eb6ed99cb938"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bbf9b333f1568ef5da42bc96e18bf30fd7f8d54e9ae066d711056add508e415"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806363144bb6e7297b8e95870e78d30a649fdc4e23fc84daa80c8ebd366ce44"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad355e8308493f527d41154e9053b86a5be892b3b359a5c6d5d95cda23601cb2"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a7517482667fb9f0ff1b2f16fe5829296ed7a655d04d68cd9711a4d8a4e708"}, + {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97eb5942c7395a171cbfecc4ef6701fc3c403e762194683772df4c54cfbb2210"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:149d95d5e018bdd822e3f38c103b1a7c91f88d38a88aada5c4e9b3a73a244241"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:624f3951181eb46fc47dea3d221554e98784c823e7069edb5dbd0dc826ac909b"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:03bfa548cf35e3f8b3a96c4e8e41f753c686ff3d8e182ce275b1751deddab58c"}, + {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:525021896afef44a68148f6ed8a8bf8375553d6066c7f48537657f64823565b9"}, + {file = "orjson-3.11.4-cp312-cp312-win32.whl", hash = "sha256:b58430396687ce0f7d9eeb3dd47761ca7d8fda8e9eb92b3077a7a353a75efefa"}, + {file = "orjson-3.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:c6dbf422894e1e3c80a177133c0dda260f81428f9de16d61041949f6a2e5c140"}, + {file = "orjson-3.11.4-cp312-cp312-win_arm64.whl", hash = "sha256:d38d2bc06d6415852224fcc9c0bfa834c25431e466dc319f0edd56cca81aa96e"}, + {file = "orjson-3.11.4-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2d6737d0e616a6e053c8b4acc9eccea6b6cce078533666f32d140e4f85002534"}, + {file = "orjson-3.11.4-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:afb14052690aa328cc118a8e09f07c651d301a72e44920b887c519b313d892ff"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38aa9e65c591febb1b0aed8da4d469eba239d434c218562df179885c94e1a3ad"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2cf4dfaf9163b0728d061bebc1e08631875c51cd30bf47cb9e3293bfbd7dcd5"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89216ff3dfdde0e4070932e126320a1752c9d9a758d6a32ec54b3b9334991a6a"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9daa26ca8e97fae0ce8aa5d80606ef8f7914e9b129b6b5df9104266f764ce436"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c8b2769dc31883c44a9cd126560327767f848eb95f99c36c9932f51090bfce9"}, + {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1469d254b9884f984026bd9b0fa5bbab477a4bfe558bba6848086f6d43eb5e73"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:68e44722541983614e37117209a194e8c3ad07838ccb3127d96863c95ec7f1e0"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8e7805fda9672c12be2f22ae124dcd7b03928d6c197544fe12174b86553f3196"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04b69c14615fb4434ab867bf6f38b2d649f6f300af30a6705397e895f7aec67a"}, + {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:639c3735b8ae7f970066930e58cf0ed39a852d417c24acd4a25fc0b3da3c39a6"}, + {file = "orjson-3.11.4-cp313-cp313-win32.whl", hash = "sha256:6c13879c0d2964335491463302a6ca5ad98105fc5db3565499dcb80b1b4bd839"}, + {file = "orjson-3.11.4-cp313-cp313-win_amd64.whl", hash = "sha256:09bf242a4af98732db9f9a1ec57ca2604848e16f132e3f72edfd3c5c96de009a"}, + {file = "orjson-3.11.4-cp313-cp313-win_arm64.whl", hash = "sha256:a85f0adf63319d6c1ba06fb0dbf997fced64a01179cf17939a6caca662bf92de"}, + {file = "orjson-3.11.4-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:42d43a1f552be1a112af0b21c10a5f553983c2a0938d2bbb8ecd8bc9fb572803"}, + {file = "orjson-3.11.4-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:26a20f3fbc6c7ff2cb8e89c4c5897762c9d88cf37330c6a117312365d6781d54"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3f20be9048941c7ffa8fc523ccbd17f82e24df1549d1d1fe9317712d19938e"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aac364c758dc87a52e68e349924d7e4ded348dedff553889e4d9f22f74785316"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5c54a6d76e3d741dcc3f2707f8eeb9ba2a791d3adbf18f900219b62942803b1"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f28485bdca8617b79d44627f5fb04336897041dfd9fa66d383a49d09d86798bc"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfc2a484cad3585e4ba61985a6062a4c2ed5c7925db6d39f1fa267c9d166487f"}, + {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e34dbd508cb91c54f9c9788923daca129fe5b55c5b4eebe713bf5ed3791280cf"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b13c478fa413d4b4ee606ec8e11c3b2e52683a640b006bb586b3041c2ca5f606"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:724ca721ecc8a831b319dcd72cfa370cc380db0bf94537f08f7edd0a7d4e1780"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:977c393f2e44845ce1b540e19a786e9643221b3323dae190668a98672d43fb23"}, + {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e539e382cf46edec157ad66b0b0872a90d829a6b71f17cb633d6c160a223155"}, + {file = "orjson-3.11.4-cp314-cp314-win32.whl", hash = "sha256:d63076d625babab9db5e7836118bdfa086e60f37d8a174194ae720161eb12394"}, + {file = "orjson-3.11.4-cp314-cp314-win_amd64.whl", hash = "sha256:0a54d6635fa3aaa438ae32e8570b9f0de36f3f6562c308d2a2a452e8b0592db1"}, + {file = "orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d"}, + {file = "orjson-3.11.4-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:405261b0a8c62bcbd8e2931c26fdc08714faf7025f45531541e2b29e544b545b"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af02ff34059ee9199a3546f123a6ab4c86caf1708c79042caf0820dc290a6d4f"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b2eba969ea4203c177c7b38b36c69519e6067ee68c34dc37081fac74c796e10"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0baa0ea43cfa5b008a28d3c07705cf3ada40e5d347f0f44994a64b1b7b4b5350"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80fd082f5dcc0e94657c144f1b2a3a6479c44ad50be216cf0c244e567f5eae19"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e3704d35e47d5bee811fb1cbd8599f0b4009b14d451c4c57be5a7e25eb89a13"}, + {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa447f2b5356779d914658519c874cf3b7629e99e63391ed519c28c8aea4919"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bba5118143373a86f91dadb8df41d9457498226698ebdf8e11cbb54d5b0e802d"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:622463ab81d19ef3e06868b576551587de8e4d518892d1afab71e0fbc1f9cffc"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3e0a700c4b82144b72946b6629968df9762552ee1344bfdb767fecdd634fbd5a"}, + {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6e18a5c15e764e5f3fc569b47872450b4bcea24f2a6354c0a0e95ad21045d5a9"}, + {file = "orjson-3.11.4-cp39-cp39-win32.whl", hash = "sha256:fb1c37c71cad991ef4d89c7a634b5ffb4447dbd7ae3ae13e8f5ee7f1775e7ab1"}, + {file = "orjson-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:e2985ce8b8c42d00492d0ed79f2bd2b6460d00f2fa671dfde4bf2e02f49bf5c6"}, + {file = "orjson-3.11.4.tar.gz", hash = "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d"}, ] [[package]] name = "packaging" -version = "24.2" +version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["main", "test"] files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +groups = ["typing"] +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["test"] files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, ] [package.extras] dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "propcache" -version = "0.2.1" +version = "0.4.1" description = "Accelerated property cache" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "test"] +files = [ + {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db"}, + {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8"}, + {file = "propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c"}, + {file = "propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb"}, + {file = "propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37"}, + {file = "propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f"}, + {file = "propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1"}, + {file = "propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6"}, + {file = "propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75"}, + {file = "propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8"}, + {file = "propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db"}, + {file = "propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66"}, + {file = "propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81"}, + {file = "propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e"}, + {file = "propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1"}, + {file = "propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717"}, + {file = "propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37"}, + {file = "propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144"}, + {file = "propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f"}, + {file = "propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153"}, + {file = "propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455"}, + {file = "propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85"}, + {file = "propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1"}, + {file = "propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d233076ccf9e450c8b3bc6720af226b898ef5d051a2d145f7d765e6e9f9bcff"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:357f5bb5c377a82e105e44bd3d52ba22b616f7b9773714bff93573988ef0a5fb"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbc3b6dfc728105b2a57c06791eb07a94229202ea75c59db644d7d496b698cac"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:182b51b421f0501952d938dc0b0eb45246a5b5153c50d42b495ad5fb7517c888"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b536b39c5199b96fc6245eb5fb796c497381d3942f169e44e8e392b29c9ebcc"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db65d2af507bbfbdcedb254a11149f894169d90488dd3e7190f7cdcb2d6cd57a"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd2dbc472da1f772a4dae4fa24be938a6c544671a912e30529984dd80400cd88"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:daede9cd44e0f8bdd9e6cc9a607fc81feb80fae7a5fc6cecaff0e0bb32e42d00"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:71b749281b816793678ae7f3d0d84bd36e694953822eaad408d682efc5ca18e0"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0002004213ee1f36cfb3f9a42b5066100c44276b9b72b4e1504cddd3d692e86e"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fe49d0a85038f36ba9e3ffafa1103e61170b28e95b16622e11be0a0ea07c6781"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99d43339c83aaf4d32bda60928231848eee470c6bda8d02599cc4cebe872d183"}, + {file = "propcache-0.4.1-cp39-cp39-win32.whl", hash = "sha256:a129e76735bc792794d5177069691c3217898b9f5cee2b2661471e52ffe13f19"}, + {file = "propcache-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:948dab269721ae9a87fd16c514a0a2c2a1bdb23a9a61b969b0f9d9ee2968546f"}, + {file = "propcache-0.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:5fd37c406dd6dc85aa743e214cef35dc54bbdd1419baac4f6ae5e5b1a2976938"}, + {file = "propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237"}, + {file = "propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d"}, +] + +[[package]] +name = "py-cpuinfo" +version = "9.0.0" +description = "Get CPU info with pure Python" +optional = false +python-versions = "*" +groups = ["test"] files = [ - {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, - {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, - {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, - {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, - {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, - {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, - {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, - {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, - {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, - {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, - {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, - {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, - {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, - {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, - {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, + {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, + {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, ] [[package]] name = "pycparser" -version = "2.22" +version = "2.23" description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["main", "test"] files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, + {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, + {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {test = "platform_python_implementation == \"PyPy\""} +markers = {main = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", test = "implementation_name != \"PyPy\""} [[package]] name = "pydantic" -version = "2.10.6" +version = "2.12.4" description = "Data validation using Python type hints" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "test"] files = [ - {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, - {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, + {file = "pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e"}, + {file = "pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.27.2" -typing-extensions = ">=4.12.2" +pydantic-core = "2.41.5" +typing-extensions = ">=4.14.1" +typing-inspection = ">=0.4.2" [package.extras] email = ["email-validator (>=2.0.0)"] @@ -1507,131 +2248,168 @@ timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows [[package]] name = "pydantic-core" -version = "2.27.2" +version = "2.41.5" description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "test"] files = [ - {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, - {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, - {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, - {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, - {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, - {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, - {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, - {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, - {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, - {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, - {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, - {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, - {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, - {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, - {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, - {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, - {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, - {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3"}, + {file = "pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9"}, + {file = "pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586"}, + {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e"}, + {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11"}, + {file = "pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd"}, + {file = "pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a"}, + {file = "pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375"}, + {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07"}, + {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf"}, + {file = "pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c"}, + {file = "pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008"}, + {file = "pydantic_core-2.41.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf"}, + {file = "pydantic_core-2.41.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3"}, + {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5"}, + {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3"}, + {file = "pydantic_core-2.41.5-cp39-cp39-win32.whl", hash = "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460"}, + {file = "pydantic_core-2.41.5-cp39-cp39-win_amd64.whl", hash = "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51"}, + {file = "pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e"}, ] [package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +typing-extensions = ">=4.14.1" + +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["test"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyopenssl" -version = "24.3.0" +version = "25.1.0" description = "Python wrapper module around the OpenSSL library" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "pyOpenSSL-24.3.0-py3-none-any.whl", hash = "sha256:e474f5a473cd7f92221cc04976e48f4d11502804657a08a989fb3be5514c904a"}, - {file = "pyopenssl-24.3.0.tar.gz", hash = "sha256:49f7a019577d834746bc55c5fce6ecbcec0f2b4ec5ce1cf43a9a173b8138bb36"}, + {file = "pyopenssl-25.1.0-py3-none-any.whl", hash = "sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab"}, + {file = "pyopenssl-25.1.0.tar.gz", hash = "sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b"}, ] [package.dependencies] -cryptography = ">=41.0.5,<45" +cryptography = ">=41.0.5,<46" +typing-extensions = {version = ">=4.9", markers = "python_version < \"3.13\" and python_version >= \"3.8\""} [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx_rtd_theme"] @@ -1679,6 +2457,62 @@ pytest = ">=7.0.0,<9" docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] +[[package]] +name = "pytest-benchmark" +version = "5.0.1" +description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." +optional = false +python-versions = ">=3.9" +groups = ["test"] +files = [ + {file = "pytest-benchmark-5.0.1.tar.gz", hash = "sha256:8138178618c85586ce056c70cc5e92f4283c2e6198e8422c2c825aeb3ace6afd"}, + {file = "pytest_benchmark-5.0.1-py3-none-any.whl", hash = "sha256:d75fec4cbf0d4fd91e020f425ce2d845e9c127c21bae35e77c84db8ed84bfaa6"}, +] + +[package.dependencies] +py-cpuinfo = "*" +pytest = ">=3.8" + +[package.extras] +aspect = ["aspectlib"] +elasticsearch = ["elasticsearch"] +histogram = ["pygal", "pygaljs", "setuptools"] + +[[package]] +name = "pytest-codspeed" +version = "4.2.0" +description = "Pytest plugin to create CodSpeed benchmarks" +optional = false +python-versions = ">=3.9" +groups = ["test"] +files = [ + {file = "pytest_codspeed-4.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:609828b03972966b75b9b7416fa2570c4a0f6124f67e02d35cd3658e64312a7b"}, + {file = "pytest_codspeed-4.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23a0c0fbf8bb4de93a3454fd9e5efcdca164c778aaef0a9da4f233d85cb7f5b8"}, + {file = "pytest_codspeed-4.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2de87bde9fbc6fd53f0fd21dcf2599c89e0b8948d49f9bad224edce51c47e26b"}, + {file = "pytest_codspeed-4.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95aeb2479ca383f6b18e2cc9ebcd3b03ab184980a59a232aea6f370bbf59a1e3"}, + {file = "pytest_codspeed-4.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d4fefbd4ae401e2c60f6be920a0be50eef0c3e4a1f0a1c83962efd45be38b39"}, + {file = "pytest_codspeed-4.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:309b4227f57fcbb9df21e889ea1ae191d0d1cd8b903b698fdb9ea0461dbf1dfe"}, + {file = "pytest_codspeed-4.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72aab8278452a6d020798b9e4f82780966adb00f80d27a25d1274272c54630d5"}, + {file = "pytest_codspeed-4.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:684fcd9491d810ded653a8d38de4835daa2d001645f4a23942862950664273f8"}, + {file = "pytest_codspeed-4.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50794dabea6ec90d4288904452051e2febace93e7edf4ca9f2bce8019dd8cd37"}, + {file = "pytest_codspeed-4.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0ebd87f2a99467a1cfd8e83492c4712976e43d353ee0b5f71cbb057f1393aca"}, + {file = "pytest_codspeed-4.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbbb2d61b85bef8fc7e2193f723f9ac2db388a48259d981bbce96319043e9830"}, + {file = "pytest_codspeed-4.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:748411c832147bfc85f805af78a1ab1684f52d08e14aabe22932bbe46c079a5f"}, + {file = "pytest_codspeed-4.2.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:238e17abe8f08d8747fa6c7acff34fefd3c40f17a56a7847ca13dc8d6e8c6009"}, + {file = "pytest_codspeed-4.2.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0881a736285f33b9a8894da8fe8e1775aa1a4310226abe5d1f0329228efb680c"}, + {file = "pytest_codspeed-4.2.0-py3-none-any.whl", hash = "sha256:e81bbb45c130874ef99aca97929d72682733527a49f84239ba575b5cb843bab0"}, + {file = "pytest_codspeed-4.2.0.tar.gz", hash = "sha256:04b5d0bc5a1851ba1504d46bf9d7dbb355222a69f2cd440d54295db721b331f7"}, +] + +[package.dependencies] +cffi = ">=1.17.1" +importlib-metadata = {version = ">=8.5.0", markers = "python_version < \"3.10\""} +pytest = ">=3.8" +rich = ">=13.8.1" + +[package.extras] +compat = ["pytest-benchmark (>=5.0.0,<5.1.0)", "pytest-xdist (>=3.6.1,<3.7.0)"] + [[package]] name = "pytest-cov" version = "4.1.0" @@ -1700,14 +2534,14 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-mock" -version = "3.15.0" +version = "3.15.1" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.9" groups = ["test"] files = [ - {file = "pytest_mock-3.15.0-py3-none-any.whl", hash = "sha256:ef2219485fb1bd256b00e7ad7466ce26729b30eadfc7cbcdb4fa9a92ca68db6f"}, - {file = "pytest_mock-3.15.0.tar.gz", hash = "sha256:ab896bd190316b9d5d87b277569dfcdf718b2d049a2ccff5f7aca279c002a1cf"}, + {file = "pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d"}, + {file = "pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f"}, ] [package.dependencies] @@ -1716,6 +2550,26 @@ pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] +[[package]] +name = "pytest-recording" +version = "0.13.4" +description = "A pytest plugin powered by VCR.py to record and replay HTTP traffic" +optional = false +python-versions = ">=3.9" +groups = ["test"] +files = [ + {file = "pytest_recording-0.13.4-py3-none-any.whl", hash = "sha256:ad49a434b51b1c4f78e85b1e6b74fdcc2a0a581ca16e52c798c6ace971f7f439"}, + {file = "pytest_recording-0.13.4.tar.gz", hash = "sha256:568d64b2a85992eec4ae0a419c855d5fd96782c5fb016784d86f18053792768c"}, +] + +[package.dependencies] +pytest = ">=3.5.0" +vcrpy = ">=2.0.1" + +[package.extras] +dev = ["pytest-httpbin", "pytest-mock", "requests", "werkzeug (==3.1.3)"] +tests = ["pytest-httpbin", "pytest-mock", "requests", "werkzeug (==3.1.3)"] + [[package]] name = "pytest-socket" version = "0.7.0" @@ -1764,94 +2618,114 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2025.1" +version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" groups = ["main"] files = [ - {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, - {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, ] [[package]] name = "pyyaml" -version = "6.0.2" +version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" groups = ["main", "test"] files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] [[package]] name = "requests" -version = "2.32.3" +version = "2.32.5" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "test"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -1894,6 +2768,25 @@ urllib3 = ">=1.25.10,<3.0" [package.extras] tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli ; python_version < \"3.11\"", "tomli-w", "types-PyYAML", "types-requests"] +[[package]] +name = "rich" +version = "14.2.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +groups = ["test"] +files = [ + {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, + {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "ruff" version = "0.1.15" @@ -1947,81 +2840,81 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.38" +version = "2.0.44" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5e1d9e429028ce04f187a9f522818386c8b076723cdbe9345708384f49ebcec6"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b87a90f14c68c925817423b0424381f0e16d80fc9a1a1046ef202ab25b19a444"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:402c2316d95ed90d3d3c25ad0390afa52f4d2c56b348f212aa9c8d072a40eee5"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6493bc0eacdbb2c0f0d260d8988e943fee06089cd239bd7f3d0c45d1657a70e2"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0561832b04c6071bac3aad45b0d3bb6d2c4f46a8409f0a7a9c9fa6673b41bc03"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49aa2cdd1e88adb1617c672a09bf4ebf2f05c9448c6dbeba096a3aeeb9d4d443"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-win32.whl", hash = "sha256:64aa8934200e222f72fcfd82ee71c0130a9c07d5725af6fe6e919017d095b297"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-win_amd64.whl", hash = "sha256:c57b8e0841f3fce7b703530ed70c7c36269c6d180ea2e02e36b34cb7288c50c7"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf89e0e4a30714b357f5d46b6f20e0099d38b30d45fa68ea48589faf5f12f62d"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8455aa60da49cb112df62b4721bd8ad3654a3a02b9452c783e651637a1f21fa2"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53c0d6a859b2db58332e0e6a921582a02c1677cc93d4cbb36fdf49709b327b2"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c4817dff8cef5697f5afe5fec6bc1783994d55a68391be24cb7d80d2dbc3a6"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9cea5b756173bb86e2235f2f871b406a9b9d722417ae31e5391ccaef5348f2c"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40e9cdbd18c1f84631312b64993f7d755d85a3930252f6276a77432a2b25a2f3"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-win32.whl", hash = "sha256:cb39ed598aaf102251483f3e4675c5dd6b289c8142210ef76ba24aae0a8f8aba"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-win_amd64.whl", hash = "sha256:f9d57f1b3061b3e21476b0ad5f0397b112b94ace21d1f439f2db472e568178ae"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-win32.whl", hash = "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-win_amd64.whl", hash = "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-win32.whl", hash = "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-win_amd64.whl", hash = "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40310db77a55512a18827488e592965d3dec6a3f1e3d8af3f8243134029daca3"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3043375dd5bbcb2282894cbb12e6c559654c67b5fffb462fda815a55bf93f7"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70065dfabf023b155a9c2a18f573e47e6ca709b9e8619b2e04c54d5bcf193178"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c058b84c3b24812c859300f3b5abf300daa34df20d4d4f42e9652a4d1c48c8a4"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0398361acebb42975deb747a824b5188817d32b5c8f8aba767d51ad0cc7bb08d"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-win32.whl", hash = "sha256:a2bc4e49e8329f3283d99840c136ff2cd1a29e49b5624a46a290f04dff48e079"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-win_amd64.whl", hash = "sha256:9cd136184dd5f58892f24001cdce986f5d7e96059d004118d5410671579834a4"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:665255e7aae5f38237b3a6eae49d2358d83a59f39ac21036413fab5d1e810578"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:92f99f2623ff16bd4aaf786ccde759c1f676d39c7bf2855eb0b540e1ac4530c8"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa498d1392216fae47eaf10c593e06c34476ced9549657fca713d0d1ba5f7248"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9afbc3909d0274d6ac8ec891e30210563b2c8bdd52ebbda14146354e7a69373"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:57dd41ba32430cbcc812041d4de8d2ca4651aeefad2626921ae2a23deb8cd6ff"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3e35d5565b35b66905b79ca4ae85840a8d40d31e0b3e2990f2e7692071b179ca"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-win32.whl", hash = "sha256:f0d3de936b192980209d7b5149e3c98977c3810d401482d05fb6d668d53c1c63"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-win_amd64.whl", hash = "sha256:3868acb639c136d98107c9096303d2d8e5da2880f7706f9f8c06a7f961961149"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07258341402a718f166618470cde0c34e4cec85a39767dce4e24f61ba5e667ea"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a826f21848632add58bef4f755a33d45105d25656a0c849f2dc2df1c71f6f50"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:386b7d136919bb66ced64d2228b92d66140de5fefb3c7df6bd79069a269a7b06"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f2951dc4b4f990a4b394d6b382accb33141d4d3bd3ef4e2b27287135d6bdd68"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8bf312ed8ac096d674c6aa9131b249093c1b37c35db6a967daa4c84746bc1bc9"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6db316d6e340f862ec059dc12e395d71f39746a20503b124edc255973977b728"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-win32.whl", hash = "sha256:c09a6ea87658695e527104cf857c70f79f14e9484605e205217aae0ec27b45fc"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-win_amd64.whl", hash = "sha256:12f5c9ed53334c3ce719155424dc5407aaa4f6cadeb09c5b627e06abb93933a1"}, - {file = "SQLAlchemy-2.0.38-py3-none-any.whl", hash = "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753"}, - {file = "sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:471733aabb2e4848d609141a9e9d56a427c0a038f4abf65dd19d7a21fd563632"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48bf7d383a35e668b984c805470518b635d48b95a3c57cb03f37eaa3551b5f9f"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf4bb6b3d6228fcf3a71b50231199fb94d2dd2611b66d33be0578ea3e6c2726"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:e998cf7c29473bd077704cea3577d23123094311f59bdc4af551923b168332b1"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ebac3f0b5732014a126b43c2b7567f2f0e0afea7d9119a3378bde46d3dcad88e"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-win32.whl", hash = "sha256:3255d821ee91bdf824795e936642bbf43a4c7cedf5d1aed8d24524e66843aa74"}, + {file = "SQLAlchemy-2.0.44-cp37-cp37m-win_amd64.whl", hash = "sha256:78e6c137ba35476adb5432103ae1534f2f5295605201d946a4198a0dea4b38e7"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c77f3080674fc529b1bd99489378c7f63fcb4ba7f8322b79732e0258f0ea3ce"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26ef74ba842d61635b0152763d057c8d48215d5be9bb8b7604116a059e9985"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a172b31785e2f00780eccab00bc240ccdbfdb8345f1e6063175b3ff12ad1b0"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9480c0740aabd8cb29c329b422fb65358049840b34aba0adf63162371d2a96e"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17835885016b9e4d0135720160db3095dc78c583e7b902b6be799fb21035e749"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cbe4f85f50c656d753890f39468fcd8190c5f08282caf19219f684225bfd5fd2"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-win32.whl", hash = "sha256:2fcc4901a86ed81dc76703f3b93ff881e08761c63263c46991081fd7f034b165"}, + {file = "sqlalchemy-2.0.44-cp310-cp310-win_amd64.whl", hash = "sha256:9919e77403a483ab81e3423151e8ffc9dd992c20d2603bf17e4a8161111e55f5"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe3917059c7ab2ee3f35e77757062b1bea10a0b6ca633c58391e3f3c6c488dd"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de4387a354ff230bc979b46b2207af841dc8bf29847b6c7dbe60af186d97aefa"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3678a0fb72c8a6a29422b2732fe423db3ce119c34421b5f9955873eb9b62c1e"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cf6872a23601672d61a68f390e44703442639a12ee9dd5a88bbce52a695e46e"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:329aa42d1be9929603f406186630135be1e7a42569540577ba2c69952b7cf399"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:70e03833faca7166e6a9927fbee7c27e6ecde436774cd0b24bbcc96353bce06b"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-win32.whl", hash = "sha256:253e2f29843fb303eca6b2fc645aca91fa7aa0aa70b38b6950da92d44ff267f3"}, + {file = "sqlalchemy-2.0.44-cp311-cp311-win_amd64.whl", hash = "sha256:7a8694107eb4308a13b425ca8c0e67112f8134c846b6e1f722698708741215d5"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-win32.whl", hash = "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4"}, + {file = "sqlalchemy-2.0.44-cp312-cp312-win_amd64.whl", hash = "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-win32.whl", hash = "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73"}, + {file = "sqlalchemy-2.0.44-cp313-cp313-win_amd64.whl", hash = "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2fc44e5965ea46909a416fff0af48a219faefd5773ab79e5f8a5fcd5d62b2667"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc8b3850d2a601ca2320d081874033684e246d28e1c5e89db0864077cfc8f5a9"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d733dec0614bb8f4bcb7c8af88172b974f685a31dc3a65cca0527e3120de5606"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22be14009339b8bc16d6b9dc8780bacaba3402aa7581658e246114abbd2236e3"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:357bade0e46064f88f2c3a99808233e67b0051cdddf82992379559322dfeb183"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4848395d932e93c1595e59a8672aa7400e8922c39bb9b0668ed99ac6fa867822"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-win32.whl", hash = "sha256:2f19644f27c76f07e10603580a47278abb2a70311136a7f8fd27dc2e096b9013"}, + {file = "sqlalchemy-2.0.44-cp38-cp38-win_amd64.whl", hash = "sha256:1df4763760d1de0dfc8192cc96d8aa293eb1a44f8f7a5fbe74caf1b551905c5e"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7027414f2b88992877573ab780c19ecb54d3a536bef3397933573d6b5068be4"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fe166c7d00912e8c10d3a9a0ce105569a31a3d0db1a6e82c4e0f4bf16d5eca9"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3caef1ff89b1caefc28f0368b3bde21a7e3e630c2eddac16abd9e47bd27cc36a"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc2856d24afa44295735e72f3c75d6ee7fdd4336d8d3a8f3d44de7aa6b766df2"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11bac86b0deada30b6b5f93382712ff0e911fe8d31cb9bf46e6b149ae175eff0"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d18cd0e9a0f37c9f4088e50e3839fcb69a380a0ec957408e0b57cff08ee0a26"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-win32.whl", hash = "sha256:9e9018544ab07614d591a26c1bd4293ddf40752cc435caf69196740516af7100"}, + {file = "sqlalchemy-2.0.44-cp39-cp39-win_amd64.whl", hash = "sha256:8e0e4e66fd80f277a8c3de016a81a554e76ccf6b8d881ee0b53200305a8433f6"}, + {file = "sqlalchemy-2.0.44-py3-none-any.whl", hash = "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05"}, + {file = "sqlalchemy-2.0.44.tar.gz", hash = "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = ">=1", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"] +aioodbc = ["aioodbc", "greenlet (>=1)"] +aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (>=1)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (>=1)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] @@ -2032,7 +2925,7 @@ mysql-connector = ["mysql-connector-python"] oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"] postgresql-pg8000 = ["pg8000 (>=1.29.1)"] postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] @@ -2043,14 +2936,14 @@ sqlcipher = ["sqlcipher3_binary"] [[package]] name = "syrupy" -version = "4.8.1" +version = "4.9.1" description = "Pytest Snapshot Test Utility" optional = false python-versions = ">=3.8.1" groups = ["test"] files = [ - {file = "syrupy-4.8.1-py3-none-any.whl", hash = "sha256:274f97cbaf44175f5e478a2f3a53559d31f41c66c6bf28131695f94ac893ea00"}, - {file = "syrupy-4.8.1.tar.gz", hash = "sha256:8da8c0311e6d92de0b15767768c6ab98982b7b4a4c67083c08fbac3fbad4d44c"}, + {file = "syrupy-4.9.1-py3-none-any.whl", hash = "sha256:b94cc12ed0e5e75b448255430af642516842a2374a46936dd2650cfb6dd20eda"}, + {file = "syrupy-4.9.1.tar.gz", hash = "sha256:b7d0fcadad80a7d2f6c4c71917918e8ebe2483e8c703dfc8d49cdbb01081f9a4"}, ] [package.dependencies] @@ -2058,14 +2951,14 @@ pytest = ">=7.0.0,<9.0.0" [[package]] name = "tenacity" -version = "9.0.0" +version = "9.1.2" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "test"] files = [ - {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, - {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, + {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, + {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, ] [package.extras] @@ -2074,84 +2967,158 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tomli" -version = "2.2.1" +version = "2.3.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["test", "typing"] files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, + {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, + {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, + {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, + {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, + {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, + {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, + {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, + {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, + {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, + {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, + {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, + {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, ] markers = {test = "python_full_version <= \"3.11.0a6\"", typing = "python_version < \"3.11\""} [[package]] name = "types-requests" -version = "2.32.0.20241016" +version = "2.31.0.6" description = "Typing stubs for requests" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" +groups = ["typing"] +markers = "platform_python_implementation == \"PyPy\" or python_version == \"3.9\"" +files = [ + {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, + {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, +] + +[package.dependencies] +types-urllib3 = "*" + +[[package]] +name = "types-requests" +version = "2.32.4.20250913" +description = "Typing stubs for requests" +optional = false +python-versions = ">=3.9" groups = ["typing"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ - {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, - {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, + {file = "types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1"}, + {file = "types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d"}, ] [package.dependencies] urllib3 = ">=2" +[[package]] +name = "types-urllib3" +version = "1.26.25.14" +description = "Typing stubs for urllib3" +optional = false +python-versions = "*" +groups = ["typing"] +markers = "platform_python_implementation == \"PyPy\" or python_version == \"3.9\"" +files = [ + {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, + {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, +] + [[package]] name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "test", "typing"] 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"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] +[[package]] +name = "typing-inspection" +version = "0.4.2" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main", "test"] +files = [ + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + [[package]] name = "urllib3" -version = "2.3.0" +version = "1.26.20" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main", "test"] +markers = "platform_python_implementation == \"PyPy\" or python_version == \"3.9\"" +files = [ + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, +] + +[package.extras] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "urllib3" +version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["main", "test", "typing"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] [package.extras] @@ -2160,6 +3127,30 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "vcrpy" +version = "7.0.0" +description = "Automatically mock your HTTP interactions to simplify and speed up testing" +optional = false +python-versions = ">=3.9" +groups = ["test"] +files = [ + {file = "vcrpy-7.0.0-py2.py3-none-any.whl", hash = "sha256:55791e26c18daa363435054d8b35bd41a4ac441b6676167635d1b37a71dbe124"}, + {file = "vcrpy-7.0.0.tar.gz", hash = "sha256:176391ad0425edde1680c5b20738ea3dc7fb942520a48d2993448050986b3a50"}, +] + +[package.dependencies] +PyYAML = "*" +urllib3 = [ + {version = "<2", markers = "python_version < \"3.10\" or platform_python_implementation == \"PyPy\""}, + {version = "*", markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\""}, +] +wrapt = "*" +yarl = "*" + +[package.extras] +tests = ["Werkzeug (==2.0.3)", "aiohttp", "boto3", "httplib2", "httpx", "pytest", "pytest-aiohttp", "pytest-asyncio", "pytest-cov", "pytest-httpbin", "requests (>=2.22.0)", "tornado", "urllib3"] + [[package]] name = "watchdog" version = "6.0.0" @@ -2203,215 +3194,403 @@ files = [ [package.extras] watchmedo = ["PyYAML (>=3.10)"] +[[package]] +name = "wrapt" +version = "2.0.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["test"] +files = [ + {file = "wrapt-2.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a7cebcee61f21b1e46aa32db8d9d93826d0fbf1ad85defc2ccfb93b4adef1435"}, + {file = "wrapt-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:827e6e3a3a560f6ec1f5ee92d4319c21a0549384f896ec692f3201eda31ebd11"}, + {file = "wrapt-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a91075a5383a7cbfe46aed1845ef7c3f027e8e20e7d9a8a75e36ebc9b0dd15e"}, + {file = "wrapt-2.0.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b6a18c813196e18146b8d041e20875bdb0cb09b94ac1d1e1146e0fa87b2deb0d"}, + {file = "wrapt-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec5028d26011a53c76bd91bb6198b30b438c6e0f7adb45f2ad84fe2655b6a104"}, + {file = "wrapt-2.0.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bed9b04900204721a24bcefc652ca267b01c1e8ad8bc8c0cff81558a45a3aadc"}, + {file = "wrapt-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:03442f2b45fa3f2b98a94a1917f52fb34670de8f96c0a009c02dbd512d855a3d"}, + {file = "wrapt-2.0.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:17d0b5c42495ba142a1cee52b76414f9210591c84aae94dffda70240753bfb3c"}, + {file = "wrapt-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ee44215e7d13e112a8fc74e12ed1a1f41cab2bc07b11cc703f2398cd114b261c"}, + {file = "wrapt-2.0.0-cp310-cp310-win32.whl", hash = "sha256:fe6eafac3bc3c957ab6597a0c0654a0a308868458d00d218743e5b5fae51951c"}, + {file = "wrapt-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:9e070c3491397fba0445b8977900271eca9656570cca7c900d9b9352186703a0"}, + {file = "wrapt-2.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:806e2e73186eb5e3546f39fb5d0405040e0088db0fc8b2f667fd1863de2b3c99"}, + {file = "wrapt-2.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b7e221abb6c5387819db9323dac3c875b459695057449634f1111955d753c621"}, + {file = "wrapt-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1147a84c8fc852426580af8b6e33138461ddbc65aa459a25ea539374d32069fa"}, + {file = "wrapt-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d6691d4a711504a0bc10de789842ad6ac627bed22937b10f37a1211a8ab7bb3"}, + {file = "wrapt-2.0.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f460e1eb8e75a17c3918c8e35ba57625721eef2439ef0bcf05304ac278a65e1d"}, + {file = "wrapt-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:12c37784b77bf043bf65cc96c7195a5db474b8e54173208af076bdbb61df7b3e"}, + {file = "wrapt-2.0.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75e5c049eb583835f7a0e0e311d9dde9bfbaac723a6dd89d052540f9b2809977"}, + {file = "wrapt-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e50bcbd5b65dac21b82319fcf18486e6ac439947e9305034b00704eb7405f553"}, + {file = "wrapt-2.0.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:06b78cb6b9320f57737a52fede882640d93cface98332d1a3df0c5696ec9ae9f"}, + {file = "wrapt-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c8349ebfc3cd98bc9105e0112dd8c8ac1f3c7cb5601f9d02248cae83a63f748"}, + {file = "wrapt-2.0.0-cp311-cp311-win32.whl", hash = "sha256:028f19ec29e204fe725139d4a8b09f77ecfb64f8f02b7ab5ee822c85e330b68b"}, + {file = "wrapt-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:c6961f05e58d919153ba311b397b7b904b907132b7b8344dde47865d4bb5ec89"}, + {file = "wrapt-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:be7e316c2accd5a31dbcc230de19e2a846a325f8967fdea72704d00e38e6af06"}, + {file = "wrapt-2.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73c6f734aecb1a030d9a265c13a425897e1ea821b73249bb14471445467ca71c"}, + {file = "wrapt-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b4a7f8023b8ce8a36370154733c747f8d65c8697cb977d8b6efeb89291fff23e"}, + {file = "wrapt-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a1cb62f686c50e9dab5983c68f6c8e9cbf14a6007935e683662898a7d892fa69"}, + {file = "wrapt-2.0.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:43dc0550ae15e33e6bb45a82a5e1b5495be2587fbaa996244b509921810ee49f"}, + {file = "wrapt-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39c5b45b056d630545e40674d1f5e1b51864b3546f25ab6a4a331943de96262e"}, + {file = "wrapt-2.0.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:804e88f824b76240a1b670330637ccfd2d18b9efa3bb4f02eb20b2f64880b324"}, + {file = "wrapt-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c2c476aa3fc2b9899c3f7b20963fac4f952e7edb74a31fc92f7745389a2e3618"}, + {file = "wrapt-2.0.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8d851e526891216f89fcb7a1820dad9bd503ba3468fb9635ee28e93c781aa98e"}, + {file = "wrapt-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b95733c2360c4a8656ee93c7af78e84c0bd617da04a236d7a456c8faa34e7a2d"}, + {file = "wrapt-2.0.0-cp312-cp312-win32.whl", hash = "sha256:ea56817176834edf143df1109ae8fdaa087be82fdad3492648de0baa8ae82bf2"}, + {file = "wrapt-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c7d3bee7be7a2665286103f4d1f15405c8074e6e1f89dac5774f9357c9a3809"}, + {file = "wrapt-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:680f707e1d26acbc60926659799b15659f077df5897a6791c7c598a5d4a211c4"}, + {file = "wrapt-2.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e2ea096db28d5eb64d381af0e93464621ace38a7003a364b6b5ffb7dd713aabe"}, + {file = "wrapt-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c92b5a82d28491e3f14f037e1aae99a27a5e6e0bb161e65f52c0445a3fa7c940"}, + {file = "wrapt-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:81d234718aabe632d179fac52c7f69f0f99fbaac4d4bcd670e62462bbcbfcad7"}, + {file = "wrapt-2.0.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db2eea83c43f84e4e41dbbb4c1de371a53166e55f900a6b130c3ef51c6345c1a"}, + {file = "wrapt-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:65f50e356c425c061e1e17fe687ff30e294fed9bf3441dc1f13ef73859c2a817"}, + {file = "wrapt-2.0.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:887f2a667e3cbfb19e204032d42ad7dedaa43972e4861dc7a3d51ae951d9b578"}, + {file = "wrapt-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9054829da4be461e3ad3192e4b6bbf1fc18af64c9975ce613aec191924e004dc"}, + {file = "wrapt-2.0.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b952ffd77133a5a2798ee3feb18e51b0a299d2f440961e5bb7737dbb02e57289"}, + {file = "wrapt-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e25fde03c480061b8234d8ee4863eb5f40a9be4fb258ce105b364de38fc6bcf9"}, + {file = "wrapt-2.0.0-cp313-cp313-win32.whl", hash = "sha256:49e982b7860d325094978292a49e0418833fc7fc42c0dc7cd0b7524d7d06ee74"}, + {file = "wrapt-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:6e5c86389d9964050ce50babe247d172a5e3911d59a64023b90db2b4fa00ae7c"}, + {file = "wrapt-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:b96fdaa4611e05c7231937930567d3c16782be9dbcf03eb9f60d83e57dd2f129"}, + {file = "wrapt-2.0.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f2c7b7fead096dbf1dcc455b7f59facb05de3f5bfb04f60a69f98cdfe6049e5f"}, + {file = "wrapt-2.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:04c7c8393f25b11c0faa5d907dd9eb462e87e4e7ba55e308a046d7ed37f4bbe2"}, + {file = "wrapt-2.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a93e0f8b376c0735b2f4daf58018b4823614d2b896cb72b6641c4d3dbdca1d75"}, + {file = "wrapt-2.0.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b42d13603da4416c43c430dbc6313c8d7ff745c40942f146ed4f6dd02c7d2547"}, + {file = "wrapt-2.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8bbd2472abf8c33480ad2314b1f8fac45d592aba6cc093e8839a7b2045660e6"}, + {file = "wrapt-2.0.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e64a3a1fd9a308ab9b815a2ad7a65b679730629dbf85f8fc3f7f970d634ee5df"}, + {file = "wrapt-2.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d61214525eaf88e0d0edf3d1ad5b5889863c6f88e588c6cdc6aa4ee5d1f10a4a"}, + {file = "wrapt-2.0.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:04f7a5f92c5f7324a1735043cc467b1295a1c5b4e0c1395472b7c44706e3dc61"}, + {file = "wrapt-2.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2356f76cb99b3de5b4e5b8210367fbbb81c7309fe39b622f5d199dd88eb7f765"}, + {file = "wrapt-2.0.0-cp313-cp313t-win32.whl", hash = "sha256:0a921b657a224e40e4bc161b5d33934583b34f0c9c5bdda4e6ac66f9d2fcb849"}, + {file = "wrapt-2.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:c16f6d4eea98080f6659a8a7fc559d4a0a337ee66960659265cad2c8a40f7c0f"}, + {file = "wrapt-2.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:52878edc13dc151c58a9966621d67163a80654bc6cff4b2e1c79fa62d0352b26"}, + {file = "wrapt-2.0.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:79a53d86c2aff7b32cc77267e3a308365d1fcb881e74bc9cbe26f63ee90e37f0"}, + {file = "wrapt-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d731a4f22ed6ffa4cb551b4d2b0c24ff940c27a88edaf8e3490a5ee3a05aef71"}, + {file = "wrapt-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3e02ab8c0ac766a5a6e81cd3b6cc39200c69051826243182175555872522bd5a"}, + {file = "wrapt-2.0.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:895870602d65d7338edb3b6a717d856632ad9f14f7ff566214e4fb11f0816649"}, + {file = "wrapt-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b9ad4fab76a0086dc364c4f17f39ad289600e73ef5c6e9ab529aff22cac1ac3"}, + {file = "wrapt-2.0.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e7ca0562606d7bad2736b2c18f61295d61f50cd3f4bfc51753df13614dbcce1b"}, + {file = "wrapt-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe089d9f5a4a3dea0108a8ae34bced114d0c4cca417bada1c5e8f42d98af9050"}, + {file = "wrapt-2.0.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e761f2d2f8dbc80384af3d547b522a80e67db3e319c7b02e7fd97aded0a8a678"}, + {file = "wrapt-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:17ba1bdc52d0c783481850996aa26cea5237720769197335abea2ae6b4c23bc0"}, + {file = "wrapt-2.0.0-cp314-cp314-win32.whl", hash = "sha256:f73318741b141223a4674ba96992aa2291b1b3f7a5e85cb3c2c964f86171eb45"}, + {file = "wrapt-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8e08d4edb13cafe7b3260f31d4de033f73d3205774540cf583bffaa4bec97db9"}, + {file = "wrapt-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:af01695c2b7bbd8d67b869d8e3de2b123a7bfbee0185bdd138c2775f75373b83"}, + {file = "wrapt-2.0.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:057f02c13cce7b26c79624c06a3e1c2353e6dc9708525232232f6768118042ca"}, + {file = "wrapt-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:79bdd84570267f3f43d609c892ae2d30b91ee4b8614c2cbfd311a2965f1c9bdb"}, + {file = "wrapt-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:93c8b4f4d54fd401a817abbfc9bf482aa72fd447f8adf19ce81d035b3f5c762c"}, + {file = "wrapt-2.0.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5e09ffd31001dce71c2c2a4fc201bdba9a2f9f62b23700cf24af42266e784741"}, + {file = "wrapt-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d87c285ff04e26083c4b03546e7b74df7ba4f1f32f1dcb92e9ac13c2dbb4c379"}, + {file = "wrapt-2.0.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e52e50ea0a72ea48d1291cf8b8aaedcc99072d9dc5baba6b820486dcf4c67da8"}, + {file = "wrapt-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1fd4c95536975895f32571073446e614d5e2810b666b64955586dcddfd438fd3"}, + {file = "wrapt-2.0.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d6ebfe9283209220ed9de80a3e9442aab8fc2be5a9bbf8491b99e02ca9349a89"}, + {file = "wrapt-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5d3ebd784804f146b7ea55359beb138e23cc18e5a5cc2cf26ad438723c00ce3a"}, + {file = "wrapt-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:9b15940ae9debc8b40b15dc57e1ce4433f7fb9d3f8761c7fab1ddd94cb999d99"}, + {file = "wrapt-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7a0efbbc06d3e2077476a04f55859819d23206600b4c33f791359a8e6fa3c362"}, + {file = "wrapt-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:7fec8a9455c029c8cf4ff143a53b6e7c463268d42be6c17efa847ebd2f809965"}, + {file = "wrapt-2.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ac3d8beac68e4863c703b844fcc82693f83f933b37d2a54e9d513b2aab9c76aa"}, + {file = "wrapt-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4b8f8644602803add6848c81b7d214cfd397b1ebab2130dc8530570d888155c"}, + {file = "wrapt-2.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93cb5bff1fcd89b75f869e4f69566a91ab2c9f13e8edf0241fd5777b2fa6d48e"}, + {file = "wrapt-2.0.0-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0eb6d155d02c7525b7ec09856cda5e611fc6eb9ab40d140e1f35f27ac7d5eae"}, + {file = "wrapt-2.0.0-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:309dd467a94ee38a7aa5752bda64e660aeab5723b26200d0b65a375dad9add09"}, + {file = "wrapt-2.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a55e8edd08e2eece131d90d82cd1521962d9152829b22c56e68539526d605825"}, + {file = "wrapt-2.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:1724dd7b84d419c80ba839da81ad78b02ac30df626e5aefcb18e94632a965f13"}, + {file = "wrapt-2.0.0-cp38-cp38-win32.whl", hash = "sha256:f8255c380a79f6752d0b920e69a5d656d863675d9c433eeb5548518ee2c8d9da"}, + {file = "wrapt-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:829c8d46465dbae49dba91516f11200a2b5ea91eae8afaccbc035f0b651eb9c4"}, + {file = "wrapt-2.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:094d348ce7e6ce37bf6ed9a6ecc11886c96f447b3ffebc7539ca197daa9a997e"}, + {file = "wrapt-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98223acaa25b1449d993a3f4ffc8b5a03535e4041b37bf6a25459a0c74ee4cfc"}, + {file = "wrapt-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b79bf04c722035b1c474980dc1a64369feab7b703d6fe67da2d8664ed0bc980"}, + {file = "wrapt-2.0.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:623242959cb0c53f76baeb929be79f5f6a9a1673ef51628072b91bf299af2212"}, + {file = "wrapt-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:59dc94afc4542c7d9b9447fb2ae1168b5a29064eca4061dbbf3b3c26df268334"}, + {file = "wrapt-2.0.0-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7c532cc9f0a9e6017f8d3c37f478a3e3a5dffa955ebba556274e5e916c058f7"}, + {file = "wrapt-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9d72c725cefbcc8ebab85c8352e5062ae87b6e323858e934e16b54ced580435a"}, + {file = "wrapt-2.0.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:2ca35b83497276c2ca0b072d2c00da2edde4c2a6c8c650eafcd1a006c17ab231"}, + {file = "wrapt-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2fc55d0da29318a5da33c2827aef8946bba046ac609a4784a90faff73c511174"}, + {file = "wrapt-2.0.0-cp39-cp39-win32.whl", hash = "sha256:9c100b0598f3763274f2033bcc0454de7486409f85bc6da58b49e5971747eb36"}, + {file = "wrapt-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:1316972a72c67936a07dbb48e2464356d91dd9674335aaec087b60094d87750b"}, + {file = "wrapt-2.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:5aad54ff45da9784573099696fd84841c7e559ce312f02afa6aa7e89b58e2c2f"}, + {file = "wrapt-2.0.0-py3-none-any.whl", hash = "sha256:02482fb0df89857e35427dfb844319417e14fae05878f295ee43fa3bf3b15502"}, + {file = "wrapt-2.0.0.tar.gz", hash = "sha256:35a542cc7a962331d0279735c30995b024e852cf40481e384fd63caaa391cbb9"}, +] + +[package.extras] +dev = ["pytest", "setuptools"] + [[package]] name = "yarl" -version = "1.18.3" +version = "1.22.0" description = "Yet another URL library" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "test"] files = [ - {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, - {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, - {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, - {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, - {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, - {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, - {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, - {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, - {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, - {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, - {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, - {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, - {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, - {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, - {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467"}, + {file = "yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea"}, + {file = "yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca"}, + {file = "yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e"}, + {file = "yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca"}, + {file = "yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b"}, + {file = "yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520"}, + {file = "yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8"}, + {file = "yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c"}, + {file = "yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67"}, + {file = "yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95"}, + {file = "yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d"}, + {file = "yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62"}, + {file = "yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03"}, + {file = "yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"}, + {file = "yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da"}, + {file = "yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2"}, + {file = "yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79"}, + {file = "yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c"}, + {file = "yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e"}, + {file = "yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27"}, + {file = "yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8"}, + {file = "yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b"}, + {file = "yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed"}, + {file = "yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2"}, + {file = "yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff"}, + {file = "yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" -propcache = ">=0.2.0" +propcache = ">=0.2.1" + +[[package]] +name = "zipp" +version = "3.23.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +groups = ["test"] +markers = "python_version == \"3.9\"" +files = [ + {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, + {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [[package]] name = "zstandard" -version = "0.23.0" +version = "0.25.0" description = "Zstandard bindings for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "test"] files = [ - {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"}, - {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c"}, - {file = "zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813"}, - {file = "zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4"}, - {file = "zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e"}, - {file = "zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473"}, - {file = "zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160"}, - {file = "zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0"}, - {file = "zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094"}, - {file = "zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35"}, - {file = "zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d"}, - {file = "zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b"}, - {file = "zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9"}, - {file = "zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33"}, - {file = "zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd"}, - {file = "zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b"}, - {file = "zstandard-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc"}, - {file = "zstandard-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e"}, - {file = "zstandard-0.23.0-cp38-cp38-win32.whl", hash = "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9"}, - {file = "zstandard-0.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f"}, - {file = "zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb"}, - {file = "zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5"}, - {file = "zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274"}, - {file = "zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58"}, - {file = "zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09"}, + {file = "zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd"}, + {file = "zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74"}, + {file = "zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa"}, + {file = "zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7"}, + {file = "zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4"}, + {file = "zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2"}, + {file = "zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa"}, + {file = "zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd"}, + {file = "zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01"}, + {file = "zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf"}, + {file = "zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09"}, + {file = "zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5"}, + {file = "zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088"}, + {file = "zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12"}, + {file = "zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2"}, + {file = "zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27"}, + {file = "zstandard-0.25.0-cp39-cp39-win32.whl", hash = "sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649"}, + {file = "zstandard-0.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860"}, + {file = "zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b"}, ] -[package.dependencies] -cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""} - [package.extras] -cffi = ["cffi (>=1.11)"] +cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and python_version < \"3.14\"", "cffi (>=2.0.0b) ; platform_python_implementation != \"PyPy\" and python_version >= \"3.14\""] [metadata] lock-version = "2.1" diff --git a/libs/oci/pyproject.toml b/libs/oci/pyproject.toml index 2165732..e9ad489 100644 --- a/libs/oci/pyproject.toml +++ b/libs/oci/pyproject.toml @@ -59,6 +59,10 @@ optional = true [tool.poetry.group.dev.dependencies] +[tool.ruff] +line-length = 120 # Increase from default 88 to 120 +exclude = ["*.ipynb"] + [tool.ruff.lint] select = [ "E", # pycodestyle @@ -69,7 +73,7 @@ select = [ [tool.mypy] ignore_missing_imports = "True" -disallow_untyped_defs = "True" +disable_error_code = ["attr-defined", "assignment", "var-annotated", "override", "union-attr", "arg-type"] [tool.coverage.run] omit = ["tests/*"] diff --git a/libs/oci/tests/conftest.py b/libs/oci/tests/conftest.py index 2c0afee..6f22c00 100644 --- a/libs/oci/tests/conftest.py +++ b/libs/oci/tests/conftest.py @@ -43,7 +43,5 @@ def test_something(): required_pkgs_info[pkg] = installed if not required_pkgs_info[pkg]: - item.add_marker( - pytest.mark.skip(reason=f"Requires pkg: `{pkg}`") - ) - break \ No newline at end of file + item.add_marker(pytest.mark.skip(reason=f"Requires pkg: `{pkg}`")) + break diff --git a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py index 6361608..8070d5a 100644 --- a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py +++ b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py @@ -84,9 +84,7 @@ def weather_tool(): def create_agent(model_id: str, weather_tool: StructuredTool): """Create a LangGraph agent with tool calling.""" region = os.getenv("OCI_REGION", "us-chicago-1") - endpoint = ( - f"https://inference.generativeai.{region}.oci.oraclecloud.com" - ) + endpoint = f"https://inference.generativeai.{region}.oci.oraclecloud.com" chat_model = ChatOCIGenAI( model_id=model_id, service_endpoint=endpoint, @@ -149,10 +147,7 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo agent = create_agent(model_id, weather_tool) # Invoke the agent - system_msg = ( - "You are a helpful assistant. Use the available tools when " - "needed to answer questions accurately." - ) + system_msg = "You are a helpful assistant. Use the available tools when needed to answer questions accurately." result = agent.invoke( { "messages": [ @@ -169,35 +164,22 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo assert len(messages) >= 4, expected # Find tool messages - tool_messages = [ - msg for msg in messages if type(msg).__name__ == "ToolMessage" - ] + tool_messages = [msg for msg in messages if type(msg).__name__ == "ToolMessage"] assert len(tool_messages) >= 1, "Should have at least one tool result" # Find AI messages with tool calls ai_tool_calls = [ - msg - for msg in messages - if ( - type(msg).__name__ == "AIMessage" - and hasattr(msg, "tool_calls") - and msg.tool_calls - ) + msg for msg in messages if (type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls) ] # The model should call the tool, but after receiving results, # should not call again. Allow flexibility - some models might make # 1 call, others might need 2, but should stop - error_msg = ( - f"Model made too many tool calls ({len(ai_tool_calls)}), " - "possible infinite loop" - ) + error_msg = f"Model made too many tool calls ({len(ai_tool_calls)}), possible infinite loop" assert len(ai_tool_calls) <= 2, error_msg # Verify final message is an AI response without tool calls final_message = messages[-1] - assert type(final_message).__name__ == "AIMessage", ( - "Final message should be AIMessage" - ) + assert type(final_message).__name__ == "AIMessage", "Final message should be AIMessage" assert final_message.content, "Final message should have content" assert not ( hasattr(final_message, "tool_calls") and final_message.tool_calls @@ -284,6 +266,7 @@ def test_multi_step_tool_orchestration(model_id: str): multi-step investigations requiring several tool calls before providing a final analysis. """ + # Create diagnostic tools that simulate a monitoring workflow def check_status(resource: str) -> str: """Check the status of a resource.""" @@ -291,17 +274,12 @@ def check_status(resource: str) -> str: "payment-service": "Status: Running, Memory: 95%, Restarts: 12", "web-server": "Status: Running, Memory: 60%, Restarts: 0", } - return status_data.get( - resource, f"Resource {resource} status: Unknown" - ) + return status_data.get(resource, f"Resource {resource} status: Unknown") def get_events(resource: str) -> str: """Get recent events for a resource.""" events_data = { - "payment-service": ( - "Events: [OOMKilled at 14:23, " - "BackOff at 14:30, Started at 14:32]" - ), + "payment-service": ("Events: [OOMKilled at 14:23, BackOff at 14:30, Started at 14:32]"), "web-server": "Events: [Started at 10:00, Healthy]", } return events_data.get(resource, f"No events for {resource}") @@ -309,10 +287,7 @@ def get_events(resource: str) -> str: def get_metrics(resource: str) -> str: """Get historical metrics for a resource.""" metrics_data = { - "payment-service": ( - "Memory trend: 70%→80%→90%→95% " - "(gradual increase over 2h)" - ), + "payment-service": ("Memory trend: 70%→80%→90%→95% (gradual increase over 2h)"), "web-server": "Memory trend: 55%→58%→60% (stable)", } return metrics_data.get(resource, f"No metrics for {resource}") @@ -369,9 +344,7 @@ def take_action(resource: str, action: str) -> str: # Create agent with higher recursion limit to allow multi-step region = os.getenv("OCI_REGION", "us-chicago-1") - endpoint = ( - f"https://inference.generativeai.{region}.oci.oraclecloud.com" - ) + endpoint = f"https://inference.generativeai.{region}.oci.oraclecloud.com" chat_model = ChatOCIGenAI( model_id=model_id, service_endpoint=endpoint, @@ -393,11 +366,7 @@ def call_model(state: MessagesState): response = model_with_tools.invoke(messages) # OCI LIMITATION: Only allow ONE tool call at a time - if ( - hasattr(response, "tool_calls") - and response.tool_calls - and len(response.tool_calls) > 1 - ): + if hasattr(response, "tool_calls") and response.tool_calls and len(response.tool_calls) > 1: # Some models try to call multiple tools in parallel # Restrict to first tool only to avoid OCI API error response.tool_calls = [response.tool_calls[0]] @@ -457,45 +426,33 @@ def should_continue(state: MessagesState): # Count tool calls tool_call_messages = [ - msg - for msg in messages - if ( - type(msg).__name__ == "AIMessage" - and hasattr(msg, "tool_calls") - and msg.tool_calls - ) - ] - tool_result_messages = [ - msg for msg in messages if type(msg).__name__ == "ToolMessage" + msg for msg in messages if (type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls) ] + tool_result_messages = [msg for msg in messages if type(msg).__name__ == "ToolMessage"] # Verify multi-step orchestration worked - msg = ( - f"Should have made multiple tool calls (got {len(tool_call_messages)})" - ) + msg = f"Should have made multiple tool calls (got {len(tool_call_messages)})" assert len(tool_call_messages) >= 2, msg # CRITICAL: Verify max_sequential_tool_calls limit was respected # The agent should stop at or before the limit (8 tool calls) # This is the key protection against infinite loops - assert len(tool_call_messages) <= 8, ( - f"Too many tool calls ({len(tool_call_messages)}), " - "max_sequential_tool_calls limit not enforced" - ) + assert ( + len(tool_call_messages) <= 8 + ), f"Too many tool calls ({len(tool_call_messages)}), max_sequential_tool_calls limit not enforced" # Verify tool results were received - assert len(tool_result_messages) >= 2, ( - "Should have received multiple tool results" - ) + assert len(tool_result_messages) >= 2, "Should have received multiple tool results" # Verify agent eventually stopped (didn't loop infinitely) # The final message might still have tool_calls if the agent hit # the max_sequential_tool_calls limit, which is expected behavior. # The key is that it STOPPED (didn't continue infinitely). final_message = messages[-1] - assert type(final_message).__name__ in ["AIMessage", "ToolMessage"], ( - "Final message should be AIMessage or ToolMessage" - ) + assert type(final_message).__name__ in [ + "AIMessage", + "ToolMessage", + ], "Final message should be AIMessage or ToolMessage" # Verify the agent didn't hit infinite loop by checking message count # With max_sequential_tool_calls=8, we expect roughly: diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py index 0bb01c8..de98c6f 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py @@ -49,10 +49,7 @@ ] CONST_STREAM_RESPONSE = ( content - for content in [ - CONST_STREAM_TEMPLATE.replace("", delta).encode() - for delta in CONST_STREAM_DELTAS - ] + for content in [CONST_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS] + [b"data: [DONE]"] ) @@ -61,13 +58,10 @@ '"model":"odsc-llm","choices":[{"index":0,"delta":,"finish_reason":null}]}' ) CONST_ASYNC_STREAM_RESPONSE = ( - CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() - for delta in CONST_STREAM_DELTAS + CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS ) -pytestmark = pytest.mark.skipif( - sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" -) +pytestmark = pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires Python 3.9 or higher") class MockResponse: @@ -144,9 +138,7 @@ def test_invoke_tgi(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_stream_vllm(*args: Any) -> None: """Tests streaming with vLLM endpoint using OpenAI spec.""" - llm = ChatOCIModelDeploymentVLLM( - endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) + llm = ChatOCIModelDeploymentVLLM(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = None count = 0 @@ -163,9 +155,7 @@ def test_stream_vllm(*args: Any) -> None: assert str(output.content).strip() == CONST_COMPLETION -async def mocked_async_streaming_response( - *args: Any, **kwargs: Any -) -> AsyncGenerator[bytes, None]: +async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGenerator[bytes, None]: """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -174,18 +164,14 @@ async def mocked_async_streaming_response( @pytest.mark.asyncio @pytest.mark.requires("ads") @pytest.mark.requires("langchain_openai") -@mock.patch( - "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) -) +@mock.patch("ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock())) @mock.patch( "langchain_oci.llms.oci_data_science_model_deployment_endpoint.BaseOCIModelDeployment._arequest", mock.MagicMock(), ) async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" - llm = ChatOCIModelDeploymentVLLM( - endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) + llm = ChatOCIModelDeploymentVLLM(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py index eaa94cb..ddb6858 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py @@ -23,9 +23,7 @@ def __getattr__(self, val): # type: ignore[no-untyped-def] @pytest.mark.requires("oci") -@pytest.mark.parametrize( - "test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"] -) +@pytest.mark.parametrize("test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"]) def test_llm_chat(monkeypatch: MonkeyPatch, test_model_id: str) -> None: """Test valid chat call to OCI Generative AI LLM service.""" oci_gen_ai_client = MagicMock() @@ -151,7 +149,7 @@ def mocked_response(*args): # type: ignore[no-untyped-def] expected = "Assistant chat reply." actual = llm.invoke(messages, temperature=0.2) assert actual.content == expected - + # Test total_tokens in additional_kwargs assert "total_tokens" in actual.additional_kwargs if provider == "cohere": @@ -268,9 +266,7 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] { "message": MockResponseDict( { - "content": [ - MockResponseDict({"text": ""}) - ], + "content": [MockResponseDict({"text": ""})], "tool_calls": [ MockResponseDict( { @@ -278,7 +274,7 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] "id": "call_escaped", "name": "get_weather", # Escaped JSON (the bug scenario) - "arguments": '"{\\\"location\\\": \\\"San Francisco\\\"}"', + "arguments": '"{\\"location\\": \\"San Francisco\\"}"', "attribute_map": { "id": "id", "type": "type", @@ -328,9 +324,7 @@ def get_weather(location: str) -> str: messages = [HumanMessage(content="What's the weather like?")] # Test that tool choice raises ValueError - with pytest.raises( - ValueError, match="Tool choice is not supported for Cohere models" - ): + with pytest.raises(ValueError, match="Tool choice is not supported for Cohere models"): llm.bind_tools( tools=[get_weather], tool_choice="auto", @@ -536,7 +530,7 @@ class WeatherResponse(BaseModel): def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] # Verify that response_format is a JsonSchemaResponseFormat object request = args[0] - assert hasattr(request.chat_request, 'response_format') + assert hasattr(request.chat_request, "response_format") assert request.chat_request.response_format is not None return MockResponseDict( @@ -583,9 +577,7 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: from unittest.mock import patch with patch("oci.config.from_file") as mock_from_file: - with patch( - "oci.generative_ai_inference.generative_ai_inference_client.validate_config" - ): + with patch("oci.generative_ai_inference.generative_ai_inference_client.validate_config"): with patch("oci.base_client.validate_config"): with patch("oci.signer.load_private_key"): custom_config_path = "/custom/path/config" @@ -593,9 +585,7 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: model_id="cohere.command-r-16k", auth_file_location=custom_config_path, ) - mock_from_file.assert_called_once_with( - file_location=custom_config_path, profile_name="DEFAULT" - ) + mock_from_file.assert_called_once_with(file_location=custom_config_path, profile_name="DEFAULT") @pytest.mark.requires("oci") @@ -641,9 +631,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] messages = [HumanMessage(content="What's the weather like?")] # Test with include_raw=True - structured_llm = llm.with_structured_output( - WeatherResponse, method="json_schema", include_raw=True - ) + structured_llm = llm.with_structured_output(WeatherResponse, method="json_schema", include_raw=True) response = structured_llm.invoke(messages) assert isinstance(response, dict) assert "parsed" in response @@ -668,12 +656,10 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] # Check if the request contains tool_calls in the message request = args[0] has_chat_request = hasattr(request, "chat_request") - has_messages = has_chat_request and hasattr( - request.chat_request, "messages" - ) + has_messages = has_chat_request and hasattr(request.chat_request, "messages") if has_messages: for msg in request.chat_request.messages: - if hasattr(msg, 'tool_calls') and msg.tool_calls: + if hasattr(msg, "tool_calls") and msg.tool_calls: tool_calls_processed = True break return MockResponseDict( @@ -694,9 +680,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "content": [ MockResponseDict( { - "text": ( - "I'll help you." - ), + "text": ("I'll help you."), "type": "TEXT", } ) @@ -731,7 +715,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "name": "get_weather", "args": {"location": "San Francisco"}, } - ] + ], ) messages = [ai_message] @@ -744,7 +728,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] @pytest.mark.requires("oci") def test_ai_message_tool_calls_additional_kwargs(monkeypatch: MonkeyPatch) -> None: """Test AIMessage with tool_calls in additional_kwargs field.""" - + oci_gen_ai_client = MagicMock() llm = ChatOCIGenAI(model_id="meta.llama-3.3-70b-instruct", client=oci_gen_ai_client) @@ -767,9 +751,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "content": [ MockResponseDict( { - "text": ( - "I'll help you." - ), + "text": ("I'll help you."), "type": "TEXT", } ) @@ -806,7 +788,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "args": {"location": "New York"}, } ] - } + }, ) messages = [ai_message] @@ -844,7 +826,7 @@ def test_tool_choice_none_after_tool_results() -> None: llm = ChatOCIGenAI( model_id="meta.llama-3.3-70b-instruct", client=oci_gen_ai_client, - max_sequential_tool_calls=3 # Set limit to 3 for testing + max_sequential_tool_calls=3, # Set limit to 3 for testing ) # Define a simple tool function (following the pattern from other tests) @@ -862,22 +844,29 @@ def get_weather(city: str) -> str: # Create conversation with 3 ToolMessages (at the limit) messages = [ HumanMessage(content="What's the weather?"), - AIMessage(content="", tool_calls=[{"id": "call_1", "name": "get_weather", "args": {"city": "Chicago"}}]), + AIMessage( + content="", + tool_calls=[{"id": "call_1", "name": "get_weather", "args": {"city": "Chicago"}}], + ), ToolMessage(content="Sunny, 65°F", tool_call_id="call_1"), - AIMessage(content="", tool_calls=[{"id": "call_2", "name": "get_weather", "args": {"city": "New York"}}]), + AIMessage( + content="", + tool_calls=[{"id": "call_2", "name": "get_weather", "args": {"city": "New York"}}], + ), ToolMessage(content="Rainy, 55°F", tool_call_id="call_2"), - AIMessage(content="", tool_calls=[{"id": "call_3", "name": "get_weather", "args": {"city": "Seattle"}}]), - ToolMessage(content="Cloudy, 60°F", tool_call_id="call_3") + AIMessage( + content="", + tool_calls=[{"id": "call_3", "name": "get_weather", "args": {"city": "Seattle"}}], + ), + ToolMessage(content="Cloudy, 60°F", tool_call_id="call_3"), ] # Prepare the request - need to pass tools from the bound model kwargs - request = llm_with_tools._prepare_request( - messages, stop=None, stream=False, **llm_with_tools.kwargs - ) + request = llm_with_tools._prepare_request(messages, stop=None, stream=False, **llm_with_tools.kwargs) # Verify that tool_choice is set to 'none' because limit was reached - assert hasattr(request.chat_request, 'tool_choice') + assert hasattr(request.chat_request, "tool_choice") assert isinstance(request.chat_request.tool_choice, models.ToolChoiceNone) # Verify tools are still present (not removed, just choice is 'none') - assert hasattr(request.chat_request, 'tools') + assert hasattr(request.chat_request, "tools") assert len(request.chat_request.tools) > 0 diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py index b670be6..2ab8930 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py @@ -85,9 +85,7 @@ def test_construct_json_body(mocker: MockerFixture) -> None: messages = [ HumanMessage(content="User message"), ] - chat = ChatOCIModelDeployment( - endpoint="test_endpoint", model_kwargs={"temperature": 0.2} - ) + chat = ChatOCIModelDeployment(endpoint="test_endpoint", model_kwargs={"temperature": 0.2}) payload = chat._construct_json_body(messages, chat._invocation_params(stop=None)) assert payload == { "messages": [{"content": "User message", "role": "user"}], diff --git a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py index 86e2ca7..f47f61d 100644 --- a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py @@ -33,8 +33,7 @@ + '"choices":[{"index":0,"text":"","finish_reason":""}]}' ) CONST_STREAM_RESPONSE = ( - CONST_STREAM_TEMPLATE.replace("", " " + word).encode() - for word in CONST_COMPLETION.split(" ") + CONST_STREAM_TEMPLATE.replace("", " " + word).encode() for word in CONST_COMPLETION.split(" ") ) CONST_ASYNC_STREAM_TEMPLATE = ( @@ -42,13 +41,10 @@ + '"choices":[{"index":0,"text":"","finish_reason":""}]}' ) CONST_ASYNC_STREAM_RESPONSE = ( - CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() - for word in CONST_COMPLETION.split(" ") + CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() for word in CONST_COMPLETION.split(" ") ) -pytestmark = pytest.mark.skipif( - sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" -) +pytestmark = pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires Python 3.9 or higher") class MockResponse: @@ -99,9 +95,7 @@ def mocked_requests_post(url: str, **kwargs: Any) -> MockResponse: ) -async def mocked_async_streaming_response( - *args: Any, **kwargs: Any -) -> AsyncGenerator[bytes, None]: +async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGenerator[bytes, None]: """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -123,9 +117,7 @@ def test_invoke_vllm(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_stream_tgi(*args: Any) -> None: """Tests streaming with TGI endpoint using OpenAI spec.""" - llm = OCIModelDeploymentTGI( - endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) + llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = "" count = 0 @@ -141,9 +133,7 @@ def test_stream_tgi(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_generate_tgi(*args: Any) -> None: """Tests invoking TGI endpoint using TGI generate spec.""" - llm = OCIModelDeploymentTGI( - endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME - ) + llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = llm.invoke(CONST_PROMPT) assert output == CONST_COMPLETION @@ -151,14 +141,10 @@ def test_generate_tgi(*args: Any) -> None: @pytest.mark.asyncio @pytest.mark.requires("ads") -@mock.patch( - "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) -) +@mock.patch("ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock())) async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" - llm = OCIModelDeploymentTGI( - endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) + llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oracledb/Makefile b/libs/oracledb/Makefile index 4342953..a9c240b 100644 --- a/libs/oracledb/Makefile +++ b/libs/oracledb/Makefile @@ -27,14 +27,14 @@ lint_tests: PYTHON_FILES=tests lint_tests: MYPY_CACHE=.mypy_cache_test lint lint_diff lint_package lint_tests: - poetry run ruff . - poetry run ruff format $(PYTHON_FILES) --diff - poetry run ruff --select I $(PYTHON_FILES) + poetry run ruff check . + poetry run ruff format $(PYTHON_FILES) --check --diff + poetry run ruff check --select I $(PYTHON_FILES) mkdir -p $(MYPY_CACHE); poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) format format_diff: poetry run ruff format $(PYTHON_FILES) - poetry run ruff --select I --fix $(PYTHON_FILES) + poetry run ruff check --select I --fix $(PYTHON_FILES) spell_check: poetry run codespell --toml pyproject.toml From af31374e162821ffc1bfa0e508593a7439a061e2 Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Thu, 6 Nov 2025 15:36:33 -0800 Subject: [PATCH 03/16] Fix make lint error Fix make lint error: tests/unit_tests/llms/test_oci_model_deployment_endpoint.py:60: error: Missing named argument "response" for "HTTPError" [call-arg] Found 1 error in 1 file (checked 29 source files) --- .../tests/unit_tests/llms/test_oci_model_deployment_endpoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py index f47f61d..28a0bd9 100644 --- a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py @@ -57,7 +57,7 @@ def __init__(self, json_data: Dict, status_code: int = 200) -> None: def raise_for_status(self) -> None: """Mocked raise for status.""" if 400 <= self.status_code < 600: - raise HTTPError() + raise HTTPError(response=self) # type: ignore[arg-type] def json(self) -> Dict: """Returns mocked json data.""" From d01a7c9962c9ef2272fe7cefc806bee1fb926edf Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Thu, 6 Nov 2025 15:45:24 -0800 Subject: [PATCH 04/16] Use Union type to pass make lint check Use Union type to pass make lint check: tests/integration_tests/vectorstores/test_oraclevs.py:1891: error: X | Y syntax for unions requires Python 3.10 [syntax] tests/integration_tests/vectorstores/test_oraclevs.py:2028: error: X | Y syntax for unions requires Python 3.10 [syntax] Found 2 errors in 1 file (checked 22 source files) make: *** [Makefile:33: lint] Error 1 --- .../tests/integration_tests/vectorstores/test_oraclevs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py b/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py index 6700295..3b0a7be 100644 --- a/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py +++ b/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py @@ -12,6 +12,7 @@ import logging import sys import threading +from typing import Union import oracledb import pytest @@ -1888,7 +1889,7 @@ def test_db_filter_test() -> None: for filtered_function in FILTERED_FUNCTIONS: method = getattr(vs, filtered_function) - query_emb: list[float] | str = query + query_emb: Union[list[float], str] = query if "_by_vector" in filtered_function: query_emb = vs.embedding_function.embed_query(query) # type: ignore[union-attr] @@ -2025,7 +2026,7 @@ async def test_db_filter_test_async() -> None: for filtered_function in FILTERED_FUNCTIONS: method = getattr(vs, "a" + filtered_function) - query_emb: list[float] | str = query + query_emb: Union[list[float], str] = query if "_by_vector" in filtered_function: query_emb = vs.embedding_function.embed_query(query) # type: ignore[union-attr] From 01bc7934faaa650d2fcdeca3d24451eef147778b Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Fri, 7 Nov 2025 11:12:36 -0800 Subject: [PATCH 05/16] Add LangGraph and related packages for integration tests Add LangGraph and related packages for integration tests. --- libs/oci/poetry.lock | 235 +++++++++++++++++++++++++++++++++++----- libs/oci/pyproject.toml | 1 + 2 files changed, 206 insertions(+), 30 deletions(-) diff --git a/libs/oci/poetry.lock b/libs/oci/poetry.lock index 73cead7..4e636a0 100644 --- a/libs/oci/poetry.lock +++ b/libs/oci/poetry.lock @@ -177,7 +177,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] 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"}, @@ -189,7 +189,7 @@ version = "4.11.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, @@ -235,7 +235,7 @@ version = "2025.10.5" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, @@ -345,7 +345,7 @@ version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, @@ -853,7 +853,7 @@ version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, @@ -1093,7 +1093,7 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -1105,7 +1105,7 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -1127,7 +1127,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1152,7 +1152,7 @@ version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.8" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, @@ -1218,7 +1218,7 @@ 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.*" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -1233,7 +1233,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -1286,7 +1286,7 @@ version = "0.3.79" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0.0,>=3.9.0" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "langchain_core-0.3.79-py3-none-any.whl", hash = "sha256:92045bfda3e741f8018e1356f83be203ec601561c6a7becfefe85be5ddc58fdb"}, {file = "langchain_core-0.3.79.tar.gz", hash = "sha256:024ba54a346dd9b13fb8b2342e0c83d0111e7f26fa01f545ada23ad772b55a60"}, @@ -1344,13 +1344,62 @@ files = [ [package.dependencies] langchain-core = ">=0.3.75,<2.0.0" +[[package]] +name = "langgraph" +version = "0.2.76" +description = "Building stateful, multi-actor applications with LLMs" +optional = false +python-versions = "<4.0,>=3.9.0" +groups = ["test_integration"] +files = [ + {file = "langgraph-0.2.76-py3-none-any.whl", hash = "sha256:076b8b5d2fc5a9761c46a7618430cfa5c978a8012257c43cbc127b27e0fd7872"}, + {file = "langgraph-0.2.76.tar.gz", hash = "sha256:688f8dcd9b6797ba78384599e0de944773000c75156ad1e186490e99e89fa5c0"}, +] + +[package.dependencies] +langchain-core = ">=0.2.43,<0.3.0 || >0.3.0,<0.3.1 || >0.3.1,<0.3.2 || >0.3.2,<0.3.3 || >0.3.3,<0.3.4 || >0.3.4,<0.3.5 || >0.3.5,<0.3.6 || >0.3.6,<0.3.7 || >0.3.7,<0.3.8 || >0.3.8,<0.3.9 || >0.3.9,<0.3.10 || >0.3.10,<0.3.11 || >0.3.11,<0.3.12 || >0.3.12,<0.3.13 || >0.3.13,<0.3.14 || >0.3.14,<0.3.15 || >0.3.15,<0.3.16 || >0.3.16,<0.3.17 || >0.3.17,<0.3.18 || >0.3.18,<0.3.19 || >0.3.19,<0.3.20 || >0.3.20,<0.3.21 || >0.3.21,<0.3.22 || >0.3.22,<0.4.0" +langgraph-checkpoint = ">=2.0.10,<3.0.0" +langgraph-sdk = ">=0.1.42,<0.2.0" + +[[package]] +name = "langgraph-checkpoint" +version = "2.1.2" +description = "Library with base interfaces for LangGraph checkpoint savers." +optional = false +python-versions = ">=3.9" +groups = ["test_integration"] +files = [ + {file = "langgraph_checkpoint-2.1.2-py3-none-any.whl", hash = "sha256:911ebffb069fd01775d4b5184c04aaafc2962fcdf50cf49d524cd4367c4d0c60"}, + {file = "langgraph_checkpoint-2.1.2.tar.gz", hash = "sha256:112e9d067a6eff8937caf198421b1ffba8d9207193f14ac6f89930c1260c06f9"}, +] + +[package.dependencies] +langchain-core = ">=0.2.38" +ormsgpack = ">=1.10.0" + +[[package]] +name = "langgraph-sdk" +version = "0.1.74" +description = "SDK for interacting with LangGraph API" +optional = false +python-versions = ">=3.9" +groups = ["test_integration"] +files = [ + {file = "langgraph_sdk-0.1.74-py3-none-any.whl", hash = "sha256:3a265c3757fe0048adad4391d10486db63ef7aa5a2cbd22da22d4503554cb890"}, + {file = "langgraph_sdk-0.1.74.tar.gz", hash = "sha256:7450e0db5b226cc2e5328ca22c5968725873630ef47c4206a30707cb25dc3ad6"}, +] + +[package.dependencies] +httpx = ">=0.25.2" +orjson = ">=3.10.1" + [[package]] name = "langsmith" version = "0.4.37" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.9" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" files = [ {file = "langsmith-0.4.37-py3-none-any.whl", hash = "sha256:e34a94ce7277646299e4703a0f6e2d2c43647a28e8b800bb7ef82fd87a0ec766"}, @@ -1380,7 +1429,7 @@ version = "0.4.41" description = "Client library to connect to the LangSmith Observability and Evaluation Platform." optional = false python-versions = ">=3.10" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" files = [ {file = "langsmith-0.4.41-py3-none-any.whl", hash = "sha256:5cdc554e5f0361bf791fdd5e8dea16d5ba9dfce09b3b8f8bba5e99450c569b27"}, @@ -1935,8 +1984,7 @@ version = "3.11.4" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.9" -groups = ["main", "test"] -markers = "platform_python_implementation != \"PyPy\"" +groups = ["main", "test", "test_integration"] files = [ {file = "orjson-3.11.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1"}, {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44"}, @@ -2026,6 +2074,133 @@ files = [ {file = "orjson-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:e2985ce8b8c42d00492d0ed79f2bd2b6460d00f2fa671dfde4bf2e02f49bf5c6"}, {file = "orjson-3.11.4.tar.gz", hash = "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d"}, ] +markers = {main = "platform_python_implementation != \"PyPy\"", test = "platform_python_implementation != \"PyPy\""} + +[[package]] +name = "ormsgpack" +version = "1.11.0" +description = "" +optional = false +python-versions = ">=3.9" +groups = ["test_integration"] +markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" +files = [ + {file = "ormsgpack-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:03d4e658dd6e1882a552ce1d13cc7b49157414e7d56a4091fbe7823225b08cba"}, + {file = "ormsgpack-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb67eb913c2b703f0ed39607fc56e50724dd41f92ce080a586b4d6149eb3fe4"}, + {file = "ormsgpack-1.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e54175b92411f73a238e5653a998627f6660de3def37d9dd7213e0fd264ca56"}, + {file = "ormsgpack-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca2b197f4556e1823d1319869d4c5dc278be335286d2308b0ed88b59a5afcc25"}, + {file = "ormsgpack-1.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bc62388262f58c792fe1e450e1d9dbcc174ed2fb0b43db1675dd7c5ff2319d6a"}, + {file = "ormsgpack-1.11.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c48bc10af74adfbc9113f3fb160dc07c61ad9239ef264c17e449eba3de343dc2"}, + {file = "ormsgpack-1.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a608d3a1d4fa4acdc5082168a54513cff91f47764cef435e81a483452f5f7647"}, + {file = "ormsgpack-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:97217b4f7f599ba45916b9c4c4b1d5656e8e2a4d91e2e191d72a7569d3c30923"}, + {file = "ormsgpack-1.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:c7be823f47d8e36648d4bc90634b93f02b7d7cc7480081195f34767e86f181fb"}, + {file = "ormsgpack-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68accf15d1b013812755c0eb7a30e1fc2f81eb603a1a143bf0cda1b301cfa797"}, + {file = "ormsgpack-1.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:805d06fb277d9a4e503c0c707545b49cde66cbb2f84e5cf7c58d81dfc20d8658"}, + {file = "ormsgpack-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1e57cdf003e77acc43643bda151dc01f97147a64b11cdee1380bb9698a7601c"}, + {file = "ormsgpack-1.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:37fc05bdaabd994097c62e2f3e08f66b03f856a640ede6dc5ea340bd15b77f4d"}, + {file = "ormsgpack-1.11.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a6e9db6c73eb46b2e4d97bdffd1368a66f54e6806b563a997b19c004ef165e1d"}, + {file = "ormsgpack-1.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e9c44eae5ac0196ffc8b5ed497c75511056508f2303fa4d36b208eb820cf209e"}, + {file = "ormsgpack-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:11d0dfaf40ae7c6de4f7dbd1e4892e2e6a55d911ab1774357c481158d17371e4"}, + {file = "ormsgpack-1.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:0c63a3f7199a3099c90398a1bdf0cb577b06651a442dc5efe67f2882665e5b02"}, + {file = "ormsgpack-1.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3434d0c8d67de27d9010222de07fb6810fb9af3bb7372354ffa19257ac0eb83b"}, + {file = "ormsgpack-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2da5bd097e8dbfa4eb0d4ccfe79acd6f538dee4493579e2debfe4fc8f4ca89b"}, + {file = "ormsgpack-1.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fdbaa0a5a8606a486960b60c24f2d5235d30ac7a8b98eeaea9854bffef14dc3d"}, + {file = "ormsgpack-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3682f24f800c1837017ee90ce321086b2cbaef88db7d4cdbbda1582aa6508159"}, + {file = "ormsgpack-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fcca21202bb05ccbf3e0e92f560ee59b9331182e4c09c965a28155efbb134993"}, + {file = "ormsgpack-1.11.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c30e5c4655ba46152d722ec7468e8302195e6db362ec1ae2c206bc64f6030e43"}, + {file = "ormsgpack-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7138a341f9e2c08c59368f03d3be25e8b87b3baaf10d30fb1f6f6b52f3d47944"}, + {file = "ormsgpack-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:d4bd8589b78a11026d47f4edf13c1ceab9088bb12451f34396afe6497db28a27"}, + {file = "ormsgpack-1.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:e5e746a1223e70f111d4001dab9585ac8639eee8979ca0c8db37f646bf2961da"}, + {file = "ormsgpack-1.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e7b36ab7b45cb95217ae1f05f1318b14a3e5ef73cb00804c0f06233f81a14e8"}, + {file = "ormsgpack-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43402d67e03a9a35cc147c8c03f0c377cad016624479e1ee5b879b8425551484"}, + {file = "ormsgpack-1.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:64fd992f932764d6306b70ddc755c1bc3405c4c6a69f77a36acf7af1c8f5ada4"}, + {file = "ormsgpack-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0362fb7fe4a29c046c8ea799303079a09372653a1ce5a5a588f3bbb8088368d0"}, + {file = "ormsgpack-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:de2f7a65a9d178ed57be49eba3d0fc9b833c32beaa19dbd4ba56014d3c20b152"}, + {file = "ormsgpack-1.11.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f38cfae95461466055af966fc922d06db4e1654966385cda2828653096db34da"}, + {file = "ormsgpack-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c88396189d238f183cea7831b07a305ab5c90d6d29b53288ae11200bd956357b"}, + {file = "ormsgpack-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:5403d1a945dd7c81044cebeca3f00a28a0f4248b33242a5d2d82111628043725"}, + {file = "ormsgpack-1.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:c57357b8d43b49722b876edf317bdad9e6d52071b523fdd7394c30cd1c67d5a0"}, + {file = "ormsgpack-1.11.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d390907d90fd0c908211592c485054d7a80990697ef4dff4e436ac18e1aab98a"}, + {file = "ormsgpack-1.11.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6153c2e92e789509098e04c9aa116b16673bd88ec78fbe0031deeb34ab642d10"}, + {file = "ormsgpack-1.11.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2b2c2a065a94d742212b2018e1fecd8f8d72f3c50b53a97d1f407418093446d"}, + {file = "ormsgpack-1.11.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:110e65b5340f3d7ef8b0009deae3c6b169437e6b43ad5a57fd1748085d29d2ac"}, + {file = "ormsgpack-1.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c27e186fca96ab34662723e65b420919910acbbc50fc8e1a44e08f26268cb0e0"}, + {file = "ormsgpack-1.11.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d56b1f877c13d499052d37a3db2378a97d5e1588d264f5040b3412aee23d742c"}, + {file = "ormsgpack-1.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c88e28cd567c0a3269f624b4ade28142d5e502c8e826115093c572007af5be0a"}, + {file = "ormsgpack-1.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:8811160573dc0a65f62f7e0792c4ca6b7108dfa50771edb93f9b84e2d45a08ae"}, + {file = "ormsgpack-1.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:23e30a8d3c17484cf74e75e6134322255bd08bc2b5b295cc9c442f4bae5f3c2d"}, + {file = "ormsgpack-1.11.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2905816502adfaf8386a01dd85f936cd378d243f4f5ee2ff46f67f6298dc90d5"}, + {file = "ormsgpack-1.11.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c04402fb9a0a9b9f18fbafd6d5f8398ee99b3ec619fb63952d3a954bc9d47daa"}, + {file = "ormsgpack-1.11.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a025ec07ac52056ecfd9e57b5cbc6fff163f62cb9805012b56cda599157f8ef2"}, + {file = "ormsgpack-1.11.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:354c6a5039faf63b63d8f42ec7915583a4a56e10b319284370a5a89c4382d985"}, + {file = "ormsgpack-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7058c85cc13dd329bc7b528e38626c6babcd0066d6e9163330a1509fe0aa4707"}, + {file = "ormsgpack-1.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e15b634be324fb18dab7aa82ab929a0d57d42c12650ae3dedd07d8d31b17733"}, + {file = "ormsgpack-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6329e6eae9dfe600962739a6e060ea82885ec58b8338875c5ac35080da970f94"}, + {file = "ormsgpack-1.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b27546c28f92b9eb757620f7f1ed89fb7b07be3b9f4ba1b7de75761ec1c4bcc8"}, + {file = "ormsgpack-1.11.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:26a17919d9144b4ac7112dbbadef07927abbe436be2cf99a703a19afe7dd5c8b"}, + {file = "ormsgpack-1.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5352868ee4cdc00656bf216b56bc654f72ac3008eb36e12561f6337bb7104b45"}, + {file = "ormsgpack-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ffe36f1f441a40949e8587f5aa3d3fc9f100576925aab667117403eab494338"}, + {file = "ormsgpack-1.11.0.tar.gz", hash = "sha256:7c9988e78fedba3292541eb3bb274fa63044ef4da2ddb47259ea70c05dee4206"}, +] + +[[package]] +name = "ormsgpack" +version = "1.12.0" +description = "" +optional = false +python-versions = ">=3.10" +groups = ["test_integration"] +markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" +files = [ + {file = "ormsgpack-1.12.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e08904c232358b94a682ccfbb680bc47d3fd5c424bb7dccb65974dd20c95e8e1"}, + {file = "ormsgpack-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ed7a4b0037d69c8ba7e670e03ee65ae8d5c5114a409e73c5770d7fb5e4b895"}, + {file = "ormsgpack-1.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:db2928525b684f3f2af0367aef7ae8d20cde37fc5349c700017129d493a755aa"}, + {file = "ormsgpack-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45f911d9c5b23d11e49ff03fc8f9566745a2b1a7d9033733a1c0a2fa9301cd60"}, + {file = "ormsgpack-1.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:98c54ae6fd682b2aceb264505af9b2255f3df9d84e6e4369bc44d2110f1f311d"}, + {file = "ormsgpack-1.12.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:857ab987c3502de08258cc4baf0e87267cb2c80931601084e13df3c355b1ab9d"}, + {file = "ormsgpack-1.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27579d45dc502ee736238e1024559cb0a01aa72a3b68827448b8edf6a2dcdc9c"}, + {file = "ormsgpack-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c78379d054760875540cf2e81f28da1bb78d09fda3eabdbeb6c53b3e297158cb"}, + {file = "ormsgpack-1.12.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:c40d86d77391b18dd34de5295e3de2b8ad818bcab9c9def4121c8ec5c9714ae4"}, + {file = "ormsgpack-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:777b7fab364dc0f200bb382a98a385c8222ffa6a2333d627d763797326202c86"}, + {file = "ormsgpack-1.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5b5089ad9dd5b3d3013b245a55e4abaea2f8ad70f4a78e1b002127b02340004"}, + {file = "ormsgpack-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaf0c87cace7bc08fbf68c5cc66605b593df6427e9f4de235b2da358787e008"}, + {file = "ormsgpack-1.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f62d476fe28bc5675d9aff30341bfa9f41d7de332c5b63fbbe9aaf6bb7ec74d4"}, + {file = "ormsgpack-1.12.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ded7810095b887e28434f32f5a345d354e88cf851bab3c5435aeb86a718618d2"}, + {file = "ormsgpack-1.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f72a1dea0c4ae7c4101dcfbe8133f274a9d769d0b87fe5188db4fab07ffabaee"}, + {file = "ormsgpack-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:8f479bfef847255d7d0b12c7a198f6a21490155da2da3062e082ba370893d4a1"}, + {file = "ormsgpack-1.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:3583ca410e4502144b2594170542e4bbef7b15643fd1208703ae820f11029036"}, + {file = "ormsgpack-1.12.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e0c1e08b64d99076fee155276097489b82cc56e8d5951c03c721a65a32f44494"}, + {file = "ormsgpack-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd43bcb299131690b8e0677af172020b2ada8e625169034b42ac0c13adf84aa"}, + {file = "ormsgpack-1.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0149d595341e22ead340bf281b2995c4cc7dc8d522a6b5f575fe17aa407604"}, + {file = "ormsgpack-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f19a1b27d169deb553c80fd10b589fc2be1fc14cee779fae79fcaf40db04de2b"}, + {file = "ormsgpack-1.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f28896942d655064940dfe06118b7ce1e3468d051483148bf02c99ec157483a"}, + {file = "ormsgpack-1.12.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9396efcfa48b4abbc06e44c5dbc3c4574a8381a80cb4cd01eea15d28b38c554e"}, + {file = "ormsgpack-1.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:96586ed537a5fb386a162c4f9f7d8e6f76e07b38a990d50c73f11131e00ff040"}, + {file = "ormsgpack-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e70387112fb3870e4844de090014212cdcf1342f5022047aecca01ec7de05d7a"}, + {file = "ormsgpack-1.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:d71290a23de5d4829610c42665d816c661ecad8979883f3f06b2e3ab9639962e"}, + {file = "ormsgpack-1.12.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:766f2f3b512d85cd375b26a8b1329b99843560b50b93d3880718e634ad4a5de5"}, + {file = "ormsgpack-1.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84b285b1f3f185aad7da45641b873b30acfd13084cf829cf668c4c6480a81583"}, + {file = "ormsgpack-1.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e23604fc79fe110292cb365f4c8232e64e63a34f470538be320feae3921f271b"}, + {file = "ormsgpack-1.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc32b156c113a0fae2975051417d8d9a7a5247c34b2d7239410c46b75ce9348a"}, + {file = "ormsgpack-1.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:94ac500dd10c20fa8b8a23bc55606250bfe711bf9716828d9f3d44dfd1f25668"}, + {file = "ormsgpack-1.12.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c5201ff7ec24f721f813a182885a17064cffdbe46b2412685a52e6374a872c8f"}, + {file = "ormsgpack-1.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a9740bb3839c9368aacae1cbcfc474ee6976458f41cc135372b7255d5206c953"}, + {file = "ormsgpack-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ed37f29772432048b58174e920a1d4c4cde0404a5d448d3d8bbcc95d86a6918"}, + {file = "ormsgpack-1.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:b03994bbec5d6d42e03d6604e327863f885bde67aa61e06107ce1fa5bdd3e71d"}, + {file = "ormsgpack-1.12.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0f3981ba3cba80656012090337e548e597799e14b41e3d0b595ab5ab05a23d7f"}, + {file = "ormsgpack-1.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:901f6f55184d6776dbd5183cbce14caf05bf7f467eef52faf9b094686980bf71"}, + {file = "ormsgpack-1.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13b15412571422b711b40f45e3fe6d993ea3314b5e97d1a853fe99226c5effc"}, + {file = "ormsgpack-1.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91fa8a452553a62e5fb3fbab471e7faf7b3bec3c87a2f355ebf3d7aab290fe4f"}, + {file = "ormsgpack-1.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74ec101f69624695eec4ce7c953192d97748254abe78fb01b591f06d529e1952"}, + {file = "ormsgpack-1.12.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:9bbf7896580848326c1f9bd7531f264e561f98db7e08e15aa75963d83832c717"}, + {file = "ormsgpack-1.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7567917da613b8f8d591c1674e411fd3404bea41ef2b9a0e0a1e049c0f9406d7"}, + {file = "ormsgpack-1.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e418256c5d8622b8bc92861936f7c6a0131355e7bcad88a42102ae8227f8a1c"}, + {file = "ormsgpack-1.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:433ace29aa02713554f714c62a4e4dcad0c9e32674ba4f66742c91a4c3b1b969"}, + {file = "ormsgpack-1.12.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e57164be4ca34b64e210ec515059193280ac84df4d6f31a6fcbfb2fc8436de55"}, + {file = "ormsgpack-1.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:904f96289deaa92fc6440b122edc27c5bdc28234edd63717f6d853d88c823a83"}, + {file = "ormsgpack-1.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b291d086e524a1062d57d1b7b5a8bcaaf29caebf0212fec12fd86240bd33633"}, + {file = "ormsgpack-1.12.0.tar.gz", hash = "sha256:94be818fdbb0285945839b88763b269987787cb2f7ef280cad5d6ec815b7e608"}, +] [[package]] name = "packaging" @@ -2033,7 +2208,7 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -2230,7 +2405,7 @@ version = "2.12.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e"}, {file = "pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac"}, @@ -2252,7 +2427,7 @@ version = "2.41.5" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146"}, {file = "pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2"}, @@ -2634,7 +2809,7 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -2717,7 +2892,7 @@ version = "2.32.5" description = "Python HTTP for Humans." optional = false python-versions = ">=3.9" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, @@ -2739,7 +2914,7 @@ version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -2832,7 +3007,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -2955,7 +3130,7 @@ version = "9.1.2" description = "Retry code until it succeeds" optional = false python-versions = ">=3.9" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, @@ -3069,7 +3244,7 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "test", "typing"] +groups = ["main", "test", "test_integration", "typing"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -3081,7 +3256,7 @@ version = "0.4.2" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, @@ -3096,7 +3271,7 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] markers = "platform_python_implementation == \"PyPy\" or python_version == \"3.9\"" files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, @@ -3114,7 +3289,7 @@ version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "test", "typing"] +groups = ["main", "test", "test_integration", "typing"] markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, @@ -3486,7 +3661,7 @@ version = "0.25.0" description = "Zstandard bindings for Python" optional = false python-versions = ">=3.9" -groups = ["main", "test"] +groups = ["main", "test", "test_integration"] files = [ {file = "zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd"}, {file = "zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7"}, @@ -3595,4 +3770,4 @@ cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and pyt [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "4bf581b3b6aafab7449b8b7fead0d5fe191d963f7bd2a90986fb8095027a7bea" +content-hash = "3e0ea83927dc8499d5b702056503f41b8e357d23b3c5ead34f71b229972e45f7" diff --git a/libs/oci/pyproject.toml b/libs/oci/pyproject.toml index e9ad489..0a977b0 100644 --- a/libs/oci/pyproject.toml +++ b/libs/oci/pyproject.toml @@ -43,6 +43,7 @@ codespell = "^2.2.6" optional = true [tool.poetry.group.test_integration.dependencies] +langgraph = "^0.2.0" [tool.poetry.group.lint] optional = true From 37164ec50280d4a97aed42aa66af349eb66c985a Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Fri, 7 Nov 2025 11:15:54 -0800 Subject: [PATCH 06/16] Add placeholder integration test for OCI Introduces a placeholder test in the OCI integration tests to ensure no errors are raised when no tests are selected. --- libs/oci/tests/integration_tests/test_placeholder.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 libs/oci/tests/integration_tests/test_placeholder.py diff --git a/libs/oci/tests/integration_tests/test_placeholder.py b/libs/oci/tests/integration_tests/test_placeholder.py new file mode 100644 index 0000000..05df087 --- /dev/null +++ b/libs/oci/tests/integration_tests/test_placeholder.py @@ -0,0 +1,10 @@ +# Copyright (c) 2025 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +import pytest + + +@pytest.mark.compile +def test_placeholder() -> None: + """Makes sure no errors raised when no tests selected.""" + pass From 21f76272a311e20f445be58bf1db2cceb6702989 Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 10:50:34 -0800 Subject: [PATCH 07/16] Revert commit: Refactor OCI code to appease the lint god --- .github/workflows/_lint.yml | 45 +- libs/oci/Makefile | 8 +- .../chat_models/oci_data_science.py | 44 +- .../chat_models/oci_generative_ai.py | 191 +++++--- ..._data_science_model_deployment_endpoint.py | 19 +- .../embeddings/oci_generative_ai.py | 27 +- ..._data_science_model_deployment_endpoint.py | 69 ++- .../langchain_oci/llms/oci_generative_ai.py | 47 +- libs/oci/poetry.lock | 420 +++++++++--------- libs/oci/pyproject.toml | 6 +- libs/oci/tests/conftest.py | 6 +- .../chat_models/test_tool_calling.py | 89 +++- .../chat_models/test_oci_data_science.py | 28 +- .../chat_models/test_oci_generative_ai.py | 77 ++-- .../test_oci_model_deployment_endpoint.py | 4 +- .../test_oci_model_deployment_endpoint.py | 30 +- libs/oracledb/Makefile | 8 +- 17 files changed, 710 insertions(+), 408 deletions(-) diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index b3edfb2..86c2276 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -42,11 +42,17 @@ jobs: working-directory: ${{ inputs.working-directory }} cache-key: lint-with-extras - - name: Check Poetry configuration + - name: Check Poetry File + shell: bash working-directory: ${{ inputs.working-directory }} run: | poetry check - poetry check --lock + + - name: Check lock file + shell: bash + working-directory: ${{ inputs.working-directory }} + run: | + poetry lock --check - name: Install dependencies # Also installs dev/lint/test/typing dependencies, to ensure we have @@ -59,9 +65,38 @@ jobs: # It doesn't matter how you change it, any change will cause a cache-bust. working-directory: ${{ inputs.working-directory }} run: | - poetry install --with lint,typing,test,test_integration + poetry install --with lint,typing + + - name: Get .mypy_cache to speed up mypy + uses: actions/cache@v4 + env: + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2" + with: + path: | + ${{ env.WORKDIR }}/.mypy_cache + key: mypy-lint-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }} + + + - name: Analysing the code with our lint + working-directory: ${{ inputs.working-directory }} + run: | + make lint_package + + - name: Install unit+integration test dependencies + working-directory: ${{ inputs.working-directory }} + run: | + poetry install --with test,test_integration + + - name: Get .mypy_cache_test to speed up mypy + uses: actions/cache@v4 + env: + SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2" + with: + path: | + ${{ env.WORKDIR }}/.mypy_cache_test + key: mypy-test-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }} - - name: Run linting + - name: Analysing the code with our lint working-directory: ${{ inputs.working-directory }} run: | - make lint + make lint_tests diff --git a/libs/oci/Makefile b/libs/oci/Makefile index da821d2..413c9e4 100644 --- a/libs/oci/Makefile +++ b/libs/oci/Makefile @@ -27,14 +27,14 @@ lint_tests: PYTHON_FILES=tests lint_tests: MYPY_CACHE=.mypy_cache_test lint lint_diff lint_package lint_tests: - poetry run ruff check . - poetry run ruff format $(PYTHON_FILES) --check --diff - poetry run ruff check --select I $(PYTHON_FILES) + poetry run ruff . + poetry run ruff format $(PYTHON_FILES) --diff + poetry run ruff --select I $(PYTHON_FILES) mkdir -p $(MYPY_CACHE); poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) format format_diff: poetry run ruff format $(PYTHON_FILES) - poetry run ruff check --select I --fix $(PYTHON_FILES) + poetry run ruff --select I --fix $(PYTHON_FILES) spell_check: poetry run codespell --toml pyproject.toml diff --git a/libs/oci/langchain_oci/chat_models/oci_data_science.py b/libs/oci/langchain_oci/chat_models/oci_data_science.py index 6b5eb90..719c355 100644 --- a/libs/oci/langchain_oci/chat_models/oci_data_science.py +++ b/libs/oci/langchain_oci/chat_models/oci_data_science.py @@ -275,7 +275,8 @@ def validate_openai(cls, values: Any) -> Any: """Checks if langchain_openai is installed.""" if not importlib.util.find_spec("langchain_openai"): raise ImportError( - "Could not import langchain_openai package. Please install it with `pip install langchain_openai`." + "Could not import langchain_openai package. " + "Please install it with `pip install langchain_openai`." ) return values @@ -302,7 +303,9 @@ def _default_params(self) -> Dict[str, Any]: "stream": self.streaming, } - def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: + def _headers( + self, is_async: Optional[bool] = False, body: Optional[dict] = None + ) -> Dict: """Construct and return the headers for a request. Args: @@ -354,13 +357,17 @@ def _generate( response = chat.invoke(messages) """ # noqa: E501 if self.streaming: - stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs) + stream_iter = self._stream( + messages, stop=stop, run_manager=run_manager, **kwargs + ) return generate_from_stream(stream_iter) requests_kwargs = kwargs.pop("requests_kwargs", {}) params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(messages, params) - res = self.completion_with_retry(data=body, run_manager=run_manager, **requests_kwargs) + res = self.completion_with_retry( + data=body, run_manager=run_manager, **requests_kwargs + ) return self._process_response(res.json()) def _stream( @@ -408,7 +415,9 @@ def _stream( params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(messages, params) # request json body - response = self.completion_with_retry(data=body, run_manager=run_manager, stream=True, **requests_kwargs) + response = self.completion_with_retry( + data=body, run_manager=run_manager, stream=True, **requests_kwargs + ) default_chunk_class = AIMessageChunk for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line, default_chunk_class) @@ -458,7 +467,9 @@ async def _agenerate( """ # noqa: E501 if self.streaming: - stream_iter = self._astream(messages, stop=stop, run_manager=run_manager, **kwargs) + stream_iter = self._astream( + messages, stop=stop, run_manager=run_manager, **kwargs + ) return await agenerate_from_stream(stream_iter) requests_kwargs = kwargs.pop("requests_kwargs", {}) @@ -582,14 +593,19 @@ def with_structured_output( else JsonOutputParser() ) else: - raise ValueError(f"Unrecognized method argument. Expected `json_mode`.Received: `{method}`.") + raise ValueError( + f"Unrecognized method argument. Expected `json_mode`." + f"Received: `{method}`." + ) if include_raw: parser_assign = RunnablePassthrough.assign( parsed=itemgetter("raw") | output_parser, parsing_error=lambda _: None ) parser_none = RunnablePassthrough.assign(parsed=lambda _: None) - parser_with_fallback = parser_assign.with_fallbacks([parser_none], exception_key="parsing_error") + parser_with_fallback = parser_assign.with_fallbacks( + [parser_none], exception_key="parsing_error" + ) return RunnableMap(raw=llm) | parser_with_fallback else: return llm | output_parser @@ -672,7 +688,9 @@ def _process_stream_response( if not isinstance(choice, dict): raise TypeError("Endpoint response is not well formed.") except (KeyError, IndexError, TypeError) as e: - raise ValueError("Error while formatting response payload for chat model of type") from e + raise ValueError( + "Error while formatting response payload for chat model of type" + ) from e chunk = _convert_delta_to_message_chunk(choice["delta"], default_chunk_cls) default_chunk_cls = chunk.__class__ @@ -684,7 +702,9 @@ def _process_stream_response( if usage is not None: gen_info.update({"usage": usage}) - return ChatGenerationChunk(message=chunk, generation_info=gen_info if gen_info else None) + return ChatGenerationChunk( + message=chunk, generation_info=gen_info if gen_info else None + ) def _process_response(self, response_json: dict) -> ChatResult: """Formats response in OpenAI spec. @@ -709,7 +729,9 @@ def _process_response(self, response_json: dict) -> ChatResult: if not isinstance(choices, list): raise TypeError("Endpoint response is not well formed.") except (KeyError, TypeError) as e: - raise ValueError("Error while formatting response payload for chat model of type") from e + raise ValueError( + "Error while formatting response payload for chat model of type" + ) from e for choice in choices: message = _convert_dict_to_message(choice["message"]) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index c015448..af6b6c7 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -106,7 +106,9 @@ def convert_oci_tool_call_to_langchain(tool_call: Any) -> ToolCall: return ToolCall( name=tool_call.name, - args=parsed if "arguments" in tool_call.attribute_map else tool_call.parameters, + args=parsed + if "arguments" in tool_call.attribute_map + else tool_call.parameters, id=tool_call.id if "id" in tool_call.attribute_map else uuid.uuid4().hex[:], ) @@ -176,14 +178,18 @@ def messages_to_oci_params(self, messages: Any, **kwargs: Any) -> Dict[str, Any] ... @abstractmethod - def convert_to_oci_tool(self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]) -> Dict[str, Any]: + def convert_to_oci_tool( + self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool] + ) -> Dict[str, Any]: """Convert a tool definition into the provider-specific OCI tool format.""" ... @abstractmethod def process_tool_choice( self, - tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], + tool_choice: Optional[ + Union[dict, str, Literal["auto", "none", "required", "any"], bool] + ], ) -> Optional[Any]: """Process tool choice parameter for the provider.""" ... @@ -256,7 +262,9 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: # Include tool calls if available if self.chat_tool_calls(response): - generation_info["tool_calls"] = self.format_response_tool_calls(self.chat_tool_calls(response)) + generation_info["tool_calls"] = self.format_response_tool_calls( + self.chat_tool_calls(response) + ) return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -336,7 +344,9 @@ def get_role(self, message: BaseMessage) -> str: return "TOOL" raise ValueError(f"Unknown message type: {type(message)}") - def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) -> Dict[str, Any]: + def messages_to_oci_params( + self, messages: Sequence[ChatMessage], **kwargs: Any + ) -> Dict[str, Any]: """ Convert LangChain messages to OCI parameters for Cohere. @@ -349,18 +359,27 @@ def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) for msg in messages[:-1]: role = self.get_role(msg) if role in ("USER", "SYSTEM"): - oci_chat_history.append(self.oci_chat_message[role](message=msg.content)) + oci_chat_history.append( + self.oci_chat_message[role](message=msg.content) + ) elif isinstance(msg, AIMessage): # Skip tool calls if forcing single step if msg.tool_calls and is_force_single_step: continue tool_calls = ( - [self.oci_tool_call(name=tc["name"], parameters=tc["args"]) for tc in msg.tool_calls] + [ + self.oci_tool_call(name=tc["name"], parameters=tc["args"]) + for tc in msg.tool_calls + ] if msg.tool_calls else None ) msg_content = msg.content if msg.content else " " - oci_chat_history.append(self.oci_chat_message[role](message=msg_content, tool_calls=tool_calls)) + oci_chat_history.append( + self.oci_chat_message[role]( + message=msg_content, tool_calls=tool_calls + ) + ) elif isinstance(msg, ToolMessage): oci_chat_history.append( self.oci_chat_message[self.get_role(msg)]( @@ -378,12 +397,16 @@ def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) for i, message in enumerate(messages[::-1]): current_turn.append(message) if isinstance(message, HumanMessage): - if len(messages) > i and isinstance(messages[len(messages) - i - 2], ToolMessage): + if len(messages) > i and isinstance( + messages[len(messages) - i - 2], ToolMessage + ): # add dummy message REPEATING the tool_result to avoid # the error about ToolMessage needing to be followed # by an AI message oci_chat_history.append( - self.oci_chat_message["CHATBOT"](message=messages[len(messages) - i - 2].content) + self.oci_chat_message["CHATBOT"]( + message=messages[len(messages) - i - 2].content + ) ) break current_turn = list(reversed(current_turn)) @@ -393,7 +416,9 @@ def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) for message in current_turn: if isinstance(message, ToolMessage): tool_msg = message - previous_ai_msgs = [m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls] + previous_ai_msgs = [ + m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls + ] if previous_ai_msgs: previous_ai_msg = previous_ai_msgs[-1] for lc_tool_call in previous_ai_msg.tool_calls: @@ -434,7 +459,9 @@ def convert_to_oci_tool( if isinstance(tool, BaseTool): return self.oci_tool( name=tool.name, - description=OCIUtils.remove_signature_from_tool_description(tool.name, tool.description), + description=OCIUtils.remove_signature_from_tool_description( + tool.name, tool.description + ), parameter_definitions={ p_name: self.oci_tool_param( description=p_def.get("description", ""), @@ -495,14 +522,21 @@ def convert_to_oci_tool( def process_tool_choice( self, - tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], + tool_choice: Optional[ + Union[dict, str, Literal["auto", "none", "required", "any"], bool] + ], ) -> Optional[Any]: """Cohere does not support tool choices.""" if tool_choice is not None: - raise ValueError("Tool choice is not supported for Cohere models.Please remove the tool_choice parameter.") + raise ValueError( + "Tool choice is not supported for Cohere models." + "Please remove the tool_choice parameter." + ) return None - def process_stream_tool_calls(self, event_data: Dict, tool_call_ids: Set[str]) -> List[ToolCallChunk]: + def process_stream_tool_calls( + self, event_data: Dict, tool_call_ids: Set[str] + ) -> List[ToolCallChunk]: """ Process Cohere stream tool calls and return them as ToolCallChunk objects. @@ -600,9 +634,11 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: # Include token usage if available if hasattr(response.data.chat_response, "usage") and response.data.chat_response.usage: generation_info["total_tokens"] = response.data.chat_response.usage.total_tokens - + if self.chat_tool_calls(response): - generation_info["tool_calls"] = self.format_response_tool_calls(self.chat_tool_calls(response)) + generation_info["tool_calls"] = self.format_response_tool_calls( + self.chat_tool_calls(response) + ) return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -678,7 +714,9 @@ def get_role(self, message: BaseMessage) -> str: return "TOOL" raise ValueError(f"Unknown message type: {type(message)}") - def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> Dict[str, Any]: + def messages_to_oci_params( + self, messages: List[BaseMessage], **kwargs: Any + ) -> Dict[str, Any]: """Convert LangChain messages to OCI chat parameters. Args: @@ -697,7 +735,9 @@ def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> role = self.get_role(message) if isinstance(message, ToolMessage): # For tool messages, wrap the content in a text content object. - tool_content = [self.oci_chat_message_text_content(text=str(message.content))] + tool_content = [ + self.oci_chat_message_text_content(text=str(message.content)) + ] if message.tool_call_id: oci_message = self.oci_chat_message[role]( content=tool_content, @@ -705,7 +745,9 @@ def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> ) else: oci_message = self.oci_chat_message[role](content=tool_content) - elif isinstance(message, AIMessage) and (message.tool_calls or message.additional_kwargs.get("tool_calls")): + elif isinstance(message, AIMessage) and ( + message.tool_calls or message.additional_kwargs.get("tool_calls") + ): # Process content and tool calls for assistant messages content = self._process_message_content(message.content) tool_calls = [] @@ -737,7 +779,10 @@ def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> # This addresses a known issue with Meta Llama models that # continue calling tools even after receiving results. - def _should_allow_more_tool_calls(messages: List[BaseMessage], max_tool_calls: int) -> bool: + def _should_allow_more_tool_calls( + messages: List[BaseMessage], + max_tool_calls: int + ) -> bool: """ Determine if the model should be allowed to call more tools. @@ -752,7 +797,10 @@ def _should_allow_more_tool_calls(messages: List[BaseMessage], max_tool_calls: i max_tool_calls: Maximum number of tool calls before forcing stop """ # Count total tool calls made so far - tool_call_count = sum(1 for msg in messages if isinstance(msg, ToolMessage)) + tool_call_count = sum( + 1 for msg in messages + if isinstance(msg, ToolMessage) + ) # Safety limit: prevent runaway tool calling if tool_call_count >= max_tool_calls: @@ -761,12 +809,12 @@ def _should_allow_more_tool_calls(messages: List[BaseMessage], max_tool_calls: i # Detect infinite loop: same tool called with same arguments in succession recent_calls = [] for msg in reversed(messages): - if hasattr(msg, "tool_calls") and msg.tool_calls: + if hasattr(msg, 'tool_calls') and msg.tool_calls: for tc in msg.tool_calls: # Create signature: (tool_name, sorted_args) try: - args_str = json.dumps(tc.get("args", {}), sort_keys=True) - signature = (tc.get("name", ""), args_str) + args_str = json.dumps(tc.get('args', {}), sort_keys=True) + signature = (tc.get('name', ''), args_str) # Check if this exact call was made in last 2 calls if signature in recent_calls[-2:]: @@ -793,7 +841,9 @@ def _should_allow_more_tool_calls(messages: List[BaseMessage], max_tool_calls: i return result - def _process_message_content(self, content: Union[str, List[Union[str, Dict]]]) -> List[Any]: + def _process_message_content( + self, content: Union[str, List[Union[str, Dict]]] + ) -> List[Any]: """Process message content into OCI chat content format. Args: @@ -820,15 +870,21 @@ def _process_message_content(self, content: Union[str, List[Union[str, Dict]]]) if item["type"] == "image_url": processed_content.append( self.oci_chat_message_image_content( - image_url=self.oci_chat_message_image_url(url=item["image_url"]["url"]) + image_url=self.oci_chat_message_image_url( + url=item["image_url"]["url"] + ) ) ) elif item["type"] == "text": - processed_content.append(self.oci_chat_message_text_content(text=item["text"])) + processed_content.append( + self.oci_chat_message_text_content(text=item["text"]) + ) else: raise ValueError(f"Unsupported content type: {item['type']}") else: - raise ValueError(f"Content items must be str or dict, got: {type(item)}") + raise ValueError( + f"Content items must be str or dict, got: {type(item)}" + ) return processed_content def convert_to_oci_tool( @@ -866,7 +922,9 @@ def convert_to_oci_tool( elif isinstance(tool, BaseTool): return self.oci_function_definition( name=tool.name, - description=OCIUtils.remove_signature_from_tool_description(tool.name, tool.description), + description=OCIUtils.remove_signature_from_tool_description( + tool.name, tool.description + ), parameters={ "type": "object", "properties": { @@ -876,7 +934,11 @@ def convert_to_oci_tool( } for p_name, p_def in tool.args.items() }, - "required": [p_name for p_name, p_def in tool.args.items() if "default" not in p_def], + "required": [ + p_name + for p_name, p_def in tool.args.items() + if "default" not in p_def + ], }, ) raise ValueError( @@ -887,7 +949,9 @@ def convert_to_oci_tool( def process_tool_choice( self, - tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], + tool_choice: Optional[ + Union[dict, str, Literal["auto", "none", "required", "any"], bool] + ], ) -> Optional[Any]: """Process tool choice for Meta provider. @@ -928,9 +992,14 @@ def process_tool_choice( elif isinstance(tool_choice, dict): # For Meta, we use ToolChoiceAuto for tool selection return self.oci_tool_choice_auto() - raise ValueError(f"Unrecognized tool_choice type. Expected str, bool or dict. Received: {tool_choice}") + raise ValueError( + f"Unrecognized tool_choice type. Expected str, bool or dict. " + f"Received: {tool_choice}" + ) - def process_stream_tool_calls(self, event_data: Dict, tool_call_ids: Set[str]) -> List[ToolCallChunk]: + def process_stream_tool_calls( + self, event_data: Dict, tool_call_ids: Set[str] + ) -> List[ToolCallChunk]: """ Process Meta stream tool calls and convert them to ToolCallChunks. @@ -1078,11 +1147,14 @@ def _prepare_request( except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. Please make sure you have the oci package installed." + "Could not import oci python package. " + "Please make sure you have the oci package installed." ) from ex oci_params = self._provider.messages_to_oci_params( - messages, max_sequential_tool_calls=self.max_sequential_tool_calls, **kwargs + messages, + max_sequential_tool_calls=self.max_sequential_tool_calls, + **kwargs ) oci_params["is_stream"] = stream @@ -1094,11 +1166,10 @@ def _prepare_request( # Warn if using max_tokens with OpenAI models if self.model_id and self.model_id.startswith("openai.") and "max_tokens" in _model_kwargs: import warnings - warnings.warn( - "OpenAI models require 'max_completion_tokens' instead of 'max_tokens'.", + f"OpenAI models require 'max_completion_tokens' instead of 'max_tokens'.", UserWarning, - stacklevel=2, + stacklevel=2 ) chat_params = {**_model_kwargs, **kwargs, **oci_params} @@ -1122,7 +1193,9 @@ def bind_tools( self, tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]], *, - tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]] = None, + tool_choice: Optional[ + Union[dict, str, Literal["auto", "none", "required", "any"], bool] + ] = None, **kwargs: Any, ) -> Runnable[LanguageModelInput, BaseMessage]: """Bind tool-like objects to this chat model. @@ -1158,7 +1231,9 @@ def with_structured_output( self, schema: Optional[Union[Dict, Type[BaseModel]]] = None, *, - method: Literal["function_calling", "json_schema", "json_mode"] = "function_calling", + method: Literal[ + "function_calling", "json_schema", "json_mode" + ] = "function_calling", include_raw: bool = False, **kwargs: Any, ) -> Runnable[LanguageModelInput, Union[Dict, BaseModel]]: @@ -1179,7 +1254,7 @@ def with_structured_output( used. Note that if using "json_mode" then you must include instructions for formatting the output into the desired schema into the model call. If "json_schema" then it allows the user to pass a json schema (or pydantic) - to the model for structured output. + to the model for structured output. include_raw: If False then only the parsed structured output is returned. If an error occurs during model output parsing it will be raised. If True @@ -1219,7 +1294,9 @@ def with_structured_output( first_tool_only=True, # type: ignore[list-item] ) else: - output_parser = JsonOutputKeyToolsParser(key_name=tool_name, first_tool_only=True) + output_parser = JsonOutputKeyToolsParser( + key_name=tool_name, first_tool_only=True + ) elif method == "json_mode": llm = self.bind(response_format={"type": "JSON_OBJECT"}) output_parser = ( @@ -1233,16 +1310,18 @@ def with_structured_output( if is_pydantic_schema else schema ) - + response_json_schema = self._provider.oci_response_json_schema( name=json_schema_dict.get("title", "response"), description=json_schema_dict.get("description", ""), schema=json_schema_dict, - is_strict=True, + is_strict=True ) - - response_format_obj = self._provider.oci_json_schema_response_format(json_schema=response_json_schema) - + + response_format_obj = self._provider.oci_json_schema_response_format( + json_schema=response_json_schema + ) + llm = self.bind(response_format=response_format_obj) if is_pydantic_schema: output_parser = PydanticOutputParser(pydantic_object=schema) @@ -1259,7 +1338,9 @@ def with_structured_output( parsed=itemgetter("raw") | output_parser, parsing_error=lambda _: None ) parser_none = RunnablePassthrough.assign(parsed=lambda _: None) - parser_with_fallback = parser_assign.with_fallbacks([parser_none], exception_key="parsing_error") + parser_with_fallback = parser_assign.with_fallbacks( + [parser_none], exception_key="parsing_error" + ) return RunnableMap(raw=llm) | parser_with_fallback return llm | output_parser @@ -1291,7 +1372,9 @@ def _generate( response = llm.invoke(messages) """ if self.is_stream: - stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs) + stream_iter = self._stream( + messages, stop=stop, run_manager=run_manager, **kwargs + ) return generate_from_stream(stream_iter) request = self._prepare_request(messages, stop=stop, stream=False, **kwargs) @@ -1322,7 +1405,9 @@ def _generate( tool_calls=tool_calls, ) return ChatResult( - generations=[ChatGeneration(message=message, generation_info=generation_info)], + generations=[ + ChatGeneration(message=message, generation_info=generation_info) + ], llm_output=llm_output, ) @@ -1348,7 +1433,9 @@ def _stream( if not self._provider.is_chat_stream_end(event_data): # Process streaming content delta = self._provider.chat_stream_to_text(event_data) - tool_call_chunks = self._provider.process_stream_tool_calls(event_data, tool_call_ids) + tool_call_chunks = self._provider.process_stream_tool_calls( + event_data, tool_call_ids + ) chunk = ChatGenerationChunk( message=AIMessageChunk( diff --git a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py index af49802..8f931f2 100644 --- a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py @@ -21,7 +21,9 @@ class TokenExpiredError(Exception): def _create_retry_decorator(llm) -> Callable[[Any], Any]: """Creates a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] - decorator = create_base_retry_decorator(error_types=errors, max_retries=llm.max_retries) + decorator = create_base_retry_decorator( + error_types=errors, max_retries=llm.max_retries + ) return decorator @@ -70,7 +72,8 @@ def validate_environment( # pylint: disable=no-self-argument except ImportError as ex: raise ImportError( - "Could not import ads python package. Please install it with `pip install oracle_ads`." + "Could not import ads python package. " + "Please install it with `pip install oracle_ads`." ) from ex if not values.get("auth", None): values["auth"] = ads.common.auth.default_signer() @@ -104,7 +107,9 @@ def _completion_with_retry(**kwargs: Any) -> Any: if response.status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err else: - raise ValueError(f"Server error: {str(http_err)}. Message: {response.text}") from http_err + raise ValueError( + f"Server error: {str(http_err)}. Message: {response.text}" + ) from http_err except Exception as e: raise ValueError(f"Error occurs by inference endpoint: {str(e)}") from e @@ -158,7 +163,9 @@ def _proceses_response(self, response: requests.Response) -> List[List[float]]: res_json = response.json() embeddings = res_json["data"][0]["embedding"] except Exception as e: - raise ValueError(f"Error raised by inference API: {e}.\nResponse: {response.text}") + raise ValueError( + f"Error raised by inference API: {e}.\nResponse: {response.text}" + ) return embeddings def embed_documents( @@ -178,7 +185,9 @@ def embed_documents( List of embeddings, one for each text. """ results = [] - _chunk_size = len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size + _chunk_size = ( + len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size + ) for i in range(0, len(texts), _chunk_size): response = self._embedding(texts[i : i + _chunk_size]) results.extend(response) diff --git a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py index ca6a479..edfb285 100644 --- a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py +++ b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py @@ -126,8 +126,12 @@ def validate_environment(cls, values: Dict) -> Dict: # pylint: disable=no-self- elif values["auth_type"] == OCIAuthType(2).name: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] - pk = oci.signer.load_private_key_from_file(oci_config.get("key_file"), None) - with open(oci_config.get("security_token_file"), encoding="utf-8") as f: + pk = oci.signer.load_private_key_from_file( + oci_config.get("key_file"), None + ) + with open( + oci_config.get("security_token_file"), encoding="utf-8" + ) as f: st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -135,19 +139,28 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] file_location=values["auth_file_location"], profile_name=values["auth_profile"], ) - client_kwargs["signer"] = make_security_token_signer(oci_config=client_kwargs["config"]) + client_kwargs["signer"] = make_security_token_signer( + oci_config=client_kwargs["config"] + ) elif values["auth_type"] == OCIAuthType(3).name: - client_kwargs["signer"] = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() + client_kwargs["signer"] = ( + oci.auth.signers.InstancePrincipalsSecurityTokenSigner() + ) elif values["auth_type"] == OCIAuthType(4).name: - client_kwargs["signer"] = oci.auth.signers.get_resource_principals_signer() + client_kwargs["signer"] = ( + oci.auth.signers.get_resource_principals_signer() + ) else: raise ValueError("Please provide valid value to auth_type") - values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient(**client_kwargs) + values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( + **client_kwargs + ) except ImportError as ex: raise ImportError( - "Could not import oci python package. Please make sure you have the oci package installed." + "Could not import oci python package. " + "Please make sure you have the oci package installed." ) from ex except Exception as e: raise ValueError( diff --git a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py index ee725ab..9089be1 100644 --- a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py @@ -52,11 +52,15 @@ class ServerError(Exception): def _create_retry_decorator( llm: "BaseOCIModelDeployment", *, - run_manager: Optional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]] = None, + run_manager: Optional[ + Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun] + ] = None, ) -> Callable[[Any], Any]: """Create a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] - decorator = create_base_retry_decorator(error_types=errors, max_retries=llm.max_retries, run_manager=run_manager) + decorator = create_base_retry_decorator( + error_types=errors, max_retries=llm.max_retries, run_manager=run_manager + ) return decorator @@ -93,7 +97,8 @@ def validate_environment(cls, values: Dict) -> Dict: except ImportError as ex: raise ImportError( - "Could not import ads python package. Please install it with `pip install oracle_ads`." + "Could not import ads python package. " + "Please install it with `pip install oracle_ads`." ) from ex if not values.get("auth", None): @@ -106,7 +111,9 @@ def validate_environment(cls, values: Dict) -> Dict: ) return values - def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: + def _headers( + self, is_async: Optional[bool] = False, body: Optional[dict] = None + ) -> Dict: """Construct and return the headers for a request. Args: @@ -150,7 +157,9 @@ def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None return headers - def completion_with_retry(self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Any: + def completion_with_retry( + self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any + ) -> Any: """Use tenacity to retry the completion call.""" retry_decorator = _create_retry_decorator(self, run_manager=run_manager) @@ -185,7 +194,9 @@ def _completion_with_retry(**kwargs: Any) -> Any: f"url={self.endpoint},timeout={request_timeout},stream={stream}. " f"Additional request kwargs={kwargs}." ) - raise RuntimeError(f"Error occurs by inference endpoint: {str(err)}") from err + raise RuntimeError( + f"Error occurs by inference endpoint: {str(err)}" + ) from err return _completion_with_retry(**kwargs) @@ -239,7 +250,9 @@ async def _completion_with_retry(**kwargs: Any) -> Any: f"Stream mode={stream}. " f"Requests kwargs: url={self.endpoint}, timeout={request_timeout}." ) - raise RuntimeError(f"Error occurs by inference endpoint: {str(err)}") from err + raise RuntimeError( + f"Error occurs by inference endpoint: {str(err)}" + ) from err return await _completion_with_retry(**kwargs) @@ -274,11 +287,17 @@ def _check_response(self, response: Any) -> None: try: response.raise_for_status() except requests.exceptions.HTTPError as http_err: - status_code = response.status_code if hasattr(response, "status_code") else response.status + status_code = ( + response.status_code + if hasattr(response, "status_code") + else response.status + ) if status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err - raise ServerError(f"Server error: {str(http_err)}. \nMessage: {response.text}") from http_err + raise ServerError( + f"Server error: {str(http_err)}. \nMessage: {response.text}" + ) from http_err def _parse_stream(self, lines: Iterator[bytes]) -> Iterator[str]: """Parse a stream of byte lines and yield parsed string lines. @@ -364,7 +383,9 @@ def _refresh_signer(self) -> bool: Returns: bool: `True` if the token was successfully refreshed, `False` otherwise. """ - if self.auth.get("signer", None) and hasattr(self.auth["signer"], "refresh_security_token"): + if self.auth.get("signer", None) and hasattr( + self.auth["signer"], "refresh_security_token" + ): self.auth["signer"].refresh_security_token() return True return False @@ -470,7 +491,9 @@ def _identifying_params(self) -> Dict[str, Any]: **self._default_params, } - def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: + def _headers( + self, is_async: Optional[bool] = False, body: Optional[dict] = None + ) -> Dict: """Construct and return the headers for a request. Args: @@ -515,7 +538,9 @@ def _generate( body = self._construct_json_body(prompt, params) if self.streaming: generation = GenerationChunk(text="") - for chunk in self._stream(prompt, stop=stop, run_manager=run_manager, **kwargs): + for chunk in self._stream( + prompt, stop=stop, run_manager=run_manager, **kwargs + ): generation += chunk generations.append([generation]) else: @@ -555,7 +580,9 @@ async def _agenerate( body = self._construct_json_body(prompt, params) if self.streaming: generation = GenerationChunk(text="") - async for chunk in self._astream(prompt, stop=stop, run_manager=run_manager, **kwargs): + async for chunk in self._astream( + prompt, stop=stop, run_manager=run_manager, **kwargs + ): generation += chunk generations.append([generation]) else: @@ -602,7 +629,9 @@ def _stream( params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(prompt, params) - response = self.completion_with_retry(data=body, run_manager=run_manager, stream=True, **requests_kwargs) + response = self.completion_with_retry( + data=body, run_manager=run_manager, stream=True, **requests_kwargs + ) for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line) if run_manager: @@ -661,7 +690,9 @@ def _construct_json_body(self, prompt: str, params: dict) -> dict: **params, } - def _invocation_params(self, stop: Optional[List[str]] = None, **kwargs: Any) -> dict: + def _invocation_params( + self, stop: Optional[List[str]] = None, **kwargs: Any + ) -> dict: """Combines the invocation parameters with default parameters.""" params = self._default_params _model_kwargs = self.model_kwargs or {} @@ -834,7 +865,9 @@ def _default_params(self) -> Dict[str, Any]: "best_of": self.best_of, "max_new_tokens": self.max_tokens, "temperature": self.temperature, - "top_k": (self.k if self.k > 0 else None), # `top_k` must be strictly positive' + "top_k": ( + self.k if self.k > 0 else None + ), # `top_k` must be strictly positive' "top_p": self.p, "do_sample": self.do_sample, "return_full_text": self.return_full_text, @@ -874,7 +907,9 @@ def _process_response(self, response_json: dict) -> List[Generation]: try: text = response_json["generated_text"] except KeyError as e: - raise ValueError(f"Error while formatting response payload.response_json={response_json}") from e + raise ValueError( + f"Error while formatting response payload.response_json={response_json}" + ) from e return [Generation(text=text)] diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index 41c0c90..3649e87 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -22,12 +22,10 @@ class Provider(ABC): @property @abstractmethod - def stop_sequence_key(self) -> str: - ... + def stop_sequence_key(self) -> str: ... @abstractmethod - def completion_response_to_text(self, response: Any) -> str: - ... + def completion_response_to_text(self, response: Any) -> str: ... class CohereProvider(Provider): @@ -122,7 +120,9 @@ class OCIGenAIBase(BaseModel, ABC): """Maximum tool calls before forcing final answer. Prevents infinite loops while allowing multi-step orchestration.""" - model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, protected_namespaces=()) + model_config = ConfigDict( + extra="forbid", arbitrary_types_allowed=True, protected_namespaces=() + ) @pre_init def validate_environment(cls, values: Dict) -> Dict: @@ -152,8 +152,12 @@ def validate_environment(cls, values: Dict) -> Dict: elif values["auth_type"] == OCIAuthType(2).name: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] - pk = oci.signer.load_private_key_from_file(oci_config.get("key_file"), None) - with open(oci_config.get("security_token_file"), encoding="utf-8") as f: + pk = oci.signer.load_private_key_from_file( + oci_config.get("key_file"), None + ) + with open( + oci_config.get("security_token_file"), encoding="utf-8" + ) as f: st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -161,19 +165,31 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] file_location=values["auth_file_location"], profile_name=values["auth_profile"], ) - client_kwargs["signer"] = make_security_token_signer(oci_config=client_kwargs["config"]) + client_kwargs["signer"] = make_security_token_signer( + oci_config=client_kwargs["config"] + ) elif values["auth_type"] == OCIAuthType(3).name: - client_kwargs["signer"] = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() + client_kwargs["signer"] = ( + oci.auth.signers.InstancePrincipalsSecurityTokenSigner() + ) elif values["auth_type"] == OCIAuthType(4).name: - client_kwargs["signer"] = oci.auth.signers.get_resource_principals_signer() + client_kwargs["signer"] = ( + oci.auth.signers.get_resource_principals_signer() + ) else: - raise ValueError(f"Please provide valid value to auth_type, {values['auth_type']} is not valid.") + raise ValueError( + "Please provide valid value to auth_type, " + f"{values['auth_type']} is not valid." + ) - values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient(**client_kwargs) + values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( + **client_kwargs + ) except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. Please make sure you have the oci package installed." + "Could not import oci python package. " + "Please make sure you have the oci package installed." ) from ex except Exception as e: raise ValueError( @@ -285,7 +301,10 @@ def _prepare_invocation_object( _model_kwargs[self._provider.stop_sequence_key] = stop if self.model_id is None: - raise ValueError("model_id is required to call the model, please provide the model_id.") + raise ValueError( + "model_id is required to call the model, " + "please provide the model_id." + ) if self.model_id.startswith(CUSTOM_ENDPOINT_PREFIX): serving_mode = models.DedicatedServingMode(endpoint_id=self.model_id) diff --git a/libs/oci/poetry.lock b/libs/oci/poetry.lock index 4e636a0..777ef7c 100644 --- a/libs/oci/poetry.lock +++ b/libs/oci/poetry.lock @@ -231,14 +231,14 @@ files = [ [[package]] name = "certifi" -version = "2025.10.5" +version = "2025.11.12" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main", "test", "test_integration"] files = [ - {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, - {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, + {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, + {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, ] [[package]] @@ -628,105 +628,105 @@ toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "coverage" -version = "7.11.0" +version = "7.11.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.10" groups = ["test"] markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" files = [ - {file = "coverage-7.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb53f1e8adeeb2e78962bade0c08bfdc461853c7969706ed901821e009b35e31"}, - {file = "coverage-7.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9a03ec6cb9f40a5c360f138b88266fd8f58408d71e89f536b4f91d85721d075"}, - {file = "coverage-7.11.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0d7f0616c557cbc3d1c2090334eddcbb70e1ae3a40b07222d62b3aa47f608fab"}, - {file = "coverage-7.11.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e44a86a47bbdf83b0a3ea4d7df5410d6b1a0de984fbd805fa5101f3624b9abe0"}, - {file = "coverage-7.11.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:596763d2f9a0ee7eec6e643e29660def2eef297e1de0d334c78c08706f1cb785"}, - {file = "coverage-7.11.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ef55537ff511b5e0a43edb4c50a7bf7ba1c3eea20b4f49b1490f1e8e0e42c591"}, - {file = "coverage-7.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cbabd8f4d0d3dc571d77ae5bdbfa6afe5061e679a9d74b6797c48d143307088"}, - {file = "coverage-7.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e24045453384e0ae2a587d562df2a04d852672eb63051d16096d3f08aa4c7c2f"}, - {file = "coverage-7.11.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:7161edd3426c8d19bdccde7d49e6f27f748f3c31cc350c5de7c633fea445d866"}, - {file = "coverage-7.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d4ed4de17e692ba6415b0587bc7f12bc80915031fc9db46a23ce70fc88c9841"}, - {file = "coverage-7.11.0-cp310-cp310-win32.whl", hash = "sha256:765c0bc8fe46f48e341ef737c91c715bd2a53a12792592296a095f0c237e09cf"}, - {file = "coverage-7.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:24d6f3128f1b2d20d84b24f4074475457faedc3d4613a7e66b5e769939c7d969"}, - {file = "coverage-7.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d58ecaa865c5b9fa56e35efc51d1014d4c0d22838815b9fce57a27dd9576847"}, - {file = "coverage-7.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b679e171f1c104a5668550ada700e3c4937110dbdd153b7ef9055c4f1a1ee3cc"}, - {file = "coverage-7.11.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ca61691ba8c5b6797deb221a0d09d7470364733ea9c69425a640f1f01b7c5bf0"}, - {file = "coverage-7.11.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:aef1747ede4bd8ca9cfc04cc3011516500c6891f1b33a94add3253f6f876b7b7"}, - {file = "coverage-7.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1839d08406e4cba2953dcc0ffb312252f14d7c4c96919f70167611f4dee2623"}, - {file = "coverage-7.11.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e0eb0a2dcc62478eb5b4cbb80b97bdee852d7e280b90e81f11b407d0b81c4287"}, - {file = "coverage-7.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bc1fbea96343b53f65d5351d8fd3b34fd415a2670d7c300b06d3e14a5af4f552"}, - {file = "coverage-7.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:214b622259dd0cf435f10241f1333d32caa64dbc27f8790ab693428a141723de"}, - {file = "coverage-7.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:258d9967520cca899695d4eb7ea38be03f06951d6ca2f21fb48b1235f791e601"}, - {file = "coverage-7.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cf9e6ff4ca908ca15c157c409d608da77a56a09877b97c889b98fb2c32b6465e"}, - {file = "coverage-7.11.0-cp311-cp311-win32.whl", hash = "sha256:fcc15fc462707b0680cff6242c48625da7f9a16a28a41bb8fd7a4280920e676c"}, - {file = "coverage-7.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:865965bf955d92790f1facd64fe7ff73551bd2c1e7e6b26443934e9701ba30b9"}, - {file = "coverage-7.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:5693e57a065760dcbeb292d60cc4d0231a6d4b6b6f6a3191561e1d5e8820b745"}, - {file = "coverage-7.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9c49e77811cf9d024b95faf86c3f059b11c0c9be0b0d61bc598f453703bd6fd1"}, - {file = "coverage-7.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a61e37a403a778e2cda2a6a39abcc895f1d984071942a41074b5c7ee31642007"}, - {file = "coverage-7.11.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c79cae102bb3b1801e2ef1511fb50e91ec83a1ce466b2c7c25010d884336de46"}, - {file = "coverage-7.11.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:16ce17ceb5d211f320b62df002fa7016b7442ea0fd260c11cec8ce7730954893"}, - {file = "coverage-7.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80027673e9d0bd6aef86134b0771845e2da85755cf686e7c7c59566cf5a89115"}, - {file = "coverage-7.11.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d3ffa07a08657306cd2215b0da53761c4d73cb54d9143b9303a6481ec0cd415"}, - {file = "coverage-7.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a3b6a5f8b2524fd6c1066bc85bfd97e78709bb5e37b5b94911a6506b65f47186"}, - {file = "coverage-7.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fcc0a4aa589de34bc56e1a80a740ee0f8c47611bdfb28cd1849de60660f3799d"}, - {file = "coverage-7.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dba82204769d78c3fd31b35c3d5f46e06511936c5019c39f98320e05b08f794d"}, - {file = "coverage-7.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81b335f03ba67309a95210caf3eb43bd6fe75a4e22ba653ef97b4696c56c7ec2"}, - {file = "coverage-7.11.0-cp312-cp312-win32.whl", hash = "sha256:037b2d064c2f8cc8716fe4d39cb705779af3fbf1ba318dc96a1af858888c7bb5"}, - {file = "coverage-7.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:d66c0104aec3b75e5fd897e7940188ea1892ca1d0235316bf89286d6a22568c0"}, - {file = "coverage-7.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:d91ebeac603812a09cf6a886ba6e464f3bbb367411904ae3790dfe28311b15ad"}, - {file = "coverage-7.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cc3f49e65ea6e0d5d9bd60368684fe52a704d46f9e7fc413918f18d046ec40e1"}, - {file = "coverage-7.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f39ae2f63f37472c17b4990f794035c9890418b1b8cca75c01193f3c8d3e01be"}, - {file = "coverage-7.11.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7db53b5cdd2917b6eaadd0b1251cf4e7d96f4a8d24e174bdbdf2f65b5ea7994d"}, - {file = "coverage-7.11.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10ad04ac3a122048688387828b4537bc9cf60c0bf4869c1e9989c46e45690b82"}, - {file = "coverage-7.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4036cc9c7983a2b1f2556d574d2eb2154ac6ed55114761685657e38782b23f52"}, - {file = "coverage-7.11.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ab934dd13b1c5e94b692b1e01bd87e4488cb746e3a50f798cb9464fd128374b"}, - {file = "coverage-7.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59a6e5a265f7cfc05f76e3bb53eca2e0dfe90f05e07e849930fecd6abb8f40b4"}, - {file = "coverage-7.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df01d6c4c81e15a7c88337b795bb7595a8596e92310266b5072c7e301168efbd"}, - {file = "coverage-7.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8c934bd088eed6174210942761e38ee81d28c46de0132ebb1801dbe36a390dcc"}, - {file = "coverage-7.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a03eaf7ec24078ad64a07f02e30060aaf22b91dedf31a6b24d0d98d2bba7f48"}, - {file = "coverage-7.11.0-cp313-cp313-win32.whl", hash = "sha256:695340f698a5f56f795b2836abe6fb576e7c53d48cd155ad2f80fd24bc63a040"}, - {file = "coverage-7.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:2727d47fce3ee2bac648528e41455d1b0c46395a087a229deac75e9f88ba5a05"}, - {file = "coverage-7.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:0efa742f431529699712b92ecdf22de8ff198df41e43aeaaadf69973eb93f17a"}, - {file = "coverage-7.11.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:587c38849b853b157706407e9ebdca8fd12f45869edb56defbef2daa5fb0812b"}, - {file = "coverage-7.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b971bdefdd75096163dd4261c74be813c4508477e39ff7b92191dea19f24cd37"}, - {file = "coverage-7.11.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:269bfe913b7d5be12ab13a95f3a76da23cf147be7fa043933320ba5625f0a8de"}, - {file = "coverage-7.11.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dadbcce51a10c07b7c72b0ce4a25e4b6dcb0c0372846afb8e5b6307a121eb99f"}, - {file = "coverage-7.11.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ed43fa22c6436f7957df036331f8fe4efa7af132054e1844918866cd228af6c"}, - {file = "coverage-7.11.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9516add7256b6713ec08359b7b05aeff8850c98d357784c7205b2e60aa2513fa"}, - {file = "coverage-7.11.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb92e47c92fcbcdc692f428da67db33337fa213756f7adb6a011f7b5a7a20740"}, - {file = "coverage-7.11.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d06f4fc7acf3cabd6d74941d53329e06bab00a8fe10e4df2714f0b134bfc64ef"}, - {file = "coverage-7.11.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:6fbcee1a8f056af07ecd344482f711f563a9eb1c2cad192e87df00338ec3cdb0"}, - {file = "coverage-7.11.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dbbf012be5f32533a490709ad597ad8a8ff80c582a95adc8d62af664e532f9ca"}, - {file = "coverage-7.11.0-cp313-cp313t-win32.whl", hash = "sha256:cee6291bb4fed184f1c2b663606a115c743df98a537c969c3c64b49989da96c2"}, - {file = "coverage-7.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a386c1061bf98e7ea4758e4313c0ab5ecf57af341ef0f43a0bf26c2477b5c268"}, - {file = "coverage-7.11.0-cp313-cp313t-win_arm64.whl", hash = "sha256:f9ea02ef40bb83823b2b04964459d281688fe173e20643870bb5d2edf68bc836"}, - {file = "coverage-7.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c770885b28fb399aaf2a65bbd1c12bf6f307ffd112d6a76c5231a94276f0c497"}, - {file = "coverage-7.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a3d0e2087dba64c86a6b254f43e12d264b636a39e88c5cc0a01a7c71bcfdab7e"}, - {file = "coverage-7.11.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73feb83bb41c32811973b8565f3705caf01d928d972b72042b44e97c71fd70d1"}, - {file = "coverage-7.11.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c6f31f281012235ad08f9a560976cc2fc9c95c17604ff3ab20120fe480169bca"}, - {file = "coverage-7.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9570ad567f880ef675673992222746a124b9595506826b210fbe0ce3f0499cd"}, - {file = "coverage-7.11.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8badf70446042553a773547a61fecaa734b55dc738cacf20c56ab04b77425e43"}, - {file = "coverage-7.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a09c1211959903a479e389685b7feb8a17f59ec5a4ef9afde7650bd5eabc2777"}, - {file = "coverage-7.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:5ef83b107f50db3f9ae40f69e34b3bd9337456c5a7fe3461c7abf8b75dd666a2"}, - {file = "coverage-7.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f91f927a3215b8907e214af77200250bb6aae36eca3f760f89780d13e495388d"}, - {file = "coverage-7.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdbcd376716d6b7fbfeedd687a6c4be019c5a5671b35f804ba76a4c0a778cba4"}, - {file = "coverage-7.11.0-cp314-cp314-win32.whl", hash = "sha256:bab7ec4bb501743edc63609320aaec8cd9188b396354f482f4de4d40a9d10721"}, - {file = "coverage-7.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d4ba9a449e9364a936a27322b20d32d8b166553bfe63059bd21527e681e2fad"}, - {file = "coverage-7.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:ce37f215223af94ef0f75ac68ea096f9f8e8c8ec7d6e8c346ee45c0d363f0479"}, - {file = "coverage-7.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f413ce6e07e0d0dc9c433228727b619871532674b45165abafe201f200cc215f"}, - {file = "coverage-7.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:05791e528a18f7072bf5998ba772fe29db4da1234c45c2087866b5ba4dea710e"}, - {file = "coverage-7.11.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cacb29f420cfeb9283b803263c3b9a068924474ff19ca126ba9103e1278dfa44"}, - {file = "coverage-7.11.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314c24e700d7027ae3ab0d95fbf8d53544fca1f20345fd30cd219b737c6e58d3"}, - {file = "coverage-7.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:630d0bd7a293ad2fc8b4b94e5758c8b2536fdf36c05f1681270203e463cbfa9b"}, - {file = "coverage-7.11.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e89641f5175d65e2dbb44db15fe4ea48fade5d5bbb9868fdc2b4fce22f4a469d"}, - {file = "coverage-7.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c9f08ea03114a637dab06cedb2e914da9dc67fa52c6015c018ff43fdde25b9c2"}, - {file = "coverage-7.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce9f3bde4e9b031eaf1eb61df95c1401427029ea1bfddb8621c1161dcb0fa02e"}, - {file = "coverage-7.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:e4dc07e95495923d6fd4d6c27bf70769425b71c89053083843fd78f378558996"}, - {file = "coverage-7.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:424538266794db2861db4922b05d729ade0940ee69dcf0591ce8f69784db0e11"}, - {file = "coverage-7.11.0-cp314-cp314t-win32.whl", hash = "sha256:4c1eeb3fb8eb9e0190bebafd0462936f75717687117339f708f395fe455acc73"}, - {file = "coverage-7.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b56efee146c98dbf2cf5cffc61b9829d1e94442df4d7398b26892a53992d3547"}, - {file = "coverage-7.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b5c2705afa83f49bd91962a4094b6b082f94aef7626365ab3f8f4bd159c5acf3"}, - {file = "coverage-7.11.0-py3-none-any.whl", hash = "sha256:4b7589765348d78fb4e5fb6ea35d07564e387da2fc5efff62e0222971f155f68"}, - {file = "coverage-7.11.0.tar.gz", hash = "sha256:167bd504ac1ca2af7ff3b81d245dfea0292c5032ebef9d66cc08a7d28c1b8050"}, + {file = "coverage-7.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c986537abca9b064510f3fd104ba33e98d3036608c7f2f5537f869bc10e1ee5"}, + {file = "coverage-7.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28c5251b3ab1d23e66f1130ca0c419747edfbcb4690de19467cd616861507af7"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4f2bb4ee8dd40f9b2a80bb4adb2aecece9480ba1fa60d9382e8c8e0bd558e2eb"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e5f4bfac975a2138215a38bda599ef00162e4143541cf7dd186da10a7f8e69f1"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f4cbfff5cf01fa07464439a8510affc9df281535f41a1f5312fbd2b59b4ab5c"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:31663572f20bf3406d7ac00d6981c7bbbcec302539d26b5ac596ca499664de31"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9799bd6a910961cb666196b8583ed0ee125fa225c6fdee2cbf00232b861f29d2"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:097acc18bedf2c6e3144eaf09b5f6034926c3c9bb9e10574ffd0942717232507"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6f033dec603eea88204589175782290a038b436105a8f3637a81c4359df27832"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd9ca2d44ed8018c90efb72f237a2a140325a4c3339971364d758e78b175f58e"}, + {file = "coverage-7.11.3-cp310-cp310-win32.whl", hash = "sha256:900580bc99c145e2561ea91a2d207e639171870d8a18756eb57db944a017d4bb"}, + {file = "coverage-7.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:c8be5bfcdc7832011b2652db29ed7672ce9d353dd19bce5272ca33dbcf60aaa8"}, + {file = "coverage-7.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:200bb89fd2a8a07780eafcdff6463104dec459f3c838d980455cfa84f5e5e6e1"}, + {file = "coverage-7.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d264402fc179776d43e557e1ca4a7d953020d3ee95f7ec19cc2c9d769277f06"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:385977d94fc155f8731c895accdfcc3dd0d9dd9ef90d102969df95d3c637ab80"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0542ddf6107adbd2592f29da9f59f5d9cff7947b5bb4f734805085c327dcffaa"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d60bf4d7f886989ddf80e121a7f4d140d9eac91f1d2385ce8eb6bda93d563297"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0a3b6e32457535df0d41d2d895da46434706dd85dbaf53fbc0d3bd7d914b362"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:876a3ee7fd2613eb79602e4cdb39deb6b28c186e76124c3f29e580099ec21a87"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a730cd0824e8083989f304e97b3f884189efb48e2151e07f57e9e138ab104200"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b5cd111d3ab7390be0c07ad839235d5ad54d2ca497b5f5db86896098a77180a4"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:074e6a5cd38e06671580b4d872c1a67955d4e69639e4b04e87fc03b494c1f060"}, + {file = "coverage-7.11.3-cp311-cp311-win32.whl", hash = "sha256:86d27d2dd7c7c5a44710565933c7dc9cd70e65ef97142e260d16d555667deef7"}, + {file = "coverage-7.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:ca90ef33a152205fb6f2f0c1f3e55c50df4ef049bb0940ebba666edd4cdebc55"}, + {file = "coverage-7.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:56f909a40d68947ef726ce6a34eb38f0ed241ffbe55c5007c64e616663bcbafc"}, + {file = "coverage-7.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b771b59ac0dfb7f139f70c85b42717ef400a6790abb6475ebac1ecee8de782f"}, + {file = "coverage-7.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:603c4414125fc9ae9000f17912dcfd3d3eb677d4e360b85206539240c96ea76e"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:77ffb3b7704eb7b9b3298a01fe4509cef70117a52d50bcba29cffc5f53dd326a"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4d4ca49f5ba432b0755ebb0fc3a56be944a19a16bb33802264bbc7311622c0d1"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05fd3fb6edff0c98874d752013588836f458261e5eba587afe4c547bba544afd"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0e920567f8c3a3ce68ae5a42cf7c2dc4bb6cc389f18bff2235dd8c03fa405de5"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4bec8c7160688bd5a34e65c82984b25409563134d63285d8943d0599efbc448e"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:adb9b7b42c802bd8cb3927de8c1c26368ce50c8fdaa83a9d8551384d77537044"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c8f563b245b4ddb591e99f28e3cd140b85f114b38b7f95b2e42542f0603eb7d7"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e2a96fdc7643c9517a317553aca13b5cae9bad9a5f32f4654ce247ae4d321405"}, + {file = "coverage-7.11.3-cp312-cp312-win32.whl", hash = "sha256:e8feeb5e8705835f0622af0fe7ff8d5cb388948454647086494d6c41ec142c2e"}, + {file = "coverage-7.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:abb903ffe46bd319d99979cdba350ae7016759bb69f47882242f7b93f3356055"}, + {file = "coverage-7.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:1451464fd855d9bd000c19b71bb7dafea9ab815741fb0bd9e813d9b671462d6f"}, + {file = "coverage-7.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84b892e968164b7a0498ddc5746cdf4e985700b902128421bb5cec1080a6ee36"}, + {file = "coverage-7.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f761dbcf45e9416ec4698e1a7649248005f0064ce3523a47402d1bff4af2779e"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1410bac9e98afd9623f53876fae7d8a5db9f5a0ac1c9e7c5188463cb4b3212e2"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:004cdcea3457c0ea3233622cd3464c1e32ebba9b41578421097402bee6461b63"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f067ada2c333609b52835ca4d4868645d3b63ac04fb2b9a658c55bba7f667d3"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:07bc7745c945a6d95676953e86ba7cebb9f11de7773951c387f4c07dc76d03f5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bba7e4743e37484ae17d5c3b8eb1ce78b564cb91b7ace2e2182b25f0f764cb5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbffc22d80d86fbe456af9abb17f7a7766e7b2101f7edaacc3535501691563f7"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:0dba4da36730e384669e05b765a2c49f39514dd3012fcc0398dd66fba8d746d5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ae12fe90b00b71a71b69f513773310782ce01d5f58d2ceb2b7c595ab9d222094"}, + {file = "coverage-7.11.3-cp313-cp313-win32.whl", hash = "sha256:12d821de7408292530b0d241468b698bce18dd12ecaf45316149f53877885f8c"}, + {file = "coverage-7.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:6bb599052a974bb6cedfa114f9778fedfad66854107cf81397ec87cb9b8fbcf2"}, + {file = "coverage-7.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:bb9d7efdb063903b3fdf77caec7b77c3066885068bdc0d44bc1b0c171033f944"}, + {file = "coverage-7.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:fb58da65e3339b3dbe266b607bb936efb983d86b00b03eb04c4ad5b442c58428"}, + {file = "coverage-7.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8d16bbe566e16a71d123cd66382c1315fcd520c7573652a8074a8fe281b38c6a"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8258f10059b5ac837232c589a350a2df4a96406d6d5f2a09ec587cbdd539655"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4c5627429f7fbff4f4131cfdd6abd530734ef7761116811a707b88b7e205afd7"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:465695268414e149bab754c54b0c45c8ceda73dd4a5c3ba255500da13984b16d"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ebcddfcdfb4c614233cff6e9a3967a09484114a8b2e4f2c7a62dc83676ba13f"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13b2066303a1c1833c654d2af0455bb009b6e1727b3883c9964bc5c2f643c1d0"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d8750dd20362a1b80e3cf84f58013d4672f89663aee457ea59336df50fab6739"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ab6212e62ea0e1006531a2234e209607f360d98d18d532c2fa8e403c1afbdd71"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a6b17c2b5e0b9bb7702449200f93e2d04cb04b1414c41424c08aa1e5d352da76"}, + {file = "coverage-7.11.3-cp313-cp313t-win32.whl", hash = "sha256:426559f105f644b69290ea414e154a0d320c3ad8a2bb75e62884731f69cf8e2c"}, + {file = "coverage-7.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:90a96fcd824564eae6137ec2563bd061d49a32944858d4bdbae5c00fb10e76ac"}, + {file = "coverage-7.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:1e33d0bebf895c7a0905fcfaff2b07ab900885fc78bba2a12291a2cfbab014cc"}, + {file = "coverage-7.11.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fdc5255eb4815babcdf236fa1a806ccb546724c8a9b129fd1ea4a5448a0bf07c"}, + {file = "coverage-7.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fe3425dc6021f906c6325d3c415e048e7cdb955505a94f1eb774dafc779ba203"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4ca5f876bf41b24378ee67c41d688155f0e54cdc720de8ef9ad6544005899240"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9061a3e3c92b27fd8036dafa26f25d95695b6aa2e4514ab16a254f297e664f83"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abcea3b5f0dc44e1d01c27090bc32ce6ffb7aa665f884f1890710454113ea902"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:68c4eb92997dbaaf839ea13527be463178ac0ddd37a7ac636b8bc11a51af2428"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:149eccc85d48c8f06547534068c41d69a1a35322deaa4d69ba1561e2e9127e75"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:08c0bcf932e47795c49f0406054824b9d45671362dfc4269e0bc6e4bff010704"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:39764c6167c82d68a2d8c97c33dba45ec0ad9172570860e12191416f4f8e6e1b"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3224c7baf34e923ffc78cb45e793925539d640d42c96646db62dbd61bbcfa131"}, + {file = "coverage-7.11.3-cp314-cp314-win32.whl", hash = "sha256:c713c1c528284d636cd37723b0b4c35c11190da6f932794e145fc40f8210a14a"}, + {file = "coverage-7.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:c381a252317f63ca0179d2c7918e83b99a4ff3101e1b24849b999a00f9cd4f86"}, + {file = "coverage-7.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:3e33a968672be1394eded257ec10d4acbb9af2ae263ba05a99ff901bb863557e"}, + {file = "coverage-7.11.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f9c96a29c6d65bd36a91f5634fef800212dff69dacdb44345c4c9783943ab0df"}, + {file = "coverage-7.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2ec27a7a991d229213c8070d31e3ecf44d005d96a9edc30c78eaeafaa421c001"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:72c8b494bd20ae1c58528b97c4a67d5cfeafcb3845c73542875ecd43924296de"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:60ca149a446da255d56c2a7a813b51a80d9497a62250532598d249b3cdb1a926"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb5069074db19a534de3859c43eec78e962d6d119f637c41c8e028c5ab3f59dd"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac5d5329c9c942bbe6295f4251b135d860ed9f86acd912d418dce186de7c19ac"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e22539b676fafba17f0a90ac725f029a309eb6e483f364c86dcadee060429d46"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2376e8a9c889016f25472c452389e98bc6e54a19570b107e27cde9d47f387b64"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4234914b8c67238a3c4af2bba648dc716aa029ca44d01f3d51536d44ac16854f"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0b4101e2b3c6c352ff1f70b3a6fcc7c17c1ab1a91ccb7a33013cb0782af9820"}, + {file = "coverage-7.11.3-cp314-cp314t-win32.whl", hash = "sha256:305716afb19133762e8cf62745c46c4853ad6f9eeba54a593e373289e24ea237"}, + {file = "coverage-7.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:9245bd392572b9f799261c4c9e7216bafc9405537d0f4ce3ad93afe081a12dc9"}, + {file = "coverage-7.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:9a1d577c20b4334e5e814c3d5fe07fa4a8c3ae42a601945e8d7940bab811d0bd"}, + {file = "coverage-7.11.3-py3-none-any.whl", hash = "sha256:351511ae28e2509c8d8cae5311577ea7dd511ab8e746ffc8814a0896c3d33fbe"}, + {file = "coverage-7.11.3.tar.gz", hash = "sha256:0f59387f5e6edbbffec2281affb71cdc85e0776c1745150a3ab9b6c1d016106b"}, ] [package.dependencies] @@ -1425,15 +1425,15 @@ vcr = ["vcrpy (>=7.0.0)"] [[package]] name = "langsmith" -version = "0.4.41" +version = "0.4.42" description = "Client library to connect to the LangSmith Observability and Evaluation Platform." optional = false python-versions = ">=3.10" groups = ["main", "test", "test_integration"] markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" files = [ - {file = "langsmith-0.4.41-py3-none-any.whl", hash = "sha256:5cdc554e5f0361bf791fdd5e8dea16d5ba9dfce09b3b8f8bba5e99450c569b27"}, - {file = "langsmith-0.4.41.tar.gz", hash = "sha256:b88d03bb157cf69d1afee250a658d847003babbbd9647f720edcc9b03a0857cd"}, + {file = "langsmith-0.4.42-py3-none-any.whl", hash = "sha256:015b0a0c17eb1a61293e8cbb7d41778a4b37caddd267d54274ba94e4721b301b"}, + {file = "langsmith-0.4.42.tar.gz", hash = "sha256:a6e808e47581403cb019b47c8c10627c1644f78ed4c03fa877d6ad661476c38f"}, ] [package.dependencies] @@ -1957,14 +1957,14 @@ files = [ [[package]] name = "oci" -version = "2.163.0" +version = "2.163.1" description = "Oracle Cloud Infrastructure Python SDK" optional = false python-versions = "*" groups = ["main"] files = [ - {file = "oci-2.163.0-py3-none-any.whl", hash = "sha256:f95dcde086879d0199c984b07296f32b18e23ac888be8243b62024c3b49258f5"}, - {file = "oci-2.163.0.tar.gz", hash = "sha256:02f4d69db74e76918709c8f7d2878edf8a931581d83fbc9238895fd0196bba81"}, + {file = "oci-2.163.1-py3-none-any.whl", hash = "sha256:232c51c5b39c4cbd381a48b6e61019ae592f747be07017e2f600610e9cac822c"}, + {file = "oci-2.163.1.tar.gz", hash = "sha256:3fedf9a2ff97de337a42358978a10a6a610bc954f53fb33601c729095fe47e41"}, ] [package.dependencies] @@ -3371,119 +3371,119 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wrapt" -version = "2.0.0" +version = "2.0.1" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" groups = ["test"] files = [ - {file = "wrapt-2.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a7cebcee61f21b1e46aa32db8d9d93826d0fbf1ad85defc2ccfb93b4adef1435"}, - {file = "wrapt-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:827e6e3a3a560f6ec1f5ee92d4319c21a0549384f896ec692f3201eda31ebd11"}, - {file = "wrapt-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a91075a5383a7cbfe46aed1845ef7c3f027e8e20e7d9a8a75e36ebc9b0dd15e"}, - {file = "wrapt-2.0.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b6a18c813196e18146b8d041e20875bdb0cb09b94ac1d1e1146e0fa87b2deb0d"}, - {file = "wrapt-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec5028d26011a53c76bd91bb6198b30b438c6e0f7adb45f2ad84fe2655b6a104"}, - {file = "wrapt-2.0.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bed9b04900204721a24bcefc652ca267b01c1e8ad8bc8c0cff81558a45a3aadc"}, - {file = "wrapt-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:03442f2b45fa3f2b98a94a1917f52fb34670de8f96c0a009c02dbd512d855a3d"}, - {file = "wrapt-2.0.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:17d0b5c42495ba142a1cee52b76414f9210591c84aae94dffda70240753bfb3c"}, - {file = "wrapt-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ee44215e7d13e112a8fc74e12ed1a1f41cab2bc07b11cc703f2398cd114b261c"}, - {file = "wrapt-2.0.0-cp310-cp310-win32.whl", hash = "sha256:fe6eafac3bc3c957ab6597a0c0654a0a308868458d00d218743e5b5fae51951c"}, - {file = "wrapt-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:9e070c3491397fba0445b8977900271eca9656570cca7c900d9b9352186703a0"}, - {file = "wrapt-2.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:806e2e73186eb5e3546f39fb5d0405040e0088db0fc8b2f667fd1863de2b3c99"}, - {file = "wrapt-2.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b7e221abb6c5387819db9323dac3c875b459695057449634f1111955d753c621"}, - {file = "wrapt-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1147a84c8fc852426580af8b6e33138461ddbc65aa459a25ea539374d32069fa"}, - {file = "wrapt-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d6691d4a711504a0bc10de789842ad6ac627bed22937b10f37a1211a8ab7bb3"}, - {file = "wrapt-2.0.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f460e1eb8e75a17c3918c8e35ba57625721eef2439ef0bcf05304ac278a65e1d"}, - {file = "wrapt-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:12c37784b77bf043bf65cc96c7195a5db474b8e54173208af076bdbb61df7b3e"}, - {file = "wrapt-2.0.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75e5c049eb583835f7a0e0e311d9dde9bfbaac723a6dd89d052540f9b2809977"}, - {file = "wrapt-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e50bcbd5b65dac21b82319fcf18486e6ac439947e9305034b00704eb7405f553"}, - {file = "wrapt-2.0.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:06b78cb6b9320f57737a52fede882640d93cface98332d1a3df0c5696ec9ae9f"}, - {file = "wrapt-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c8349ebfc3cd98bc9105e0112dd8c8ac1f3c7cb5601f9d02248cae83a63f748"}, - {file = "wrapt-2.0.0-cp311-cp311-win32.whl", hash = "sha256:028f19ec29e204fe725139d4a8b09f77ecfb64f8f02b7ab5ee822c85e330b68b"}, - {file = "wrapt-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:c6961f05e58d919153ba311b397b7b904b907132b7b8344dde47865d4bb5ec89"}, - {file = "wrapt-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:be7e316c2accd5a31dbcc230de19e2a846a325f8967fdea72704d00e38e6af06"}, - {file = "wrapt-2.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73c6f734aecb1a030d9a265c13a425897e1ea821b73249bb14471445467ca71c"}, - {file = "wrapt-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b4a7f8023b8ce8a36370154733c747f8d65c8697cb977d8b6efeb89291fff23e"}, - {file = "wrapt-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a1cb62f686c50e9dab5983c68f6c8e9cbf14a6007935e683662898a7d892fa69"}, - {file = "wrapt-2.0.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:43dc0550ae15e33e6bb45a82a5e1b5495be2587fbaa996244b509921810ee49f"}, - {file = "wrapt-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39c5b45b056d630545e40674d1f5e1b51864b3546f25ab6a4a331943de96262e"}, - {file = "wrapt-2.0.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:804e88f824b76240a1b670330637ccfd2d18b9efa3bb4f02eb20b2f64880b324"}, - {file = "wrapt-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c2c476aa3fc2b9899c3f7b20963fac4f952e7edb74a31fc92f7745389a2e3618"}, - {file = "wrapt-2.0.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8d851e526891216f89fcb7a1820dad9bd503ba3468fb9635ee28e93c781aa98e"}, - {file = "wrapt-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b95733c2360c4a8656ee93c7af78e84c0bd617da04a236d7a456c8faa34e7a2d"}, - {file = "wrapt-2.0.0-cp312-cp312-win32.whl", hash = "sha256:ea56817176834edf143df1109ae8fdaa087be82fdad3492648de0baa8ae82bf2"}, - {file = "wrapt-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c7d3bee7be7a2665286103f4d1f15405c8074e6e1f89dac5774f9357c9a3809"}, - {file = "wrapt-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:680f707e1d26acbc60926659799b15659f077df5897a6791c7c598a5d4a211c4"}, - {file = "wrapt-2.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e2ea096db28d5eb64d381af0e93464621ace38a7003a364b6b5ffb7dd713aabe"}, - {file = "wrapt-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c92b5a82d28491e3f14f037e1aae99a27a5e6e0bb161e65f52c0445a3fa7c940"}, - {file = "wrapt-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:81d234718aabe632d179fac52c7f69f0f99fbaac4d4bcd670e62462bbcbfcad7"}, - {file = "wrapt-2.0.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db2eea83c43f84e4e41dbbb4c1de371a53166e55f900a6b130c3ef51c6345c1a"}, - {file = "wrapt-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:65f50e356c425c061e1e17fe687ff30e294fed9bf3441dc1f13ef73859c2a817"}, - {file = "wrapt-2.0.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:887f2a667e3cbfb19e204032d42ad7dedaa43972e4861dc7a3d51ae951d9b578"}, - {file = "wrapt-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9054829da4be461e3ad3192e4b6bbf1fc18af64c9975ce613aec191924e004dc"}, - {file = "wrapt-2.0.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b952ffd77133a5a2798ee3feb18e51b0a299d2f440961e5bb7737dbb02e57289"}, - {file = "wrapt-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e25fde03c480061b8234d8ee4863eb5f40a9be4fb258ce105b364de38fc6bcf9"}, - {file = "wrapt-2.0.0-cp313-cp313-win32.whl", hash = "sha256:49e982b7860d325094978292a49e0418833fc7fc42c0dc7cd0b7524d7d06ee74"}, - {file = "wrapt-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:6e5c86389d9964050ce50babe247d172a5e3911d59a64023b90db2b4fa00ae7c"}, - {file = "wrapt-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:b96fdaa4611e05c7231937930567d3c16782be9dbcf03eb9f60d83e57dd2f129"}, - {file = "wrapt-2.0.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f2c7b7fead096dbf1dcc455b7f59facb05de3f5bfb04f60a69f98cdfe6049e5f"}, - {file = "wrapt-2.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:04c7c8393f25b11c0faa5d907dd9eb462e87e4e7ba55e308a046d7ed37f4bbe2"}, - {file = "wrapt-2.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a93e0f8b376c0735b2f4daf58018b4823614d2b896cb72b6641c4d3dbdca1d75"}, - {file = "wrapt-2.0.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b42d13603da4416c43c430dbc6313c8d7ff745c40942f146ed4f6dd02c7d2547"}, - {file = "wrapt-2.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8bbd2472abf8c33480ad2314b1f8fac45d592aba6cc093e8839a7b2045660e6"}, - {file = "wrapt-2.0.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e64a3a1fd9a308ab9b815a2ad7a65b679730629dbf85f8fc3f7f970d634ee5df"}, - {file = "wrapt-2.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d61214525eaf88e0d0edf3d1ad5b5889863c6f88e588c6cdc6aa4ee5d1f10a4a"}, - {file = "wrapt-2.0.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:04f7a5f92c5f7324a1735043cc467b1295a1c5b4e0c1395472b7c44706e3dc61"}, - {file = "wrapt-2.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2356f76cb99b3de5b4e5b8210367fbbb81c7309fe39b622f5d199dd88eb7f765"}, - {file = "wrapt-2.0.0-cp313-cp313t-win32.whl", hash = "sha256:0a921b657a224e40e4bc161b5d33934583b34f0c9c5bdda4e6ac66f9d2fcb849"}, - {file = "wrapt-2.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:c16f6d4eea98080f6659a8a7fc559d4a0a337ee66960659265cad2c8a40f7c0f"}, - {file = "wrapt-2.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:52878edc13dc151c58a9966621d67163a80654bc6cff4b2e1c79fa62d0352b26"}, - {file = "wrapt-2.0.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:79a53d86c2aff7b32cc77267e3a308365d1fcb881e74bc9cbe26f63ee90e37f0"}, - {file = "wrapt-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d731a4f22ed6ffa4cb551b4d2b0c24ff940c27a88edaf8e3490a5ee3a05aef71"}, - {file = "wrapt-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3e02ab8c0ac766a5a6e81cd3b6cc39200c69051826243182175555872522bd5a"}, - {file = "wrapt-2.0.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:895870602d65d7338edb3b6a717d856632ad9f14f7ff566214e4fb11f0816649"}, - {file = "wrapt-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b9ad4fab76a0086dc364c4f17f39ad289600e73ef5c6e9ab529aff22cac1ac3"}, - {file = "wrapt-2.0.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e7ca0562606d7bad2736b2c18f61295d61f50cd3f4bfc51753df13614dbcce1b"}, - {file = "wrapt-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe089d9f5a4a3dea0108a8ae34bced114d0c4cca417bada1c5e8f42d98af9050"}, - {file = "wrapt-2.0.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e761f2d2f8dbc80384af3d547b522a80e67db3e319c7b02e7fd97aded0a8a678"}, - {file = "wrapt-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:17ba1bdc52d0c783481850996aa26cea5237720769197335abea2ae6b4c23bc0"}, - {file = "wrapt-2.0.0-cp314-cp314-win32.whl", hash = "sha256:f73318741b141223a4674ba96992aa2291b1b3f7a5e85cb3c2c964f86171eb45"}, - {file = "wrapt-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8e08d4edb13cafe7b3260f31d4de033f73d3205774540cf583bffaa4bec97db9"}, - {file = "wrapt-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:af01695c2b7bbd8d67b869d8e3de2b123a7bfbee0185bdd138c2775f75373b83"}, - {file = "wrapt-2.0.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:057f02c13cce7b26c79624c06a3e1c2353e6dc9708525232232f6768118042ca"}, - {file = "wrapt-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:79bdd84570267f3f43d609c892ae2d30b91ee4b8614c2cbfd311a2965f1c9bdb"}, - {file = "wrapt-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:93c8b4f4d54fd401a817abbfc9bf482aa72fd447f8adf19ce81d035b3f5c762c"}, - {file = "wrapt-2.0.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5e09ffd31001dce71c2c2a4fc201bdba9a2f9f62b23700cf24af42266e784741"}, - {file = "wrapt-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d87c285ff04e26083c4b03546e7b74df7ba4f1f32f1dcb92e9ac13c2dbb4c379"}, - {file = "wrapt-2.0.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e52e50ea0a72ea48d1291cf8b8aaedcc99072d9dc5baba6b820486dcf4c67da8"}, - {file = "wrapt-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1fd4c95536975895f32571073446e614d5e2810b666b64955586dcddfd438fd3"}, - {file = "wrapt-2.0.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d6ebfe9283209220ed9de80a3e9442aab8fc2be5a9bbf8491b99e02ca9349a89"}, - {file = "wrapt-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5d3ebd784804f146b7ea55359beb138e23cc18e5a5cc2cf26ad438723c00ce3a"}, - {file = "wrapt-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:9b15940ae9debc8b40b15dc57e1ce4433f7fb9d3f8761c7fab1ddd94cb999d99"}, - {file = "wrapt-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7a0efbbc06d3e2077476a04f55859819d23206600b4c33f791359a8e6fa3c362"}, - {file = "wrapt-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:7fec8a9455c029c8cf4ff143a53b6e7c463268d42be6c17efa847ebd2f809965"}, - {file = "wrapt-2.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ac3d8beac68e4863c703b844fcc82693f83f933b37d2a54e9d513b2aab9c76aa"}, - {file = "wrapt-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4b8f8644602803add6848c81b7d214cfd397b1ebab2130dc8530570d888155c"}, - {file = "wrapt-2.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93cb5bff1fcd89b75f869e4f69566a91ab2c9f13e8edf0241fd5777b2fa6d48e"}, - {file = "wrapt-2.0.0-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0eb6d155d02c7525b7ec09856cda5e611fc6eb9ab40d140e1f35f27ac7d5eae"}, - {file = "wrapt-2.0.0-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:309dd467a94ee38a7aa5752bda64e660aeab5723b26200d0b65a375dad9add09"}, - {file = "wrapt-2.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a55e8edd08e2eece131d90d82cd1521962d9152829b22c56e68539526d605825"}, - {file = "wrapt-2.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:1724dd7b84d419c80ba839da81ad78b02ac30df626e5aefcb18e94632a965f13"}, - {file = "wrapt-2.0.0-cp38-cp38-win32.whl", hash = "sha256:f8255c380a79f6752d0b920e69a5d656d863675d9c433eeb5548518ee2c8d9da"}, - {file = "wrapt-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:829c8d46465dbae49dba91516f11200a2b5ea91eae8afaccbc035f0b651eb9c4"}, - {file = "wrapt-2.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:094d348ce7e6ce37bf6ed9a6ecc11886c96f447b3ffebc7539ca197daa9a997e"}, - {file = "wrapt-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98223acaa25b1449d993a3f4ffc8b5a03535e4041b37bf6a25459a0c74ee4cfc"}, - {file = "wrapt-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b79bf04c722035b1c474980dc1a64369feab7b703d6fe67da2d8664ed0bc980"}, - {file = "wrapt-2.0.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:623242959cb0c53f76baeb929be79f5f6a9a1673ef51628072b91bf299af2212"}, - {file = "wrapt-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:59dc94afc4542c7d9b9447fb2ae1168b5a29064eca4061dbbf3b3c26df268334"}, - {file = "wrapt-2.0.0-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7c532cc9f0a9e6017f8d3c37f478a3e3a5dffa955ebba556274e5e916c058f7"}, - {file = "wrapt-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9d72c725cefbcc8ebab85c8352e5062ae87b6e323858e934e16b54ced580435a"}, - {file = "wrapt-2.0.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:2ca35b83497276c2ca0b072d2c00da2edde4c2a6c8c650eafcd1a006c17ab231"}, - {file = "wrapt-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2fc55d0da29318a5da33c2827aef8946bba046ac609a4784a90faff73c511174"}, - {file = "wrapt-2.0.0-cp39-cp39-win32.whl", hash = "sha256:9c100b0598f3763274f2033bcc0454de7486409f85bc6da58b49e5971747eb36"}, - {file = "wrapt-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:1316972a72c67936a07dbb48e2464356d91dd9674335aaec087b60094d87750b"}, - {file = "wrapt-2.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:5aad54ff45da9784573099696fd84841c7e559ce312f02afa6aa7e89b58e2c2f"}, - {file = "wrapt-2.0.0-py3-none-any.whl", hash = "sha256:02482fb0df89857e35427dfb844319417e14fae05878f295ee43fa3bf3b15502"}, - {file = "wrapt-2.0.0.tar.gz", hash = "sha256:35a542cc7a962331d0279735c30995b024e852cf40481e384fd63caaa391cbb9"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64b103acdaa53b7caf409e8d45d39a8442fe6dcfec6ba3f3d141e0cc2b5b4dbd"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91bcc576260a274b169c3098e9a3519fb01f2989f6d3d386ef9cbf8653de1374"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab594f346517010050126fcd822697b25a7031d815bb4fbc238ccbe568216489"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25"}, + {file = "wrapt-2.0.1-cp310-cp310-win32.whl", hash = "sha256:8330b42d769965e96e01fa14034b28a2a7600fbf7e8f0cc90ebb36d492c993e4"}, + {file = "wrapt-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:1218573502a8235bb8a7ecaed12736213b22dcde9feab115fa2989d42b5ded45"}, + {file = "wrapt-2.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:eda8e4ecd662d48c28bb86be9e837c13e45c58b8300e43ba3c9b4fa9900302f7"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df0b6d3b95932809c5b3fecc18fda0f1e07452d05e2662a0b35548985f256e28"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da7384b0e5d4cae05c97cd6f94faaf78cc8b0f791fc63af43436d98c4ab37bb"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ec65a78fbd9d6f083a15d7613b2800d5663dbb6bb96003899c834beaa68b242c"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7de3cc939be0e1174969f943f3b44e0d79b6f9a82198133a5b7fc6cc92882f16"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fb1a5b72cbd751813adc02ef01ada0b0d05d3dcbc32976ce189a1279d80ad4a2"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3fa272ca34332581e00bf7773e993d4f632594eb2d1b0b162a9038df0fd971dd"}, + {file = "wrapt-2.0.1-cp311-cp311-win32.whl", hash = "sha256:fc007fdf480c77301ab1afdbb6ab22a5deee8885f3b1ed7afcb7e5e84a0e27be"}, + {file = "wrapt-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:47434236c396d04875180171ee1f3815ca1eada05e24a1ee99546320d54d1d1b"}, + {file = "wrapt-2.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:837e31620e06b16030b1d126ed78e9383815cbac914693f54926d816d35d8edf"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb"}, + {file = "wrapt-2.0.1-cp312-cp312-win32.whl", hash = "sha256:3e271346f01e9c8b1130a6a3b0e11908049fe5be2d365a5f402778049147e7e9"}, + {file = "wrapt-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:2da620b31a90cdefa9cd0c2b661882329e2e19d1d7b9b920189956b76c564d75"}, + {file = "wrapt-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:aea9c7224c302bc8bfc892b908537f56c430802560e827b75ecbde81b604598b"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b"}, + {file = "wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7"}, + {file = "wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3"}, + {file = "wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e"}, + {file = "wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c"}, + {file = "wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92"}, + {file = "wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed"}, + {file = "wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0"}, + {file = "wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c"}, + {file = "wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349"}, + {file = "wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c"}, + {file = "wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395"}, + {file = "wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:90897ea1cf0679763b62e79657958cd54eae5659f6360fc7d2ccc6f906342183"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:50844efc8cdf63b2d90cd3d62d4947a28311e6266ce5235a219d21b195b4ec2c"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49989061a9977a8cbd6d20f2efa813f24bf657c6990a42967019ce779a878dbf"}, + {file = "wrapt-2.0.1-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:09c7476ab884b74dce081ad9bfd07fe5822d8600abade571cb1f66d5fc915af6"}, + {file = "wrapt-2.0.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1a8a09a004ef100e614beec82862d11fc17d601092c3599afd22b1f36e4137e"}, + {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:89a82053b193837bf93c0f8a57ded6e4b6d88033a499dadff5067e912c2a41e9"}, + {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f26f8e2ca19564e2e1fdbb6a0e47f36e0efbab1acc31e15471fad88f828c75f6"}, + {file = "wrapt-2.0.1-cp38-cp38-win32.whl", hash = "sha256:115cae4beed3542e37866469a8a1f2b9ec549b4463572b000611e9946b86e6f6"}, + {file = "wrapt-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c4012a2bd37059d04f8209916aa771dfb564cccb86079072bdcd48a308b6a5c5"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:68424221a2dc00d634b54f92441914929c5ffb1c30b3b837343978343a3512a3"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bd1a18f5a797fe740cb3d7a0e853a8ce6461cc62023b630caec80171a6b8097"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb3a86e703868561c5cad155a15c36c716e1ab513b7065bd2ac8ed353c503333"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5dc1b852337c6792aa111ca8becff5bacf576bf4a0255b0f05eb749da6a1643e"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c046781d422f0830de6329fa4b16796096f28a92c8aef3850674442cdcb87b7f"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f73f9f7a0ebd0db139253d27e5fc8d2866ceaeef19c30ab5d69dcbe35e1a6981"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b667189cf8efe008f55bbda321890bef628a67ab4147ebf90d182f2dadc78790"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:a9a83618c4f0757557c077ef71d708ddd9847ed66b7cc63416632af70d3e2308"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e9b121e9aeb15df416c2c960b8255a49d44b4038016ee17af03975992d03931"}, + {file = "wrapt-2.0.1-cp39-cp39-win32.whl", hash = "sha256:1f186e26ea0a55f809f232e92cc8556a0977e00183c3ebda039a807a42be1494"}, + {file = "wrapt-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bf4cb76f36be5de950ce13e22e7fdf462b35b04665a12b64f3ac5c1bbbcf3728"}, + {file = "wrapt-2.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:d6cc985b9c8b235bd933990cdbf0f891f8e010b65a3911f7a55179cd7b0fc57b"}, + {file = "wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca"}, + {file = "wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f"}, ] [package.extras] diff --git a/libs/oci/pyproject.toml b/libs/oci/pyproject.toml index 0a977b0..f577df4 100644 --- a/libs/oci/pyproject.toml +++ b/libs/oci/pyproject.toml @@ -60,10 +60,6 @@ optional = true [tool.poetry.group.dev.dependencies] -[tool.ruff] -line-length = 120 # Increase from default 88 to 120 -exclude = ["*.ipynb"] - [tool.ruff.lint] select = [ "E", # pycodestyle @@ -74,7 +70,7 @@ select = [ [tool.mypy] ignore_missing_imports = "True" -disable_error_code = ["attr-defined", "assignment", "var-annotated", "override", "union-attr", "arg-type"] +disallow_untyped_defs = "True" [tool.coverage.run] omit = ["tests/*"] diff --git a/libs/oci/tests/conftest.py b/libs/oci/tests/conftest.py index 6f22c00..2c0afee 100644 --- a/libs/oci/tests/conftest.py +++ b/libs/oci/tests/conftest.py @@ -43,5 +43,7 @@ def test_something(): required_pkgs_info[pkg] = installed if not required_pkgs_info[pkg]: - item.add_marker(pytest.mark.skip(reason=f"Requires pkg: `{pkg}`")) - break + item.add_marker( + pytest.mark.skip(reason=f"Requires pkg: `{pkg}`") + ) + break \ No newline at end of file diff --git a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py index 8070d5a..6361608 100644 --- a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py +++ b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py @@ -84,7 +84,9 @@ def weather_tool(): def create_agent(model_id: str, weather_tool: StructuredTool): """Create a LangGraph agent with tool calling.""" region = os.getenv("OCI_REGION", "us-chicago-1") - endpoint = f"https://inference.generativeai.{region}.oci.oraclecloud.com" + endpoint = ( + f"https://inference.generativeai.{region}.oci.oraclecloud.com" + ) chat_model = ChatOCIGenAI( model_id=model_id, service_endpoint=endpoint, @@ -147,7 +149,10 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo agent = create_agent(model_id, weather_tool) # Invoke the agent - system_msg = "You are a helpful assistant. Use the available tools when needed to answer questions accurately." + system_msg = ( + "You are a helpful assistant. Use the available tools when " + "needed to answer questions accurately." + ) result = agent.invoke( { "messages": [ @@ -164,22 +169,35 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo assert len(messages) >= 4, expected # Find tool messages - tool_messages = [msg for msg in messages if type(msg).__name__ == "ToolMessage"] + tool_messages = [ + msg for msg in messages if type(msg).__name__ == "ToolMessage" + ] assert len(tool_messages) >= 1, "Should have at least one tool result" # Find AI messages with tool calls ai_tool_calls = [ - msg for msg in messages if (type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls) + msg + for msg in messages + if ( + type(msg).__name__ == "AIMessage" + and hasattr(msg, "tool_calls") + and msg.tool_calls + ) ] # The model should call the tool, but after receiving results, # should not call again. Allow flexibility - some models might make # 1 call, others might need 2, but should stop - error_msg = f"Model made too many tool calls ({len(ai_tool_calls)}), possible infinite loop" + error_msg = ( + f"Model made too many tool calls ({len(ai_tool_calls)}), " + "possible infinite loop" + ) assert len(ai_tool_calls) <= 2, error_msg # Verify final message is an AI response without tool calls final_message = messages[-1] - assert type(final_message).__name__ == "AIMessage", "Final message should be AIMessage" + assert type(final_message).__name__ == "AIMessage", ( + "Final message should be AIMessage" + ) assert final_message.content, "Final message should have content" assert not ( hasattr(final_message, "tool_calls") and final_message.tool_calls @@ -266,7 +284,6 @@ def test_multi_step_tool_orchestration(model_id: str): multi-step investigations requiring several tool calls before providing a final analysis. """ - # Create diagnostic tools that simulate a monitoring workflow def check_status(resource: str) -> str: """Check the status of a resource.""" @@ -274,12 +291,17 @@ def check_status(resource: str) -> str: "payment-service": "Status: Running, Memory: 95%, Restarts: 12", "web-server": "Status: Running, Memory: 60%, Restarts: 0", } - return status_data.get(resource, f"Resource {resource} status: Unknown") + return status_data.get( + resource, f"Resource {resource} status: Unknown" + ) def get_events(resource: str) -> str: """Get recent events for a resource.""" events_data = { - "payment-service": ("Events: [OOMKilled at 14:23, BackOff at 14:30, Started at 14:32]"), + "payment-service": ( + "Events: [OOMKilled at 14:23, " + "BackOff at 14:30, Started at 14:32]" + ), "web-server": "Events: [Started at 10:00, Healthy]", } return events_data.get(resource, f"No events for {resource}") @@ -287,7 +309,10 @@ def get_events(resource: str) -> str: def get_metrics(resource: str) -> str: """Get historical metrics for a resource.""" metrics_data = { - "payment-service": ("Memory trend: 70%→80%→90%→95% (gradual increase over 2h)"), + "payment-service": ( + "Memory trend: 70%→80%→90%→95% " + "(gradual increase over 2h)" + ), "web-server": "Memory trend: 55%→58%→60% (stable)", } return metrics_data.get(resource, f"No metrics for {resource}") @@ -344,7 +369,9 @@ def take_action(resource: str, action: str) -> str: # Create agent with higher recursion limit to allow multi-step region = os.getenv("OCI_REGION", "us-chicago-1") - endpoint = f"https://inference.generativeai.{region}.oci.oraclecloud.com" + endpoint = ( + f"https://inference.generativeai.{region}.oci.oraclecloud.com" + ) chat_model = ChatOCIGenAI( model_id=model_id, service_endpoint=endpoint, @@ -366,7 +393,11 @@ def call_model(state: MessagesState): response = model_with_tools.invoke(messages) # OCI LIMITATION: Only allow ONE tool call at a time - if hasattr(response, "tool_calls") and response.tool_calls and len(response.tool_calls) > 1: + if ( + hasattr(response, "tool_calls") + and response.tool_calls + and len(response.tool_calls) > 1 + ): # Some models try to call multiple tools in parallel # Restrict to first tool only to avoid OCI API error response.tool_calls = [response.tool_calls[0]] @@ -426,33 +457,45 @@ def should_continue(state: MessagesState): # Count tool calls tool_call_messages = [ - msg for msg in messages if (type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls) + msg + for msg in messages + if ( + type(msg).__name__ == "AIMessage" + and hasattr(msg, "tool_calls") + and msg.tool_calls + ) + ] + tool_result_messages = [ + msg for msg in messages if type(msg).__name__ == "ToolMessage" ] - tool_result_messages = [msg for msg in messages if type(msg).__name__ == "ToolMessage"] # Verify multi-step orchestration worked - msg = f"Should have made multiple tool calls (got {len(tool_call_messages)})" + msg = ( + f"Should have made multiple tool calls (got {len(tool_call_messages)})" + ) assert len(tool_call_messages) >= 2, msg # CRITICAL: Verify max_sequential_tool_calls limit was respected # The agent should stop at or before the limit (8 tool calls) # This is the key protection against infinite loops - assert ( - len(tool_call_messages) <= 8 - ), f"Too many tool calls ({len(tool_call_messages)}), max_sequential_tool_calls limit not enforced" + assert len(tool_call_messages) <= 8, ( + f"Too many tool calls ({len(tool_call_messages)}), " + "max_sequential_tool_calls limit not enforced" + ) # Verify tool results were received - assert len(tool_result_messages) >= 2, "Should have received multiple tool results" + assert len(tool_result_messages) >= 2, ( + "Should have received multiple tool results" + ) # Verify agent eventually stopped (didn't loop infinitely) # The final message might still have tool_calls if the agent hit # the max_sequential_tool_calls limit, which is expected behavior. # The key is that it STOPPED (didn't continue infinitely). final_message = messages[-1] - assert type(final_message).__name__ in [ - "AIMessage", - "ToolMessage", - ], "Final message should be AIMessage or ToolMessage" + assert type(final_message).__name__ in ["AIMessage", "ToolMessage"], ( + "Final message should be AIMessage or ToolMessage" + ) # Verify the agent didn't hit infinite loop by checking message count # With max_sequential_tool_calls=8, we expect roughly: diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py index de98c6f..0bb01c8 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py @@ -49,7 +49,10 @@ ] CONST_STREAM_RESPONSE = ( content - for content in [CONST_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS] + for content in [ + CONST_STREAM_TEMPLATE.replace("", delta).encode() + for delta in CONST_STREAM_DELTAS + ] + [b"data: [DONE]"] ) @@ -58,10 +61,13 @@ '"model":"odsc-llm","choices":[{"index":0,"delta":,"finish_reason":null}]}' ) CONST_ASYNC_STREAM_RESPONSE = ( - CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS + CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() + for delta in CONST_STREAM_DELTAS ) -pytestmark = pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires Python 3.9 or higher") +pytestmark = pytest.mark.skipif( + sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" +) class MockResponse: @@ -138,7 +144,9 @@ def test_invoke_tgi(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_stream_vllm(*args: Any) -> None: """Tests streaming with vLLM endpoint using OpenAI spec.""" - llm = ChatOCIModelDeploymentVLLM(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) + llm = ChatOCIModelDeploymentVLLM( + endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = None count = 0 @@ -155,7 +163,9 @@ def test_stream_vllm(*args: Any) -> None: assert str(output.content).strip() == CONST_COMPLETION -async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGenerator[bytes, None]: +async def mocked_async_streaming_response( + *args: Any, **kwargs: Any +) -> AsyncGenerator[bytes, None]: """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -164,14 +174,18 @@ async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGen @pytest.mark.asyncio @pytest.mark.requires("ads") @pytest.mark.requires("langchain_openai") -@mock.patch("ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock())) +@mock.patch( + "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) +) @mock.patch( "langchain_oci.llms.oci_data_science_model_deployment_endpoint.BaseOCIModelDeployment._arequest", mock.MagicMock(), ) async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" - llm = ChatOCIModelDeploymentVLLM(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) + llm = ChatOCIModelDeploymentVLLM( + endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py index ddb6858..eaa94cb 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py @@ -23,7 +23,9 @@ def __getattr__(self, val): # type: ignore[no-untyped-def] @pytest.mark.requires("oci") -@pytest.mark.parametrize("test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"]) +@pytest.mark.parametrize( + "test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"] +) def test_llm_chat(monkeypatch: MonkeyPatch, test_model_id: str) -> None: """Test valid chat call to OCI Generative AI LLM service.""" oci_gen_ai_client = MagicMock() @@ -149,7 +151,7 @@ def mocked_response(*args): # type: ignore[no-untyped-def] expected = "Assistant chat reply." actual = llm.invoke(messages, temperature=0.2) assert actual.content == expected - + # Test total_tokens in additional_kwargs assert "total_tokens" in actual.additional_kwargs if provider == "cohere": @@ -266,7 +268,9 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] { "message": MockResponseDict( { - "content": [MockResponseDict({"text": ""})], + "content": [ + MockResponseDict({"text": ""}) + ], "tool_calls": [ MockResponseDict( { @@ -274,7 +278,7 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] "id": "call_escaped", "name": "get_weather", # Escaped JSON (the bug scenario) - "arguments": '"{\\"location\\": \\"San Francisco\\"}"', + "arguments": '"{\\\"location\\\": \\\"San Francisco\\\"}"', "attribute_map": { "id": "id", "type": "type", @@ -324,7 +328,9 @@ def get_weather(location: str) -> str: messages = [HumanMessage(content="What's the weather like?")] # Test that tool choice raises ValueError - with pytest.raises(ValueError, match="Tool choice is not supported for Cohere models"): + with pytest.raises( + ValueError, match="Tool choice is not supported for Cohere models" + ): llm.bind_tools( tools=[get_weather], tool_choice="auto", @@ -530,7 +536,7 @@ class WeatherResponse(BaseModel): def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] # Verify that response_format is a JsonSchemaResponseFormat object request = args[0] - assert hasattr(request.chat_request, "response_format") + assert hasattr(request.chat_request, 'response_format') assert request.chat_request.response_format is not None return MockResponseDict( @@ -577,7 +583,9 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: from unittest.mock import patch with patch("oci.config.from_file") as mock_from_file: - with patch("oci.generative_ai_inference.generative_ai_inference_client.validate_config"): + with patch( + "oci.generative_ai_inference.generative_ai_inference_client.validate_config" + ): with patch("oci.base_client.validate_config"): with patch("oci.signer.load_private_key"): custom_config_path = "/custom/path/config" @@ -585,7 +593,9 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: model_id="cohere.command-r-16k", auth_file_location=custom_config_path, ) - mock_from_file.assert_called_once_with(file_location=custom_config_path, profile_name="DEFAULT") + mock_from_file.assert_called_once_with( + file_location=custom_config_path, profile_name="DEFAULT" + ) @pytest.mark.requires("oci") @@ -631,7 +641,9 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] messages = [HumanMessage(content="What's the weather like?")] # Test with include_raw=True - structured_llm = llm.with_structured_output(WeatherResponse, method="json_schema", include_raw=True) + structured_llm = llm.with_structured_output( + WeatherResponse, method="json_schema", include_raw=True + ) response = structured_llm.invoke(messages) assert isinstance(response, dict) assert "parsed" in response @@ -656,10 +668,12 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] # Check if the request contains tool_calls in the message request = args[0] has_chat_request = hasattr(request, "chat_request") - has_messages = has_chat_request and hasattr(request.chat_request, "messages") + has_messages = has_chat_request and hasattr( + request.chat_request, "messages" + ) if has_messages: for msg in request.chat_request.messages: - if hasattr(msg, "tool_calls") and msg.tool_calls: + if hasattr(msg, 'tool_calls') and msg.tool_calls: tool_calls_processed = True break return MockResponseDict( @@ -680,7 +694,9 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "content": [ MockResponseDict( { - "text": ("I'll help you."), + "text": ( + "I'll help you." + ), "type": "TEXT", } ) @@ -715,7 +731,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "name": "get_weather", "args": {"location": "San Francisco"}, } - ], + ] ) messages = [ai_message] @@ -728,7 +744,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] @pytest.mark.requires("oci") def test_ai_message_tool_calls_additional_kwargs(monkeypatch: MonkeyPatch) -> None: """Test AIMessage with tool_calls in additional_kwargs field.""" - + oci_gen_ai_client = MagicMock() llm = ChatOCIGenAI(model_id="meta.llama-3.3-70b-instruct", client=oci_gen_ai_client) @@ -751,7 +767,9 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "content": [ MockResponseDict( { - "text": ("I'll help you."), + "text": ( + "I'll help you." + ), "type": "TEXT", } ) @@ -788,7 +806,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "args": {"location": "New York"}, } ] - }, + } ) messages = [ai_message] @@ -826,7 +844,7 @@ def test_tool_choice_none_after_tool_results() -> None: llm = ChatOCIGenAI( model_id="meta.llama-3.3-70b-instruct", client=oci_gen_ai_client, - max_sequential_tool_calls=3, # Set limit to 3 for testing + max_sequential_tool_calls=3 # Set limit to 3 for testing ) # Define a simple tool function (following the pattern from other tests) @@ -844,29 +862,22 @@ def get_weather(city: str) -> str: # Create conversation with 3 ToolMessages (at the limit) messages = [ HumanMessage(content="What's the weather?"), - AIMessage( - content="", - tool_calls=[{"id": "call_1", "name": "get_weather", "args": {"city": "Chicago"}}], - ), + AIMessage(content="", tool_calls=[{"id": "call_1", "name": "get_weather", "args": {"city": "Chicago"}}]), ToolMessage(content="Sunny, 65°F", tool_call_id="call_1"), - AIMessage( - content="", - tool_calls=[{"id": "call_2", "name": "get_weather", "args": {"city": "New York"}}], - ), + AIMessage(content="", tool_calls=[{"id": "call_2", "name": "get_weather", "args": {"city": "New York"}}]), ToolMessage(content="Rainy, 55°F", tool_call_id="call_2"), - AIMessage( - content="", - tool_calls=[{"id": "call_3", "name": "get_weather", "args": {"city": "Seattle"}}], - ), - ToolMessage(content="Cloudy, 60°F", tool_call_id="call_3"), + AIMessage(content="", tool_calls=[{"id": "call_3", "name": "get_weather", "args": {"city": "Seattle"}}]), + ToolMessage(content="Cloudy, 60°F", tool_call_id="call_3") ] # Prepare the request - need to pass tools from the bound model kwargs - request = llm_with_tools._prepare_request(messages, stop=None, stream=False, **llm_with_tools.kwargs) + request = llm_with_tools._prepare_request( + messages, stop=None, stream=False, **llm_with_tools.kwargs + ) # Verify that tool_choice is set to 'none' because limit was reached - assert hasattr(request.chat_request, "tool_choice") + assert hasattr(request.chat_request, 'tool_choice') assert isinstance(request.chat_request.tool_choice, models.ToolChoiceNone) # Verify tools are still present (not removed, just choice is 'none') - assert hasattr(request.chat_request, "tools") + assert hasattr(request.chat_request, 'tools') assert len(request.chat_request.tools) > 0 diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py index 2ab8930..b670be6 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py @@ -85,7 +85,9 @@ def test_construct_json_body(mocker: MockerFixture) -> None: messages = [ HumanMessage(content="User message"), ] - chat = ChatOCIModelDeployment(endpoint="test_endpoint", model_kwargs={"temperature": 0.2}) + chat = ChatOCIModelDeployment( + endpoint="test_endpoint", model_kwargs={"temperature": 0.2} + ) payload = chat._construct_json_body(messages, chat._invocation_params(stop=None)) assert payload == { "messages": [{"content": "User message", "role": "user"}], diff --git a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py index 28a0bd9..dc4bd78 100644 --- a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py @@ -33,7 +33,8 @@ + '"choices":[{"index":0,"text":"","finish_reason":""}]}' ) CONST_STREAM_RESPONSE = ( - CONST_STREAM_TEMPLATE.replace("", " " + word).encode() for word in CONST_COMPLETION.split(" ") + CONST_STREAM_TEMPLATE.replace("", " " + word).encode() + for word in CONST_COMPLETION.split(" ") ) CONST_ASYNC_STREAM_TEMPLATE = ( @@ -41,10 +42,13 @@ + '"choices":[{"index":0,"text":"","finish_reason":""}]}' ) CONST_ASYNC_STREAM_RESPONSE = ( - CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() for word in CONST_COMPLETION.split(" ") + CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() + for word in CONST_COMPLETION.split(" ") ) -pytestmark = pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires Python 3.9 or higher") +pytestmark = pytest.mark.skipif( + sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" +) class MockResponse: @@ -95,7 +99,9 @@ def mocked_requests_post(url: str, **kwargs: Any) -> MockResponse: ) -async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGenerator[bytes, None]: +async def mocked_async_streaming_response( + *args: Any, **kwargs: Any +) -> AsyncGenerator[bytes, None]: """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -117,7 +123,9 @@ def test_invoke_vllm(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_stream_tgi(*args: Any) -> None: """Tests streaming with TGI endpoint using OpenAI spec.""" - llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) + llm = OCIModelDeploymentTGI( + endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = "" count = 0 @@ -133,7 +141,9 @@ def test_stream_tgi(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_generate_tgi(*args: Any) -> None: """Tests invoking TGI endpoint using TGI generate spec.""" - llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME) + llm = OCIModelDeploymentTGI( + endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = llm.invoke(CONST_PROMPT) assert output == CONST_COMPLETION @@ -141,10 +151,14 @@ def test_generate_tgi(*args: Any) -> None: @pytest.mark.asyncio @pytest.mark.requires("ads") -@mock.patch("ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock())) +@mock.patch( + "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) +) async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" - llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) + llm = OCIModelDeploymentTGI( + endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oracledb/Makefile b/libs/oracledb/Makefile index a9c240b..4342953 100644 --- a/libs/oracledb/Makefile +++ b/libs/oracledb/Makefile @@ -27,14 +27,14 @@ lint_tests: PYTHON_FILES=tests lint_tests: MYPY_CACHE=.mypy_cache_test lint lint_diff lint_package lint_tests: - poetry run ruff check . - poetry run ruff format $(PYTHON_FILES) --check --diff - poetry run ruff check --select I $(PYTHON_FILES) + poetry run ruff . + poetry run ruff format $(PYTHON_FILES) --diff + poetry run ruff --select I $(PYTHON_FILES) mkdir -p $(MYPY_CACHE); poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) format format_diff: poetry run ruff format $(PYTHON_FILES) - poetry run ruff check --select I --fix $(PYTHON_FILES) + poetry run ruff --select I --fix $(PYTHON_FILES) spell_check: poetry run codespell --toml pyproject.toml From c2fad14b8dc3d7d0af2f4f2c65b555aa60f68baf Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 13:19:26 -0800 Subject: [PATCH 08/16] Refactor to pass make lint checks Refactor to pass make lint checks --- .github/workflows/_lint.yml | 45 +--- libs/oci/Makefile | 9 +- .../chat_models/oci_data_science.py | 93 +++----- .../chat_models/oci_generative_ai.py | 199 +++++------------- ..._data_science_model_deployment_endpoint.py | 19 +- .../embeddings/oci_generative_ai.py | 29 +-- ..._data_science_model_deployment_endpoint.py | 71 ++----- .../langchain_oci/llms/oci_generative_ai.py | 49 ++--- libs/oci/poetry.lock | 108 +++++----- libs/oci/pyproject.toml | 25 ++- libs/oci/tests/conftest.py | 9 +- .../chat_models/test_tool_calling.py | 84 ++------ .../chat_models/test_oci_data_science.py | 28 +-- .../chat_models/test_oci_generative_ai.py | 62 ++---- .../test_oci_model_deployment_endpoint.py | 4 +- .../test_oci_model_deployment_endpoint.py | 30 +-- libs/oracledb/Makefile | 9 +- libs/oracledb/pyproject.toml | 22 +- 18 files changed, 301 insertions(+), 594 deletions(-) diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index 86c2276..60b0034 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -42,17 +42,11 @@ jobs: working-directory: ${{ inputs.working-directory }} cache-key: lint-with-extras - - name: Check Poetry File - shell: bash + - name: Check Poetry configuration working-directory: ${{ inputs.working-directory }} run: | poetry check - - - name: Check lock file - shell: bash - working-directory: ${{ inputs.working-directory }} - run: | - poetry lock --check + poetry check --lock - name: Install dependencies # Also installs dev/lint/test/typing dependencies, to ensure we have @@ -65,38 +59,9 @@ jobs: # It doesn't matter how you change it, any change will cause a cache-bust. working-directory: ${{ inputs.working-directory }} run: | - poetry install --with lint,typing - - - name: Get .mypy_cache to speed up mypy - uses: actions/cache@v4 - env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2" - with: - path: | - ${{ env.WORKDIR }}/.mypy_cache - key: mypy-lint-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }} - - - - name: Analysing the code with our lint - working-directory: ${{ inputs.working-directory }} - run: | - make lint_package - - - name: Install unit+integration test dependencies - working-directory: ${{ inputs.working-directory }} - run: | - poetry install --with test,test_integration - - - name: Get .mypy_cache_test to speed up mypy - uses: actions/cache@v4 - env: - SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2" - with: - path: | - ${{ env.WORKDIR }}/.mypy_cache_test - key: mypy-test-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }} + poetry install --with lint,typing,test,test_integration - - name: Analysing the code with our lint + - name: Run linting working-directory: ${{ inputs.working-directory }} run: | - make lint_tests + make lint \ No newline at end of file diff --git a/libs/oci/Makefile b/libs/oci/Makefile index 413c9e4..047a13c 100644 --- a/libs/oci/Makefile +++ b/libs/oci/Makefile @@ -27,14 +27,13 @@ lint_tests: PYTHON_FILES=tests lint_tests: MYPY_CACHE=.mypy_cache_test lint lint_diff lint_package lint_tests: - poetry run ruff . - poetry run ruff format $(PYTHON_FILES) --diff - poetry run ruff --select I $(PYTHON_FILES) - mkdir -p $(MYPY_CACHE); poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) + [ "$(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: poetry run ruff format $(PYTHON_FILES) - poetry run ruff --select I --fix $(PYTHON_FILES) + poetry run ruff check --select I --fix $(PYTHON_FILES) spell_check: poetry run codespell --toml pyproject.toml diff --git a/libs/oci/langchain_oci/chat_models/oci_data_science.py b/libs/oci/langchain_oci/chat_models/oci_data_science.py index 719c355..e2a8941 100644 --- a/libs/oci/langchain_oci/chat_models/oci_data_science.py +++ b/libs/oci/langchain_oci/chat_models/oci_data_science.py @@ -78,6 +78,7 @@ class ChatOCIModelDeployment(BaseChatModel, BaseOCIModelDeployment): .. code-block:: python import ads + ads.set_auth("resource_principal") For more details on authentication, see: @@ -109,7 +110,7 @@ class ChatOCIModelDeployment(BaseChatModel, BaseOCIModelDeployment): chat = ChatOCIModelDeployment( endpoint="https://modeldeployment..oci.customer-oci.com//predict", - model="odsc-llm", # this is the default model name if deployed with AQUA + model="odsc-llm", # this is the default model name if deployed with AQUA streaming=True, max_retries=3, model_kwargs={ @@ -135,18 +136,14 @@ class ChatOCIModelDeployment(BaseChatModel, BaseOCIModelDeployment): .. code-block:: python AIMessage( - content='Bonjour le monde!', + content="Bonjour le monde!", response_metadata={ - 'token_usage': { - 'prompt_tokens': 40, - 'total_tokens': 50, - 'completion_tokens': 10 - }, - 'model_name': 'odsc-llm', - 'system_fingerprint': '', - 'finish_reason': 'stop' + "token_usage": {"prompt_tokens": 40, "total_tokens": 50, "completion_tokens": 10}, + "model_name": "odsc-llm", + "system_fingerprint": "", + "finish_reason": "stop", }, - id='run-cbed62da-e1b3-4abd-9df3-ec89d69ca012-0' + id="run-cbed62da-e1b3-4abd-9df3-ec89d69ca012-0", ) Streaming: @@ -179,9 +176,9 @@ class ChatOCIModelDeployment(BaseChatModel, BaseOCIModelDeployment): .. code-block:: python AIMessage( - content='Bonjour le monde!', - response_metadata={'finish_reason': 'stop'}, - id='run-8657a105-96b7-4bb6-b98e-b69ca420e5d1-0' + content="Bonjour le monde!", + response_metadata={"finish_reason": "stop"}, + id="run-8657a105-96b7-4bb6-b98e-b69ca420e5d1-0", ) Structured output: @@ -190,22 +187,18 @@ class ChatOCIModelDeployment(BaseChatModel, BaseOCIModelDeployment): from typing import Optional from pydantic import BaseModel, Field + class Joke(BaseModel): setup: str = Field(description="The setup of the joke") punchline: str = Field(description="The punchline to the joke") + structured_llm = chat.with_structured_output(Joke, method="json_mode") - structured_llm.invoke( - "Tell me a joke about cats, " - "respond in JSON with `setup` and `punchline` keys" - ) + structured_llm.invoke("Tell me a joke about cats, respond in JSON with `setup` and `punchline` keys") .. code-block:: python - Joke( - setup='Why did the cat get stuck in the tree?', - punchline='Because it was chasing its tail!' - ) + Joke(setup="Why did the cat get stuck in the tree?", punchline="Because it was chasing its tail!") See ``ChatOCIModelDeployment.with_structured_output()`` for more. @@ -247,14 +240,10 @@ def _construct_json_body(self, messages: list, params: dict) -> dict: .. code-block:: python { - 'token_usage': { - 'prompt_tokens': 40, - 'total_tokens': 50, - 'completion_tokens': 10 - }, - 'model_name': 'odsc-llm', - 'system_fingerprint': '', - 'finish_reason': 'stop' + "token_usage": {"prompt_tokens": 40, "total_tokens": 50, "completion_tokens": 10}, + "model_name": "odsc-llm", + "system_fingerprint": "", + "finish_reason": "stop", } """ # noqa: E501 @@ -275,8 +264,7 @@ def validate_openai(cls, values: Any) -> Any: """Checks if langchain_openai is installed.""" if not importlib.util.find_spec("langchain_openai"): raise ImportError( - "Could not import langchain_openai package. " - "Please install it with `pip install langchain_openai`." + "Could not import langchain_openai package. Please install it with `pip install langchain_openai`." ) return values @@ -303,9 +291,7 @@ def _default_params(self) -> Dict[str, Any]: "stream": self.streaming, } - def _headers( - self, is_async: Optional[bool] = False, body: Optional[dict] = None - ) -> Dict: + def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: """Construct and return the headers for a request. Args: @@ -357,17 +343,13 @@ def _generate( response = chat.invoke(messages) """ # noqa: E501 if self.streaming: - stream_iter = self._stream( - messages, stop=stop, run_manager=run_manager, **kwargs - ) + stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs) return generate_from_stream(stream_iter) requests_kwargs = kwargs.pop("requests_kwargs", {}) params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(messages, params) - res = self.completion_with_retry( - data=body, run_manager=run_manager, **requests_kwargs - ) + res = self.completion_with_retry(data=body, run_manager=run_manager, **requests_kwargs) return self._process_response(res.json()) def _stream( @@ -415,9 +397,7 @@ def _stream( params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(messages, params) # request json body - response = self.completion_with_retry( - data=body, run_manager=run_manager, stream=True, **requests_kwargs - ) + response = self.completion_with_retry(data=body, run_manager=run_manager, stream=True, **requests_kwargs) default_chunk_class = AIMessageChunk for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line, default_chunk_class) @@ -467,9 +447,7 @@ async def _agenerate( """ # noqa: E501 if self.streaming: - stream_iter = self._astream( - messages, stop=stop, run_manager=run_manager, **kwargs - ) + stream_iter = self._astream(messages, stop=stop, run_manager=run_manager, **kwargs) return await agenerate_from_stream(stream_iter) requests_kwargs = kwargs.pop("requests_kwargs", {}) @@ -593,19 +571,14 @@ def with_structured_output( else JsonOutputParser() ) else: - raise ValueError( - f"Unrecognized method argument. Expected `json_mode`." - f"Received: `{method}`." - ) + raise ValueError(f"Unrecognized method argument. Expected `json_mode`.Received: `{method}`.") if include_raw: parser_assign = RunnablePassthrough.assign( parsed=itemgetter("raw") | output_parser, parsing_error=lambda _: None ) parser_none = RunnablePassthrough.assign(parsed=lambda _: None) - parser_with_fallback = parser_assign.with_fallbacks( - [parser_none], exception_key="parsing_error" - ) + parser_with_fallback = parser_assign.with_fallbacks([parser_none], exception_key="parsing_error") return RunnableMap(raw=llm) | parser_with_fallback else: return llm | output_parser @@ -688,9 +661,7 @@ def _process_stream_response( if not isinstance(choice, dict): raise TypeError("Endpoint response is not well formed.") except (KeyError, IndexError, TypeError) as e: - raise ValueError( - "Error while formatting response payload for chat model of type" - ) from e + raise ValueError("Error while formatting response payload for chat model of type") from e chunk = _convert_delta_to_message_chunk(choice["delta"], default_chunk_cls) default_chunk_cls = chunk.__class__ @@ -702,9 +673,7 @@ def _process_stream_response( if usage is not None: gen_info.update({"usage": usage}) - return ChatGenerationChunk( - message=chunk, generation_info=gen_info if gen_info else None - ) + return ChatGenerationChunk(message=chunk, generation_info=gen_info if gen_info else None) def _process_response(self, response_json: dict) -> ChatResult: """Formats response in OpenAI spec. @@ -729,9 +698,7 @@ def _process_response(self, response_json: dict) -> ChatResult: if not isinstance(choices, list): raise TypeError("Endpoint response is not well formed.") except (KeyError, TypeError) as e: - raise ValueError( - "Error while formatting response payload for chat model of type" - ) from e + raise ValueError("Error while formatting response payload for chat model of type") from e for choice in choices: message = _convert_dict_to_message(choice["message"]) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index af6b6c7..90447f7 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -106,9 +106,7 @@ def convert_oci_tool_call_to_langchain(tool_call: Any) -> ToolCall: return ToolCall( name=tool_call.name, - args=parsed - if "arguments" in tool_call.attribute_map - else tool_call.parameters, + args=parsed if "arguments" in tool_call.attribute_map else tool_call.parameters, id=tool_call.id if "id" in tool_call.attribute_map else uuid.uuid4().hex[:], ) @@ -178,18 +176,14 @@ def messages_to_oci_params(self, messages: Any, **kwargs: Any) -> Dict[str, Any] ... @abstractmethod - def convert_to_oci_tool( - self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool] - ) -> Dict[str, Any]: + def convert_to_oci_tool(self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]) -> Dict[str, Any]: """Convert a tool definition into the provider-specific OCI tool format.""" ... @abstractmethod def process_tool_choice( self, - tool_choice: Optional[ - Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], + tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], ) -> Optional[Any]: """Process tool choice parameter for the provider.""" ... @@ -262,9 +256,7 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: # Include tool calls if available if self.chat_tool_calls(response): - generation_info["tool_calls"] = self.format_response_tool_calls( - self.chat_tool_calls(response) - ) + generation_info["tool_calls"] = self.format_response_tool_calls(self.chat_tool_calls(response)) return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -344,9 +336,7 @@ def get_role(self, message: BaseMessage) -> str: return "TOOL" raise ValueError(f"Unknown message type: {type(message)}") - def messages_to_oci_params( - self, messages: Sequence[ChatMessage], **kwargs: Any - ) -> Dict[str, Any]: + def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) -> Dict[str, Any]: """ Convert LangChain messages to OCI parameters for Cohere. @@ -359,27 +349,18 @@ def messages_to_oci_params( for msg in messages[:-1]: role = self.get_role(msg) if role in ("USER", "SYSTEM"): - oci_chat_history.append( - self.oci_chat_message[role](message=msg.content) - ) + oci_chat_history.append(self.oci_chat_message[role](message=msg.content)) elif isinstance(msg, AIMessage): # Skip tool calls if forcing single step if msg.tool_calls and is_force_single_step: continue tool_calls = ( - [ - self.oci_tool_call(name=tc["name"], parameters=tc["args"]) - for tc in msg.tool_calls - ] + [self.oci_tool_call(name=tc["name"], parameters=tc["args"]) for tc in msg.tool_calls] if msg.tool_calls else None ) msg_content = msg.content if msg.content else " " - oci_chat_history.append( - self.oci_chat_message[role]( - message=msg_content, tool_calls=tool_calls - ) - ) + oci_chat_history.append(self.oci_chat_message[role](message=msg_content, tool_calls=tool_calls)) elif isinstance(msg, ToolMessage): oci_chat_history.append( self.oci_chat_message[self.get_role(msg)]( @@ -397,16 +378,12 @@ def messages_to_oci_params( for i, message in enumerate(messages[::-1]): current_turn.append(message) if isinstance(message, HumanMessage): - if len(messages) > i and isinstance( - messages[len(messages) - i - 2], ToolMessage - ): + if len(messages) > i and isinstance(messages[len(messages) - i - 2], ToolMessage): # add dummy message REPEATING the tool_result to avoid # the error about ToolMessage needing to be followed # by an AI message oci_chat_history.append( - self.oci_chat_message["CHATBOT"]( - message=messages[len(messages) - i - 2].content - ) + self.oci_chat_message["CHATBOT"](message=messages[len(messages) - i - 2].content) ) break current_turn = list(reversed(current_turn)) @@ -416,9 +393,7 @@ def messages_to_oci_params( for message in current_turn: if isinstance(message, ToolMessage): tool_msg = message - previous_ai_msgs = [ - m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls - ] + previous_ai_msgs = [m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls] if previous_ai_msgs: previous_ai_msg = previous_ai_msgs[-1] for lc_tool_call in previous_ai_msg.tool_calls: @@ -459,9 +434,7 @@ def convert_to_oci_tool( if isinstance(tool, BaseTool): return self.oci_tool( name=tool.name, - description=OCIUtils.remove_signature_from_tool_description( - tool.name, tool.description - ), + description=OCIUtils.remove_signature_from_tool_description(tool.name, tool.description), parameter_definitions={ p_name: self.oci_tool_param( description=p_def.get("description", ""), @@ -522,21 +495,14 @@ def convert_to_oci_tool( def process_tool_choice( self, - tool_choice: Optional[ - Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], + tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], ) -> Optional[Any]: """Cohere does not support tool choices.""" if tool_choice is not None: - raise ValueError( - "Tool choice is not supported for Cohere models." - "Please remove the tool_choice parameter." - ) + raise ValueError("Tool choice is not supported for Cohere models.Please remove the tool_choice parameter.") return None - def process_stream_tool_calls( - self, event_data: Dict, tool_call_ids: Set[str] - ) -> List[ToolCallChunk]: + def process_stream_tool_calls(self, event_data: Dict, tool_call_ids: Set[str]) -> List[ToolCallChunk]: """ Process Cohere stream tool calls and return them as ToolCallChunk objects. @@ -634,11 +600,9 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: # Include token usage if available if hasattr(response.data.chat_response, "usage") and response.data.chat_response.usage: generation_info["total_tokens"] = response.data.chat_response.usage.total_tokens - + if self.chat_tool_calls(response): - generation_info["tool_calls"] = self.format_response_tool_calls( - self.chat_tool_calls(response) - ) + generation_info["tool_calls"] = self.format_response_tool_calls(self.chat_tool_calls(response)) return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -714,9 +678,7 @@ def get_role(self, message: BaseMessage) -> str: return "TOOL" raise ValueError(f"Unknown message type: {type(message)}") - def messages_to_oci_params( - self, messages: List[BaseMessage], **kwargs: Any - ) -> Dict[str, Any]: + def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> Dict[str, Any]: """Convert LangChain messages to OCI chat parameters. Args: @@ -735,9 +697,7 @@ def messages_to_oci_params( role = self.get_role(message) if isinstance(message, ToolMessage): # For tool messages, wrap the content in a text content object. - tool_content = [ - self.oci_chat_message_text_content(text=str(message.content)) - ] + tool_content = [self.oci_chat_message_text_content(text=str(message.content))] if message.tool_call_id: oci_message = self.oci_chat_message[role]( content=tool_content, @@ -745,9 +705,7 @@ def messages_to_oci_params( ) else: oci_message = self.oci_chat_message[role](content=tool_content) - elif isinstance(message, AIMessage) and ( - message.tool_calls or message.additional_kwargs.get("tool_calls") - ): + elif isinstance(message, AIMessage) and (message.tool_calls or message.additional_kwargs.get("tool_calls")): # Process content and tool calls for assistant messages content = self._process_message_content(message.content) tool_calls = [] @@ -779,10 +737,7 @@ def messages_to_oci_params( # This addresses a known issue with Meta Llama models that # continue calling tools even after receiving results. - def _should_allow_more_tool_calls( - messages: List[BaseMessage], - max_tool_calls: int - ) -> bool: + def _should_allow_more_tool_calls(messages: List[BaseMessage], max_tool_calls: int) -> bool: """ Determine if the model should be allowed to call more tools. @@ -797,10 +752,7 @@ def _should_allow_more_tool_calls( max_tool_calls: Maximum number of tool calls before forcing stop """ # Count total tool calls made so far - tool_call_count = sum( - 1 for msg in messages - if isinstance(msg, ToolMessage) - ) + tool_call_count = sum(1 for msg in messages if isinstance(msg, ToolMessage)) # Safety limit: prevent runaway tool calling if tool_call_count >= max_tool_calls: @@ -809,12 +761,12 @@ def _should_allow_more_tool_calls( # Detect infinite loop: same tool called with same arguments in succession recent_calls = [] for msg in reversed(messages): - if hasattr(msg, 'tool_calls') and msg.tool_calls: + if hasattr(msg, "tool_calls") and msg.tool_calls: for tc in msg.tool_calls: # Create signature: (tool_name, sorted_args) try: - args_str = json.dumps(tc.get('args', {}), sort_keys=True) - signature = (tc.get('name', ''), args_str) + args_str = json.dumps(tc.get("args", {}), sort_keys=True) + signature = (tc.get("name", ""), args_str) # Check if this exact call was made in last 2 calls if signature in recent_calls[-2:]: @@ -841,9 +793,7 @@ def _should_allow_more_tool_calls( return result - def _process_message_content( - self, content: Union[str, List[Union[str, Dict]]] - ) -> List[Any]: + def _process_message_content(self, content: Union[str, List[Union[str, Dict]]]) -> List[Any]: """Process message content into OCI chat content format. Args: @@ -870,21 +820,15 @@ def _process_message_content( if item["type"] == "image_url": processed_content.append( self.oci_chat_message_image_content( - image_url=self.oci_chat_message_image_url( - url=item["image_url"]["url"] - ) + image_url=self.oci_chat_message_image_url(url=item["image_url"]["url"]) ) ) elif item["type"] == "text": - processed_content.append( - self.oci_chat_message_text_content(text=item["text"]) - ) + processed_content.append(self.oci_chat_message_text_content(text=item["text"])) else: raise ValueError(f"Unsupported content type: {item['type']}") else: - raise ValueError( - f"Content items must be str or dict, got: {type(item)}" - ) + raise ValueError(f"Content items must be str or dict, got: {type(item)}") return processed_content def convert_to_oci_tool( @@ -922,9 +866,7 @@ def convert_to_oci_tool( elif isinstance(tool, BaseTool): return self.oci_function_definition( name=tool.name, - description=OCIUtils.remove_signature_from_tool_description( - tool.name, tool.description - ), + description=OCIUtils.remove_signature_from_tool_description(tool.name, tool.description), parameters={ "type": "object", "properties": { @@ -934,11 +876,7 @@ def convert_to_oci_tool( } for p_name, p_def in tool.args.items() }, - "required": [ - p_name - for p_name, p_def in tool.args.items() - if "default" not in p_def - ], + "required": [p_name for p_name, p_def in tool.args.items() if "default" not in p_def], }, ) raise ValueError( @@ -949,9 +887,7 @@ def convert_to_oci_tool( def process_tool_choice( self, - tool_choice: Optional[ - Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], + tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], ) -> Optional[Any]: """Process tool choice for Meta provider. @@ -992,14 +928,9 @@ def process_tool_choice( elif isinstance(tool_choice, dict): # For Meta, we use ToolChoiceAuto for tool selection return self.oci_tool_choice_auto() - raise ValueError( - f"Unrecognized tool_choice type. Expected str, bool or dict. " - f"Received: {tool_choice}" - ) + raise ValueError(f"Unrecognized tool_choice type. Expected str, bool or dict. Received: {tool_choice}") - def process_stream_tool_calls( - self, event_data: Dict, tool_call_ids: Set[str] - ) -> List[ToolCallChunk]: + def process_stream_tool_calls(self, event_data: Dict, tool_call_ids: Set[str]) -> List[ToolCallChunk]: """ Process Meta stream tool calls and convert them to ToolCallChunks. @@ -1147,14 +1078,11 @@ def _prepare_request( except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. " - "Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." ) from ex oci_params = self._provider.messages_to_oci_params( - messages, - max_sequential_tool_calls=self.max_sequential_tool_calls, - **kwargs + messages, max_sequential_tool_calls=self.max_sequential_tool_calls, **kwargs ) oci_params["is_stream"] = stream @@ -1166,10 +1094,9 @@ def _prepare_request( # Warn if using max_tokens with OpenAI models if self.model_id and self.model_id.startswith("openai.") and "max_tokens" in _model_kwargs: import warnings + warnings.warn( - f"OpenAI models require 'max_completion_tokens' instead of 'max_tokens'.", - UserWarning, - stacklevel=2 + "OpenAI models require 'max_completion_tokens' instead of 'max_tokens'.", UserWarning, stacklevel=2 ) chat_params = {**_model_kwargs, **kwargs, **oci_params} @@ -1193,9 +1120,7 @@ def bind_tools( self, tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]], *, - tool_choice: Optional[ - Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ] = None, + tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]] = None, **kwargs: Any, ) -> Runnable[LanguageModelInput, BaseMessage]: """Bind tool-like objects to this chat model. @@ -1231,9 +1156,7 @@ def with_structured_output( self, schema: Optional[Union[Dict, Type[BaseModel]]] = None, *, - method: Literal[ - "function_calling", "json_schema", "json_mode" - ] = "function_calling", + method: Literal["function_calling", "json_schema", "json_mode"] = "function_calling", include_raw: bool = False, **kwargs: Any, ) -> Runnable[LanguageModelInput, Union[Dict, BaseModel]]: @@ -1254,7 +1177,7 @@ def with_structured_output( used. Note that if using "json_mode" then you must include instructions for formatting the output into the desired schema into the model call. If "json_schema" then it allows the user to pass a json schema (or pydantic) - to the model for structured output. + to the model for structured output. include_raw: If False then only the parsed structured output is returned. If an error occurs during model output parsing it will be raised. If True @@ -1294,9 +1217,7 @@ def with_structured_output( first_tool_only=True, # type: ignore[list-item] ) else: - output_parser = JsonOutputKeyToolsParser( - key_name=tool_name, first_tool_only=True - ) + output_parser = JsonOutputKeyToolsParser(key_name=tool_name, first_tool_only=True) elif method == "json_mode": llm = self.bind(response_format={"type": "JSON_OBJECT"}) output_parser = ( @@ -1310,18 +1231,16 @@ def with_structured_output( if is_pydantic_schema else schema ) - + response_json_schema = self._provider.oci_response_json_schema( name=json_schema_dict.get("title", "response"), description=json_schema_dict.get("description", ""), schema=json_schema_dict, - is_strict=True + is_strict=True, ) - - response_format_obj = self._provider.oci_json_schema_response_format( - json_schema=response_json_schema - ) - + + response_format_obj = self._provider.oci_json_schema_response_format(json_schema=response_json_schema) + llm = self.bind(response_format=response_format_obj) if is_pydantic_schema: output_parser = PydanticOutputParser(pydantic_object=schema) @@ -1338,9 +1257,7 @@ def with_structured_output( parsed=itemgetter("raw") | output_parser, parsing_error=lambda _: None ) parser_none = RunnablePassthrough.assign(parsed=lambda _: None) - parser_with_fallback = parser_assign.with_fallbacks( - [parser_none], exception_key="parsing_error" - ) + parser_with_fallback = parser_assign.with_fallbacks([parser_none], exception_key="parsing_error") return RunnableMap(raw=llm) | parser_with_fallback return llm | output_parser @@ -1364,17 +1281,15 @@ def _generate( .. code-block:: python messages = [ - HumanMessage(content="hello!"), - AIMessage(content="Hi there human!"), - HumanMessage(content="Meow!") - ] + HumanMessage(content="hello!"), + AIMessage(content="Hi there human!"), + HumanMessage(content="Meow!"), + ] response = llm.invoke(messages) """ if self.is_stream: - stream_iter = self._stream( - messages, stop=stop, run_manager=run_manager, **kwargs - ) + stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs) return generate_from_stream(stream_iter) request = self._prepare_request(messages, stop=stop, stream=False, **kwargs) @@ -1405,9 +1320,7 @@ def _generate( tool_calls=tool_calls, ) return ChatResult( - generations=[ - ChatGeneration(message=message, generation_info=generation_info) - ], + generations=[ChatGeneration(message=message, generation_info=generation_info)], llm_output=llm_output, ) @@ -1433,9 +1346,7 @@ def _stream( if not self._provider.is_chat_stream_end(event_data): # Process streaming content delta = self._provider.chat_stream_to_text(event_data) - tool_call_chunks = self._provider.process_stream_tool_calls( - event_data, tool_call_ids - ) + tool_call_chunks = self._provider.process_stream_tool_calls(event_data, tool_call_ids) chunk = ChatGenerationChunk( message=AIMessageChunk( diff --git a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py index 8f931f2..af49802 100644 --- a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py @@ -21,9 +21,7 @@ class TokenExpiredError(Exception): def _create_retry_decorator(llm) -> Callable[[Any], Any]: """Creates a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] - decorator = create_base_retry_decorator( - error_types=errors, max_retries=llm.max_retries - ) + decorator = create_base_retry_decorator(error_types=errors, max_retries=llm.max_retries) return decorator @@ -72,8 +70,7 @@ def validate_environment( # pylint: disable=no-self-argument except ImportError as ex: raise ImportError( - "Could not import ads python package. " - "Please install it with `pip install oracle_ads`." + "Could not import ads python package. Please install it with `pip install oracle_ads`." ) from ex if not values.get("auth", None): values["auth"] = ads.common.auth.default_signer() @@ -107,9 +104,7 @@ def _completion_with_retry(**kwargs: Any) -> Any: if response.status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err else: - raise ValueError( - f"Server error: {str(http_err)}. Message: {response.text}" - ) from http_err + raise ValueError(f"Server error: {str(http_err)}. Message: {response.text}") from http_err except Exception as e: raise ValueError(f"Error occurs by inference endpoint: {str(e)}") from e @@ -163,9 +158,7 @@ def _proceses_response(self, response: requests.Response) -> List[List[float]]: res_json = response.json() embeddings = res_json["data"][0]["embedding"] except Exception as e: - raise ValueError( - f"Error raised by inference API: {e}.\nResponse: {response.text}" - ) + raise ValueError(f"Error raised by inference API: {e}.\nResponse: {response.text}") return embeddings def embed_documents( @@ -185,9 +178,7 @@ def embed_documents( List of embeddings, one for each text. """ results = [] - _chunk_size = ( - len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size - ) + _chunk_size = len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size for i in range(0, len(texts), _chunk_size): response = self._embedding(texts[i : i + _chunk_size]) results.extend(response) diff --git a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py index edfb285..52808ed 100644 --- a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py +++ b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py @@ -48,7 +48,7 @@ class OCIGenAIEmbeddings(BaseModel, Embeddings): embeddings = OCIGenAIEmbeddings( model_id="MY_EMBEDDING_MODEL", service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com", - compartment_id="MY_OCID" + compartment_id="MY_OCID", ) """ @@ -126,12 +126,8 @@ def validate_environment(cls, values: Dict) -> Dict: # pylint: disable=no-self- elif values["auth_type"] == OCIAuthType(2).name: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] - pk = oci.signer.load_private_key_from_file( - oci_config.get("key_file"), None - ) - with open( - oci_config.get("security_token_file"), encoding="utf-8" - ) as f: + pk = oci.signer.load_private_key_from_file(oci_config.get("key_file"), None) + with open(oci_config.get("security_token_file"), encoding="utf-8") as f: st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -139,28 +135,19 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] file_location=values["auth_file_location"], profile_name=values["auth_profile"], ) - client_kwargs["signer"] = make_security_token_signer( - oci_config=client_kwargs["config"] - ) + client_kwargs["signer"] = make_security_token_signer(oci_config=client_kwargs["config"]) elif values["auth_type"] == OCIAuthType(3).name: - client_kwargs["signer"] = ( - oci.auth.signers.InstancePrincipalsSecurityTokenSigner() - ) + client_kwargs["signer"] = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() elif values["auth_type"] == OCIAuthType(4).name: - client_kwargs["signer"] = ( - oci.auth.signers.get_resource_principals_signer() - ) + client_kwargs["signer"] = oci.auth.signers.get_resource_principals_signer() else: raise ValueError("Please provide valid value to auth_type") - values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( - **client_kwargs - ) + values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient(**client_kwargs) except ImportError as ex: raise ImportError( - "Could not import oci python package. " - "Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." ) from ex except Exception as e: raise ValueError( diff --git a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py index 9089be1..815a366 100644 --- a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py @@ -52,15 +52,11 @@ class ServerError(Exception): def _create_retry_decorator( llm: "BaseOCIModelDeployment", *, - run_manager: Optional[ - Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun] - ] = None, + run_manager: Optional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]] = None, ) -> Callable[[Any], Any]: """Create a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] - decorator = create_base_retry_decorator( - error_types=errors, max_retries=llm.max_retries, run_manager=run_manager - ) + decorator = create_base_retry_decorator(error_types=errors, max_retries=llm.max_retries, run_manager=run_manager) return decorator @@ -97,8 +93,7 @@ def validate_environment(cls, values: Dict) -> Dict: except ImportError as ex: raise ImportError( - "Could not import ads python package. " - "Please install it with `pip install oracle_ads`." + "Could not import ads python package. Please install it with `pip install oracle_ads`." ) from ex if not values.get("auth", None): @@ -111,9 +106,7 @@ def validate_environment(cls, values: Dict) -> Dict: ) return values - def _headers( - self, is_async: Optional[bool] = False, body: Optional[dict] = None - ) -> Dict: + def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: """Construct and return the headers for a request. Args: @@ -157,9 +150,7 @@ def _headers( return headers - def completion_with_retry( - self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any - ) -> Any: + def completion_with_retry(self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Any: """Use tenacity to retry the completion call.""" retry_decorator = _create_retry_decorator(self, run_manager=run_manager) @@ -194,9 +185,7 @@ def _completion_with_retry(**kwargs: Any) -> Any: f"url={self.endpoint},timeout={request_timeout},stream={stream}. " f"Additional request kwargs={kwargs}." ) - raise RuntimeError( - f"Error occurs by inference endpoint: {str(err)}" - ) from err + raise RuntimeError(f"Error occurs by inference endpoint: {str(err)}") from err return _completion_with_retry(**kwargs) @@ -250,9 +239,7 @@ async def _completion_with_retry(**kwargs: Any) -> Any: f"Stream mode={stream}. " f"Requests kwargs: url={self.endpoint}, timeout={request_timeout}." ) - raise RuntimeError( - f"Error occurs by inference endpoint: {str(err)}" - ) from err + raise RuntimeError(f"Error occurs by inference endpoint: {str(err)}") from err return await _completion_with_retry(**kwargs) @@ -287,17 +274,11 @@ def _check_response(self, response: Any) -> None: try: response.raise_for_status() except requests.exceptions.HTTPError as http_err: - status_code = ( - response.status_code - if hasattr(response, "status_code") - else response.status - ) + status_code = response.status_code if hasattr(response, "status_code") else response.status if status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err - raise ServerError( - f"Server error: {str(http_err)}. \nMessage: {response.text}" - ) from http_err + raise ServerError(f"Server error: {str(http_err)}. \nMessage: {response.text}") from http_err def _parse_stream(self, lines: Iterator[bytes]) -> Iterator[str]: """Parse a stream of byte lines and yield parsed string lines. @@ -383,9 +364,7 @@ def _refresh_signer(self) -> bool: Returns: bool: `True` if the token was successfully refreshed, `False` otherwise. """ - if self.auth.get("signer", None) and hasattr( - self.auth["signer"], "refresh_security_token" - ): + if self.auth.get("signer", None) and hasattr(self.auth["signer"], "refresh_security_token"): self.auth["signer"].refresh_security_token() return True return False @@ -423,7 +402,7 @@ class OCIModelDeploymentLLM(BaseLLM, BaseOCIModelDeployment): headers={ "route": "/v1/completions", # other request headers ... - } + }, ) llm.invoke("tell me a joke.") @@ -491,9 +470,7 @@ def _identifying_params(self) -> Dict[str, Any]: **self._default_params, } - def _headers( - self, is_async: Optional[bool] = False, body: Optional[dict] = None - ) -> Dict: + def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: """Construct and return the headers for a request. Args: @@ -538,9 +515,7 @@ def _generate( body = self._construct_json_body(prompt, params) if self.streaming: generation = GenerationChunk(text="") - for chunk in self._stream( - prompt, stop=stop, run_manager=run_manager, **kwargs - ): + for chunk in self._stream(prompt, stop=stop, run_manager=run_manager, **kwargs): generation += chunk generations.append([generation]) else: @@ -580,9 +555,7 @@ async def _agenerate( body = self._construct_json_body(prompt, params) if self.streaming: generation = GenerationChunk(text="") - async for chunk in self._astream( - prompt, stop=stop, run_manager=run_manager, **kwargs - ): + async for chunk in self._astream(prompt, stop=stop, run_manager=run_manager, **kwargs): generation += chunk generations.append([generation]) else: @@ -629,9 +602,7 @@ def _stream( params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(prompt, params) - response = self.completion_with_retry( - data=body, run_manager=run_manager, stream=True, **requests_kwargs - ) + response = self.completion_with_retry(data=body, run_manager=run_manager, stream=True, **requests_kwargs) for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line) if run_manager: @@ -690,9 +661,7 @@ def _construct_json_body(self, prompt: str, params: dict) -> dict: **params, } - def _invocation_params( - self, stop: Optional[List[str]] = None, **kwargs: Any - ) -> dict: + def _invocation_params(self, stop: Optional[List[str]] = None, **kwargs: Any) -> dict: """Combines the invocation parameters with default parameters.""" params = self._default_params _model_kwargs = self.model_kwargs or {} @@ -865,9 +834,7 @@ def _default_params(self) -> Dict[str, Any]: "best_of": self.best_of, "max_new_tokens": self.max_tokens, "temperature": self.temperature, - "top_k": ( - self.k if self.k > 0 else None - ), # `top_k` must be strictly positive' + "top_k": (self.k if self.k > 0 else None), # `top_k` must be strictly positive' "top_p": self.p, "do_sample": self.do_sample, "return_full_text": self.return_full_text, @@ -907,9 +874,7 @@ def _process_response(self, response_json: dict) -> List[Generation]: try: text = response_json["generated_text"] except KeyError as e: - raise ValueError( - f"Error while formatting response payload.response_json={response_json}" - ) from e + raise ValueError(f"Error while formatting response payload.response_json={response_json}") from e return [Generation(text=text)] diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index 3649e87..ec6c6bf 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -120,9 +120,7 @@ class OCIGenAIBase(BaseModel, ABC): """Maximum tool calls before forcing final answer. Prevents infinite loops while allowing multi-step orchestration.""" - model_config = ConfigDict( - extra="forbid", arbitrary_types_allowed=True, protected_namespaces=() - ) + model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, protected_namespaces=()) @pre_init def validate_environment(cls, values: Dict) -> Dict: @@ -152,12 +150,8 @@ def validate_environment(cls, values: Dict) -> Dict: elif values["auth_type"] == OCIAuthType(2).name: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] - pk = oci.signer.load_private_key_from_file( - oci_config.get("key_file"), None - ) - with open( - oci_config.get("security_token_file"), encoding="utf-8" - ) as f: + pk = oci.signer.load_private_key_from_file(oci_config.get("key_file"), None) + with open(oci_config.get("security_token_file"), encoding="utf-8") as f: st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -165,31 +159,19 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] file_location=values["auth_file_location"], profile_name=values["auth_profile"], ) - client_kwargs["signer"] = make_security_token_signer( - oci_config=client_kwargs["config"] - ) + client_kwargs["signer"] = make_security_token_signer(oci_config=client_kwargs["config"]) elif values["auth_type"] == OCIAuthType(3).name: - client_kwargs["signer"] = ( - oci.auth.signers.InstancePrincipalsSecurityTokenSigner() - ) + client_kwargs["signer"] = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() elif values["auth_type"] == OCIAuthType(4).name: - client_kwargs["signer"] = ( - oci.auth.signers.get_resource_principals_signer() - ) + client_kwargs["signer"] = oci.auth.signers.get_resource_principals_signer() else: - raise ValueError( - "Please provide valid value to auth_type, " - f"{values['auth_type']} is not valid." - ) + raise ValueError(f"Please provide valid value to auth_type, {values['auth_type']} is not valid.") - values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( - **client_kwargs - ) + values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient(**client_kwargs) except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. " - "Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." ) from ex except Exception as e: raise ValueError( @@ -261,10 +243,10 @@ class OCIGenAI(LLM, OCIGenAIBase): from langchain_oci.llms import OCIGenAI llm = OCIGenAI( - model_id="MY_MODEL_ID", - service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com", - compartment_id="MY_OCID" - ) + model_id="MY_MODEL_ID", + service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com", + compartment_id="MY_OCID", + ) """ model_config = ConfigDict( @@ -301,10 +283,7 @@ def _prepare_invocation_object( _model_kwargs[self._provider.stop_sequence_key] = stop if self.model_id is None: - raise ValueError( - "model_id is required to call the model, " - "please provide the model_id." - ) + raise ValueError("model_id is required to call the model, please provide the model_id.") if self.model_id.startswith(CUSTOM_ENDPOINT_PREFIX): serving_mode = models.DedicatedServingMode(endpoint_id=self.model_id) diff --git a/libs/oci/poetry.lock b/libs/oci/poetry.lock index 777ef7c..c9635db 100644 --- a/libs/oci/poetry.lock +++ b/libs/oci/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -177,7 +177,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] 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"}, @@ -189,7 +189,7 @@ version = "4.11.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, @@ -235,7 +235,7 @@ version = "2025.11.12" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, @@ -345,7 +345,7 @@ version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, @@ -853,7 +853,7 @@ version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, @@ -1093,7 +1093,7 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -1105,7 +1105,7 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -1127,7 +1127,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1152,7 +1152,7 @@ version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.8" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, @@ -1218,7 +1218,7 @@ 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.*" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -1233,7 +1233,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -1286,7 +1286,7 @@ version = "0.3.79" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0.0,>=3.9.0" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "langchain_core-0.3.79-py3-none-any.whl", hash = "sha256:92045bfda3e741f8018e1356f83be203ec601561c6a7becfefe85be5ddc58fdb"}, {file = "langchain_core-0.3.79.tar.gz", hash = "sha256:024ba54a346dd9b13fb8b2342e0c83d0111e7f26fa01f545ada23ad772b55a60"}, @@ -1350,7 +1350,7 @@ version = "0.2.76" description = "Building stateful, multi-actor applications with LLMs" optional = false python-versions = "<4.0,>=3.9.0" -groups = ["test_integration"] +groups = ["test-integration"] files = [ {file = "langgraph-0.2.76-py3-none-any.whl", hash = "sha256:076b8b5d2fc5a9761c46a7618430cfa5c978a8012257c43cbc127b27e0fd7872"}, {file = "langgraph-0.2.76.tar.gz", hash = "sha256:688f8dcd9b6797ba78384599e0de944773000c75156ad1e186490e99e89fa5c0"}, @@ -1367,7 +1367,7 @@ version = "2.1.2" description = "Library with base interfaces for LangGraph checkpoint savers." optional = false python-versions = ">=3.9" -groups = ["test_integration"] +groups = ["test-integration"] files = [ {file = "langgraph_checkpoint-2.1.2-py3-none-any.whl", hash = "sha256:911ebffb069fd01775d4b5184c04aaafc2962fcdf50cf49d524cd4367c4d0c60"}, {file = "langgraph_checkpoint-2.1.2.tar.gz", hash = "sha256:112e9d067a6eff8937caf198421b1ffba8d9207193f14ac6f89930c1260c06f9"}, @@ -1383,7 +1383,7 @@ version = "0.1.74" description = "SDK for interacting with LangGraph API" optional = false python-versions = ">=3.9" -groups = ["test_integration"] +groups = ["test-integration"] files = [ {file = "langgraph_sdk-0.1.74-py3-none-any.whl", hash = "sha256:3a265c3757fe0048adad4391d10486db63ef7aa5a2cbd22da22d4503554cb890"}, {file = "langgraph_sdk-0.1.74.tar.gz", hash = "sha256:7450e0db5b226cc2e5328ca22c5968725873630ef47c4206a30707cb25dc3ad6"}, @@ -1399,7 +1399,7 @@ version = "0.4.37" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" files = [ {file = "langsmith-0.4.37-py3-none-any.whl", hash = "sha256:e34a94ce7277646299e4703a0f6e2d2c43647a28e8b800bb7ef82fd87a0ec766"}, @@ -1429,7 +1429,7 @@ version = "0.4.42" description = "Client library to connect to the LangSmith Observability and Evaluation Platform." optional = false python-versions = ">=3.10" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" files = [ {file = "langsmith-0.4.42-py3-none-any.whl", hash = "sha256:015b0a0c17eb1a61293e8cbb7d41778a4b37caddd267d54274ba94e4721b301b"}, @@ -1984,7 +1984,7 @@ version = "3.11.4" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "orjson-3.11.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1"}, {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44"}, @@ -2082,7 +2082,7 @@ version = "1.11.0" description = "" optional = false python-versions = ">=3.9" -groups = ["test_integration"] +groups = ["test-integration"] markers = "python_version == \"3.9\" or platform_python_implementation == \"PyPy\" and python_version < \"3.13\"" files = [ {file = "ormsgpack-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:03d4e658dd6e1882a552ce1d13cc7b49157414e7d56a4091fbe7823225b08cba"}, @@ -2149,7 +2149,7 @@ version = "1.12.0" description = "" optional = false python-versions = ">=3.10" -groups = ["test_integration"] +groups = ["test-integration"] markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" or python_version >= \"3.13\"" files = [ {file = "ormsgpack-1.12.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e08904c232358b94a682ccfbb680bc47d3fd5c424bb7dccb65974dd20c95e8e1"}, @@ -2208,7 +2208,7 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -2405,7 +2405,7 @@ version = "2.12.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e"}, {file = "pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac"}, @@ -2427,7 +2427,7 @@ version = "2.41.5" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146"}, {file = "pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2"}, @@ -2809,7 +2809,7 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -2892,7 +2892,7 @@ version = "2.32.5" description = "Python HTTP for Humans." optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, @@ -2914,7 +2914,7 @@ version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -2964,29 +2964,31 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.1.15" +version = "0.13.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["lint"] files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, + {file = "ruff-0.13.3-py3-none-linux_armv6l.whl", hash = "sha256:311860a4c5e19189c89d035638f500c1e191d283d0cc2f1600c8c80d6dcd430c"}, + {file = "ruff-0.13.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2bdad6512fb666b40fcadb65e33add2b040fc18a24997d2e47fee7d66f7fcae2"}, + {file = "ruff-0.13.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fc6fa4637284708d6ed4e5e970d52fc3b76a557d7b4e85a53013d9d201d93286"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c9e6469864f94a98f412f20ea143d547e4c652f45e44f369d7b74ee78185838"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5bf62b705f319476c78891e0e97e965b21db468b3c999086de8ffb0d40fd2822"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78cc1abed87ce40cb07ee0667ce99dbc766c9f519eabfd948ed87295d8737c60"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4fb75e7c402d504f7a9a259e0442b96403fa4a7310ffe3588d11d7e170d2b1e3"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17b951f9d9afb39330b2bdd2dd144ce1c1335881c277837ac1b50bfd99985ed3"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6052f8088728898e0a449f0dde8fafc7ed47e4d878168b211977e3e7e854f662"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc742c50f4ba72ce2a3be362bd359aef7d0d302bf7637a6f942eaa763bd292af"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:8e5640349493b378431637019366bbd73c927e515c9c1babfea3e932f5e68e1d"}, + {file = "ruff-0.13.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6b139f638a80eae7073c691a5dd8d581e0ba319540be97c343d60fb12949c8d0"}, + {file = "ruff-0.13.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6b547def0a40054825de7cfa341039ebdfa51f3d4bfa6a0772940ed351d2746c"}, + {file = "ruff-0.13.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9cc48a3564423915c93573f1981d57d101e617839bef38504f85f3677b3a0a3e"}, + {file = "ruff-0.13.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1a993b17ec03719c502881cb2d5f91771e8742f2ca6de740034433a97c561989"}, + {file = "ruff-0.13.3-py3-none-win32.whl", hash = "sha256:f14e0d1fe6460f07814d03c6e32e815bff411505178a1f539a38f6097d3e8ee3"}, + {file = "ruff-0.13.3-py3-none-win_amd64.whl", hash = "sha256:621e2e5812b691d4f244638d693e640f188bacbb9bc793ddd46837cea0503dd2"}, + {file = "ruff-0.13.3-py3-none-win_arm64.whl", hash = "sha256:9e9e9d699841eaf4c2c798fa783df2fabc680b72059a02ca0ed81c460bc58330"}, + {file = "ruff-0.13.3.tar.gz", hash = "sha256:5b0ba0db740eefdfbcce4299f49e9eaefc643d4d007749d77d047c2bab19908e"}, ] [[package]] @@ -3007,7 +3009,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -3130,7 +3132,7 @@ version = "9.1.2" description = "Retry code until it succeeds" optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, @@ -3244,7 +3246,7 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration", "typing"] +groups = ["main", "test", "test-integration", "typing"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -3256,7 +3258,7 @@ version = "0.4.2" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, @@ -3271,7 +3273,7 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] markers = "platform_python_implementation == \"PyPy\" or python_version == \"3.9\"" files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, @@ -3289,7 +3291,7 @@ version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration", "typing"] +groups = ["main", "test", "test-integration", "typing"] markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, @@ -3661,7 +3663,7 @@ version = "0.25.0" description = "Zstandard bindings for Python" optional = false python-versions = ">=3.9" -groups = ["main", "test", "test_integration"] +groups = ["main", "test", "test-integration"] files = [ {file = "zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd"}, {file = "zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7"}, @@ -3770,4 +3772,4 @@ cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and pyt [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "3e0ea83927dc8499d5b702056503f41b8e357d23b3c5ead34f71b229972e45f7" +content-hash = "230a6c292166c267991f49901202f2823da065c49abc8c66350a179622855d0b" diff --git a/libs/oci/pyproject.toml b/libs/oci/pyproject.toml index f577df4..5d09885 100644 --- a/libs/oci/pyproject.toml +++ b/libs/oci/pyproject.toml @@ -49,7 +49,7 @@ langgraph = "^0.2.0" optional = true [tool.poetry.group.lint.dependencies] -ruff = "^0.1.8" +ruff = "^0.13.1" [tool.poetry.group.typing.dependencies] mypy = "^1.7" @@ -60,6 +60,12 @@ optional = true [tool.poetry.group.dev.dependencies] +[tool.ruff] +line-length = 120 + +[tool.ruff.format] +docstring-code-format = true + [tool.ruff.lint] select = [ "E", # pycodestyle @@ -67,10 +73,25 @@ select = [ "I", # isort "T201", # print ] +ignore = [ + "COM812", # Messes with the formatter +] [tool.mypy] ignore_missing_imports = "True" -disallow_untyped_defs = "True" + +# Disable specific error codes that are causing issues +disallow_untyped_defs = "False" +disable_error_code = ["attr-defined", "assignment", "var-annotated", "override", "union-attr", "arg-type"] + +# TODO: LangChain Google settings +# plugins = ["pydantic.mypy"] +# strict = true +# disallow_untyped_defs = true + +# # TODO: activate for 'strict' checking +# disallow_any_generics = false +# warn_return_any = false [tool.coverage.run] omit = ["tests/*"] diff --git a/libs/oci/tests/conftest.py b/libs/oci/tests/conftest.py index 2c0afee..f102ccb 100644 --- a/libs/oci/tests/conftest.py +++ b/libs/oci/tests/conftest.py @@ -20,8 +20,7 @@ def pytest_collection_modifyitems(config: Config, items: Sequence[Function]) -> .. code-block:: python @pytest.mark.requires("package1", "package2") - def test_something(): - ... + def test_something(): ... """ # Mapping from the name of a package to whether it is installed or not. # Used to avoid repeated calls to `util.find_spec` @@ -43,7 +42,5 @@ def test_something(): required_pkgs_info[pkg] = installed if not required_pkgs_info[pkg]: - item.add_marker( - pytest.mark.skip(reason=f"Requires pkg: `{pkg}`") - ) - break \ No newline at end of file + item.add_marker(pytest.mark.skip(reason=f"Requires pkg: `{pkg}`")) + break diff --git a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py index 6361608..c7779a2 100644 --- a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py +++ b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py @@ -84,9 +84,7 @@ def weather_tool(): def create_agent(model_id: str, weather_tool: StructuredTool): """Create a LangGraph agent with tool calling.""" region = os.getenv("OCI_REGION", "us-chicago-1") - endpoint = ( - f"https://inference.generativeai.{region}.oci.oraclecloud.com" - ) + endpoint = f"https://inference.generativeai.{region}.oci.oraclecloud.com" chat_model = ChatOCIGenAI( model_id=model_id, service_endpoint=endpoint, @@ -149,10 +147,7 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo agent = create_agent(model_id, weather_tool) # Invoke the agent - system_msg = ( - "You are a helpful assistant. Use the available tools when " - "needed to answer questions accurately." - ) + system_msg = "You are a helpful assistant. Use the available tools when needed to answer questions accurately." result = agent.invoke( { "messages": [ @@ -169,39 +164,26 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo assert len(messages) >= 4, expected # Find tool messages - tool_messages = [ - msg for msg in messages if type(msg).__name__ == "ToolMessage" - ] + tool_messages = [msg for msg in messages if type(msg).__name__ == "ToolMessage"] assert len(tool_messages) >= 1, "Should have at least one tool result" # Find AI messages with tool calls ai_tool_calls = [ - msg - for msg in messages - if ( - type(msg).__name__ == "AIMessage" - and hasattr(msg, "tool_calls") - and msg.tool_calls - ) + msg for msg in messages if (type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls) ] # The model should call the tool, but after receiving results, # should not call again. Allow flexibility - some models might make # 1 call, others might need 2, but should stop - error_msg = ( - f"Model made too many tool calls ({len(ai_tool_calls)}), " - "possible infinite loop" - ) + error_msg = f"Model made too many tool calls ({len(ai_tool_calls)}), possible infinite loop" assert len(ai_tool_calls) <= 2, error_msg # Verify final message is an AI response without tool calls final_message = messages[-1] - assert type(final_message).__name__ == "AIMessage", ( - "Final message should be AIMessage" - ) + assert type(final_message).__name__ == "AIMessage", "Final message should be AIMessage" assert final_message.content, "Final message should have content" - assert not ( - hasattr(final_message, "tool_calls") and final_message.tool_calls - ), "Final message should not have tool_calls (infinite loop prevention)" + assert not (hasattr(final_message, "tool_calls") and final_message.tool_calls), ( + "Final message should not have tool_calls (infinite loop prevention)" + ) # Note: Different models format responses differently. Some return # natural language, others may return the tool call syntax. The @@ -284,6 +266,7 @@ def test_multi_step_tool_orchestration(model_id: str): multi-step investigations requiring several tool calls before providing a final analysis. """ + # Create diagnostic tools that simulate a monitoring workflow def check_status(resource: str) -> str: """Check the status of a resource.""" @@ -291,17 +274,12 @@ def check_status(resource: str) -> str: "payment-service": "Status: Running, Memory: 95%, Restarts: 12", "web-server": "Status: Running, Memory: 60%, Restarts: 0", } - return status_data.get( - resource, f"Resource {resource} status: Unknown" - ) + return status_data.get(resource, f"Resource {resource} status: Unknown") def get_events(resource: str) -> str: """Get recent events for a resource.""" events_data = { - "payment-service": ( - "Events: [OOMKilled at 14:23, " - "BackOff at 14:30, Started at 14:32]" - ), + "payment-service": ("Events: [OOMKilled at 14:23, BackOff at 14:30, Started at 14:32]"), "web-server": "Events: [Started at 10:00, Healthy]", } return events_data.get(resource, f"No events for {resource}") @@ -309,10 +287,7 @@ def get_events(resource: str) -> str: def get_metrics(resource: str) -> str: """Get historical metrics for a resource.""" metrics_data = { - "payment-service": ( - "Memory trend: 70%→80%→90%→95% " - "(gradual increase over 2h)" - ), + "payment-service": ("Memory trend: 70%→80%→90%→95% (gradual increase over 2h)"), "web-server": "Memory trend: 55%→58%→60% (stable)", } return metrics_data.get(resource, f"No metrics for {resource}") @@ -369,9 +344,7 @@ def take_action(resource: str, action: str) -> str: # Create agent with higher recursion limit to allow multi-step region = os.getenv("OCI_REGION", "us-chicago-1") - endpoint = ( - f"https://inference.generativeai.{region}.oci.oraclecloud.com" - ) + endpoint = f"https://inference.generativeai.{region}.oci.oraclecloud.com" chat_model = ChatOCIGenAI( model_id=model_id, service_endpoint=endpoint, @@ -393,11 +366,7 @@ def call_model(state: MessagesState): response = model_with_tools.invoke(messages) # OCI LIMITATION: Only allow ONE tool call at a time - if ( - hasattr(response, "tool_calls") - and response.tool_calls - and len(response.tool_calls) > 1 - ): + if hasattr(response, "tool_calls") and response.tool_calls and len(response.tool_calls) > 1: # Some models try to call multiple tools in parallel # Restrict to first tool only to avoid OCI API error response.tool_calls = [response.tool_calls[0]] @@ -457,36 +426,23 @@ def should_continue(state: MessagesState): # Count tool calls tool_call_messages = [ - msg - for msg in messages - if ( - type(msg).__name__ == "AIMessage" - and hasattr(msg, "tool_calls") - and msg.tool_calls - ) - ] - tool_result_messages = [ - msg for msg in messages if type(msg).__name__ == "ToolMessage" + msg for msg in messages if (type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls) ] + tool_result_messages = [msg for msg in messages if type(msg).__name__ == "ToolMessage"] # Verify multi-step orchestration worked - msg = ( - f"Should have made multiple tool calls (got {len(tool_call_messages)})" - ) + msg = f"Should have made multiple tool calls (got {len(tool_call_messages)})" assert len(tool_call_messages) >= 2, msg # CRITICAL: Verify max_sequential_tool_calls limit was respected # The agent should stop at or before the limit (8 tool calls) # This is the key protection against infinite loops assert len(tool_call_messages) <= 8, ( - f"Too many tool calls ({len(tool_call_messages)}), " - "max_sequential_tool_calls limit not enforced" + f"Too many tool calls ({len(tool_call_messages)}), max_sequential_tool_calls limit not enforced" ) # Verify tool results were received - assert len(tool_result_messages) >= 2, ( - "Should have received multiple tool results" - ) + assert len(tool_result_messages) >= 2, "Should have received multiple tool results" # Verify agent eventually stopped (didn't loop infinitely) # The final message might still have tool_calls if the agent hit diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py index 0bb01c8..de98c6f 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py @@ -49,10 +49,7 @@ ] CONST_STREAM_RESPONSE = ( content - for content in [ - CONST_STREAM_TEMPLATE.replace("", delta).encode() - for delta in CONST_STREAM_DELTAS - ] + for content in [CONST_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS] + [b"data: [DONE]"] ) @@ -61,13 +58,10 @@ '"model":"odsc-llm","choices":[{"index":0,"delta":,"finish_reason":null}]}' ) CONST_ASYNC_STREAM_RESPONSE = ( - CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() - for delta in CONST_STREAM_DELTAS + CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS ) -pytestmark = pytest.mark.skipif( - sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" -) +pytestmark = pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires Python 3.9 or higher") class MockResponse: @@ -144,9 +138,7 @@ def test_invoke_tgi(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_stream_vllm(*args: Any) -> None: """Tests streaming with vLLM endpoint using OpenAI spec.""" - llm = ChatOCIModelDeploymentVLLM( - endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) + llm = ChatOCIModelDeploymentVLLM(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = None count = 0 @@ -163,9 +155,7 @@ def test_stream_vllm(*args: Any) -> None: assert str(output.content).strip() == CONST_COMPLETION -async def mocked_async_streaming_response( - *args: Any, **kwargs: Any -) -> AsyncGenerator[bytes, None]: +async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGenerator[bytes, None]: """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -174,18 +164,14 @@ async def mocked_async_streaming_response( @pytest.mark.asyncio @pytest.mark.requires("ads") @pytest.mark.requires("langchain_openai") -@mock.patch( - "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) -) +@mock.patch("ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock())) @mock.patch( "langchain_oci.llms.oci_data_science_model_deployment_endpoint.BaseOCIModelDeployment._arequest", mock.MagicMock(), ) async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" - llm = ChatOCIModelDeploymentVLLM( - endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) + llm = ChatOCIModelDeploymentVLLM(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py index eaa94cb..3d00545 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py @@ -23,9 +23,7 @@ def __getattr__(self, val): # type: ignore[no-untyped-def] @pytest.mark.requires("oci") -@pytest.mark.parametrize( - "test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"] -) +@pytest.mark.parametrize("test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"]) def test_llm_chat(monkeypatch: MonkeyPatch, test_model_id: str) -> None: """Test valid chat call to OCI Generative AI LLM service.""" oci_gen_ai_client = MagicMock() @@ -151,7 +149,7 @@ def mocked_response(*args): # type: ignore[no-untyped-def] expected = "Assistant chat reply." actual = llm.invoke(messages, temperature=0.2) assert actual.content == expected - + # Test total_tokens in additional_kwargs assert "total_tokens" in actual.additional_kwargs if provider == "cohere": @@ -268,9 +266,7 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] { "message": MockResponseDict( { - "content": [ - MockResponseDict({"text": ""}) - ], + "content": [MockResponseDict({"text": ""})], "tool_calls": [ MockResponseDict( { @@ -278,7 +274,7 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] "id": "call_escaped", "name": "get_weather", # Escaped JSON (the bug scenario) - "arguments": '"{\\\"location\\\": \\\"San Francisco\\\"}"', + "arguments": '"{\\"location\\": \\"San Francisco\\"}"', # noqa: E501 "attribute_map": { "id": "id", "type": "type", @@ -328,9 +324,7 @@ def get_weather(location: str) -> str: messages = [HumanMessage(content="What's the weather like?")] # Test that tool choice raises ValueError - with pytest.raises( - ValueError, match="Tool choice is not supported for Cohere models" - ): + with pytest.raises(ValueError, match="Tool choice is not supported for Cohere models"): llm.bind_tools( tools=[get_weather], tool_choice="auto", @@ -536,7 +530,7 @@ class WeatherResponse(BaseModel): def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] # Verify that response_format is a JsonSchemaResponseFormat object request = args[0] - assert hasattr(request.chat_request, 'response_format') + assert hasattr(request.chat_request, "response_format") assert request.chat_request.response_format is not None return MockResponseDict( @@ -583,9 +577,7 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: from unittest.mock import patch with patch("oci.config.from_file") as mock_from_file: - with patch( - "oci.generative_ai_inference.generative_ai_inference_client.validate_config" - ): + with patch("oci.generative_ai_inference.generative_ai_inference_client.validate_config"): with patch("oci.base_client.validate_config"): with patch("oci.signer.load_private_key"): custom_config_path = "/custom/path/config" @@ -593,9 +585,7 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: model_id="cohere.command-r-16k", auth_file_location=custom_config_path, ) - mock_from_file.assert_called_once_with( - file_location=custom_config_path, profile_name="DEFAULT" - ) + mock_from_file.assert_called_once_with(file_location=custom_config_path, profile_name="DEFAULT") @pytest.mark.requires("oci") @@ -641,9 +631,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] messages = [HumanMessage(content="What's the weather like?")] # Test with include_raw=True - structured_llm = llm.with_structured_output( - WeatherResponse, method="json_schema", include_raw=True - ) + structured_llm = llm.with_structured_output(WeatherResponse, method="json_schema", include_raw=True) response = structured_llm.invoke(messages) assert isinstance(response, dict) assert "parsed" in response @@ -668,12 +656,10 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] # Check if the request contains tool_calls in the message request = args[0] has_chat_request = hasattr(request, "chat_request") - has_messages = has_chat_request and hasattr( - request.chat_request, "messages" - ) + has_messages = has_chat_request and hasattr(request.chat_request, "messages") if has_messages: for msg in request.chat_request.messages: - if hasattr(msg, 'tool_calls') and msg.tool_calls: + if hasattr(msg, "tool_calls") and msg.tool_calls: tool_calls_processed = True break return MockResponseDict( @@ -694,9 +680,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "content": [ MockResponseDict( { - "text": ( - "I'll help you." - ), + "text": ("I'll help you."), "type": "TEXT", } ) @@ -731,7 +715,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "name": "get_weather", "args": {"location": "San Francisco"}, } - ] + ], ) messages = [ai_message] @@ -744,7 +728,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] @pytest.mark.requires("oci") def test_ai_message_tool_calls_additional_kwargs(monkeypatch: MonkeyPatch) -> None: """Test AIMessage with tool_calls in additional_kwargs field.""" - + oci_gen_ai_client = MagicMock() llm = ChatOCIGenAI(model_id="meta.llama-3.3-70b-instruct", client=oci_gen_ai_client) @@ -767,9 +751,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "content": [ MockResponseDict( { - "text": ( - "I'll help you." - ), + "text": ("I'll help you."), "type": "TEXT", } ) @@ -806,7 +788,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "args": {"location": "New York"}, } ] - } + }, ) messages = [ai_message] @@ -844,7 +826,7 @@ def test_tool_choice_none_after_tool_results() -> None: llm = ChatOCIGenAI( model_id="meta.llama-3.3-70b-instruct", client=oci_gen_ai_client, - max_sequential_tool_calls=3 # Set limit to 3 for testing + max_sequential_tool_calls=3, # Set limit to 3 for testing ) # Define a simple tool function (following the pattern from other tests) @@ -867,17 +849,15 @@ def get_weather(city: str) -> str: AIMessage(content="", tool_calls=[{"id": "call_2", "name": "get_weather", "args": {"city": "New York"}}]), ToolMessage(content="Rainy, 55°F", tool_call_id="call_2"), AIMessage(content="", tool_calls=[{"id": "call_3", "name": "get_weather", "args": {"city": "Seattle"}}]), - ToolMessage(content="Cloudy, 60°F", tool_call_id="call_3") + ToolMessage(content="Cloudy, 60°F", tool_call_id="call_3"), ] # Prepare the request - need to pass tools from the bound model kwargs - request = llm_with_tools._prepare_request( - messages, stop=None, stream=False, **llm_with_tools.kwargs - ) + request = llm_with_tools._prepare_request(messages, stop=None, stream=False, **llm_with_tools.kwargs) # Verify that tool_choice is set to 'none' because limit was reached - assert hasattr(request.chat_request, 'tool_choice') + assert hasattr(request.chat_request, "tool_choice") assert isinstance(request.chat_request.tool_choice, models.ToolChoiceNone) # Verify tools are still present (not removed, just choice is 'none') - assert hasattr(request.chat_request, 'tools') + assert hasattr(request.chat_request, "tools") assert len(request.chat_request.tools) > 0 diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py index b670be6..2ab8930 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py @@ -85,9 +85,7 @@ def test_construct_json_body(mocker: MockerFixture) -> None: messages = [ HumanMessage(content="User message"), ] - chat = ChatOCIModelDeployment( - endpoint="test_endpoint", model_kwargs={"temperature": 0.2} - ) + chat = ChatOCIModelDeployment(endpoint="test_endpoint", model_kwargs={"temperature": 0.2}) payload = chat._construct_json_body(messages, chat._invocation_params(stop=None)) assert payload == { "messages": [{"content": "User message", "role": "user"}], diff --git a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py index dc4bd78..28a0bd9 100644 --- a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py @@ -33,8 +33,7 @@ + '"choices":[{"index":0,"text":"","finish_reason":""}]}' ) CONST_STREAM_RESPONSE = ( - CONST_STREAM_TEMPLATE.replace("", " " + word).encode() - for word in CONST_COMPLETION.split(" ") + CONST_STREAM_TEMPLATE.replace("", " " + word).encode() for word in CONST_COMPLETION.split(" ") ) CONST_ASYNC_STREAM_TEMPLATE = ( @@ -42,13 +41,10 @@ + '"choices":[{"index":0,"text":"","finish_reason":""}]}' ) CONST_ASYNC_STREAM_RESPONSE = ( - CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() - for word in CONST_COMPLETION.split(" ") + CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() for word in CONST_COMPLETION.split(" ") ) -pytestmark = pytest.mark.skipif( - sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" -) +pytestmark = pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires Python 3.9 or higher") class MockResponse: @@ -99,9 +95,7 @@ def mocked_requests_post(url: str, **kwargs: Any) -> MockResponse: ) -async def mocked_async_streaming_response( - *args: Any, **kwargs: Any -) -> AsyncGenerator[bytes, None]: +async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGenerator[bytes, None]: """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -123,9 +117,7 @@ def test_invoke_vllm(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_stream_tgi(*args: Any) -> None: """Tests streaming with TGI endpoint using OpenAI spec.""" - llm = OCIModelDeploymentTGI( - endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) + llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = "" count = 0 @@ -141,9 +133,7 @@ def test_stream_tgi(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_generate_tgi(*args: Any) -> None: """Tests invoking TGI endpoint using TGI generate spec.""" - llm = OCIModelDeploymentTGI( - endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME - ) + llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = llm.invoke(CONST_PROMPT) assert output == CONST_COMPLETION @@ -151,14 +141,10 @@ def test_generate_tgi(*args: Any) -> None: @pytest.mark.asyncio @pytest.mark.requires("ads") -@mock.patch( - "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) -) +@mock.patch("ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock())) async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" - llm = OCIModelDeploymentTGI( - endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) + llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oracledb/Makefile b/libs/oracledb/Makefile index 4342953..79f2a67 100644 --- a/libs/oracledb/Makefile +++ b/libs/oracledb/Makefile @@ -27,14 +27,13 @@ lint_tests: PYTHON_FILES=tests lint_tests: MYPY_CACHE=.mypy_cache_test lint lint_diff lint_package lint_tests: - poetry run ruff . - poetry run ruff format $(PYTHON_FILES) --diff - poetry run ruff --select I $(PYTHON_FILES) - mkdir -p $(MYPY_CACHE); poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) + [ "$(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: poetry run ruff format $(PYTHON_FILES) - poetry run ruff --select I --fix $(PYTHON_FILES) + poetry run ruff check --select I --fix $(PYTHON_FILES) spell_check: poetry run codespell --toml pyproject.toml diff --git a/libs/oracledb/pyproject.toml b/libs/oracledb/pyproject.toml index 34f5988..a30e468 100644 --- a/libs/oracledb/pyproject.toml +++ b/libs/oracledb/pyproject.toml @@ -44,7 +44,7 @@ optional = true optional = true [tool.poetry.group.lint.dependencies] -ruff = "^0.1.8" +ruff = "^0.13.1" [tool.poetry.group.typing.dependencies] mypy = "^1.7" @@ -55,6 +55,9 @@ optional = true [tool.poetry.group.dev.dependencies] +[tool.ruff] +line-length = 120 + [tool.ruff.lint] select = [ "E", # pycodestyle @@ -62,13 +65,28 @@ select = [ "I", # isort "T201", # print ] +ignore = [ + "COM812", # Messes with the formatter +] [tool.ruff.format] docstring-code-format = true [tool.mypy] ignore_missing_imports = "True" -disallow_untyped_defs = "True" + +# Disable specific error codes that are causing issues +disallow_untyped_defs = "False" +disable_error_code = ["attr-defined", "assignment", "var-annotated", "override", "union-attr", "arg-type"] + +# TODO: LangChain Google settings +# plugins = ["pydantic.mypy"] +# strict = true +# disallow_untyped_defs = true + +# # TODO: activate for 'strict' checking +# disallow_any_generics = false +# warn_return_any = false [tool.coverage.run] omit = ["tests/*"] From e38af364602d10a32ff5e611edeb286b22dfc525 Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 13:26:21 -0800 Subject: [PATCH 09/16] Refactor oracledb to pass make lint tests --- .../document_loaders/oracleadb_loader.py | 12 +- .../document_loaders/oracleai.py | 47 +- .../langchain_oracledb/embeddings/oracleai.py | 15 +- .../langchain_oracledb/utilities/oracleai.py | 14 +- .../vectorstores/oraclevs.py | 300 +++-------- libs/oracledb/poetry.lock | 62 +-- .../document_loaders/test_oracleds.py | 3 +- .../vectorstores/test_oraclevs.py | 486 +++++------------- .../document_loaders/test_oracleadb.py | 14 +- 9 files changed, 251 insertions(+), 702 deletions(-) diff --git a/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py b/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py index 2b7ff3b..7faa92f 100644 --- a/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py +++ b/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py @@ -3,7 +3,7 @@ """ oracleadb_loader.py -Contains OracleAutonomousDatabaseLoader for connecting to +Contains OracleAutonomousDatabaseLoader for connecting to Oracle Autonomous Database (ADB). """ @@ -98,11 +98,7 @@ def _run_query(self) -> List[Dict[str, Any]]: columns = [col[0] for col in cursor.description] data = cursor.fetchall() data = [ - { - i: (j if not isinstance(j, oracledb.LOB) else j.read()) - for i, j in zip(columns, row) - } - for row in data + {i: (j if not isinstance(j, oracledb.LOB) else j.read()) for i, j in zip(columns, row)} for row in data ] except oracledb.DatabaseError as e: print("Got error while connecting: " + str(e)) # noqa: T201 @@ -118,9 +114,7 @@ def load(self) -> List[Document]: documents = [] metadata_columns = self.metadata if self.metadata else [] for row in data: - metadata = { - key: value for key, value in row.items() if key in metadata_columns - } + metadata = {key: value for key, value in row.items() if key in metadata_columns} doc = Document(page_content=str(row), metadata=metadata) documents.append(doc) diff --git a/libs/oracledb/langchain_oracledb/document_loaders/oracleai.py b/libs/oracledb/langchain_oracledb/document_loaders/oracleai.py index 2d55ad3..ae38a2b 100644 --- a/libs/oracledb/langchain_oracledb/document_loaders/oracleai.py +++ b/libs/oracledb/langchain_oracledb/document_loaders/oracleai.py @@ -3,7 +3,7 @@ """ oracleai.py -Defines OracleDocLoader and OracleTextSplitter for loading +Defines OracleDocLoader and OracleTextSplitter for loading and splitting documents using Oracle AI Vector Search. Authors: @@ -101,18 +101,14 @@ def generate_object_id(input_string: Union[str, None] = None) -> str: # binary object id object_id = timestamp_bin + hashval_bin + counter_bin # 16 bytes object_id_hex = object_id.hex() # 32 bytes - object_id_hex = object_id_hex.zfill( - out_length - ) # fill with zeros if less than 32 bytes + object_id_hex = object_id_hex.zfill(out_length) # fill with zeros if less than 32 bytes object_id_hex = object_id_hex[:out_length] return object_id_hex @staticmethod - def read_file( - conn: Connection, file_path: str, params: dict - ) -> Union[Document, None]: + def read_file(conn: Connection, file_path: str, params: dict) -> Union[Document, None]: """Read a file using OracleReader Args: conn: Oracle Connection, @@ -155,9 +151,7 @@ def read_file( metadata = {} else: doc_data = str(mdata.getvalue()) - if doc_data.startswith("" - ): + if doc_data.startswith(""): p = ParseOracleDocMetadata() p.feed(doc_data) metadata = p.get_metadata() @@ -243,10 +237,7 @@ def load(self) -> List[Document]: self.mdata_cols = self.params.get("mdata_cols") if self.mdata_cols is not None: if len(self.mdata_cols) > 3: - raise Exception( - "Exceeds the max number of columns " - + "you can request for metadata." - ) + raise Exception("Exceeds the max number of columns " + "you can request for metadata.") # execute a query to get column data types sql = ( @@ -274,8 +265,7 @@ def load(self) -> List[Document]: "VARCHAR2", ]: raise Exception( - "The datatype for the column requested " - + "for metadata is not supported." + "The datatype for the column requested " + "for metadata is not supported." ) self.mdata_cols_sql = ", rowid" @@ -306,22 +296,14 @@ def load(self) -> List[Document]: if row is None: doc_id = OracleDocReader.generate_object_id( - self.conn.username - + "$" - + self.owner - + "$" - + self.tablename - + "$" - + self.colname + self.conn.username + "$" + self.owner + "$" + self.tablename + "$" + self.colname ) metadata["_oid"] = doc_id results.append(Document(page_content="", metadata=metadata)) else: if row[0] is not None: data = str(row[0]) - if data.startswith("" - ): + if data.startswith(""): p = ParseOracleDocMetadata() p.feed(data) metadata = p.get_metadata() @@ -348,15 +330,9 @@ def load(self) -> List[Document]: metadata[self.mdata_cols[i]] = row[i + 2] if row[1] is None: - results.append( - Document(page_content="", metadata=metadata) - ) + results.append(Document(page_content="", metadata=metadata)) else: - results.append( - Document( - page_content=str(row[1]), metadata=metadata - ) - ) + results.append(Document(page_content=str(row[1]), metadata=metadata)) except Exception as ex: logger.info(f"An exception occurred :: {ex}") traceback.print_exc() @@ -403,8 +379,7 @@ def split_text(self, text: str) -> List[str]: cursor.setinputsizes(content=oracledb.CLOB) cursor.execute( - "select t.column_value from " - + "dbms_vector_chain.utl_to_chunks(:content, json(:params)) t", + "select t.column_value from " + "dbms_vector_chain.utl_to_chunks(:content, json(:params)) t", content=text, params=self._json.dumps(self.params), ) diff --git a/libs/oracledb/langchain_oracledb/embeddings/oracleai.py b/libs/oracledb/langchain_oracledb/embeddings/oracleai.py index 6b7c624..bae963e 100644 --- a/libs/oracledb/langchain_oracledb/embeddings/oracleai.py +++ b/libs/oracledb/langchain_oracledb/embeddings/oracleai.py @@ -3,13 +3,14 @@ """ oracleai.py -Implements OracleEmbeddings for generating and handling +Implements OracleEmbeddings for generating and handling vector embeddings with Oracle AI Vector Search. Authors: - Harichandan Roy (hroy) - David Jiang (ddjiang) """ + from __future__ import annotations import json @@ -55,9 +56,7 @@ def __init__(self, **kwargs: Any): """ @staticmethod - def load_onnx_model( - conn: Connection, dir: str, onnx_file: str, model_name: str - ) -> None: + def load_onnx_model(conn: Connection, dir: str, onnx_file: str, model_name: str) -> None: """Load an ONNX model to Oracle Database. Args: conn: Oracle Connection, @@ -111,9 +110,7 @@ def embed_documents(self, texts: List[str]) -> List[List[float]]: cursor = self.conn.cursor() if self.proxy: - cursor.execute( - "begin utl_http.set_proxy(:proxy); end;", proxy=self.proxy - ) + cursor.execute("begin utl_http.set_proxy(:proxy); end;", proxy=self.proxy) chunks = [] for i, text in enumerate(texts, start=1): @@ -124,9 +121,7 @@ def embed_documents(self, texts: List[str]) -> List[List[float]]: inputs = vector_array_type.newobject(chunks) cursor.setinputsizes(None, oracledb.DB_TYPE_JSON) cursor.execute( - "select t.* " - + "from dbms_vector_chain.utl_to_embeddings(:1, " - + "json(:2)) t", + "select t.* " + "from dbms_vector_chain.utl_to_embeddings(:1, " + "json(:2)) t", [inputs, self.params], ) diff --git a/libs/oracledb/langchain_oracledb/utilities/oracleai.py b/libs/oracledb/langchain_oracledb/utilities/oracleai.py index 47a3e9d..5a7492a 100644 --- a/libs/oracledb/langchain_oracledb/utilities/oracleai.py +++ b/libs/oracledb/langchain_oracledb/utilities/oracleai.py @@ -9,6 +9,7 @@ - Harichandan Roy (hroy) - David Jiang (ddjiang) """ + from __future__ import annotations import json @@ -45,9 +46,7 @@ class OracleSummary: proxy: Proxy """ - def __init__( - self, conn: Connection, params: Dict[str, Any], proxy: Optional[str] = None - ): + def __init__(self, conn: Connection, params: Dict[str, Any], proxy: Optional[str] = None): self.conn = conn self.proxy = proxy self.summary_params = params @@ -70,9 +69,7 @@ def get_summary(self, docs: Any) -> List[str]: cursor.outputtypehandler = output_type_handler if self.proxy: - cursor.execute( - "begin utl_http.set_proxy(:proxy); end;", proxy=self.proxy - ) + cursor.execute("begin utl_http.set_proxy(:proxy); end;", proxy=self.proxy) if isinstance(docs, str): results = [] @@ -149,10 +146,7 @@ def get_summary(self, docs: Any) -> List[str]: value = summary.getvalue(i) - results = [ - "" if value is None else str(value) - for i in range(summary.actual_elements) - ] + results = ["" if value is None else str(value) for i in range(summary.actual_elements)] else: raise Exception("Invalid input type") diff --git a/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py b/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py index 4a9d748..0f2413c 100644 --- a/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py +++ b/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py @@ -3,9 +3,10 @@ """ oraclevs.py -Provides integration between Oracle Vector Database and +Provides integration between Oracle Vector Database and LangChain for vector storage and search. """ + from __future__ import annotations import array @@ -91,9 +92,7 @@ NOT_OPERS = ["$nin", "$not", "$exists"] -def _get_comparison_string( - oper: str, value: Any, bind_variables: List[str] -) -> tuple[str, str]: +def _get_comparison_string(oper: str, value: Any, bind_variables: List[str]) -> tuple[str, str]: if oper not in COMPARISON_MAP: raise ValueError(f"Invalid operator: {oper}") @@ -110,10 +109,7 @@ def _get_comparison_string( # between - needs two bindings elif oper == "$between": if not isinstance(value, List) or len(value) != 2: - raise ValueError( - f"Invalid value for $between: {value}. " - "It must be a list containing exactly 2 elements." - ) + raise ValueError(f"Invalid value for $between: {value}. It must be a list containing exactly 2 elements.") min_val, max_val = value if min_val is None and max_val is None: @@ -142,9 +138,7 @@ def _get_comparison_string( # in/nin/all needs N bindings elif oper in ["$in", "$nin", "$all"]: if not isinstance(value, List): - raise ValueError( - f"Invalid value for $in: {value}. It must be a non-empty list." - ) + raise ValueError(f"Invalid value for $in: {value}. It must be a non-empty list.") value_binds = [] passings = [] @@ -183,14 +177,9 @@ def _validate_metadata_key(metadata_key: str) -> None: ) -def _generate_condition( - metadata_key: str, value: Any, bind_variables: List[str] -) -> str: +def _generate_condition(metadata_key: str, value: Any, bind_variables: List[str]) -> str: # single check inside a JSON_EXISTS - SINGLE_MASK = ( - "JSON_EXISTS(metadata, '$.{key}?(@ {oper} $val)' " - 'PASSING {value_bind} AS "val")' - ) + SINGLE_MASK = "JSON_EXISTS(metadata, '$.{key}?(@ {oper} $val)' PASSING {value_bind} AS \"val\")" # combined checks with multiple operators and passing values MULTIPLE_MASK = "JSON_EXISTS(metadata, '$.{key}?({filters})' PASSING {passes})" @@ -249,28 +238,18 @@ def _generate_condition( elif k == "$exists": if not isinstance(v, bool): - raise ValueError( - f"Invalid value for $exists: {value}. " - "It must be a boolean (true or false)." - ) + raise ValueError(f"Invalid value for $exists: {value}. It must be a boolean (true or false).") if v: - all_conditions.append( - f"JSON_EXISTS(metadata, '$.{metadata_key}')" - ) + all_conditions.append(f"JSON_EXISTS(metadata, '$.{metadata_key}')") else: - all_conditions.append( - f"NOT (JSON_EXISTS(metadata, '$.{metadata_key}'))" - ) + all_conditions.append(f"NOT (JSON_EXISTS(metadata, '$.{metadata_key}'))") elif k == "$nin": # for now only $nin result, passings = _get_comparison_string(k, v, bind_variables) all_conditions.append( - " NOT " - + MULTIPLE_MASK.format( - key=metadata_key, filters=result, passes=passings - ) + " NOT " + MULTIPLE_MASK.format(key=metadata_key, filters=result, passes=passings) ) elif k == "$eq": @@ -278,10 +257,7 @@ def _generate_condition( bind_variables.append(json.dumps(v)) all_conditions.append( - "JSON_EQUAL(" - f" JSON_QUERY(metadata, '$.{metadata_key}' )," - f" JSON(:value{bind_l})" - ")" + f"JSON_EQUAL( JSON_QUERY(metadata, '$.{metadata_key}' ), JSON(:value{bind_l}))" ) elif k == "$ne": @@ -289,10 +265,7 @@ def _generate_condition( bind_variables.append(json.dumps(v)) all_conditions.append( - "NOT (JSON_EQUAL(" - f" JSON_QUERY(metadata, '$.{metadata_key}' )," - f" JSON(:value{bind_l})" - "))" + f"NOT (JSON_EQUAL( JSON_QUERY(metadata, '$.{metadata_key}' ), JSON(:value{bind_l})))" ) res = " AND ".join(all_conditions) @@ -326,9 +299,7 @@ def _generate_where_clause(filter: dict, bind_variables: List[str]) -> str: if not isinstance(value, list): raise ValueError("Logical operators require an array of values.") - combine_conditions = [ - _generate_where_clause(v, bind_variables) for v in value - ] + combine_conditions = [_generate_where_clause(v, bind_variables) for v in value] res = filter_format[1].format(filter_format[0].join(combine_conditions)) @@ -360,9 +331,7 @@ def _get_connection(client: Any) -> Optional[Connection]: valid_types = "oracledb.Connection" if connection_pool_class: valid_types += " or oracledb.ConnectionPool" - raise TypeError( - f"Expected client of type {valid_types}, got {type(client).__name__}" - ) + raise TypeError(f"Expected client of type {valid_types}, got {type(client).__name__}") async def _aget_connection(client: Any) -> Optional[AsyncConnection]: @@ -377,9 +346,7 @@ async def _aget_connection(client: Any) -> Optional[AsyncConnection]: valid_types = "oracledb.AsyncConnection" if connection_pool_class: valid_types += " or oracledb.AsyncConnectionPool" - raise TypeError( - f"Expected client of type {valid_types}, got {type(client).__name__}" - ) + raise TypeError(f"Expected client of type {valid_types}, got {type(client).__name__}") def _handle_exceptions(func: T) -> T: @@ -390,15 +357,11 @@ def wrapper(*args: Any, **kwargs: Any) -> Any: except oracledb.Error as db_err: # Handle a known type of error (e.g., DB-related) specifically logger.exception("DB-related error occurred.") - raise RuntimeError( - "Failed due to a DB error: {}".format(db_err) - ) from db_err + raise RuntimeError("Failed due to a DB error: {}".format(db_err)) from db_err except RuntimeError as runtime_err: # Handle a runtime error logger.exception("Runtime error occurred.") - raise RuntimeError( - "Failed due to a runtime error: {}".format(runtime_err) - ) from runtime_err + raise RuntimeError("Failed due to a runtime error: {}".format(runtime_err)) from runtime_err except ValueError as val_err: # Handle another known type of error specifically logger.exception("Validation error.") @@ -419,15 +382,11 @@ async def wrapper(*args: Any, **kwargs: Any) -> Any: except oracledb.Error as db_err: # Handle a known type of error (e.g., DB-related) specifically logger.exception("DB-related error occurred.") - raise RuntimeError( - "Failed due to a DB error: {}".format(db_err) - ) from db_err + raise RuntimeError("Failed due to a DB error: {}".format(db_err)) from db_err except RuntimeError as runtime_err: # Handle a runtime error logger.exception("Runtime error occurred.") - raise RuntimeError( - "Failed due to a runtime error: {}".format(runtime_err) - ) from runtime_err + raise RuntimeError("Failed due to a runtime error: {}".format(runtime_err)) from runtime_err except ValueError as val_err: # Handle another known type of error specifically logger.exception("Validation error.") @@ -481,9 +440,7 @@ def _quote_indentifier(name: str) -> str: @_handle_exceptions -def _index_exists( - connection: Connection, index_name: str, table_name: Optional[str] = None -) -> bool: +def _index_exists(connection: Connection, index_name: str, table_name: Optional[str] = None) -> bool: # check if the index exists query = f""" SELECT index_name @@ -513,9 +470,7 @@ def _index_exists( return result is not None -async def _aindex_exists( - connection: AsyncConnection, index_name: str, table_name: Optional[str] = None -) -> bool: +async def _aindex_exists(connection: AsyncConnection, index_name: str, table_name: Optional[str] = None) -> bool: # check if the index exists query = f""" SELECT index_name, table_name @@ -582,9 +537,7 @@ def _create_table(connection: Connection, table_name: str, embedding_dim: int) - if not _table_exists(connection, table_name): with connection.cursor() as cursor: - ddl_body = ", ".join( - f"{col_name} {col_type}" for col_name, col_type in cols_dict.items() - ) + ddl_body = ", ".join(f"{col_name} {col_type}" for col_name, col_type in cols_dict.items()) ddl = f"CREATE TABLE {table_name} ({ddl_body})" cursor.execute(ddl) logger.info(f"Table {table_name} created successfully...") @@ -592,16 +545,12 @@ def _create_table(connection: Connection, table_name: str, embedding_dim: int) - logger.info(f"Table {table_name} already exists...") -async def _acreate_table( - connection: AsyncConnection, table_name: str, embedding_dim: int -) -> None: +async def _acreate_table(connection: AsyncConnection, table_name: str, embedding_dim: int) -> None: cols_dict = _get_table_dict(embedding_dim) if not await _atable_exists(connection, table_name): with connection.cursor() as cursor: - ddl_body = ", ".join( - f"{col_name} {col_type}" for col_name, col_type in cols_dict.items() - ) + ddl_body = ", ".join(f"{col_name} {col_type}" for col_name, col_type in cols_dict.items()) ddl = f"CREATE TABLE {table_name} ({ddl_body})" await cursor.execute(ddl) logger.info(f"Table {table_name} created successfully...") @@ -643,9 +592,7 @@ def create_index( params, ) else: - _create_hnsw_index( - connection, vector_store.table_name, vector_store.distance_strategy, params - ) + _create_hnsw_index(connection, vector_store.table_name, vector_store.distance_strategy, params) return @@ -669,9 +616,7 @@ def _get_hnsw_index_ddl( for compulsory_key in ["idx_name", "parallel"]: if compulsory_key not in config: if compulsory_key == "idx_name": - config[compulsory_key] = _get_index_name( - str(defaults[compulsory_key]) - ) + config[compulsory_key] = _get_index_name(str(defaults[compulsory_key])) else: config[compulsory_key] = defaults[compulsory_key] @@ -685,10 +630,7 @@ def _get_hnsw_index_ddl( # base SQL statement idx_name = config["idx_name"] - base_sql = ( - f"create vector index {idx_name} on {table_name}(embedding) " - f"ORGANIZATION INMEMORY NEIGHBOR GRAPH" - ) + base_sql = f"create vector index {idx_name} on {table_name}(embedding) ORGANIZATION INMEMORY NEIGHBOR GRAPH" # optional parts depending on parameters accuracy_part = " WITH TARGET ACCURACY {accuracy}" if ("accuracy" in config) else "" @@ -696,30 +638,19 @@ def _get_hnsw_index_ddl( parameters_part = "" if "neighbors" in config and "efConstruction" in config: - parameters_part = ( - " parameters (type {idx_type}, neighbors {" - "neighbors}, efConstruction {efConstruction})" - ) + parameters_part = " parameters (type {idx_type}, neighbors {neighbors}, efConstruction {efConstruction})" elif "neighbors" in config and "efConstruction" not in config: config["efConstruction"] = defaults["efConstruction"] - parameters_part = ( - " parameters (type {idx_type}, neighbors {" - "neighbors}, efConstruction {efConstruction})" - ) + parameters_part = " parameters (type {idx_type}, neighbors {neighbors}, efConstruction {efConstruction})" elif "neighbors" not in config and "efConstruction" in config: config["neighbors"] = defaults["neighbors"] - parameters_part = ( - " parameters (type {idx_type}, neighbors {" - "neighbors}, efConstruction {efConstruction})" - ) + parameters_part = " parameters (type {idx_type}, neighbors {neighbors}, efConstruction {efConstruction})" # always included part for parallel parallel_part = " parallel {parallel}" # combine all parts - ddl_assembly = ( - base_sql + accuracy_part + distance_part + parameters_part + parallel_part - ) + ddl_assembly = base_sql + accuracy_part + distance_part + parameters_part + parallel_part # format the SQL with values from the params dictionary ddl = ddl_assembly.format(**config) @@ -764,9 +695,7 @@ def _get_ivf_index_ddl( for compulsory_key in ["idx_name", "parallel"]: if compulsory_key not in config: if compulsory_key == "idx_name": - config[compulsory_key] = _get_index_name( - str(defaults[compulsory_key]) - ) + config[compulsory_key] = _get_index_name(str(defaults[compulsory_key])) else: config[compulsory_key] = defaults[compulsory_key] @@ -780,10 +709,7 @@ def _get_ivf_index_ddl( # base SQL statement idx_name = config["idx_name"] - base_sql = ( - f"CREATE VECTOR INDEX {idx_name} ON {table_name}(embedding) " - f"ORGANIZATION NEIGHBOR PARTITIONS" - ) + base_sql = f"CREATE VECTOR INDEX {idx_name} ON {table_name}(embedding) ORGANIZATION NEIGHBOR PARTITIONS" # optional parts depending on parameters accuracy_part = " WITH TARGET ACCURACY {accuracy}" if ("accuracy" in config) else "" @@ -791,18 +717,13 @@ def _get_ivf_index_ddl( parameters_part = "" if "idx_type" in config and "neighbor_part" in config: - parameters_part = ( - f" PARAMETERS (type {config['idx_type']}, neighbor" - f" partitions {config['neighbor_part']})" - ) + parameters_part = f" PARAMETERS (type {config['idx_type']}, neighbor partitions {config['neighbor_part']})" # always included part for parallel parallel_part = f" PARALLEL {config['parallel']}" # combine all parts - ddl_assembly = ( - base_sql + accuracy_part + distance_part + parameters_part + parallel_part - ) + ddl_assembly = base_sql + accuracy_part + distance_part + parameters_part + parallel_part # format the SQL with values from the params dictionary ddl = ddl_assembly.format(**config) @@ -1014,32 +935,20 @@ def get_processed_ids( ) -> List[str]: if ids: # if ids are provided, hash them to maintain consistency - processed_ids = [ - hashlib.sha256(_id.encode()).hexdigest()[:16].upper() for _id in ids - ] + processed_ids = [hashlib.sha256(_id.encode()).hexdigest()[:16].upper() for _id in ids] elif metadatas and all("id" in metadata for metadata in metadatas): # if no ids are provided but metadatas with ids are, generate # ids from metadatas - processed_ids = [ - hashlib.sha256(metadata["id"].encode()).hexdigest()[:16].upper() - for metadata in metadatas - ] + processed_ids = [hashlib.sha256(metadata["id"].encode()).hexdigest()[:16].upper() for metadata in metadatas] else: # generate new ids if none are provided - generated_ids = [ - str(uuid.uuid4()) for _ in texts - ] # uuid4 is more standard for random UUIDs - processed_ids = [ - hashlib.sha256(_id.encode()).hexdigest()[:16].upper() - for _id in generated_ids - ] + generated_ids = [str(uuid.uuid4()) for _ in texts] # uuid4 is more standard for random UUIDs + processed_ids = [hashlib.sha256(_id.encode()).hexdigest()[:16].upper() for _id in generated_ids] return processed_ids -def _get_delete_ddl( - table_name: str, ids: Optional[List[str]] = None -) -> Tuple[str, Dict]: +def _get_delete_ddl(table_name: str, ids: Optional[List[str]] = None) -> Tuple[str, Dict]: if ids is None: raise ValueError("No ids provided to delete.") @@ -1065,9 +974,7 @@ def mmr_from_docs_embeddings( ) -> List[Tuple[Document, float]]: # if you need to split documents and scores for processing (e.g., # for MMR calculation) - documents, scores, embeddings = ( - zip(*docs_scores_embeddings) if docs_scores_embeddings else ([], [], []) - ) + documents, scores, embeddings = zip(*docs_scores_embeddings) if docs_scores_embeddings else ([], [], []) # assume maximal_marginal_relevance method accepts embeddings and # scores, and returns indices of selected docs @@ -1079,9 +986,7 @@ def mmr_from_docs_embeddings( ) # filter documents based on MMR-selected indices and map scores - mmr_selected_documents_with_scores = [ - (documents[i], scores[i]) for i in mmr_selected_indices - ] + mmr_selected_documents_with_scores = [(documents[i], scores[i]) for i in mmr_selected_indices] return mmr_selected_documents_with_scores @@ -1291,26 +1196,18 @@ def embeddings(self) -> Optional[Embeddings]: Optional[Embeddings]: The embedding function if it's an instance of Embeddings, otherwise None. """ - return ( - self.embedding_function - if isinstance(self.embedding_function, Embeddings) - else None - ) + return self.embedding_function if isinstance(self.embedding_function, Embeddings) else None def get_embedding_dimension(self) -> int: # embed the single document by wrapping it in a list - embedded_document = self._embed_documents( - [self.query if self.query is not None else ""] - ) + embedded_document = self._embed_documents([self.query if self.query is not None else ""]) # get the first (and only) embedding's dimension return len(embedded_document[0]) async def aget_embedding_dimension(self) -> int: # embed the single document by wrapping it in a list - embedded_document = await self._aembed_documents( - [self.query if self.query is not None else ""] - ) + embedded_document = await self._aembed_documents([self.query if self.query is not None else ""]) # get the first (and only) embedding's dimension return len(embedded_document[0]) @@ -1321,9 +1218,7 @@ def _embed_documents(self, texts: List[str]) -> List[List[float]]: elif callable(self.embedding_function): return [self.embedding_function(text) for text in texts] else: - raise TypeError( - "The embedding_function is neither Embeddings nor callable." - ) + raise TypeError("The embedding_function is neither Embeddings nor callable.") async def _aembed_documents(self, texts: List[str]) -> List[List[float]]: if isinstance(self.embedding_function, Embeddings): @@ -1333,9 +1228,7 @@ async def _aembed_documents(self, texts: List[str]) -> List[List[float]]: elif callable(self.embedding_function): return [self.embedding_function(text) for text in texts] else: - raise TypeError( - "The embedding_function is neither Embeddings nor callable." - ) + raise TypeError("The embedding_function is neither Embeddings nor callable.") def _embed_query(self, text: str) -> List[float]: if isinstance(self.embedding_function, Embeddings): @@ -1386,9 +1279,7 @@ def add_texts( metadata, text, ) - for id_, embedding, metadata, text in zip( - processed_ids, embeddings, metadatas, texts - ) + for id_, embedding, metadata, text in zip(processed_ids, embeddings, metadatas, texts) ] else: docs = list(zip(processed_ids, metadatas, texts)) @@ -1400,8 +1291,7 @@ def add_texts( if not isinstance(self.embeddings, OracleEmbeddings): cursor.setinputsizes(None, None, oracledb.DB_TYPE_JSON, None) cursor.executemany( - f"INSERT INTO {self.table_name} (id, embedding, metadata, " - f"text) VALUES (:1, :2, :3, :4)", + f"INSERT INTO {self.table_name} (id, embedding, metadata, text) VALUES (:1, :2, :3, :4)", docs, ) connection.commit() @@ -1414,15 +1304,13 @@ def add_texts( cursor.setinputsizes(None, oracledb.DB_TYPE_JSON, None) cursor.executemany( - f"INSERT INTO {self.table_name} (id, metadata, " - f"text) VALUES (:1, :2, :3)", + f"INSERT INTO {self.table_name} (id, metadata, text) VALUES (:1, :2, :3)", docs, ) cursor.setinputsizes(oracledb.DB_TYPE_JSON) update_sql = ( - f"UPDATE {self.table_name} " - "SET embedding = dbms_vector_chain.utl_to_embedding(text, json(:1))" + f"UPDATE {self.table_name} SET embedding = dbms_vector_chain.utl_to_embedding(text, json(:1))" ) cursor.execute(update_sql, [self.embeddings.params]) connection.commit() @@ -1464,9 +1352,7 @@ async def aadd_texts( metadata, text, ) - for id_, embedding, metadata, text in zip( - processed_ids, embeddings, metadatas, texts - ) + for id_, embedding, metadata, text in zip(processed_ids, embeddings, metadatas, texts) ] else: docs = list(zip(processed_ids, metadatas, texts)) @@ -1478,8 +1364,7 @@ async def context(connection: Any) -> None: if not isinstance(self.embeddings, OracleEmbeddings): cursor.setinputsizes(None, None, oracledb.DB_TYPE_JSON, None) await cursor.executemany( - f"INSERT INTO {self.table_name} (id, embedding, metadata, " - f"text) VALUES (:1, :2, :3, :4)", + f"INSERT INTO {self.table_name} (id, embedding, metadata, text) VALUES (:1, :2, :3, :4)", docs, ) await connection.commit() @@ -1492,8 +1377,7 @@ async def context(connection: Any) -> None: cursor.setinputsizes(None, oracledb.DB_TYPE_JSON, None) await cursor.executemany( - f"INSERT INTO {self.table_name} (id, metadata, " - f"text) VALUES (:1, :2, :3)", + f"INSERT INTO {self.table_name} (id, metadata, text) VALUES (:1, :2, :3)", docs, ) @@ -1520,9 +1404,7 @@ def similarity_search( """Return docs most similar to query.""" embedding: List[float] = self._embed_query(query) - documents = self.similarity_search_by_vector( - embedding=embedding, k=k, filter=filter, **kwargs - ) + documents = self.similarity_search_by_vector(embedding=embedding, k=k, filter=filter, **kwargs) return documents async def asimilarity_search( @@ -1536,9 +1418,7 @@ async def asimilarity_search( """Return docs most similar to query.""" embedding: List[float] = await self._aembed_query(query) - documents = await self.asimilarity_search_by_vector( - embedding=embedding, k=k, filter=filter, **kwargs - ) + documents = await self.asimilarity_search_by_vector(embedding=embedding, k=k, filter=filter, **kwargs) return documents def similarity_search_by_vector( @@ -1613,9 +1493,7 @@ def similarity_search_by_vector_with_relevance_scores( db_filter = kwargs.get("db_filter", None) if db_filter: if filter: - raise ValueError( - "Specify only one of 'filter' or 'db_filter'; they are equivalent." - ) + raise ValueError("Specify only one of 'filter' or 'db_filter'; they are equivalent.") filter = db_filter @@ -1673,9 +1551,7 @@ async def asimilarity_search_by_vector_with_relevance_scores( db_filter = kwargs.get("db_filter", None) if db_filter: if filter: - raise ValueError( - "Specify only one of 'filter' or 'db_filter'; they are equivalent." - ) + raise ValueError("Specify only one of 'filter' or 'db_filter'; they are equivalent.") filter = db_filter @@ -1732,9 +1608,7 @@ def similarity_search_by_vector_returning_embeddings( db_filter = kwargs.get("db_filter", None) if db_filter: if filter: - raise ValueError( - "Specify only one of 'filter' or 'db_filter'; they are equivalent." - ) + raise ValueError("Specify only one of 'filter' or 'db_filter'; they are equivalent.") filter = db_filter @@ -1771,9 +1645,7 @@ def similarity_search_by_vector_returning_embeddings( # assuming result[4] is already in the correct format; # adjust if necessary current_embedding = ( - np.array(result[4], dtype=np.float32) - if result[4] - else np.empty(0, dtype=np.float32) + np.array(result[4], dtype=np.float32) if result[4] else np.empty(0, dtype=np.float32) ) documents.append((document, distance, current_embedding)) @@ -1796,9 +1668,7 @@ async def asimilarity_search_by_vector_returning_embeddings( db_filter = kwargs.get("db_filter", None) if db_filter: if filter: - raise ValueError( - "Specify only one of 'filter' or 'db_filter'; they are equivalent." - ) + raise ValueError("Specify only one of 'filter' or 'db_filter'; they are equivalent.") filter = db_filter @@ -1827,17 +1697,13 @@ async def context(connection: Any) -> List: raise Exception("Unexpected type:", type(page_content_str)) metadata = result[2] or {} - document = Document( - page_content=page_content_str, metadata=metadata - ) + document = Document(page_content=page_content_str, metadata=metadata) distance = result[3] # assuming result[4] is already in the correct format; # adjust if necessary current_embedding = ( - np.array(result[4], dtype=np.float32) - if result[4] - else np.empty(0, dtype=np.float32) + np.array(result[4], dtype=np.float32) if result[4] else np.empty(0, dtype=np.float32) ) documents.append((document, distance, current_embedding)) @@ -1887,9 +1753,7 @@ def max_marginal_relevance_search_with_score_by_vector( embedding, fetch_k, filter=filter, **kwargs ) # assuming documents_with_scores is a list of tuples (Document, score) - mmr_selected_documents_with_scores = mmr_from_docs_embeddings( - docs_scores_embeddings, embedding, k, lambda_mult - ) + mmr_selected_documents_with_scores = mmr_from_docs_embeddings(docs_scores_embeddings, embedding, k, lambda_mult) return mmr_selected_documents_with_scores @@ -1930,15 +1794,11 @@ async def amax_marginal_relevance_search_with_score_by_vector( """ # fetch documents and their scores - docs_scores_embeddings = ( - await self.asimilarity_search_by_vector_returning_embeddings( - embedding, fetch_k, filter=filter, **kwargs - ) + docs_scores_embeddings = await self.asimilarity_search_by_vector_returning_embeddings( + embedding, fetch_k, filter=filter, **kwargs ) # assuming documents_with_scores is a list of tuples (Document, score) - mmr_selected_documents_with_scores = mmr_from_docs_embeddings( - docs_scores_embeddings, embedding, k, lambda_mult - ) + mmr_selected_documents_with_scores = mmr_from_docs_embeddings(docs_scores_embeddings, embedding, k, lambda_mult) return mmr_selected_documents_with_scores @@ -2012,15 +1872,13 @@ async def amax_marginal_relevance_search_by_vector( Returns: List of Documents selected by maximal marginal relevance. """ - docs_and_scores = ( - await self.amax_marginal_relevance_search_with_score_by_vector( - embedding, - k=k, - fetch_k=fetch_k, - lambda_mult=lambda_mult, - filter=filter, - **kwargs, - ) + docs_and_scores = await self.amax_marginal_relevance_search_with_score_by_vector( + embedding, + k=k, + fetch_k=fetch_k, + lambda_mult=lambda_mult, + filter=filter, + **kwargs, ) return [doc for doc, _ in docs_and_scores] @@ -2163,13 +2021,9 @@ def _from_texts_helper( table_name = str(kwargs.get("table_name", "langchain")) - distance_strategy = cast( - DistanceStrategy, kwargs.get("distance_strategy", None) - ) + distance_strategy = cast(DistanceStrategy, kwargs.get("distance_strategy", None)) if not isinstance(distance_strategy, DistanceStrategy): - raise TypeError( - f"Expected DistanceStrategy got " f"{type(distance_strategy).__name__} " - ) + raise TypeError(f"Expected DistanceStrategy got {type(distance_strategy).__name__} ") query = kwargs.get("query", "What is a Oracle database") diff --git a/libs/oracledb/poetry.lock b/libs/oracledb/poetry.lock index 11ce62c..a8c24cd 100644 --- a/libs/oracledb/poetry.lock +++ b/libs/oracledb/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -2086,8 +2086,6 @@ groups = ["test"] files = [ {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b"}, {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50"}, {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae"}, {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9"}, @@ -2097,8 +2095,6 @@ files = [ {file = "pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f"}, {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"}, {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"}, {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"}, {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"}, {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"}, @@ -2108,8 +2104,6 @@ files = [ {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"}, {file = "pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4"}, {file = "pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6"}, {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7"}, {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024"}, {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809"}, @@ -2122,8 +2116,6 @@ files = [ {file = "pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f"}, {file = "pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c"}, {file = "pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1"}, {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805"}, {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8"}, {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2"}, @@ -2133,8 +2125,6 @@ files = [ {file = "pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580"}, {file = "pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e"}, {file = "pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c"}, {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8"}, {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59"}, {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe"}, @@ -2144,8 +2134,6 @@ files = [ {file = "pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e"}, {file = "pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12"}, {file = "pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673"}, {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027"}, {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77"}, {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874"}, @@ -2155,8 +2143,6 @@ files = [ {file = "pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6"}, {file = "pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae"}, {file = "pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36"}, {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b"}, {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477"}, {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50"}, @@ -2166,8 +2152,6 @@ files = [ {file = "pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa"}, {file = "pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f"}, {file = "pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc"}, {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06"}, {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a"}, {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978"}, @@ -2177,15 +2161,11 @@ files = [ {file = "pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb"}, {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967"}, {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25"}, {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27"}, {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a"}, {file = "pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f"}, {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"}, {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"}, {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"}, {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"}, {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"}, @@ -2793,29 +2773,31 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "ruff" -version = "0.1.15" +version = "0.13.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["lint"] files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, + {file = "ruff-0.13.3-py3-none-linux_armv6l.whl", hash = "sha256:311860a4c5e19189c89d035638f500c1e191d283d0cc2f1600c8c80d6dcd430c"}, + {file = "ruff-0.13.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2bdad6512fb666b40fcadb65e33add2b040fc18a24997d2e47fee7d66f7fcae2"}, + {file = "ruff-0.13.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fc6fa4637284708d6ed4e5e970d52fc3b76a557d7b4e85a53013d9d201d93286"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c9e6469864f94a98f412f20ea143d547e4c652f45e44f369d7b74ee78185838"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5bf62b705f319476c78891e0e97e965b21db468b3c999086de8ffb0d40fd2822"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78cc1abed87ce40cb07ee0667ce99dbc766c9f519eabfd948ed87295d8737c60"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4fb75e7c402d504f7a9a259e0442b96403fa4a7310ffe3588d11d7e170d2b1e3"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17b951f9d9afb39330b2bdd2dd144ce1c1335881c277837ac1b50bfd99985ed3"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6052f8088728898e0a449f0dde8fafc7ed47e4d878168b211977e3e7e854f662"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc742c50f4ba72ce2a3be362bd359aef7d0d302bf7637a6f942eaa763bd292af"}, + {file = "ruff-0.13.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:8e5640349493b378431637019366bbd73c927e515c9c1babfea3e932f5e68e1d"}, + {file = "ruff-0.13.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6b139f638a80eae7073c691a5dd8d581e0ba319540be97c343d60fb12949c8d0"}, + {file = "ruff-0.13.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6b547def0a40054825de7cfa341039ebdfa51f3d4bfa6a0772940ed351d2746c"}, + {file = "ruff-0.13.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9cc48a3564423915c93573f1981d57d101e617839bef38504f85f3677b3a0a3e"}, + {file = "ruff-0.13.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1a993b17ec03719c502881cb2d5f91771e8742f2ca6de740034433a97c561989"}, + {file = "ruff-0.13.3-py3-none-win32.whl", hash = "sha256:f14e0d1fe6460f07814d03c6e32e815bff411505178a1f539a38f6097d3e8ee3"}, + {file = "ruff-0.13.3-py3-none-win_amd64.whl", hash = "sha256:621e2e5812b691d4f244638d693e640f188bacbb9bc793ddd46837cea0503dd2"}, + {file = "ruff-0.13.3-py3-none-win_arm64.whl", hash = "sha256:9e9e9d699841eaf4c2c798fa783df2fabc680b72059a02ca0ed81c460bc58330"}, + {file = "ruff-0.13.3.tar.gz", hash = "sha256:5b0ba0db740eefdfbcce4299f49e9eaefc643d4d007749d77d047c2bab19908e"}, ] [[package]] @@ -3895,4 +3877,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "ec5493b0e20638f45c739e4f8177a12ab62803869c982b3850ff0c67227259e2" +content-hash = "62c77772143ca125bb8edbd16758f71216f45d8a9e3c9e6e48d2594c46a14eec" diff --git a/libs/oracledb/tests/integration_tests/document_loaders/test_oracleds.py b/libs/oracledb/tests/integration_tests/document_loaders/test_oracleds.py index e257457..3404cd4 100644 --- a/libs/oracledb/tests/integration_tests/document_loaders/test_oracleds.py +++ b/libs/oracledb/tests/integration_tests/document_loaders/test_oracleds.py @@ -5,9 +5,10 @@ Unit tests for OracleDocLoader and OracleTextSplitter. -Authors: +Authors: - Sudhir Kumar (sudhirkk) """ + import sys import oracledb diff --git a/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py b/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py index 3b0a7be..9cd7069 100644 --- a/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py +++ b/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py @@ -3,7 +3,7 @@ """ test_oraclevs.py -Test Oracle AI Vector Search functionality integration +Test Oracle AI Vector Search functionality integration with OracleVS. """ @@ -113,9 +113,7 @@ def test_table_exists_test() -> None: @pytest.mark.asyncio async def test_table_exists_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) # 1. Existing Table:(all capital letters) @@ -295,9 +293,7 @@ def test_create_table_test() -> None: @pytest.mark.asyncio async def test_create_table_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) @@ -410,9 +406,7 @@ async def test_create_table_test_async() -> None: # 17. String Operations in table_name&dimension parameter # Expectation:table is created - await _acreate_table( - connection, _quote_indentifier("YaSh".replace("aS", "ok")), 500 - ) + await _acreate_table(connection, _quote_indentifier("YaSh".replace("aS", "ok")), 500) await adrop_table_purge(connection, _quote_indentifier("YaSh".replace("aS", "ok"))) @@ -430,9 +424,7 @@ def test_create_hnsw_index_test() -> None: # New Index # distance_strategy - DistanceStrategy.Dot_product # Expectation:Index created - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") vs = OracleVS(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) create_index(connection, vs) @@ -635,9 +627,7 @@ def test_create_hnsw_index_test() -> None: # 11. index_name as # Expectation:U1 not present with pytest.raises(RuntimeError): - vs = OracleVS( - connection, model1, "U1.TB16", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = OracleVS(connection, model1, "U1.TB16", DistanceStrategy.EUCLIDEAN_DISTANCE) create_index( connection, vs, @@ -672,21 +662,15 @@ def test_create_hnsw_index_test() -> None: @pytest.mark.asyncio async def test_create_hnsw_index_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) # 1. Table_name - TB1 # New Index # distance_strategy - DistanceStrategy.Dot_product # Expectation:Index created - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) - vs = await OracleVS.acreate( - connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + vs = await OracleVS.acreate(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index(connection, vs) # 2. Creating same index again @@ -701,12 +685,8 @@ async def test_create_hnsw_index_test_async() -> None: # idx_name - hnsw_idx2 # idx_type - HNSW # Expectation:Index created - vs = await OracleVS.acreate( - connection, model1, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - await acreate_index( - connection, vs, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} - ) + vs = await OracleVS.acreate(connection, model1, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) + await acreate_index(connection, vs, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) await adrop_index_if_exists(connection, "hnsw_idx2") await adrop_table_purge(connection, "TB2") @@ -714,41 +694,29 @@ async def test_create_hnsw_index_test_async() -> None: # idx_name - "हिन्दी" # idx_type - HNSW # Expectation:Index created - vs = await OracleVS.acreate( - connection, model1, "TB3", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - await acreate_index( - connection, vs, params={"idx_name": '"हिन्दी"', "idx_type": "HNSW"} - ) + vs = await OracleVS.acreate(connection, model1, "TB3", DistanceStrategy.EUCLIDEAN_DISTANCE) + await acreate_index(connection, vs, params={"idx_name": '"हिन्दी"', "idx_type": "HNSW"}) await adrop_index_if_exists(connection, '"हिन्दी"') await adrop_table_purge(connection, "TB3") # 5. idx_name passed empty # Expectation:ORA-01741: illegal zero-length identifier with pytest.raises(ValueError): - vs = await OracleVS.acreate( - connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - await acreate_index( - connection, vs, params={"idx_name": '""', "idx_type": "HNSW"} - ) + vs = await OracleVS.acreate(connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE) + await acreate_index(connection, vs, params={"idx_name": '""', "idx_type": "HNSW"}) await adrop_index_if_exists(connection, '""') await adrop_table_purge(connection, "TB4") # 6. idx_type left empty # Expectation:Index created - vs = await OracleVS.acreate( - connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index(connection, vs, params={"idx_name": "Hello", "idx_type": ""}) await adrop_index_if_exists(connection, "Hello") await adrop_table_purge(connection, "TB5") # 7. efconstruction passed as parameter but not neighbours # Expectation:Index created - vs = await OracleVS.acreate( - connection, model1, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -760,9 +728,7 @@ async def test_create_hnsw_index_test_async() -> None: # 8. efconstruction passed as parameter as well as neighbours # (for this idx_type parameter is also necessary) # Expectation:Index created - vs = await OracleVS.acreate( - connection, model1, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -787,9 +753,7 @@ async def test_create_hnsw_index_test_async() -> None: # 0 None: await adrop_table_purge(connection, "TB9") # index not created: with pytest.raises(RuntimeError): - vs = await OracleVS.acreate( - connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -823,9 +785,7 @@ async def test_create_hnsw_index_test_async() -> None: # index not created: with pytest.raises(RuntimeError): - vs = await OracleVS.acreate( - connection, model1, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -840,9 +800,7 @@ async def test_create_hnsw_index_test_async() -> None: await adrop_index_if_exists(connection, "idx11") # index not created with pytest.raises(RuntimeError): - vs = await OracleVS.acreate( - connection, model1, "TB12", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB12", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -857,9 +815,7 @@ async def test_create_hnsw_index_test_async() -> None: await adrop_index_if_exists(connection, "idx11") # index not created with pytest.raises(RuntimeError): - vs = await OracleVS.acreate( - connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -876,9 +832,7 @@ async def test_create_hnsw_index_test_async() -> None: # with negative values/out-of-bound values for all 4 of them, we get the same errors # Expectation:Index not created with pytest.raises(RuntimeError): - vs = await OracleVS.acreate( - connection, model1, "TB14", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB14", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -900,9 +854,7 @@ async def test_create_hnsw_index_test_async() -> None: # 10. Table_name as # Expectation:Index created - vs = await OracleVS.acreate( - connection, model1, "TB15", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB15", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -921,9 +873,7 @@ async def test_create_hnsw_index_test_async() -> None: # 11. index_name as # Expectation:U1 not present with pytest.raises(RuntimeError): - vs = await OracleVS.acreate( - connection, model1, "U1.TB16", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "U1.TB16", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -942,23 +892,15 @@ async def test_create_hnsw_index_test_async() -> None: # 12. Index_name size >129 # Expectation:Index not created with pytest.raises(RuntimeError): - vs = await OracleVS.acreate( - connection, model1, "TB17", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - await acreate_index( - connection, vs, params={"idx_name": "x" * 129, "idx_type": "HNSW"} - ) + vs = await OracleVS.acreate(connection, model1, "TB17", DistanceStrategy.EUCLIDEAN_DISTANCE) + await acreate_index(connection, vs, params={"idx_name": "x" * 129, "idx_type": "HNSW"}) await adrop_index_if_exists(connection, "x" * 129) await adrop_table_purge(connection, "TB17") # 13. Index_name size 128 # Expectation:Index created - vs = await OracleVS.acreate( - connection, model1, "TB18", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - await acreate_index( - connection, vs, params={"idx_name": "x" * 128, "idx_type": "HNSW"} - ) + vs = await OracleVS.acreate(connection, model1, "TB18", DistanceStrategy.EUCLIDEAN_DISTANCE) + await acreate_index(connection, vs, params={"idx_name": "x" * 128, "idx_type": "HNSW"}) await adrop_index_if_exists(connection, "x" * 128) await adrop_table_purge(connection, "TB18") @@ -973,9 +915,7 @@ def test_index_exists_test() -> None: connection = oracledb.connect(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") # 1. Existing Index:(all capital letters) # Expectation:true vs = OracleVS(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) @@ -1033,22 +973,14 @@ def test_index_exists_test() -> None: @pytest.mark.asyncio async def test_index_exists_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") # 1. Existing Index:(all capital letters) # Expectation:true - vs = await OracleVS.acreate( - connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - await acreate_index( - connection, vs, params={"idx_name": "idx11", "idx_type": "HNSW"} - ) + vs = await OracleVS.acreate(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) + await acreate_index(connection, vs, params={"idx_name": "idx11", "idx_type": "HNSW"}) assert not await _aindex_exists(connection, _quote_indentifier("IDX11")) # 2. Existing Table:(all small letters) @@ -1190,12 +1122,8 @@ def test_add_texts_test() -> None: # 6. Add 2 different record concurrently # Expectation:Successful def add(val: str) -> None: - model = HuggingFaceEmbeddings( - model_name="sentence-transformers/all-mpnet-base-v2" - ) - vs_obj = OracleVS( - connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + vs_obj = OracleVS(connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) texts5 = [val] ids9 = texts5 vs_obj.add_texts(texts5, ids=ids9) @@ -1211,12 +1139,8 @@ def add(val: str) -> None: # 7. Add 2 same record concurrently # Expectation:Successful, For one of the insert,get primary key violation error def add1(val: str) -> None: - model = HuggingFaceEmbeddings( - model_name="sentence-transformers/all-mpnet-base-v2" - ) - vs_obj = OracleVS( - connection, model, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + vs_obj = OracleVS(connection, model, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE) texts = [val] ids10 = texts vs_obj.add_texts(texts, ids=ids10) @@ -1246,9 +1170,7 @@ def add1(val: str) -> None: @pytest.mark.asyncio async def test_add_texts_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) # 1. Add 2 records to table @@ -1259,9 +1181,7 @@ async def test_add_texts_test_async() -> None: {"id": "101", "link": "Document Example Test 2"}, ] model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate( - connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) await vs_obj.aadd_texts(texts, metadata) await adrop_table_purge(connection, "TB1") @@ -1269,9 +1189,7 @@ async def test_add_texts_test_async() -> None: # Expectation:An exception occurred :: Either specify an 'ids' list or # 'metadatas' with an 'id' attribute for each element. model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate( - connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) texts2 = ["Sri Ram", "Krishna"] await vs_obj.aadd_texts(texts2) await adrop_table_purge(connection, "TB2") @@ -1287,23 +1205,17 @@ async def test_add_texts_test_async() -> None: # Successful # Successful - vs_obj = await OracleVS.acreate( - connection, model, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE) ids3 = ["114", "124"] await vs_obj.aadd_texts(texts2, ids=ids3) await adrop_table_purge(connection, "TB4") - vs_obj = await OracleVS.acreate( - connection, model, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE) ids4 = ["", "134"] await vs_obj.aadd_texts(texts2, ids=ids4) await adrop_table_purge(connection, "TB5") - vs_obj = await OracleVS.acreate( - connection, model, "TB6", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB6", DistanceStrategy.EUCLIDEAN_DISTANCE) ids5 = [ """Good afternoon my friends""", @@ -1312,18 +1224,14 @@ async def test_add_texts_test_async() -> None: await vs_obj.aadd_texts(texts2, ids=ids5) await adrop_table_purge(connection, "TB6") - vs_obj = await OracleVS.acreate( - connection, model, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE) ids6 = ['"Good afternoon"', '"India"'] await vs_obj.aadd_texts(texts2, ids=ids6) await adrop_table_purge(connection, "TB7") # 4. Add records with ids and metadatas # Expectation:Successful - vs_obj = await OracleVS.acreate( - connection, model, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE) texts3 = ["Sri Ram 6", "Krishna 6"] ids7 = ["1", "2"] metadata = [ @@ -1335,9 +1243,7 @@ async def test_add_texts_test_async() -> None: # 5. Add 10000 records # Expectation:Successful - vs_obj = await OracleVS.acreate( - connection, model, "TB9", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB9", DistanceStrategy.EUCLIDEAN_DISTANCE) texts4 = ["Sri Ram{0}".format(i) for i in range(1, 10000)] ids8 = ["Hello{0}".format(i) for i in range(1, 10000)] await vs_obj.aadd_texts(texts4, ids=ids8) @@ -1346,12 +1252,8 @@ async def test_add_texts_test_async() -> None: # 6. Add 2 different record concurrently # Expectation:Successful async def add(val: str) -> None: - model = HuggingFaceEmbeddings( - model_name="sentence-transformers/all-mpnet-base-v2" - ) - vs_obj = await OracleVS.acreate( - connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + vs_obj = await OracleVS.acreate(connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) texts5 = [val] ids9 = texts5 await vs_obj.aadd_texts(texts5, ids=ids9) @@ -1365,12 +1267,8 @@ async def add(val: str) -> None: # 7. Add 2 same record concurrently # Expectation:Successful, For one of the insert,get primary key violation error async def add1(val: str) -> None: - model = HuggingFaceEmbeddings( - model_name="sentence-transformers/all-mpnet-base-v2" - ) - vs_obj = await OracleVS.acreate( - connection, model, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + vs_obj = await OracleVS.acreate(connection, model, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE) texts = [val] ids10 = texts await vs_obj.aadd_texts(texts, ids=ids10) @@ -1385,9 +1283,7 @@ async def add1(val: str) -> None: # 8. create object with table name of type # Expectation:U1 does not exist with pytest.raises(RuntimeError): - vs_obj = await OracleVS.acreate( - connection, model, "U1.TB14", DistanceStrategy.DOT_PRODUCT - ) + vs_obj = await OracleVS.acreate(connection, model, "U1.TB14", DistanceStrategy.DOT_PRODUCT) for i in range(1, 10): texts7 = ["Yash{0}".format(i)] ids13 = ["1234{0}".format(i)] @@ -1417,17 +1313,13 @@ def test_embed_documents_test() -> None: @pytest.mark.asyncio async def test_embed_documents_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) # 1. String Example-'Sri Ram' # Expectation:Vector Printed model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate( - connection, model, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE) # 4. List # Expectation:Vector Printed @@ -1458,17 +1350,13 @@ def test_embed_query_test() -> None: @pytest.mark.asyncio async def test_embed_query_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) # 1. String # Expectation:Vector printed model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate( - connection, model, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE) await vs_obj._aembed_query("Sri Ram") await adrop_table_purge(connection, "TB8") @@ -1487,9 +1375,7 @@ def test_create_index_test() -> None: sys.exit(1) # 1. No optional parameters passed # Expectation:Successful - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") vs = OracleVS(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) create_index(connection, vs) drop_index_if_exists(connection, "HNSW") @@ -1512,18 +1398,14 @@ def test_create_index_test() -> None: # 4. ivf index with neighbour_part and accuracy passed as parameter # Expectation:Successful vs = OracleVS(connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE) - create_index( - connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "accuracy": 90} - ) + create_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "accuracy": 90}) drop_index_if_exists(connection, "IVF") drop_table_purge(connection, "TB4") # 5. ivf index with neighbour_part and parallel passed as parameter # Expectation:Successful vs = OracleVS(connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE) - create_index( - connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "parallel": 90} - ) + create_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "parallel": 90}) drop_index_if_exists(connection, "IVF") drop_table_purge(connection, "TB5") @@ -1553,68 +1435,48 @@ def test_create_index_test() -> None: @pytest.mark.asyncio async def test_create_index_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) # 1. No optional parameters passed # Expectation:Successful - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) - vs = await OracleVS.acreate( - connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + vs = await OracleVS.acreate(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index(connection, vs) await adrop_index_if_exists(connection, "HNSW") await adrop_table_purge(connection, "TB1") # 2. ivf index # Expectation:Successful - vs = await OracleVS.acreate( - connection, model1, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index(connection, vs, {"idx_type": "IVF", "idx_name": "IVF"}) await adrop_index_if_exists(connection, "IVF") await adrop_table_purge(connection, "TB2") # 3. ivf index with neighbour_part passed as parameter # Expectation:Successful - vs = await OracleVS.acreate( - connection, model1, "TB3", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB3", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10}) await adrop_index_if_exists(connection, "IVF") await adrop_table_purge(connection, "TB3") # 4. ivf index with neighbour_part and accuracy passed as parameter # Expectation:Successful - vs = await OracleVS.acreate( - connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - await acreate_index( - connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "accuracy": 90} - ) + vs = await OracleVS.acreate(connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE) + await acreate_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "accuracy": 90}) await adrop_index_if_exists(connection, "IVF") await adrop_table_purge(connection, "TB4") # 5. ivf index with neighbour_part and parallel passed as parameter # Expectation:Successful - vs = await OracleVS.acreate( - connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - await acreate_index( - connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "parallel": 90} - ) + vs = await OracleVS.acreate(connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE) + await acreate_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "parallel": 90}) await adrop_index_if_exists(connection, "IVF") await adrop_table_purge(connection, "TB5") # 6. ivf index and then perform dml(insert) # Expectation:Successful - vs = await OracleVS.acreate( - connection, model1, "TB6", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB6", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index(connection, vs, {"idx_type": "IVF", "idx_name": "IVF"}) texts = ["Sri Ram", "Krishna"] await vs.aadd_texts(texts) @@ -1625,9 +1487,7 @@ async def test_create_index_test_async() -> None: # 7. ivf index with neighbour_part,parallel and accuracy passed as parameter # Expectation:Successful - vs = await OracleVS.acreate( - connection, model1, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE) await acreate_index( connection, vs, @@ -1645,9 +1505,7 @@ def test_perform_search_test() -> None: connection = oracledb.connect(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") vs_1 = OracleVS(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) vs_2 = OracleVS(connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT) vs_3 = OracleVS(connection, model1, "TB12", DistanceStrategy.COSINE) @@ -1704,9 +1562,7 @@ def test_perform_search_test() -> None: vs.max_marginal_relevance_search(query, 2, fetch_k=20, lambda_mult=0.5) # Max marginal relevance search with filter - vs.max_marginal_relevance_search( - query, 2, fetch_k=20, lambda_mult=0.5, filter=db_filter - ) + vs.max_marginal_relevance_search(query, 2, fetch_k=20, lambda_mult=0.5, filter=db_filter) drop_table_purge(connection, "TB10") drop_table_purge(connection, "TB11") @@ -1719,28 +1575,16 @@ def test_perform_search_test() -> None: @pytest.mark.asyncio async def test_perform_search_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") - vs_1 = await OracleVS.acreate( - connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - vs_2 = await OracleVS.acreate( - connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT - ) + vs_1 = await OracleVS.acreate(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_2 = await OracleVS.acreate(connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT) vs_3 = await OracleVS.acreate(connection, model1, "TB12", DistanceStrategy.COSINE) - vs_4 = await OracleVS.acreate( - connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - vs_5 = await OracleVS.acreate( - connection, model1, "TB14", DistanceStrategy.DOT_PRODUCT - ) + vs_4 = await OracleVS.acreate(connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_5 = await OracleVS.acreate(connection, model1, "TB14", DistanceStrategy.DOT_PRODUCT) vs_6 = await OracleVS.acreate(connection, model1, "TB15", DistanceStrategy.COSINE) # vector store lists: @@ -1761,13 +1605,9 @@ async def test_perform_search_test_async() -> None: # create index if i == 1 or i == 2 or i == 3: - await acreate_index( - connection, vs, {"idx_type": "HNSW", "idx_name": f"IDX1{i}"} - ) + await acreate_index(connection, vs, {"idx_type": "HNSW", "idx_name": f"IDX1{i}"}) else: - await acreate_index( - connection, vs, {"idx_type": "IVF", "idx_name": f"IDX1{i}"} - ) + await acreate_index(connection, vs, {"idx_type": "IVF", "idx_name": f"IDX1{i}"}) # perform search query = "YashB" @@ -1796,9 +1636,7 @@ async def test_perform_search_test_async() -> None: await vs.amax_marginal_relevance_search(query, 2, fetch_k=20, lambda_mult=0.5) # Max marginal relevance search with filter - await vs.amax_marginal_relevance_search( - query, 2, fetch_k=20, lambda_mult=0.5, filter=db_filter - ) + await vs.amax_marginal_relevance_search(query, 2, fetch_k=20, lambda_mult=0.5, filter=db_filter) await adrop_table_purge(connection, "TB10") await adrop_table_purge(connection, "TB11") @@ -1829,9 +1667,7 @@ def test_db_filter_test() -> None: connection = oracledb.connect(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") drop_table_purge(connection, "TB10") drop_table_purge(connection, "TB11") drop_table_purge(connection, "TB12") @@ -1955,28 +1791,16 @@ def test_db_filter_test() -> None: @pytest.mark.asyncio async def test_db_filter_test_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") - vs_1 = await OracleVS.acreate( - connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - vs_2 = await OracleVS.acreate( - connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT - ) + vs_1 = await OracleVS.acreate(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_2 = await OracleVS.acreate(connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT) vs_3 = await OracleVS.acreate(connection, model1, "TB12", DistanceStrategy.COSINE) - vs_4 = await OracleVS.acreate( - connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE - ) - vs_5 = await OracleVS.acreate( - connection, model1, "TB14", DistanceStrategy.DOT_PRODUCT - ) + vs_4 = await OracleVS.acreate(connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_5 = await OracleVS.acreate(connection, model1, "TB14", DistanceStrategy.DOT_PRODUCT) vs_6 = await OracleVS.acreate(connection, model1, "TB15", DistanceStrategy.COSINE) # vector store lists: @@ -1997,13 +1821,9 @@ async def test_db_filter_test_async() -> None: # create index if i == 1 or i == 2 or i == 3: - await acreate_index( - connection, vs, {"idx_type": "HNSW", "idx_name": f"IDX1{i}"} - ) + await acreate_index(connection, vs, {"idx_type": "HNSW", "idx_name": f"IDX1{i}"}) else: - await acreate_index( - connection, vs, {"idx_type": "IVF", "idx_name": f"IDX1{i}"} - ) + await acreate_index(connection, vs, {"idx_type": "IVF", "idx_name": f"IDX1{i}"}) # perform search query = "Strawberry" @@ -2100,21 +1920,15 @@ async def test_add_texts_pool_test() -> None: POOLS_MAX = 4 try: - connection = oracledb.create_pool( - user=username, password=password, dsn=dsn, min=1, max=POOLS_MAX, increment=1 - ) + connection = oracledb.create_pool(user=username, password=password, dsn=dsn, min=1, max=POOLS_MAX, increment=1) except Exception: sys.exit(1) # 1. Add different records concurrently # Expectation:Successful async def add(order: int) -> None: - model = HuggingFaceEmbeddings( - model_name="sentence-transformers/all-mpnet-base-v2" - ) - vs_obj = OracleVS( - connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + vs_obj = OracleVS(connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) texts = ["Sri Ram" + str(order)] ids = texts vs_obj.add_texts(texts, ids=ids) @@ -2146,21 +1960,15 @@ async def test_add_texts_pool_test_async() -> None: POOLS_MAX = 4 try: - connection = oracledb.create_pool_async( - user=username, password=password, dsn=dsn, min=1, max=4, increment=1 - ) + connection = oracledb.create_pool_async(user=username, password=password, dsn=dsn, min=1, max=4, increment=1) except Exception: sys.exit(1) # 1. Add different records concurrently # Expectation:Successful async def add(order: int) -> None: - model = HuggingFaceEmbeddings( - model_name="sentence-transformers/all-mpnet-base-v2" - ) - vs_obj = await OracleVS.acreate( - connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + vs_obj = await OracleVS.acreate(connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) texts = ["Sri Ram" + str(order)] ids = texts await vs_obj.aadd_texts(texts, ids=ids) @@ -2196,9 +2004,7 @@ def test_from_texts_lobs() -> None: except Exception: sys.exit(1) - model = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") texts = [ "If the answer to any preceding questions is yes, then the database stops \ @@ -2251,15 +2057,11 @@ def test_from_texts_lobs() -> None: @pytest.mark.asyncio async def test_from_texts_lobs_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model = HuggingFaceEmbeddings( - model_name="sentence-transformers/paraphrase-mpnet-base-v2" - ) + model = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") texts = [ "If the answer to any preceding questions is yes, then the database stops \ @@ -2346,37 +2148,25 @@ def test_index_table_case(caplog: pytest.LogCaptureFixture) -> None: assert 'Table "Tb1" created successfully...' in caplog.records[-1].message with caplog.at_level(logging.INFO): - vs_obj2 = OracleVS( - connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj2 = OracleVS(connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) assert 'Table "TB2" created successfully...' in caplog.records[-1].message vs_obj.add_texts(texts, metadata) with caplog.at_level(logging.INFO): - create_index( - connection, vs_obj, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} - ) + create_index(connection, vs_obj, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) assert 'Index "hnsw_idx2" created successfully...' in caplog.records[-1].message with pytest.raises(RuntimeError, match="such column list already indexed"): - create_index( - connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"} - ) + create_index(connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"}) - with pytest.raises( - RuntimeError, match="name is already used by an existing object" - ): - create_index( - connection, vs_obj2, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} - ) + with pytest.raises(RuntimeError, match="name is already used by an existing object"): + create_index(connection, vs_obj2, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) with pytest.raises(RuntimeError, match="such column list already indexed"): - create_index( - connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"} - ) + create_index(connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"}) with caplog.at_level(logging.INFO): drop_index_if_exists(connection, "hnsw_idx2") @@ -2384,9 +2174,7 @@ def test_index_table_case(caplog: pytest.LogCaptureFixture) -> None: assert 'Index "hnsw_idx2" has been dropped.' in caplog.records[-1].message with caplog.at_level(logging.INFO): - create_index( - connection, vs_obj, params={"idx_name": '"hnsw_idx2"', "idx_type": "HNSW"} - ) + create_index(connection, vs_obj, params={"idx_name": '"hnsw_idx2"', "idx_type": "HNSW"}) assert 'Index "hnsw_idx2" created successfully...' in caplog.records[-1].message @@ -2398,9 +2186,7 @@ def test_index_table_case(caplog: pytest.LogCaptureFixture) -> None: @pytest.mark.asyncio async def test_index_table_case_async(caplog: pytest.LogCaptureFixture) -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) @@ -2418,58 +2204,40 @@ async def test_index_table_case_async(caplog: pytest.LogCaptureFixture) -> None: model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") with caplog.at_level(logging.INFO): - vs_obj = await OracleVS.acreate( - connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) assert 'Table "TB1" created successfully...' in caplog.records[-1].message with caplog.at_level(logging.INFO): - await OracleVS.acreate( - connection, model, '"TB1"', DistanceStrategy.EUCLIDEAN_DISTANCE - ) + await OracleVS.acreate(connection, model, '"TB1"', DistanceStrategy.EUCLIDEAN_DISTANCE) assert 'Table "TB1" already exists...' in caplog.records[-1].message with caplog.at_level(logging.INFO): - await OracleVS.acreate( - connection, model, "Tb1", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + await OracleVS.acreate(connection, model, "Tb1", DistanceStrategy.EUCLIDEAN_DISTANCE) assert 'Table "Tb1" created successfully...' in caplog.records[-1].message with caplog.at_level(logging.INFO): - vs_obj2 = await OracleVS.acreate( - connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj2 = await OracleVS.acreate(connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) assert 'Table "TB2" created successfully...' in caplog.records[-1].message await vs_obj.aadd_texts(texts, metadata) with caplog.at_level(logging.INFO): - await acreate_index( - connection, vs_obj, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} - ) + await acreate_index(connection, vs_obj, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) assert 'Index "hnsw_idx2" created successfully...' in caplog.records[-1].message with pytest.raises(RuntimeError, match="such column list already indexed"): - await acreate_index( - connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"} - ) + await acreate_index(connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"}) - with pytest.raises( - RuntimeError, match="name is already used by an existing object" - ): - await acreate_index( - connection, vs_obj2, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} - ) + with pytest.raises(RuntimeError, match="name is already used by an existing object"): + await acreate_index(connection, vs_obj2, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) with pytest.raises(RuntimeError, match="such column list already indexed"): - await acreate_index( - connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"} - ) + await acreate_index(connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"}) with caplog.at_level(logging.INFO): await adrop_index_if_exists(connection, "hnsw_idx2") @@ -2477,9 +2245,7 @@ async def test_index_table_case_async(caplog: pytest.LogCaptureFixture) -> None: assert 'Index "hnsw_idx2" has been dropped.' in caplog.records[-1].message with caplog.at_level(logging.INFO): - await acreate_index( - connection, vs_obj, params={"idx_name": '"hnsw_idx2"', "idx_type": "HNSW"} - ) + await acreate_index(connection, vs_obj, params={"idx_name": '"hnsw_idx2"', "idx_type": "HNSW"}) assert 'Index "hnsw_idx2" created successfully...' in caplog.records[-1].message @@ -2527,9 +2293,7 @@ def test_oracle_embeddings() -> None: @pytest.mark.asyncio async def test_oracle_embeddings_async(caplog: pytest.LogCaptureFixture) -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) connection_sync = oracledb.connect(user=username, password=password, dsn=dsn) except Exception: @@ -2548,9 +2312,7 @@ async def test_oracle_embeddings_async(caplog: pytest.LogCaptureFixture) -> None # instance model = OracleEmbeddings(conn=connection_sync, params=embedder_params, proxy=proxy) - vs_obj = await OracleVS.acreate( - connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs_obj = await OracleVS.acreate(connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) await vs_obj.aadd_texts(texts, metadata) res = await vs_obj.asimilarity_search("database", 1) @@ -2798,9 +2560,7 @@ def model1(_) -> list[float]: # type: ignore[no-untyped-def] async def test_filters_async() -> None: try: - connection = await oracledb.connect_async( - user=username, password=password, dsn=dsn - ) + connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) @@ -2811,9 +2571,7 @@ def model1(_) -> list[float]: # type: ignore[no-untyped-def] await adrop_table_purge(connection, "TB10") - vs = await OracleVS.acreate( - connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE - ) + vs = await OracleVS.acreate(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) texts = ["Strawberry", "Banana", "Blueberry"] metadatas = [ diff --git a/libs/oracledb/tests/unit_tests/document_loaders/test_oracleadb.py b/libs/oracledb/tests/unit_tests/document_loaders/test_oracleadb.py index 38dae73..2dd9642 100644 --- a/libs/oracledb/tests/unit_tests/document_loaders/test_oracleadb.py +++ b/libs/oracledb/tests/unit_tests/document_loaders/test_oracleadb.py @@ -5,6 +5,7 @@ Unit tests for OracleAutonomousDatabaseLoader. """ + from typing import Dict, List from unittest.mock import MagicMock, patch @@ -26,26 +27,21 @@ def raw_docs() -> List[Dict]: def expected_documents() -> List[Document]: return [ Document( - page_content="{'FIELD1': '1', 'FIELD_JSON': " - "{'INNER_FIELD1': '1', 'INNER_FIELD2': '1'}}", + page_content="{'FIELD1': '1', 'FIELD_JSON': {'INNER_FIELD1': '1', 'INNER_FIELD2': '1'}}", metadata={"FIELD1": "1"}, ), Document( - page_content="{'FIELD1': '2', 'FIELD_JSON': " - "{'INNER_FIELD1': '2', 'INNER_FIELD2': '2'}}", + page_content="{'FIELD1': '2', 'FIELD_JSON': {'INNER_FIELD1': '2', 'INNER_FIELD2': '2'}}", metadata={"FIELD1": "2"}, ), Document( - page_content="{'FIELD1': '3', 'FIELD_JSON': " - "{'INNER_FIELD1': '3', 'INNER_FIELD2': '3'}}", + page_content="{'FIELD1': '3', 'FIELD_JSON': {'INNER_FIELD1': '3', 'INNER_FIELD2': '3'}}", metadata={"FIELD1": "3"}, ), ] -@patch( - "langchain_oracledb.document_loaders.oracleadb_loader.OracleAutonomousDatabaseLoader._run_query" -) +@patch("langchain_oracledb.document_loaders.oracleadb_loader.OracleAutonomousDatabaseLoader._run_query") def test_oracle_loader_load(mock_query: MagicMock) -> None: """Test oracleDB loader load function.""" From 6dc6c0cdf79e474a2000d8620291a4de572953ed Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 13:34:14 -0800 Subject: [PATCH 10/16] Remove placeholder integration tests and compile-integration-tests job from the CI workflow Deleted test_placeholder.py files and the 'compile' pytest marker from both oci and oracledb libraries. Also removed the compile-integration-tests job from the CI workflow, as these placeholders are no longer needed. --- .github/workflows/CI.yml | 14 +------------- libs/oci/pyproject.toml | 1 - .../tests/integration_tests/test_placeholder.py | 10 ---------- libs/oracledb/pyproject.toml | 1 - .../tests/integration_tests/test_placeholder.py | 10 ---------- 5 files changed, 1 insertion(+), 35 deletions(-) delete mode 100644 libs/oci/tests/integration_tests/test_placeholder.py delete mode 100644 libs/oracledb/tests/integration_tests/test_placeholder.py diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5100775..a2c51d7 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -45,21 +45,9 @@ jobs: working-directory: ${{ matrix.working-directory }} secrets: inherit - compile-integration-tests: - name: cd ${{ matrix.working-directory }} - strategy: - matrix: - working-directory: - - "libs/oci" - - "libs/oracledb" - uses: ./.github/workflows/_compile_integration_test.yml - with: - working-directory: ${{ matrix.working-directory }} - secrets: inherit - ci_success: name: "CI Success" - needs: [lint, test, compile-integration-tests] + needs: [lint, test] if: | always() runs-on: ubuntu-latest diff --git a/libs/oci/pyproject.toml b/libs/oci/pyproject.toml index 5d09885..f3b505b 100644 --- a/libs/oci/pyproject.toml +++ b/libs/oci/pyproject.toml @@ -116,7 +116,6 @@ 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", "scheduled: mark tests to run in scheduled testing", ] asyncio_mode = "auto" diff --git a/libs/oci/tests/integration_tests/test_placeholder.py b/libs/oci/tests/integration_tests/test_placeholder.py deleted file mode 100644 index 05df087..0000000 --- a/libs/oci/tests/integration_tests/test_placeholder.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2025 Oracle and/or its affiliates. -# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ - -import pytest - - -@pytest.mark.compile -def test_placeholder() -> None: - """Makes sure no errors raised when no tests selected.""" - pass diff --git a/libs/oracledb/pyproject.toml b/libs/oracledb/pyproject.toml index a30e468..8ecec13 100644 --- a/libs/oracledb/pyproject.toml +++ b/libs/oracledb/pyproject.toml @@ -111,7 +111,6 @@ 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", "scheduled: mark tests to run in scheduled testing", ] asyncio_mode = "auto" diff --git a/libs/oracledb/tests/integration_tests/test_placeholder.py b/libs/oracledb/tests/integration_tests/test_placeholder.py deleted file mode 100644 index 05df087..0000000 --- a/libs/oracledb/tests/integration_tests/test_placeholder.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2025 Oracle and/or its affiliates. -# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ - -import pytest - - -@pytest.mark.compile -def test_placeholder() -> None: - """Makes sure no errors raised when no tests selected.""" - pass From 3596291b4cd140e94b1c0fb29983ca7e460ac677 Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 16:55:27 -0800 Subject: [PATCH 11/16] Use default 88 line length in ruff formatting --- .../chat_models/oci_data_science.py | 65 ++- .../chat_models/oci_generative_ai.py | 185 +++++-- ..._data_science_model_deployment_endpoint.py | 18 +- .../embeddings/oci_generative_ai.py | 26 +- ..._data_science_model_deployment_endpoint.py | 68 ++- .../langchain_oci/llms/oci_generative_ai.py | 38 +- libs/oci/pyproject.toml | 1 - .../chat_models/test_tool_calling.py | 46 +- .../chat_models/test_oci_data_science.py | 28 +- .../chat_models/test_oci_generative_ai.py | 65 ++- .../test_oci_model_deployment_endpoint.py | 4 +- .../test_oci_model_deployment_endpoint.py | 30 +- .../document_loaders/oracleadb_loader.py | 10 +- .../document_loaders/oracleai.py | 45 +- .../langchain_oracledb/embeddings/oracleai.py | 12 +- .../langchain_oracledb/utilities/oracleai.py | 13 +- .../vectorstores/oraclevs.py | 294 ++++++++--- libs/oracledb/pyproject.toml | 1 - .../vectorstores/test_oraclevs.py | 484 +++++++++++++----- .../document_loaders/test_oracleadb.py | 19 +- 20 files changed, 1091 insertions(+), 361 deletions(-) diff --git a/libs/oci/langchain_oci/chat_models/oci_data_science.py b/libs/oci/langchain_oci/chat_models/oci_data_science.py index e2a8941..cb000a6 100644 --- a/libs/oci/langchain_oci/chat_models/oci_data_science.py +++ b/libs/oci/langchain_oci/chat_models/oci_data_science.py @@ -138,7 +138,11 @@ class ChatOCIModelDeployment(BaseChatModel, BaseOCIModelDeployment): AIMessage( content="Bonjour le monde!", response_metadata={ - "token_usage": {"prompt_tokens": 40, "total_tokens": 50, "completion_tokens": 10}, + "token_usage": { + "prompt_tokens": 40, + "total_tokens": 50, + "completion_tokens": 10, + }, "model_name": "odsc-llm", "system_fingerprint": "", "finish_reason": "stop", @@ -194,11 +198,16 @@ class Joke(BaseModel): structured_llm = chat.with_structured_output(Joke, method="json_mode") - structured_llm.invoke("Tell me a joke about cats, respond in JSON with `setup` and `punchline` keys") + structured_llm.invoke( + "Tell me a joke about cats, respond in JSON with `setup` and `punchline` keys" + ) .. code-block:: python - Joke(setup="Why did the cat get stuck in the tree?", punchline="Because it was chasing its tail!") + Joke( + setup="Why did the cat get stuck in the tree?", + punchline="Because it was chasing its tail!", + ) See ``ChatOCIModelDeployment.with_structured_output()`` for more. @@ -240,7 +249,11 @@ def _construct_json_body(self, messages: list, params: dict) -> dict: .. code-block:: python { - "token_usage": {"prompt_tokens": 40, "total_tokens": 50, "completion_tokens": 10}, + "token_usage": { + "prompt_tokens": 40, + "total_tokens": 50, + "completion_tokens": 10, + }, "model_name": "odsc-llm", "system_fingerprint": "", "finish_reason": "stop", @@ -264,7 +277,8 @@ def validate_openai(cls, values: Any) -> Any: """Checks if langchain_openai is installed.""" if not importlib.util.find_spec("langchain_openai"): raise ImportError( - "Could not import langchain_openai package. Please install it with `pip install langchain_openai`." + "Could not import langchain_openai package. " + "Please install it with `pip install langchain_openai`." ) return values @@ -291,7 +305,9 @@ def _default_params(self) -> Dict[str, Any]: "stream": self.streaming, } - def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: + def _headers( + self, is_async: Optional[bool] = False, body: Optional[dict] = None + ) -> Dict: """Construct and return the headers for a request. Args: @@ -343,13 +359,17 @@ def _generate( response = chat.invoke(messages) """ # noqa: E501 if self.streaming: - stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs) + stream_iter = self._stream( + messages, stop=stop, run_manager=run_manager, **kwargs + ) return generate_from_stream(stream_iter) requests_kwargs = kwargs.pop("requests_kwargs", {}) params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(messages, params) - res = self.completion_with_retry(data=body, run_manager=run_manager, **requests_kwargs) + res = self.completion_with_retry( + data=body, run_manager=run_manager, **requests_kwargs + ) return self._process_response(res.json()) def _stream( @@ -397,7 +417,9 @@ def _stream( params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(messages, params) # request json body - response = self.completion_with_retry(data=body, run_manager=run_manager, stream=True, **requests_kwargs) + response = self.completion_with_retry( + data=body, run_manager=run_manager, stream=True, **requests_kwargs + ) default_chunk_class = AIMessageChunk for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line, default_chunk_class) @@ -447,7 +469,9 @@ async def _agenerate( """ # noqa: E501 if self.streaming: - stream_iter = self._astream(messages, stop=stop, run_manager=run_manager, **kwargs) + stream_iter = self._astream( + messages, stop=stop, run_manager=run_manager, **kwargs + ) return await agenerate_from_stream(stream_iter) requests_kwargs = kwargs.pop("requests_kwargs", {}) @@ -571,14 +595,19 @@ def with_structured_output( else JsonOutputParser() ) else: - raise ValueError(f"Unrecognized method argument. Expected `json_mode`.Received: `{method}`.") + raise ValueError( + f"Unrecognized method argument. Expected `json_mode`." + f"Received: `{method}`." + ) if include_raw: parser_assign = RunnablePassthrough.assign( parsed=itemgetter("raw") | output_parser, parsing_error=lambda _: None ) parser_none = RunnablePassthrough.assign(parsed=lambda _: None) - parser_with_fallback = parser_assign.with_fallbacks([parser_none], exception_key="parsing_error") + parser_with_fallback = parser_assign.with_fallbacks( + [parser_none], exception_key="parsing_error" + ) return RunnableMap(raw=llm) | parser_with_fallback else: return llm | output_parser @@ -661,7 +690,9 @@ def _process_stream_response( if not isinstance(choice, dict): raise TypeError("Endpoint response is not well formed.") except (KeyError, IndexError, TypeError) as e: - raise ValueError("Error while formatting response payload for chat model of type") from e + raise ValueError( + "Error while formatting response payload for chat model of type" + ) from e chunk = _convert_delta_to_message_chunk(choice["delta"], default_chunk_cls) default_chunk_cls = chunk.__class__ @@ -673,7 +704,9 @@ def _process_stream_response( if usage is not None: gen_info.update({"usage": usage}) - return ChatGenerationChunk(message=chunk, generation_info=gen_info if gen_info else None) + return ChatGenerationChunk( + message=chunk, generation_info=gen_info if gen_info else None + ) def _process_response(self, response_json: dict) -> ChatResult: """Formats response in OpenAI spec. @@ -698,7 +731,9 @@ def _process_response(self, response_json: dict) -> ChatResult: if not isinstance(choices, list): raise TypeError("Endpoint response is not well formed.") except (KeyError, TypeError) as e: - raise ValueError("Error while formatting response payload for chat model of type") from e + raise ValueError( + "Error while formatting response payload for chat model of type" + ) from e for choice in choices: message = _convert_dict_to_message(choice["message"]) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index 90447f7..0581b38 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -96,7 +96,7 @@ def convert_oci_tool_call_to_langchain(tool_call: Any) -> ToolCall: """Convert an OCI tool call to a LangChain ToolCall.""" parsed = json.loads(tool_call.arguments) - # If the parsed result is a string, it means the JSON was escaped, so parse again + # If the parsed result is a string, it means the JSON was escaped, so parse again # noqa: E501 if isinstance(parsed, str): try: parsed = json.loads(parsed) @@ -106,7 +106,9 @@ def convert_oci_tool_call_to_langchain(tool_call: Any) -> ToolCall: return ToolCall( name=tool_call.name, - args=parsed if "arguments" in tool_call.attribute_map else tool_call.parameters, + args=parsed + if "arguments" in tool_call.attribute_map + else tool_call.parameters, # noqa: E501 id=tool_call.id if "id" in tool_call.attribute_map else uuid.uuid4().hex[:], ) @@ -176,14 +178,18 @@ def messages_to_oci_params(self, messages: Any, **kwargs: Any) -> Dict[str, Any] ... @abstractmethod - def convert_to_oci_tool(self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]) -> Dict[str, Any]: + def convert_to_oci_tool( + self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool] + ) -> Dict[str, Any]: # noqa: E501 """Convert a tool definition into the provider-specific OCI tool format.""" ... @abstractmethod def process_tool_choice( self, - tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], + tool_choice: Optional[ + Union[dict, str, Literal["auto", "none", "required", "any"], bool] + ], # noqa: E501 ) -> Optional[Any]: """Process tool choice parameter for the provider.""" ... @@ -251,12 +257,19 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: } # Include token usage if available - if hasattr(response.data.chat_response, "usage") and response.data.chat_response.usage: - generation_info["total_tokens"] = response.data.chat_response.usage.total_tokens + if ( + hasattr(response.data.chat_response, "usage") + and response.data.chat_response.usage + ): # noqa: E501 + generation_info["total_tokens"] = ( + response.data.chat_response.usage.total_tokens + ) # noqa: E501 # Include tool calls if available if self.chat_tool_calls(response): - generation_info["tool_calls"] = self.format_response_tool_calls(self.chat_tool_calls(response)) + generation_info["tool_calls"] = self.format_response_tool_calls( + self.chat_tool_calls(response) + ) # noqa: E501 return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -336,7 +349,9 @@ def get_role(self, message: BaseMessage) -> str: return "TOOL" raise ValueError(f"Unknown message type: {type(message)}") - def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) -> Dict[str, Any]: + def messages_to_oci_params( + self, messages: Sequence[ChatMessage], **kwargs: Any + ) -> Dict[str, Any]: # noqa: E501 """ Convert LangChain messages to OCI parameters for Cohere. @@ -349,18 +364,27 @@ def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) for msg in messages[:-1]: role = self.get_role(msg) if role in ("USER", "SYSTEM"): - oci_chat_history.append(self.oci_chat_message[role](message=msg.content)) + oci_chat_history.append( + self.oci_chat_message[role](message=msg.content) + ) elif isinstance(msg, AIMessage): # Skip tool calls if forcing single step if msg.tool_calls and is_force_single_step: continue tool_calls = ( - [self.oci_tool_call(name=tc["name"], parameters=tc["args"]) for tc in msg.tool_calls] + [ + self.oci_tool_call(name=tc["name"], parameters=tc["args"]) + for tc in msg.tool_calls + ] # noqa: E501 if msg.tool_calls else None ) msg_content = msg.content if msg.content else " " - oci_chat_history.append(self.oci_chat_message[role](message=msg_content, tool_calls=tool_calls)) + oci_chat_history.append( + self.oci_chat_message[role]( + message=msg_content, tool_calls=tool_calls + ) + ) # noqa: E501 elif isinstance(msg, ToolMessage): oci_chat_history.append( self.oci_chat_message[self.get_role(msg)]( @@ -378,12 +402,16 @@ def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) for i, message in enumerate(messages[::-1]): current_turn.append(message) if isinstance(message, HumanMessage): - if len(messages) > i and isinstance(messages[len(messages) - i - 2], ToolMessage): + if len(messages) > i and isinstance( + messages[len(messages) - i - 2], ToolMessage + ): # noqa: E501 # add dummy message REPEATING the tool_result to avoid # the error about ToolMessage needing to be followed # by an AI message oci_chat_history.append( - self.oci_chat_message["CHATBOT"](message=messages[len(messages) - i - 2].content) + self.oci_chat_message["CHATBOT"]( + message=messages[len(messages) - i - 2].content + ) # noqa: E501 ) break current_turn = list(reversed(current_turn)) @@ -393,7 +421,9 @@ def messages_to_oci_params(self, messages: Sequence[ChatMessage], **kwargs: Any) for message in current_turn: if isinstance(message, ToolMessage): tool_msg = message - previous_ai_msgs = [m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls] + previous_ai_msgs = [ + m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls + ] # noqa: E501 if previous_ai_msgs: previous_ai_msg = previous_ai_msgs[-1] for lc_tool_call in previous_ai_msg.tool_calls: @@ -434,7 +464,9 @@ def convert_to_oci_tool( if isinstance(tool, BaseTool): return self.oci_tool( name=tool.name, - description=OCIUtils.remove_signature_from_tool_description(tool.name, tool.description), + description=OCIUtils.remove_signature_from_tool_description( + tool.name, tool.description + ), # noqa: E501 parameter_definitions={ p_name: self.oci_tool_param( description=p_def.get("description", ""), @@ -495,14 +527,20 @@ def convert_to_oci_tool( def process_tool_choice( self, - tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], + tool_choice: Optional[ + Union[dict, str, Literal["auto", "none", "required", "any"], bool] + ], # noqa: E501 ) -> Optional[Any]: """Cohere does not support tool choices.""" if tool_choice is not None: - raise ValueError("Tool choice is not supported for Cohere models.Please remove the tool_choice parameter.") + raise ValueError( + "Tool choice is not supported for Cohere models.Please remove the tool_choice parameter." # noqa: E501 + ) return None - def process_stream_tool_calls(self, event_data: Dict, tool_call_ids: Set[str]) -> List[ToolCallChunk]: + def process_stream_tool_calls( + self, event_data: Dict, tool_call_ids: Set[str] + ) -> List[ToolCallChunk]: # noqa: E501 """ Process Cohere stream tool calls and return them as ToolCallChunk objects. @@ -598,11 +636,18 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: } # Include token usage if available - if hasattr(response.data.chat_response, "usage") and response.data.chat_response.usage: - generation_info["total_tokens"] = response.data.chat_response.usage.total_tokens + if ( + hasattr(response.data.chat_response, "usage") + and response.data.chat_response.usage + ): # noqa: E501 + generation_info["total_tokens"] = ( + response.data.chat_response.usage.total_tokens + ) # noqa: E501 if self.chat_tool_calls(response): - generation_info["tool_calls"] = self.format_response_tool_calls(self.chat_tool_calls(response)) + generation_info["tool_calls"] = self.format_response_tool_calls( + self.chat_tool_calls(response) + ) # noqa: E501 return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -678,7 +723,9 @@ def get_role(self, message: BaseMessage) -> str: return "TOOL" raise ValueError(f"Unknown message type: {type(message)}") - def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> Dict[str, Any]: + def messages_to_oci_params( + self, messages: List[BaseMessage], **kwargs: Any + ) -> Dict[str, Any]: # noqa: E501 """Convert LangChain messages to OCI chat parameters. Args: @@ -697,7 +744,9 @@ def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> role = self.get_role(message) if isinstance(message, ToolMessage): # For tool messages, wrap the content in a text content object. - tool_content = [self.oci_chat_message_text_content(text=str(message.content))] + tool_content = [ + self.oci_chat_message_text_content(text=str(message.content)) + ] # noqa: E501 if message.tool_call_id: oci_message = self.oci_chat_message[role]( content=tool_content, @@ -705,7 +754,9 @@ def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> ) else: oci_message = self.oci_chat_message[role](content=tool_content) - elif isinstance(message, AIMessage) and (message.tool_calls or message.additional_kwargs.get("tool_calls")): + elif isinstance(message, AIMessage) and ( + message.tool_calls or message.additional_kwargs.get("tool_calls") + ): # noqa: E501 # Process content and tool calls for assistant messages content = self._process_message_content(message.content) tool_calls = [] @@ -737,7 +788,9 @@ def messages_to_oci_params(self, messages: List[BaseMessage], **kwargs: Any) -> # This addresses a known issue with Meta Llama models that # continue calling tools even after receiving results. - def _should_allow_more_tool_calls(messages: List[BaseMessage], max_tool_calls: int) -> bool: + def _should_allow_more_tool_calls( + messages: List[BaseMessage], max_tool_calls: int + ) -> bool: # noqa: E501 """ Determine if the model should be allowed to call more tools. @@ -793,7 +846,9 @@ def _should_allow_more_tool_calls(messages: List[BaseMessage], max_tool_calls: i return result - def _process_message_content(self, content: Union[str, List[Union[str, Dict]]]) -> List[Any]: + def _process_message_content( + self, content: Union[str, List[Union[str, Dict]]] + ) -> List[Any]: # noqa: E501 """Process message content into OCI chat content format. Args: @@ -820,15 +875,21 @@ def _process_message_content(self, content: Union[str, List[Union[str, Dict]]]) if item["type"] == "image_url": processed_content.append( self.oci_chat_message_image_content( - image_url=self.oci_chat_message_image_url(url=item["image_url"]["url"]) + image_url=self.oci_chat_message_image_url( + url=item["image_url"]["url"] + ) ) ) elif item["type"] == "text": - processed_content.append(self.oci_chat_message_text_content(text=item["text"])) + processed_content.append( + self.oci_chat_message_text_content(text=item["text"]) + ) else: raise ValueError(f"Unsupported content type: {item['type']}") else: - raise ValueError(f"Content items must be str or dict, got: {type(item)}") + raise ValueError( + f"Content items must be str or dict, got: {type(item)}" + ) # noqa: E501 return processed_content def convert_to_oci_tool( @@ -866,7 +927,9 @@ def convert_to_oci_tool( elif isinstance(tool, BaseTool): return self.oci_function_definition( name=tool.name, - description=OCIUtils.remove_signature_from_tool_description(tool.name, tool.description), + description=OCIUtils.remove_signature_from_tool_description( + tool.name, tool.description + ), # noqa: E501 parameters={ "type": "object", "properties": { @@ -876,7 +939,11 @@ def convert_to_oci_tool( } for p_name, p_def in tool.args.items() }, - "required": [p_name for p_name, p_def in tool.args.items() if "default" not in p_def], + "required": [ + p_name + for p_name, p_def in tool.args.items() + if "default" not in p_def + ], # noqa: E501 }, ) raise ValueError( @@ -887,7 +954,9 @@ def convert_to_oci_tool( def process_tool_choice( self, - tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]], + tool_choice: Optional[ + Union[dict, str, Literal["auto", "none", "required", "any"], bool] + ], # noqa: E501 ) -> Optional[Any]: """Process tool choice for Meta provider. @@ -928,9 +997,13 @@ def process_tool_choice( elif isinstance(tool_choice, dict): # For Meta, we use ToolChoiceAuto for tool selection return self.oci_tool_choice_auto() - raise ValueError(f"Unrecognized tool_choice type. Expected str, bool or dict. Received: {tool_choice}") + raise ValueError( + f"Unrecognized tool_choice type. Expected str, bool or dict. Received: {tool_choice}" # noqa: E501 + ) - def process_stream_tool_calls(self, event_data: Dict, tool_call_ids: Set[str]) -> List[ToolCallChunk]: + def process_stream_tool_calls( + self, event_data: Dict, tool_call_ids: Set[str] + ) -> List[ToolCallChunk]: # noqa: E501 """ Process Meta stream tool calls and convert them to ToolCallChunks. @@ -1078,7 +1151,7 @@ def _prepare_request( except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." # noqa: E501 ) from ex oci_params = self._provider.messages_to_oci_params( @@ -1092,11 +1165,17 @@ def _prepare_request( _model_kwargs[self._provider.stop_sequence_key] = stop # Warn if using max_tokens with OpenAI models - if self.model_id and self.model_id.startswith("openai.") and "max_tokens" in _model_kwargs: + if ( + self.model_id + and self.model_id.startswith("openai.") + and "max_tokens" in _model_kwargs + ): # noqa: E501 import warnings warnings.warn( - "OpenAI models require 'max_completion_tokens' instead of 'max_tokens'.", UserWarning, stacklevel=2 + "OpenAI models require 'max_completion_tokens' instead of 'max_tokens'.", # noqa: E501 + UserWarning, + stacklevel=2, ) chat_params = {**_model_kwargs, **kwargs, **oci_params} @@ -1120,7 +1199,9 @@ def bind_tools( self, tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]], *, - tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]] = None, + tool_choice: Optional[ + Union[dict, str, Literal["auto", "none", "required", "any"], bool] + ] = None, # noqa: E501 **kwargs: Any, ) -> Runnable[LanguageModelInput, BaseMessage]: """Bind tool-like objects to this chat model. @@ -1156,7 +1237,9 @@ def with_structured_output( self, schema: Optional[Union[Dict, Type[BaseModel]]] = None, *, - method: Literal["function_calling", "json_schema", "json_mode"] = "function_calling", + method: Literal[ + "function_calling", "json_schema", "json_mode" + ] = "function_calling", # noqa: E501 include_raw: bool = False, **kwargs: Any, ) -> Runnable[LanguageModelInput, Union[Dict, BaseModel]]: @@ -1217,7 +1300,9 @@ def with_structured_output( first_tool_only=True, # type: ignore[list-item] ) else: - output_parser = JsonOutputKeyToolsParser(key_name=tool_name, first_tool_only=True) + output_parser = JsonOutputKeyToolsParser( + key_name=tool_name, first_tool_only=True + ) # noqa: E501 elif method == "json_mode": llm = self.bind(response_format={"type": "JSON_OBJECT"}) output_parser = ( @@ -1239,7 +1324,9 @@ def with_structured_output( is_strict=True, ) - response_format_obj = self._provider.oci_json_schema_response_format(json_schema=response_json_schema) + response_format_obj = self._provider.oci_json_schema_response_format( + json_schema=response_json_schema + ) # noqa: E501 llm = self.bind(response_format=response_format_obj) if is_pydantic_schema: @@ -1257,7 +1344,9 @@ def with_structured_output( parsed=itemgetter("raw") | output_parser, parsing_error=lambda _: None ) parser_none = RunnablePassthrough.assign(parsed=lambda _: None) - parser_with_fallback = parser_assign.with_fallbacks([parser_none], exception_key="parsing_error") + parser_with_fallback = parser_assign.with_fallbacks( + [parser_none], exception_key="parsing_error" + ) # noqa: E501 return RunnableMap(raw=llm) | parser_with_fallback return llm | output_parser @@ -1289,7 +1378,9 @@ def _generate( response = llm.invoke(messages) """ if self.is_stream: - stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs) + stream_iter = self._stream( + messages, stop=stop, run_manager=run_manager, **kwargs + ) # noqa: E501 return generate_from_stream(stream_iter) request = self._prepare_request(messages, stop=stop, stream=False, **kwargs) @@ -1320,7 +1411,9 @@ def _generate( tool_calls=tool_calls, ) return ChatResult( - generations=[ChatGeneration(message=message, generation_info=generation_info)], + generations=[ + ChatGeneration(message=message, generation_info=generation_info) + ], # noqa: E501 llm_output=llm_output, ) @@ -1346,7 +1439,9 @@ def _stream( if not self._provider.is_chat_stream_end(event_data): # Process streaming content delta = self._provider.chat_stream_to_text(event_data) - tool_call_chunks = self._provider.process_stream_tool_calls(event_data, tool_call_ids) + tool_call_chunks = self._provider.process_stream_tool_calls( + event_data, tool_call_ids + ) # noqa: E501 chunk = ChatGenerationChunk( message=AIMessageChunk( diff --git a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py index af49802..8bcb00c 100644 --- a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py @@ -21,7 +21,9 @@ class TokenExpiredError(Exception): def _create_retry_decorator(llm) -> Callable[[Any], Any]: """Creates a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] - decorator = create_base_retry_decorator(error_types=errors, max_retries=llm.max_retries) + decorator = create_base_retry_decorator( + error_types=errors, max_retries=llm.max_retries + ) # noqa: E501 return decorator @@ -70,7 +72,7 @@ def validate_environment( # pylint: disable=no-self-argument except ImportError as ex: raise ImportError( - "Could not import ads python package. Please install it with `pip install oracle_ads`." + "Could not import ads python package. Please install it with `pip install oracle_ads`." # noqa: E501 ) from ex if not values.get("auth", None): values["auth"] = ads.common.auth.default_signer() @@ -104,7 +106,9 @@ def _completion_with_retry(**kwargs: Any) -> Any: if response.status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err else: - raise ValueError(f"Server error: {str(http_err)}. Message: {response.text}") from http_err + raise ValueError( + f"Server error: {str(http_err)}. Message: {response.text}" + ) from http_err # noqa: E501 except Exception as e: raise ValueError(f"Error occurs by inference endpoint: {str(e)}") from e @@ -158,7 +162,9 @@ def _proceses_response(self, response: requests.Response) -> List[List[float]]: res_json = response.json() embeddings = res_json["data"][0]["embedding"] except Exception as e: - raise ValueError(f"Error raised by inference API: {e}.\nResponse: {response.text}") + raise ValueError( + f"Error raised by inference API: {e}.\nResponse: {response.text}" + ) # noqa: E501 return embeddings def embed_documents( @@ -178,7 +184,9 @@ def embed_documents( List of embeddings, one for each text. """ results = [] - _chunk_size = len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size + _chunk_size = ( + len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size + ) # noqa: E501 for i in range(0, len(texts), _chunk_size): response = self._embedding(texts[i : i + _chunk_size]) results.extend(response) diff --git a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py index 52808ed..22bb028 100644 --- a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py +++ b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py @@ -126,8 +126,12 @@ def validate_environment(cls, values: Dict) -> Dict: # pylint: disable=no-self- elif values["auth_type"] == OCIAuthType(2).name: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] - pk = oci.signer.load_private_key_from_file(oci_config.get("key_file"), None) - with open(oci_config.get("security_token_file"), encoding="utf-8") as f: + pk = oci.signer.load_private_key_from_file( + oci_config.get("key_file"), None + ) # noqa: E501 + with open( + oci_config.get("security_token_file"), encoding="utf-8" + ) as f: # noqa: E501 st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -135,19 +139,27 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] file_location=values["auth_file_location"], profile_name=values["auth_profile"], ) - client_kwargs["signer"] = make_security_token_signer(oci_config=client_kwargs["config"]) + client_kwargs["signer"] = make_security_token_signer( + oci_config=client_kwargs["config"] + ) # noqa: E501 elif values["auth_type"] == OCIAuthType(3).name: - client_kwargs["signer"] = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() + client_kwargs["signer"] = ( + oci.auth.signers.InstancePrincipalsSecurityTokenSigner() + ) # noqa: E501 elif values["auth_type"] == OCIAuthType(4).name: - client_kwargs["signer"] = oci.auth.signers.get_resource_principals_signer() + client_kwargs["signer"] = ( + oci.auth.signers.get_resource_principals_signer() + ) # noqa: E501 else: raise ValueError("Please provide valid value to auth_type") - values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient(**client_kwargs) + values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( + **client_kwargs + ) # noqa: E501 except ImportError as ex: raise ImportError( - "Could not import oci python package. Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." # noqa: E501 ) from ex except Exception as e: raise ValueError( diff --git a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py index 815a366..ff3d4ec 100644 --- a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py @@ -52,11 +52,15 @@ class ServerError(Exception): def _create_retry_decorator( llm: "BaseOCIModelDeployment", *, - run_manager: Optional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]] = None, + run_manager: Optional[ + Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun] + ] = None, # noqa: E501 ) -> Callable[[Any], Any]: """Create a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] - decorator = create_base_retry_decorator(error_types=errors, max_retries=llm.max_retries, run_manager=run_manager) + decorator = create_base_retry_decorator( + error_types=errors, max_retries=llm.max_retries, run_manager=run_manager + ) # noqa: E501 return decorator @@ -93,7 +97,7 @@ def validate_environment(cls, values: Dict) -> Dict: except ImportError as ex: raise ImportError( - "Could not import ads python package. Please install it with `pip install oracle_ads`." + "Could not import ads python package. Please install it with `pip install oracle_ads`." # noqa: E501 ) from ex if not values.get("auth", None): @@ -106,7 +110,9 @@ def validate_environment(cls, values: Dict) -> Dict: ) return values - def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: + def _headers( + self, is_async: Optional[bool] = False, body: Optional[dict] = None + ) -> Dict: # noqa: E501 """Construct and return the headers for a request. Args: @@ -150,7 +156,9 @@ def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None return headers - def completion_with_retry(self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Any: + def completion_with_retry( + self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any + ) -> Any: # noqa: E501 """Use tenacity to retry the completion call.""" retry_decorator = _create_retry_decorator(self, run_manager=run_manager) @@ -185,7 +193,9 @@ def _completion_with_retry(**kwargs: Any) -> Any: f"url={self.endpoint},timeout={request_timeout},stream={stream}. " f"Additional request kwargs={kwargs}." ) - raise RuntimeError(f"Error occurs by inference endpoint: {str(err)}") from err + raise RuntimeError( + f"Error occurs by inference endpoint: {str(err)}" + ) from err # noqa: E501 return _completion_with_retry(**kwargs) @@ -239,7 +249,9 @@ async def _completion_with_retry(**kwargs: Any) -> Any: f"Stream mode={stream}. " f"Requests kwargs: url={self.endpoint}, timeout={request_timeout}." ) - raise RuntimeError(f"Error occurs by inference endpoint: {str(err)}") from err + raise RuntimeError( + f"Error occurs by inference endpoint: {str(err)}" + ) from err # noqa: E501 return await _completion_with_retry(**kwargs) @@ -274,11 +286,17 @@ def _check_response(self, response: Any) -> None: try: response.raise_for_status() except requests.exceptions.HTTPError as http_err: - status_code = response.status_code if hasattr(response, "status_code") else response.status + status_code = ( + response.status_code + if hasattr(response, "status_code") + else response.status + ) # noqa: E501 if status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err - raise ServerError(f"Server error: {str(http_err)}. \nMessage: {response.text}") from http_err + raise ServerError( + f"Server error: {str(http_err)}. \nMessage: {response.text}" + ) from http_err # noqa: E501 def _parse_stream(self, lines: Iterator[bytes]) -> Iterator[str]: """Parse a stream of byte lines and yield parsed string lines. @@ -364,7 +382,9 @@ def _refresh_signer(self) -> bool: Returns: bool: `True` if the token was successfully refreshed, `False` otherwise. """ - if self.auth.get("signer", None) and hasattr(self.auth["signer"], "refresh_security_token"): + if self.auth.get("signer", None) and hasattr( + self.auth["signer"], "refresh_security_token" + ): # noqa: E501 self.auth["signer"].refresh_security_token() return True return False @@ -470,7 +490,9 @@ def _identifying_params(self) -> Dict[str, Any]: **self._default_params, } - def _headers(self, is_async: Optional[bool] = False, body: Optional[dict] = None) -> Dict: + def _headers( + self, is_async: Optional[bool] = False, body: Optional[dict] = None + ) -> Dict: # noqa: E501 """Construct and return the headers for a request. Args: @@ -515,7 +537,9 @@ def _generate( body = self._construct_json_body(prompt, params) if self.streaming: generation = GenerationChunk(text="") - for chunk in self._stream(prompt, stop=stop, run_manager=run_manager, **kwargs): + for chunk in self._stream( + prompt, stop=stop, run_manager=run_manager, **kwargs + ): # noqa: E501 generation += chunk generations.append([generation]) else: @@ -555,7 +579,9 @@ async def _agenerate( body = self._construct_json_body(prompt, params) if self.streaming: generation = GenerationChunk(text="") - async for chunk in self._astream(prompt, stop=stop, run_manager=run_manager, **kwargs): + async for chunk in self._astream( + prompt, stop=stop, run_manager=run_manager, **kwargs + ): # noqa: E501 generation += chunk generations.append([generation]) else: @@ -602,7 +628,9 @@ def _stream( params = self._invocation_params(stop, **kwargs) body = self._construct_json_body(prompt, params) - response = self.completion_with_retry(data=body, run_manager=run_manager, stream=True, **requests_kwargs) + response = self.completion_with_retry( + data=body, run_manager=run_manager, stream=True, **requests_kwargs + ) # noqa: E501 for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line) if run_manager: @@ -661,7 +689,9 @@ def _construct_json_body(self, prompt: str, params: dict) -> dict: **params, } - def _invocation_params(self, stop: Optional[List[str]] = None, **kwargs: Any) -> dict: + def _invocation_params( + self, stop: Optional[List[str]] = None, **kwargs: Any + ) -> dict: # noqa: E501 """Combines the invocation parameters with default parameters.""" params = self._default_params _model_kwargs = self.model_kwargs or {} @@ -834,7 +864,9 @@ def _default_params(self) -> Dict[str, Any]: "best_of": self.best_of, "max_new_tokens": self.max_tokens, "temperature": self.temperature, - "top_k": (self.k if self.k > 0 else None), # `top_k` must be strictly positive' + "top_k": ( + self.k if self.k > 0 else None + ), # `top_k` must be strictly positive' # noqa: E501 "top_p": self.p, "do_sample": self.do_sample, "return_full_text": self.return_full_text, @@ -874,7 +906,9 @@ def _process_response(self, response_json: dict) -> List[Generation]: try: text = response_json["generated_text"] except KeyError as e: - raise ValueError(f"Error while formatting response payload.response_json={response_json}") from e + raise ValueError( + f"Error while formatting response payload.response_json={response_json}" + ) from e # noqa: E501 return [Generation(text=text)] diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index ec6c6bf..67b1145 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -120,7 +120,9 @@ class OCIGenAIBase(BaseModel, ABC): """Maximum tool calls before forcing final answer. Prevents infinite loops while allowing multi-step orchestration.""" - model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, protected_namespaces=()) + model_config = ConfigDict( + extra="forbid", arbitrary_types_allowed=True, protected_namespaces=() + ) # noqa: E501 @pre_init def validate_environment(cls, values: Dict) -> Dict: @@ -150,8 +152,12 @@ def validate_environment(cls, values: Dict) -> Dict: elif values["auth_type"] == OCIAuthType(2).name: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] - pk = oci.signer.load_private_key_from_file(oci_config.get("key_file"), None) - with open(oci_config.get("security_token_file"), encoding="utf-8") as f: + pk = oci.signer.load_private_key_from_file( + oci_config.get("key_file"), None + ) # noqa: E501 + with open( + oci_config.get("security_token_file"), encoding="utf-8" + ) as f: # noqa: E501 st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -159,19 +165,29 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] file_location=values["auth_file_location"], profile_name=values["auth_profile"], ) - client_kwargs["signer"] = make_security_token_signer(oci_config=client_kwargs["config"]) + client_kwargs["signer"] = make_security_token_signer( + oci_config=client_kwargs["config"] + ) # noqa: E501 elif values["auth_type"] == OCIAuthType(3).name: - client_kwargs["signer"] = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() + client_kwargs["signer"] = ( + oci.auth.signers.InstancePrincipalsSecurityTokenSigner() + ) # noqa: E501 elif values["auth_type"] == OCIAuthType(4).name: - client_kwargs["signer"] = oci.auth.signers.get_resource_principals_signer() + client_kwargs["signer"] = ( + oci.auth.signers.get_resource_principals_signer() + ) # noqa: E501 else: - raise ValueError(f"Please provide valid value to auth_type, {values['auth_type']} is not valid.") + raise ValueError( + f"Please provide valid value to auth_type, {values['auth_type']} is not valid." # noqa: E501 + ) - values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient(**client_kwargs) + values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( + **client_kwargs + ) # noqa: E501 except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. Please make sure you have the oci package installed." + "Could not import oci python package. Please make sure you have the oci package installed." # noqa: E501 ) from ex except Exception as e: raise ValueError( @@ -283,7 +299,9 @@ def _prepare_invocation_object( _model_kwargs[self._provider.stop_sequence_key] = stop if self.model_id is None: - raise ValueError("model_id is required to call the model, please provide the model_id.") + raise ValueError( + "model_id is required to call the model, please provide the model_id." + ) # noqa: E501 if self.model_id.startswith(CUSTOM_ENDPOINT_PREFIX): serving_mode = models.DedicatedServingMode(endpoint_id=self.model_id) diff --git a/libs/oci/pyproject.toml b/libs/oci/pyproject.toml index f3b505b..2e22d52 100644 --- a/libs/oci/pyproject.toml +++ b/libs/oci/pyproject.toml @@ -61,7 +61,6 @@ optional = true [tool.poetry.group.dev.dependencies] [tool.ruff] -line-length = 120 [tool.ruff.format] docstring-code-format = true diff --git a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py index c7779a2..726ab16 100644 --- a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py +++ b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py @@ -147,7 +147,7 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo agent = create_agent(model_id, weather_tool) # Invoke the agent - system_msg = "You are a helpful assistant. Use the available tools when needed to answer questions accurately." + system_msg = "You are a helpful assistant. Use the available tools when needed to answer questions accurately." # noqa: E501 result = agent.invoke( { "messages": [ @@ -169,17 +169,27 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo # Find AI messages with tool calls ai_tool_calls = [ - msg for msg in messages if (type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls) + msg + for msg in messages + if ( + type(msg).__name__ == "AIMessage" + and hasattr(msg, "tool_calls") + and msg.tool_calls + ) # noqa: E501 ] # The model should call the tool, but after receiving results, # should not call again. Allow flexibility - some models might make # 1 call, others might need 2, but should stop - error_msg = f"Model made too many tool calls ({len(ai_tool_calls)}), possible infinite loop" + error_msg = ( + f"Model made too many tool calls ({len(ai_tool_calls)}), possible infinite loop" # noqa: E501 + ) assert len(ai_tool_calls) <= 2, error_msg # Verify final message is an AI response without tool calls final_message = messages[-1] - assert type(final_message).__name__ == "AIMessage", "Final message should be AIMessage" + assert type(final_message).__name__ == "AIMessage", ( + "Final message should be AIMessage" + ) # noqa: E501 assert final_message.content, "Final message should have content" assert not (hasattr(final_message, "tool_calls") and final_message.tool_calls), ( "Final message should not have tool_calls (infinite loop prevention)" @@ -279,7 +289,9 @@ def check_status(resource: str) -> str: def get_events(resource: str) -> str: """Get recent events for a resource.""" events_data = { - "payment-service": ("Events: [OOMKilled at 14:23, BackOff at 14:30, Started at 14:32]"), + "payment-service": ( + "Events: [OOMKilled at 14:23, BackOff at 14:30, Started at 14:32]" + ), # noqa: E501 "web-server": "Events: [Started at 10:00, Healthy]", } return events_data.get(resource, f"No events for {resource}") @@ -287,7 +299,9 @@ def get_events(resource: str) -> str: def get_metrics(resource: str) -> str: """Get historical metrics for a resource.""" metrics_data = { - "payment-service": ("Memory trend: 70%→80%→90%→95% (gradual increase over 2h)"), + "payment-service": ( + "Memory trend: 70%→80%→90%→95% (gradual increase over 2h)" + ), # noqa: E501 "web-server": "Memory trend: 55%→58%→60% (stable)", } return metrics_data.get(resource, f"No metrics for {resource}") @@ -366,7 +380,11 @@ def call_model(state: MessagesState): response = model_with_tools.invoke(messages) # OCI LIMITATION: Only allow ONE tool call at a time - if hasattr(response, "tool_calls") and response.tool_calls and len(response.tool_calls) > 1: + if ( + hasattr(response, "tool_calls") + and response.tool_calls + and len(response.tool_calls) > 1 + ): # noqa: E501 # Some models try to call multiple tools in parallel # Restrict to first tool only to avoid OCI API error response.tool_calls = [response.tool_calls[0]] @@ -426,9 +444,17 @@ def should_continue(state: MessagesState): # Count tool calls tool_call_messages = [ - msg for msg in messages if (type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls) + msg + for msg in messages + if ( + type(msg).__name__ == "AIMessage" + and hasattr(msg, "tool_calls") + and msg.tool_calls + ) # noqa: E501 ] - tool_result_messages = [msg for msg in messages if type(msg).__name__ == "ToolMessage"] + tool_result_messages = [ + msg for msg in messages if type(msg).__name__ == "ToolMessage" + ] # noqa: E501 # Verify multi-step orchestration worked msg = f"Should have made multiple tool calls (got {len(tool_call_messages)})" @@ -438,7 +464,7 @@ def should_continue(state: MessagesState): # The agent should stop at or before the limit (8 tool calls) # This is the key protection against infinite loops assert len(tool_call_messages) <= 8, ( - f"Too many tool calls ({len(tool_call_messages)}), max_sequential_tool_calls limit not enforced" + f"Too many tool calls ({len(tool_call_messages)}), max_sequential_tool_calls limit not enforced" # noqa: E501 ) # Verify tool results were received diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py index de98c6f..5dbd936 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py @@ -49,7 +49,10 @@ ] CONST_STREAM_RESPONSE = ( content - for content in [CONST_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS] + for content in [ + CONST_STREAM_TEMPLATE.replace("", delta).encode() + for delta in CONST_STREAM_DELTAS + ] # noqa: E501 + [b"data: [DONE]"] ) @@ -58,10 +61,13 @@ '"model":"odsc-llm","choices":[{"index":0,"delta":,"finish_reason":null}]}' ) CONST_ASYNC_STREAM_RESPONSE = ( - CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS + CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() + for delta in CONST_STREAM_DELTAS # noqa: E501 ) -pytestmark = pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires Python 3.9 or higher") +pytestmark = pytest.mark.skipif( + sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" +) # noqa: E501 class MockResponse: @@ -138,7 +144,9 @@ def test_invoke_tgi(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_stream_vllm(*args: Any) -> None: """Tests streaming with vLLM endpoint using OpenAI spec.""" - llm = ChatOCIModelDeploymentVLLM(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) + llm = ChatOCIModelDeploymentVLLM( + endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True + ) # noqa: E501 assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = None count = 0 @@ -155,7 +163,9 @@ def test_stream_vllm(*args: Any) -> None: assert str(output.content).strip() == CONST_COMPLETION -async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGenerator[bytes, None]: +async def mocked_async_streaming_response( + *args: Any, **kwargs: Any +) -> AsyncGenerator[bytes, None]: # noqa: E501 """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -164,14 +174,18 @@ async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGen @pytest.mark.asyncio @pytest.mark.requires("ads") @pytest.mark.requires("langchain_openai") -@mock.patch("ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock())) +@mock.patch( + "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) +) # noqa: E501 @mock.patch( "langchain_oci.llms.oci_data_science_model_deployment_endpoint.BaseOCIModelDeployment._arequest", mock.MagicMock(), ) async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" - llm = ChatOCIModelDeploymentVLLM(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) + llm = ChatOCIModelDeploymentVLLM( + endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True + ) # noqa: E501 assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py index 3d00545..3ff9fec 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py @@ -23,7 +23,9 @@ def __getattr__(self, val): # type: ignore[no-untyped-def] @pytest.mark.requires("oci") -@pytest.mark.parametrize("test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"]) +@pytest.mark.parametrize( + "test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"] +) # noqa: E501 def test_llm_chat(monkeypatch: MonkeyPatch, test_model_id: str) -> None: """Test valid chat call to OCI Generative AI LLM service.""" oci_gen_ai_client = MagicMock() @@ -266,20 +268,22 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] { "message": MockResponseDict( { - "content": [MockResponseDict({"text": ""})], + "content": [ + MockResponseDict({"text": ""}) + ], # noqa: E501 "tool_calls": [ MockResponseDict( { "type": "FUNCTION", "id": "call_escaped", "name": "get_weather", - # Escaped JSON (the bug scenario) + # Escaped JSON (the bug scenario) # noqa: E501 "arguments": '"{\\"location\\": \\"San Francisco\\"}"', # noqa: E501 "attribute_map": { "id": "id", "type": "type", "name": "name", - "arguments": "arguments", + "arguments": "arguments", # noqa: E501 }, } ) @@ -324,7 +328,9 @@ def get_weather(location: str) -> str: messages = [HumanMessage(content="What's the weather like?")] # Test that tool choice raises ValueError - with pytest.raises(ValueError, match="Tool choice is not supported for Cohere models"): + with pytest.raises( + ValueError, match="Tool choice is not supported for Cohere models" + ): # noqa: E501 llm.bind_tools( tools=[get_weather], tool_choice="auto", @@ -577,7 +583,9 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: from unittest.mock import patch with patch("oci.config.from_file") as mock_from_file: - with patch("oci.generative_ai_inference.generative_ai_inference_client.validate_config"): + with patch( + "oci.generative_ai_inference.generative_ai_inference_client.validate_config" + ): # noqa: E501 with patch("oci.base_client.validate_config"): with patch("oci.signer.load_private_key"): custom_config_path = "/custom/path/config" @@ -585,7 +593,9 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: model_id="cohere.command-r-16k", auth_file_location=custom_config_path, ) - mock_from_file.assert_called_once_with(file_location=custom_config_path, profile_name="DEFAULT") + mock_from_file.assert_called_once_with( + file_location=custom_config_path, profile_name="DEFAULT" + ) # noqa: E501 @pytest.mark.requires("oci") @@ -631,7 +641,9 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] messages = [HumanMessage(content="What's the weather like?")] # Test with include_raw=True - structured_llm = llm.with_structured_output(WeatherResponse, method="json_schema", include_raw=True) + structured_llm = llm.with_structured_output( + WeatherResponse, method="json_schema", include_raw=True + ) # noqa: E501 response = structured_llm.invoke(messages) assert isinstance(response, dict) assert "parsed" in response @@ -680,7 +692,9 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "content": [ MockResponseDict( { - "text": ("I'll help you."), + "text": ( + "I'll help you." + ), # noqa: E501 "type": "TEXT", } ) @@ -751,7 +765,9 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] "content": [ MockResponseDict( { - "text": ("I'll help you."), + "text": ( + "I'll help you." + ), # noqa: E501 "type": "TEXT", } ) @@ -813,8 +829,8 @@ def test_get_provider(): @pytest.mark.requires("oci") -def test_tool_choice_none_after_tool_results() -> None: - """Test that tool_choice is set to 'none' when max_sequential_tool_calls is exceeded. +def test_tool_choice_none_after_tool_results() -> None: # noqa: E501 + """Test tool_choice='none' when max_sequential_tool_calls is exceeded. This prevents infinite loops with Meta Llama models by limiting the number of sequential tool calls. @@ -844,16 +860,33 @@ def get_weather(city: str) -> str: # Create conversation with 3 ToolMessages (at the limit) messages = [ HumanMessage(content="What's the weather?"), - AIMessage(content="", tool_calls=[{"id": "call_1", "name": "get_weather", "args": {"city": "Chicago"}}]), + AIMessage( + content="", + tool_calls=[ + {"id": "call_1", "name": "get_weather", "args": {"city": "Chicago"}} + ], + ), # noqa: E501 ToolMessage(content="Sunny, 65°F", tool_call_id="call_1"), - AIMessage(content="", tool_calls=[{"id": "call_2", "name": "get_weather", "args": {"city": "New York"}}]), + AIMessage( + content="", + tool_calls=[ + {"id": "call_2", "name": "get_weather", "args": {"city": "New York"}} + ], + ), # noqa: E501 ToolMessage(content="Rainy, 55°F", tool_call_id="call_2"), - AIMessage(content="", tool_calls=[{"id": "call_3", "name": "get_weather", "args": {"city": "Seattle"}}]), + AIMessage( + content="", + tool_calls=[ + {"id": "call_3", "name": "get_weather", "args": {"city": "Seattle"}} + ], + ), # noqa: E501 ToolMessage(content="Cloudy, 60°F", tool_call_id="call_3"), ] # Prepare the request - need to pass tools from the bound model kwargs - request = llm_with_tools._prepare_request(messages, stop=None, stream=False, **llm_with_tools.kwargs) + request = llm_with_tools._prepare_request( + messages, stop=None, stream=False, **llm_with_tools.kwargs + ) # noqa: E501 # Verify that tool_choice is set to 'none' because limit was reached assert hasattr(request.chat_request, "tool_choice") diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py index 2ab8930..726e8cb 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py @@ -85,7 +85,9 @@ def test_construct_json_body(mocker: MockerFixture) -> None: messages = [ HumanMessage(content="User message"), ] - chat = ChatOCIModelDeployment(endpoint="test_endpoint", model_kwargs={"temperature": 0.2}) + chat = ChatOCIModelDeployment( + endpoint="test_endpoint", model_kwargs={"temperature": 0.2} + ) # noqa: E501 payload = chat._construct_json_body(messages, chat._invocation_params(stop=None)) assert payload == { "messages": [{"content": "User message", "role": "user"}], diff --git a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py index 28a0bd9..9dc275b 100644 --- a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py @@ -33,7 +33,8 @@ + '"choices":[{"index":0,"text":"","finish_reason":""}]}' ) CONST_STREAM_RESPONSE = ( - CONST_STREAM_TEMPLATE.replace("", " " + word).encode() for word in CONST_COMPLETION.split(" ") + CONST_STREAM_TEMPLATE.replace("", " " + word).encode() + for word in CONST_COMPLETION.split(" ") # noqa: E501 ) CONST_ASYNC_STREAM_TEMPLATE = ( @@ -41,10 +42,13 @@ + '"choices":[{"index":0,"text":"","finish_reason":""}]}' ) CONST_ASYNC_STREAM_RESPONSE = ( - CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() for word in CONST_COMPLETION.split(" ") + CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() + for word in CONST_COMPLETION.split(" ") # noqa: E501 ) -pytestmark = pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires Python 3.9 or higher") +pytestmark = pytest.mark.skipif( + sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" +) # noqa: E501 class MockResponse: @@ -95,7 +99,9 @@ def mocked_requests_post(url: str, **kwargs: Any) -> MockResponse: ) -async def mocked_async_streaming_response(*args: Any, **kwargs: Any) -> AsyncGenerator[bytes, None]: +async def mocked_async_streaming_response( + *args: Any, **kwargs: Any +) -> AsyncGenerator[bytes, None]: # noqa: E501 """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -117,7 +123,9 @@ def test_invoke_vllm(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_stream_tgi(*args: Any) -> None: """Tests streaming with TGI endpoint using OpenAI spec.""" - llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) + llm = OCIModelDeploymentTGI( + endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True + ) # noqa: E501 assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = "" count = 0 @@ -133,7 +141,9 @@ def test_stream_tgi(*args: Any) -> None: @mock.patch("requests.post", side_effect=mocked_requests_post) def test_generate_tgi(*args: Any) -> None: """Tests invoking TGI endpoint using TGI generate spec.""" - llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME) + llm = OCIModelDeploymentTGI( + endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME + ) # noqa: E501 assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = llm.invoke(CONST_PROMPT) assert output == CONST_COMPLETION @@ -141,10 +151,14 @@ def test_generate_tgi(*args: Any) -> None: @pytest.mark.asyncio @pytest.mark.requires("ads") -@mock.patch("ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock())) +@mock.patch( + "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) +) # noqa: E501 async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" - llm = OCIModelDeploymentTGI(endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True) + llm = OCIModelDeploymentTGI( + endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True + ) # noqa: E501 assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py b/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py index 7faa92f..81afa2d 100644 --- a/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py +++ b/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py @@ -98,7 +98,11 @@ def _run_query(self) -> List[Dict[str, Any]]: columns = [col[0] for col in cursor.description] data = cursor.fetchall() data = [ - {i: (j if not isinstance(j, oracledb.LOB) else j.read()) for i, j in zip(columns, row)} for row in data + { + i: (j if not isinstance(j, oracledb.LOB) else j.read()) + for i, j in zip(columns, row) + } + for row in data ] except oracledb.DatabaseError as e: print("Got error while connecting: " + str(e)) # noqa: T201 @@ -114,7 +118,9 @@ def load(self) -> List[Document]: documents = [] metadata_columns = self.metadata if self.metadata else [] for row in data: - metadata = {key: value for key, value in row.items() if key in metadata_columns} + metadata = { + key: value for key, value in row.items() if key in metadata_columns + } doc = Document(page_content=str(row), metadata=metadata) documents.append(doc) diff --git a/libs/oracledb/langchain_oracledb/document_loaders/oracleai.py b/libs/oracledb/langchain_oracledb/document_loaders/oracleai.py index ae38a2b..637792f 100644 --- a/libs/oracledb/langchain_oracledb/document_loaders/oracleai.py +++ b/libs/oracledb/langchain_oracledb/document_loaders/oracleai.py @@ -101,14 +101,18 @@ def generate_object_id(input_string: Union[str, None] = None) -> str: # binary object id object_id = timestamp_bin + hashval_bin + counter_bin # 16 bytes object_id_hex = object_id.hex() # 32 bytes - object_id_hex = object_id_hex.zfill(out_length) # fill with zeros if less than 32 bytes + object_id_hex = object_id_hex.zfill( + out_length + ) # fill with zeros if less than 32 bytes object_id_hex = object_id_hex[:out_length] return object_id_hex @staticmethod - def read_file(conn: Connection, file_path: str, params: dict) -> Union[Document, None]: + def read_file( + conn: Connection, file_path: str, params: dict + ) -> Union[Document, None]: """Read a file using OracleReader Args: conn: Oracle Connection, @@ -151,7 +155,9 @@ def read_file(conn: Connection, file_path: str, params: dict) -> Union[Document, metadata = {} else: doc_data = str(mdata.getvalue()) - if doc_data.startswith(""): + if doc_data.startswith("" + ): p = ParseOracleDocMetadata() p.feed(doc_data) metadata = p.get_metadata() @@ -237,7 +243,10 @@ def load(self) -> List[Document]: self.mdata_cols = self.params.get("mdata_cols") if self.mdata_cols is not None: if len(self.mdata_cols) > 3: - raise Exception("Exceeds the max number of columns " + "you can request for metadata.") + raise Exception( + "Exceeds the max number of columns " + + "you can request for metadata." + ) # execute a query to get column data types sql = ( @@ -265,7 +274,8 @@ def load(self) -> List[Document]: "VARCHAR2", ]: raise Exception( - "The datatype for the column requested " + "for metadata is not supported." + "The datatype for the column requested " + + "for metadata is not supported." ) self.mdata_cols_sql = ", rowid" @@ -296,14 +306,22 @@ def load(self) -> List[Document]: if row is None: doc_id = OracleDocReader.generate_object_id( - self.conn.username + "$" + self.owner + "$" + self.tablename + "$" + self.colname + self.conn.username + + "$" + + self.owner + + "$" + + self.tablename + + "$" + + self.colname ) metadata["_oid"] = doc_id results.append(Document(page_content="", metadata=metadata)) else: if row[0] is not None: data = str(row[0]) - if data.startswith(""): + if data.startswith("" + ): p = ParseOracleDocMetadata() p.feed(data) metadata = p.get_metadata() @@ -330,9 +348,15 @@ def load(self) -> List[Document]: metadata[self.mdata_cols[i]] = row[i + 2] if row[1] is None: - results.append(Document(page_content="", metadata=metadata)) + results.append( + Document(page_content="", metadata=metadata) + ) else: - results.append(Document(page_content=str(row[1]), metadata=metadata)) + results.append( + Document( + page_content=str(row[1]), metadata=metadata + ) + ) except Exception as ex: logger.info(f"An exception occurred :: {ex}") traceback.print_exc() @@ -379,7 +403,8 @@ def split_text(self, text: str) -> List[str]: cursor.setinputsizes(content=oracledb.CLOB) cursor.execute( - "select t.column_value from " + "dbms_vector_chain.utl_to_chunks(:content, json(:params)) t", + "select t.column_value from " + + "dbms_vector_chain.utl_to_chunks(:content, json(:params)) t", content=text, params=self._json.dumps(self.params), ) diff --git a/libs/oracledb/langchain_oracledb/embeddings/oracleai.py b/libs/oracledb/langchain_oracledb/embeddings/oracleai.py index bae963e..b0fbedf 100644 --- a/libs/oracledb/langchain_oracledb/embeddings/oracleai.py +++ b/libs/oracledb/langchain_oracledb/embeddings/oracleai.py @@ -56,7 +56,9 @@ def __init__(self, **kwargs: Any): """ @staticmethod - def load_onnx_model(conn: Connection, dir: str, onnx_file: str, model_name: str) -> None: + def load_onnx_model( + conn: Connection, dir: str, onnx_file: str, model_name: str + ) -> None: """Load an ONNX model to Oracle Database. Args: conn: Oracle Connection, @@ -110,7 +112,9 @@ def embed_documents(self, texts: List[str]) -> List[List[float]]: cursor = self.conn.cursor() if self.proxy: - cursor.execute("begin utl_http.set_proxy(:proxy); end;", proxy=self.proxy) + cursor.execute( + "begin utl_http.set_proxy(:proxy); end;", proxy=self.proxy + ) chunks = [] for i, text in enumerate(texts, start=1): @@ -121,7 +125,9 @@ def embed_documents(self, texts: List[str]) -> List[List[float]]: inputs = vector_array_type.newobject(chunks) cursor.setinputsizes(None, oracledb.DB_TYPE_JSON) cursor.execute( - "select t.* " + "from dbms_vector_chain.utl_to_embeddings(:1, " + "json(:2)) t", + "select t.* " + + "from dbms_vector_chain.utl_to_embeddings(:1, " + + "json(:2)) t", [inputs, self.params], ) diff --git a/libs/oracledb/langchain_oracledb/utilities/oracleai.py b/libs/oracledb/langchain_oracledb/utilities/oracleai.py index 5a7492a..860fd1b 100644 --- a/libs/oracledb/langchain_oracledb/utilities/oracleai.py +++ b/libs/oracledb/langchain_oracledb/utilities/oracleai.py @@ -46,7 +46,9 @@ class OracleSummary: proxy: Proxy """ - def __init__(self, conn: Connection, params: Dict[str, Any], proxy: Optional[str] = None): + def __init__( + self, conn: Connection, params: Dict[str, Any], proxy: Optional[str] = None + ): self.conn = conn self.proxy = proxy self.summary_params = params @@ -69,7 +71,9 @@ def get_summary(self, docs: Any) -> List[str]: cursor.outputtypehandler = output_type_handler if self.proxy: - cursor.execute("begin utl_http.set_proxy(:proxy); end;", proxy=self.proxy) + cursor.execute( + "begin utl_http.set_proxy(:proxy); end;", proxy=self.proxy + ) if isinstance(docs, str): results = [] @@ -146,7 +150,10 @@ def get_summary(self, docs: Any) -> List[str]: value = summary.getvalue(i) - results = ["" if value is None else str(value) for i in range(summary.actual_elements)] + results = [ + "" if value is None else str(value) + for i in range(summary.actual_elements) + ] else: raise Exception("Invalid input type") diff --git a/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py b/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py index 0f2413c..9e926f9 100644 --- a/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py +++ b/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py @@ -92,7 +92,9 @@ NOT_OPERS = ["$nin", "$not", "$exists"] -def _get_comparison_string(oper: str, value: Any, bind_variables: List[str]) -> tuple[str, str]: +def _get_comparison_string( + oper: str, value: Any, bind_variables: List[str] +) -> tuple[str, str]: if oper not in COMPARISON_MAP: raise ValueError(f"Invalid operator: {oper}") @@ -109,7 +111,10 @@ def _get_comparison_string(oper: str, value: Any, bind_variables: List[str]) -> # between - needs two bindings elif oper == "$between": if not isinstance(value, List) or len(value) != 2: - raise ValueError(f"Invalid value for $between: {value}. It must be a list containing exactly 2 elements.") + raise ValueError( + f"Invalid value for $between: {value}. " + "It must be a list containing exactly 2 elements." + ) min_val, max_val = value if min_val is None and max_val is None: @@ -138,7 +143,9 @@ def _get_comparison_string(oper: str, value: Any, bind_variables: List[str]) -> # in/nin/all needs N bindings elif oper in ["$in", "$nin", "$all"]: if not isinstance(value, List): - raise ValueError(f"Invalid value for $in: {value}. It must be a non-empty list.") + raise ValueError( + f"Invalid value for $in: {value}. It must be a non-empty list." + ) value_binds = [] passings = [] @@ -177,9 +184,14 @@ def _validate_metadata_key(metadata_key: str) -> None: ) -def _generate_condition(metadata_key: str, value: Any, bind_variables: List[str]) -> str: +def _generate_condition( + metadata_key: str, value: Any, bind_variables: List[str] +) -> str: # single check inside a JSON_EXISTS - SINGLE_MASK = "JSON_EXISTS(metadata, '$.{key}?(@ {oper} $val)' PASSING {value_bind} AS \"val\")" + SINGLE_MASK = ( + "JSON_EXISTS(metadata, '$.{key}?(@ {oper} $val)' " + 'PASSING {value_bind} AS "val")' + ) # combined checks with multiple operators and passing values MULTIPLE_MASK = "JSON_EXISTS(metadata, '$.{key}?({filters})' PASSING {passes})" @@ -238,18 +250,28 @@ def _generate_condition(metadata_key: str, value: Any, bind_variables: List[str] elif k == "$exists": if not isinstance(v, bool): - raise ValueError(f"Invalid value for $exists: {value}. It must be a boolean (true or false).") + raise ValueError( + f"Invalid value for $exists: {value}. " + "It must be a boolean (true or false)." + ) if v: - all_conditions.append(f"JSON_EXISTS(metadata, '$.{metadata_key}')") + all_conditions.append( + f"JSON_EXISTS(metadata, '$.{metadata_key}')" + ) else: - all_conditions.append(f"NOT (JSON_EXISTS(metadata, '$.{metadata_key}'))") + all_conditions.append( + f"NOT (JSON_EXISTS(metadata, '$.{metadata_key}'))" + ) elif k == "$nin": # for now only $nin result, passings = _get_comparison_string(k, v, bind_variables) all_conditions.append( - " NOT " + MULTIPLE_MASK.format(key=metadata_key, filters=result, passes=passings) + " NOT " + + MULTIPLE_MASK.format( + key=metadata_key, filters=result, passes=passings + ) ) elif k == "$eq": @@ -257,7 +279,8 @@ def _generate_condition(metadata_key: str, value: Any, bind_variables: List[str] bind_variables.append(json.dumps(v)) all_conditions.append( - f"JSON_EQUAL( JSON_QUERY(metadata, '$.{metadata_key}' ), JSON(:value{bind_l}))" + f"JSON_EQUAL( JSON_QUERY(metadata, '$.{metadata_key}' ), " + f"JSON(:value{bind_l}))" ) elif k == "$ne": @@ -265,7 +288,9 @@ def _generate_condition(metadata_key: str, value: Any, bind_variables: List[str] bind_variables.append(json.dumps(v)) all_conditions.append( - f"NOT (JSON_EQUAL( JSON_QUERY(metadata, '$.{metadata_key}' ), JSON(:value{bind_l})))" + f"NOT (JSON_EQUAL( " + f"JSON_QUERY(metadata, '$.{metadata_key}' ), " + f"JSON(:value{bind_l})))" ) res = " AND ".join(all_conditions) @@ -299,7 +324,9 @@ def _generate_where_clause(filter: dict, bind_variables: List[str]) -> str: if not isinstance(value, list): raise ValueError("Logical operators require an array of values.") - combine_conditions = [_generate_where_clause(v, bind_variables) for v in value] + combine_conditions = [ + _generate_where_clause(v, bind_variables) for v in value + ] res = filter_format[1].format(filter_format[0].join(combine_conditions)) @@ -331,7 +358,9 @@ def _get_connection(client: Any) -> Optional[Connection]: valid_types = "oracledb.Connection" if connection_pool_class: valid_types += " or oracledb.ConnectionPool" - raise TypeError(f"Expected client of type {valid_types}, got {type(client).__name__}") + raise TypeError( + f"Expected client of type {valid_types}, got {type(client).__name__}" + ) async def _aget_connection(client: Any) -> Optional[AsyncConnection]: @@ -346,7 +375,9 @@ async def _aget_connection(client: Any) -> Optional[AsyncConnection]: valid_types = "oracledb.AsyncConnection" if connection_pool_class: valid_types += " or oracledb.AsyncConnectionPool" - raise TypeError(f"Expected client of type {valid_types}, got {type(client).__name__}") + raise TypeError( + f"Expected client of type {valid_types}, got {type(client).__name__}" + ) def _handle_exceptions(func: T) -> T: @@ -357,11 +388,15 @@ def wrapper(*args: Any, **kwargs: Any) -> Any: except oracledb.Error as db_err: # Handle a known type of error (e.g., DB-related) specifically logger.exception("DB-related error occurred.") - raise RuntimeError("Failed due to a DB error: {}".format(db_err)) from db_err + raise RuntimeError( + "Failed due to a DB error: {}".format(db_err) + ) from db_err except RuntimeError as runtime_err: # Handle a runtime error logger.exception("Runtime error occurred.") - raise RuntimeError("Failed due to a runtime error: {}".format(runtime_err)) from runtime_err + raise RuntimeError( + "Failed due to a runtime error: {}".format(runtime_err) + ) from runtime_err except ValueError as val_err: # Handle another known type of error specifically logger.exception("Validation error.") @@ -382,11 +417,15 @@ async def wrapper(*args: Any, **kwargs: Any) -> Any: except oracledb.Error as db_err: # Handle a known type of error (e.g., DB-related) specifically logger.exception("DB-related error occurred.") - raise RuntimeError("Failed due to a DB error: {}".format(db_err)) from db_err + raise RuntimeError( + "Failed due to a DB error: {}".format(db_err) + ) from db_err except RuntimeError as runtime_err: # Handle a runtime error logger.exception("Runtime error occurred.") - raise RuntimeError("Failed due to a runtime error: {}".format(runtime_err)) from runtime_err + raise RuntimeError( + "Failed due to a runtime error: {}".format(runtime_err) + ) from runtime_err except ValueError as val_err: # Handle another known type of error specifically logger.exception("Validation error.") @@ -440,7 +479,9 @@ def _quote_indentifier(name: str) -> str: @_handle_exceptions -def _index_exists(connection: Connection, index_name: str, table_name: Optional[str] = None) -> bool: +def _index_exists( + connection: Connection, index_name: str, table_name: Optional[str] = None +) -> bool: # check if the index exists query = f""" SELECT index_name @@ -470,7 +511,9 @@ def _index_exists(connection: Connection, index_name: str, table_name: Optional[ return result is not None -async def _aindex_exists(connection: AsyncConnection, index_name: str, table_name: Optional[str] = None) -> bool: +async def _aindex_exists( + connection: AsyncConnection, index_name: str, table_name: Optional[str] = None +) -> bool: # check if the index exists query = f""" SELECT index_name, table_name @@ -537,7 +580,9 @@ def _create_table(connection: Connection, table_name: str, embedding_dim: int) - if not _table_exists(connection, table_name): with connection.cursor() as cursor: - ddl_body = ", ".join(f"{col_name} {col_type}" for col_name, col_type in cols_dict.items()) + ddl_body = ", ".join( + f"{col_name} {col_type}" for col_name, col_type in cols_dict.items() + ) ddl = f"CREATE TABLE {table_name} ({ddl_body})" cursor.execute(ddl) logger.info(f"Table {table_name} created successfully...") @@ -545,12 +590,16 @@ def _create_table(connection: Connection, table_name: str, embedding_dim: int) - logger.info(f"Table {table_name} already exists...") -async def _acreate_table(connection: AsyncConnection, table_name: str, embedding_dim: int) -> None: +async def _acreate_table( + connection: AsyncConnection, table_name: str, embedding_dim: int +) -> None: cols_dict = _get_table_dict(embedding_dim) if not await _atable_exists(connection, table_name): with connection.cursor() as cursor: - ddl_body = ", ".join(f"{col_name} {col_type}" for col_name, col_type in cols_dict.items()) + ddl_body = ", ".join( + f"{col_name} {col_type}" for col_name, col_type in cols_dict.items() + ) ddl = f"CREATE TABLE {table_name} ({ddl_body})" await cursor.execute(ddl) logger.info(f"Table {table_name} created successfully...") @@ -592,7 +641,9 @@ def create_index( params, ) else: - _create_hnsw_index(connection, vector_store.table_name, vector_store.distance_strategy, params) + _create_hnsw_index( + connection, vector_store.table_name, vector_store.distance_strategy, params + ) return @@ -616,7 +667,9 @@ def _get_hnsw_index_ddl( for compulsory_key in ["idx_name", "parallel"]: if compulsory_key not in config: if compulsory_key == "idx_name": - config[compulsory_key] = _get_index_name(str(defaults[compulsory_key])) + config[compulsory_key] = _get_index_name( + str(defaults[compulsory_key]) + ) else: config[compulsory_key] = defaults[compulsory_key] @@ -630,7 +683,10 @@ def _get_hnsw_index_ddl( # base SQL statement idx_name = config["idx_name"] - base_sql = f"create vector index {idx_name} on {table_name}(embedding) ORGANIZATION INMEMORY NEIGHBOR GRAPH" + base_sql = ( + f"create vector index {idx_name} on {table_name}(embedding) " + "ORGANIZATION INMEMORY NEIGHBOR GRAPH" + ) # optional parts depending on parameters accuracy_part = " WITH TARGET ACCURACY {accuracy}" if ("accuracy" in config) else "" @@ -638,19 +694,30 @@ def _get_hnsw_index_ddl( parameters_part = "" if "neighbors" in config and "efConstruction" in config: - parameters_part = " parameters (type {idx_type}, neighbors {neighbors}, efConstruction {efConstruction})" + parameters_part = ( + " parameters (type {idx_type}, neighbors {neighbors}, " + "efConstruction {efConstruction})" + ) elif "neighbors" in config and "efConstruction" not in config: config["efConstruction"] = defaults["efConstruction"] - parameters_part = " parameters (type {idx_type}, neighbors {neighbors}, efConstruction {efConstruction})" + parameters_part = ( + " parameters (type {idx_type}, neighbors {neighbors}, " + "efConstruction {efConstruction})" + ) elif "neighbors" not in config and "efConstruction" in config: config["neighbors"] = defaults["neighbors"] - parameters_part = " parameters (type {idx_type}, neighbors {neighbors}, efConstruction {efConstruction})" + parameters_part = ( + " parameters (type {idx_type}, neighbors {neighbors}, " + "efConstruction {efConstruction})" + ) # always included part for parallel parallel_part = " parallel {parallel}" # combine all parts - ddl_assembly = base_sql + accuracy_part + distance_part + parameters_part + parallel_part + ddl_assembly = ( + base_sql + accuracy_part + distance_part + parameters_part + parallel_part + ) # format the SQL with values from the params dictionary ddl = ddl_assembly.format(**config) @@ -695,7 +762,9 @@ def _get_ivf_index_ddl( for compulsory_key in ["idx_name", "parallel"]: if compulsory_key not in config: if compulsory_key == "idx_name": - config[compulsory_key] = _get_index_name(str(defaults[compulsory_key])) + config[compulsory_key] = _get_index_name( + str(defaults[compulsory_key]) + ) else: config[compulsory_key] = defaults[compulsory_key] @@ -709,7 +778,10 @@ def _get_ivf_index_ddl( # base SQL statement idx_name = config["idx_name"] - base_sql = f"CREATE VECTOR INDEX {idx_name} ON {table_name}(embedding) ORGANIZATION NEIGHBOR PARTITIONS" + base_sql = ( + f"CREATE VECTOR INDEX {idx_name} ON {table_name}(embedding) " + "ORGANIZATION NEIGHBOR PARTITIONS" + ) # optional parts depending on parameters accuracy_part = " WITH TARGET ACCURACY {accuracy}" if ("accuracy" in config) else "" @@ -717,13 +789,18 @@ def _get_ivf_index_ddl( parameters_part = "" if "idx_type" in config and "neighbor_part" in config: - parameters_part = f" PARAMETERS (type {config['idx_type']}, neighbor partitions {config['neighbor_part']})" + parameters_part = ( + f" PARAMETERS (type {config['idx_type']}, " + f"neighbor partitions {config['neighbor_part']})" + ) # always included part for parallel parallel_part = f" PARALLEL {config['parallel']}" # combine all parts - ddl_assembly = base_sql + accuracy_part + distance_part + parameters_part + parallel_part + ddl_assembly = ( + base_sql + accuracy_part + distance_part + parameters_part + parallel_part + ) # format the SQL with values from the params dictionary ddl = ddl_assembly.format(**config) @@ -935,20 +1012,32 @@ def get_processed_ids( ) -> List[str]: if ids: # if ids are provided, hash them to maintain consistency - processed_ids = [hashlib.sha256(_id.encode()).hexdigest()[:16].upper() for _id in ids] + processed_ids = [ + hashlib.sha256(_id.encode()).hexdigest()[:16].upper() for _id in ids + ] elif metadatas and all("id" in metadata for metadata in metadatas): # if no ids are provided but metadatas with ids are, generate # ids from metadatas - processed_ids = [hashlib.sha256(metadata["id"].encode()).hexdigest()[:16].upper() for metadata in metadatas] + processed_ids = [ + hashlib.sha256(metadata["id"].encode()).hexdigest()[:16].upper() + for metadata in metadatas + ] else: # generate new ids if none are provided - generated_ids = [str(uuid.uuid4()) for _ in texts] # uuid4 is more standard for random UUIDs - processed_ids = [hashlib.sha256(_id.encode()).hexdigest()[:16].upper() for _id in generated_ids] + generated_ids = [ + str(uuid.uuid4()) for _ in texts + ] # uuid4 is more standard for random UUIDs + processed_ids = [ + hashlib.sha256(_id.encode()).hexdigest()[:16].upper() + for _id in generated_ids + ] return processed_ids -def _get_delete_ddl(table_name: str, ids: Optional[List[str]] = None) -> Tuple[str, Dict]: +def _get_delete_ddl( + table_name: str, ids: Optional[List[str]] = None +) -> Tuple[str, Dict]: if ids is None: raise ValueError("No ids provided to delete.") @@ -974,7 +1063,9 @@ def mmr_from_docs_embeddings( ) -> List[Tuple[Document, float]]: # if you need to split documents and scores for processing (e.g., # for MMR calculation) - documents, scores, embeddings = zip(*docs_scores_embeddings) if docs_scores_embeddings else ([], [], []) + documents, scores, embeddings = ( + zip(*docs_scores_embeddings) if docs_scores_embeddings else ([], [], []) + ) # assume maximal_marginal_relevance method accepts embeddings and # scores, and returns indices of selected docs @@ -986,7 +1077,9 @@ def mmr_from_docs_embeddings( ) # filter documents based on MMR-selected indices and map scores - mmr_selected_documents_with_scores = [(documents[i], scores[i]) for i in mmr_selected_indices] + mmr_selected_documents_with_scores = [ + (documents[i], scores[i]) for i in mmr_selected_indices + ] return mmr_selected_documents_with_scores @@ -1196,18 +1289,26 @@ def embeddings(self) -> Optional[Embeddings]: Optional[Embeddings]: The embedding function if it's an instance of Embeddings, otherwise None. """ - return self.embedding_function if isinstance(self.embedding_function, Embeddings) else None + return ( + self.embedding_function + if isinstance(self.embedding_function, Embeddings) + else None + ) def get_embedding_dimension(self) -> int: # embed the single document by wrapping it in a list - embedded_document = self._embed_documents([self.query if self.query is not None else ""]) + embedded_document = self._embed_documents( + [self.query if self.query is not None else ""] + ) # get the first (and only) embedding's dimension return len(embedded_document[0]) async def aget_embedding_dimension(self) -> int: # embed the single document by wrapping it in a list - embedded_document = await self._aembed_documents([self.query if self.query is not None else ""]) + embedded_document = await self._aembed_documents( + [self.query if self.query is not None else ""] + ) # get the first (and only) embedding's dimension return len(embedded_document[0]) @@ -1218,7 +1319,9 @@ def _embed_documents(self, texts: List[str]) -> List[List[float]]: elif callable(self.embedding_function): return [self.embedding_function(text) for text in texts] else: - raise TypeError("The embedding_function is neither Embeddings nor callable.") + raise TypeError( + "The embedding_function is neither Embeddings nor callable." + ) async def _aembed_documents(self, texts: List[str]) -> List[List[float]]: if isinstance(self.embedding_function, Embeddings): @@ -1228,7 +1331,9 @@ async def _aembed_documents(self, texts: List[str]) -> List[List[float]]: elif callable(self.embedding_function): return [self.embedding_function(text) for text in texts] else: - raise TypeError("The embedding_function is neither Embeddings nor callable.") + raise TypeError( + "The embedding_function is neither Embeddings nor callable." + ) def _embed_query(self, text: str) -> List[float]: if isinstance(self.embedding_function, Embeddings): @@ -1279,7 +1384,9 @@ def add_texts( metadata, text, ) - for id_, embedding, metadata, text in zip(processed_ids, embeddings, metadatas, texts) + for id_, embedding, metadata, text in zip( + processed_ids, embeddings, metadatas, texts + ) ] else: docs = list(zip(processed_ids, metadatas, texts)) @@ -1291,7 +1398,8 @@ def add_texts( if not isinstance(self.embeddings, OracleEmbeddings): cursor.setinputsizes(None, None, oracledb.DB_TYPE_JSON, None) cursor.executemany( - f"INSERT INTO {self.table_name} (id, embedding, metadata, text) VALUES (:1, :2, :3, :4)", + f"INSERT INTO {self.table_name} " + "(id, embedding, metadata, text) VALUES (:1, :2, :3, :4)", docs, ) connection.commit() @@ -1304,13 +1412,15 @@ def add_texts( cursor.setinputsizes(None, oracledb.DB_TYPE_JSON, None) cursor.executemany( - f"INSERT INTO {self.table_name} (id, metadata, text) VALUES (:1, :2, :3)", + f"INSERT INTO {self.table_name} " + "(id, metadata, text) VALUES (:1, :2, :3)", docs, ) cursor.setinputsizes(oracledb.DB_TYPE_JSON) update_sql = ( - f"UPDATE {self.table_name} SET embedding = dbms_vector_chain.utl_to_embedding(text, json(:1))" + f"UPDATE {self.table_name} SET embedding = " + "dbms_vector_chain.utl_to_embedding(text, json(:1))" ) cursor.execute(update_sql, [self.embeddings.params]) connection.commit() @@ -1352,7 +1462,9 @@ async def aadd_texts( metadata, text, ) - for id_, embedding, metadata, text in zip(processed_ids, embeddings, metadatas, texts) + for id_, embedding, metadata, text in zip( + processed_ids, embeddings, metadatas, texts + ) ] else: docs = list(zip(processed_ids, metadatas, texts)) @@ -1364,7 +1476,8 @@ async def context(connection: Any) -> None: if not isinstance(self.embeddings, OracleEmbeddings): cursor.setinputsizes(None, None, oracledb.DB_TYPE_JSON, None) await cursor.executemany( - f"INSERT INTO {self.table_name} (id, embedding, metadata, text) VALUES (:1, :2, :3, :4)", + f"INSERT INTO {self.table_name} " + "(id, embedding, metadata, text) VALUES (:1, :2, :3, :4)", docs, ) await connection.commit() @@ -1377,7 +1490,8 @@ async def context(connection: Any) -> None: cursor.setinputsizes(None, oracledb.DB_TYPE_JSON, None) await cursor.executemany( - f"INSERT INTO {self.table_name} (id, metadata, text) VALUES (:1, :2, :3)", + f"INSERT INTO {self.table_name} " + "(id, metadata, text) VALUES (:1, :2, :3)", docs, ) @@ -1404,7 +1518,9 @@ def similarity_search( """Return docs most similar to query.""" embedding: List[float] = self._embed_query(query) - documents = self.similarity_search_by_vector(embedding=embedding, k=k, filter=filter, **kwargs) + documents = self.similarity_search_by_vector( + embedding=embedding, k=k, filter=filter, **kwargs + ) return documents async def asimilarity_search( @@ -1418,7 +1534,9 @@ async def asimilarity_search( """Return docs most similar to query.""" embedding: List[float] = await self._aembed_query(query) - documents = await self.asimilarity_search_by_vector(embedding=embedding, k=k, filter=filter, **kwargs) + documents = await self.asimilarity_search_by_vector( + embedding=embedding, k=k, filter=filter, **kwargs + ) return documents def similarity_search_by_vector( @@ -1493,7 +1611,9 @@ def similarity_search_by_vector_with_relevance_scores( db_filter = kwargs.get("db_filter", None) if db_filter: if filter: - raise ValueError("Specify only one of 'filter' or 'db_filter'; they are equivalent.") + raise ValueError( + "Specify only one of 'filter' or 'db_filter'; they are equivalent." + ) filter = db_filter @@ -1551,7 +1671,9 @@ async def asimilarity_search_by_vector_with_relevance_scores( db_filter = kwargs.get("db_filter", None) if db_filter: if filter: - raise ValueError("Specify only one of 'filter' or 'db_filter'; they are equivalent.") + raise ValueError( + "Specify only one of 'filter' or 'db_filter'; they are equivalent." + ) filter = db_filter @@ -1608,7 +1730,9 @@ def similarity_search_by_vector_returning_embeddings( db_filter = kwargs.get("db_filter", None) if db_filter: if filter: - raise ValueError("Specify only one of 'filter' or 'db_filter'; they are equivalent.") + raise ValueError( + "Specify only one of 'filter' or 'db_filter'; they are equivalent." + ) filter = db_filter @@ -1645,7 +1769,9 @@ def similarity_search_by_vector_returning_embeddings( # assuming result[4] is already in the correct format; # adjust if necessary current_embedding = ( - np.array(result[4], dtype=np.float32) if result[4] else np.empty(0, dtype=np.float32) + np.array(result[4], dtype=np.float32) + if result[4] + else np.empty(0, dtype=np.float32) ) documents.append((document, distance, current_embedding)) @@ -1668,7 +1794,9 @@ async def asimilarity_search_by_vector_returning_embeddings( db_filter = kwargs.get("db_filter", None) if db_filter: if filter: - raise ValueError("Specify only one of 'filter' or 'db_filter'; they are equivalent.") + raise ValueError( + "Specify only one of 'filter' or 'db_filter'; they are equivalent." + ) filter = db_filter @@ -1697,13 +1825,17 @@ async def context(connection: Any) -> List: raise Exception("Unexpected type:", type(page_content_str)) metadata = result[2] or {} - document = Document(page_content=page_content_str, metadata=metadata) + document = Document( + page_content=page_content_str, metadata=metadata + ) distance = result[3] # assuming result[4] is already in the correct format; # adjust if necessary current_embedding = ( - np.array(result[4], dtype=np.float32) if result[4] else np.empty(0, dtype=np.float32) + np.array(result[4], dtype=np.float32) + if result[4] + else np.empty(0, dtype=np.float32) ) documents.append((document, distance, current_embedding)) @@ -1753,7 +1885,9 @@ def max_marginal_relevance_search_with_score_by_vector( embedding, fetch_k, filter=filter, **kwargs ) # assuming documents_with_scores is a list of tuples (Document, score) - mmr_selected_documents_with_scores = mmr_from_docs_embeddings(docs_scores_embeddings, embedding, k, lambda_mult) + mmr_selected_documents_with_scores = mmr_from_docs_embeddings( + docs_scores_embeddings, embedding, k, lambda_mult + ) return mmr_selected_documents_with_scores @@ -1794,11 +1928,15 @@ async def amax_marginal_relevance_search_with_score_by_vector( """ # fetch documents and their scores - docs_scores_embeddings = await self.asimilarity_search_by_vector_returning_embeddings( - embedding, fetch_k, filter=filter, **kwargs + docs_scores_embeddings = ( + await self.asimilarity_search_by_vector_returning_embeddings( + embedding, fetch_k, filter=filter, **kwargs + ) ) # assuming documents_with_scores is a list of tuples (Document, score) - mmr_selected_documents_with_scores = mmr_from_docs_embeddings(docs_scores_embeddings, embedding, k, lambda_mult) + mmr_selected_documents_with_scores = mmr_from_docs_embeddings( + docs_scores_embeddings, embedding, k, lambda_mult + ) return mmr_selected_documents_with_scores @@ -1872,13 +2010,15 @@ async def amax_marginal_relevance_search_by_vector( Returns: List of Documents selected by maximal marginal relevance. """ - docs_and_scores = await self.amax_marginal_relevance_search_with_score_by_vector( - embedding, - k=k, - fetch_k=fetch_k, - lambda_mult=lambda_mult, - filter=filter, - **kwargs, + docs_and_scores = ( + await self.amax_marginal_relevance_search_with_score_by_vector( + embedding, + k=k, + fetch_k=fetch_k, + lambda_mult=lambda_mult, + filter=filter, + **kwargs, + ) ) return [doc for doc, _ in docs_and_scores] @@ -2021,9 +2161,13 @@ def _from_texts_helper( table_name = str(kwargs.get("table_name", "langchain")) - distance_strategy = cast(DistanceStrategy, kwargs.get("distance_strategy", None)) + distance_strategy = cast( + DistanceStrategy, kwargs.get("distance_strategy", None) + ) if not isinstance(distance_strategy, DistanceStrategy): - raise TypeError(f"Expected DistanceStrategy got {type(distance_strategy).__name__} ") + raise TypeError( + f"Expected DistanceStrategy got {type(distance_strategy).__name__} " + ) query = kwargs.get("query", "What is a Oracle database") diff --git a/libs/oracledb/pyproject.toml b/libs/oracledb/pyproject.toml index 8ecec13..0fbd2e2 100644 --- a/libs/oracledb/pyproject.toml +++ b/libs/oracledb/pyproject.toml @@ -56,7 +56,6 @@ optional = true [tool.poetry.group.dev.dependencies] [tool.ruff] -line-length = 120 [tool.ruff.lint] select = [ diff --git a/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py b/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py index 9cd7069..708e08b 100644 --- a/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py +++ b/libs/oracledb/tests/integration_tests/vectorstores/test_oraclevs.py @@ -113,7 +113,9 @@ def test_table_exists_test() -> None: @pytest.mark.asyncio async def test_table_exists_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) # 1. Existing Table:(all capital letters) @@ -293,7 +295,9 @@ def test_create_table_test() -> None: @pytest.mark.asyncio async def test_create_table_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) @@ -406,7 +410,9 @@ async def test_create_table_test_async() -> None: # 17. String Operations in table_name&dimension parameter # Expectation:table is created - await _acreate_table(connection, _quote_indentifier("YaSh".replace("aS", "ok")), 500) + await _acreate_table( + connection, _quote_indentifier("YaSh".replace("aS", "ok")), 500 + ) await adrop_table_purge(connection, _quote_indentifier("YaSh".replace("aS", "ok"))) @@ -424,7 +430,9 @@ def test_create_hnsw_index_test() -> None: # New Index # distance_strategy - DistanceStrategy.Dot_product # Expectation:Index created - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) vs = OracleVS(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) create_index(connection, vs) @@ -627,7 +635,9 @@ def test_create_hnsw_index_test() -> None: # 11. index_name as # Expectation:U1 not present with pytest.raises(RuntimeError): - vs = OracleVS(connection, model1, "U1.TB16", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = OracleVS( + connection, model1, "U1.TB16", DistanceStrategy.EUCLIDEAN_DISTANCE + ) create_index( connection, vs, @@ -662,15 +672,21 @@ def test_create_hnsw_index_test() -> None: @pytest.mark.asyncio async def test_create_hnsw_index_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) # 1. Table_name - TB1 # New Index # distance_strategy - DistanceStrategy.Dot_product # Expectation:Index created - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") - vs = await OracleVS.acreate(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) + vs = await OracleVS.acreate( + connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index(connection, vs) # 2. Creating same index again @@ -685,8 +701,12 @@ async def test_create_hnsw_index_test_async() -> None: # idx_name - hnsw_idx2 # idx_type - HNSW # Expectation:Index created - vs = await OracleVS.acreate(connection, model1, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) - await acreate_index(connection, vs, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) + vs = await OracleVS.acreate( + connection, model1, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + await acreate_index( + connection, vs, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} + ) await adrop_index_if_exists(connection, "hnsw_idx2") await adrop_table_purge(connection, "TB2") @@ -694,29 +714,41 @@ async def test_create_hnsw_index_test_async() -> None: # idx_name - "हिन्दी" # idx_type - HNSW # Expectation:Index created - vs = await OracleVS.acreate(connection, model1, "TB3", DistanceStrategy.EUCLIDEAN_DISTANCE) - await acreate_index(connection, vs, params={"idx_name": '"हिन्दी"', "idx_type": "HNSW"}) + vs = await OracleVS.acreate( + connection, model1, "TB3", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + await acreate_index( + connection, vs, params={"idx_name": '"हिन्दी"', "idx_type": "HNSW"} + ) await adrop_index_if_exists(connection, '"हिन्दी"') await adrop_table_purge(connection, "TB3") # 5. idx_name passed empty # Expectation:ORA-01741: illegal zero-length identifier with pytest.raises(ValueError): - vs = await OracleVS.acreate(connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE) - await acreate_index(connection, vs, params={"idx_name": '""', "idx_type": "HNSW"}) + vs = await OracleVS.acreate( + connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + await acreate_index( + connection, vs, params={"idx_name": '""', "idx_type": "HNSW"} + ) await adrop_index_if_exists(connection, '""') await adrop_table_purge(connection, "TB4") # 6. idx_type left empty # Expectation:Index created - vs = await OracleVS.acreate(connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index(connection, vs, params={"idx_name": "Hello", "idx_type": ""}) await adrop_index_if_exists(connection, "Hello") await adrop_table_purge(connection, "TB5") # 7. efconstruction passed as parameter but not neighbours # Expectation:Index created - vs = await OracleVS.acreate(connection, model1, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -728,7 +760,9 @@ async def test_create_hnsw_index_test_async() -> None: # 8. efconstruction passed as parameter as well as neighbours # (for this idx_type parameter is also necessary) # Expectation:Index created - vs = await OracleVS.acreate(connection, model1, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -753,7 +787,9 @@ async def test_create_hnsw_index_test_async() -> None: # 0 None: await adrop_table_purge(connection, "TB9") # index not created: with pytest.raises(RuntimeError): - vs = await OracleVS.acreate(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -785,7 +823,9 @@ async def test_create_hnsw_index_test_async() -> None: # index not created: with pytest.raises(RuntimeError): - vs = await OracleVS.acreate(connection, model1, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -800,7 +840,9 @@ async def test_create_hnsw_index_test_async() -> None: await adrop_index_if_exists(connection, "idx11") # index not created with pytest.raises(RuntimeError): - vs = await OracleVS.acreate(connection, model1, "TB12", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB12", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -815,7 +857,9 @@ async def test_create_hnsw_index_test_async() -> None: await adrop_index_if_exists(connection, "idx11") # index not created with pytest.raises(RuntimeError): - vs = await OracleVS.acreate(connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -832,7 +876,9 @@ async def test_create_hnsw_index_test_async() -> None: # with negative values/out-of-bound values for all 4 of them, we get the same errors # Expectation:Index not created with pytest.raises(RuntimeError): - vs = await OracleVS.acreate(connection, model1, "TB14", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB14", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -854,7 +900,9 @@ async def test_create_hnsw_index_test_async() -> None: # 10. Table_name as # Expectation:Index created - vs = await OracleVS.acreate(connection, model1, "TB15", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB15", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -873,7 +921,9 @@ async def test_create_hnsw_index_test_async() -> None: # 11. index_name as # Expectation:U1 not present with pytest.raises(RuntimeError): - vs = await OracleVS.acreate(connection, model1, "U1.TB16", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "U1.TB16", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -892,15 +942,23 @@ async def test_create_hnsw_index_test_async() -> None: # 12. Index_name size >129 # Expectation:Index not created with pytest.raises(RuntimeError): - vs = await OracleVS.acreate(connection, model1, "TB17", DistanceStrategy.EUCLIDEAN_DISTANCE) - await acreate_index(connection, vs, params={"idx_name": "x" * 129, "idx_type": "HNSW"}) + vs = await OracleVS.acreate( + connection, model1, "TB17", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + await acreate_index( + connection, vs, params={"idx_name": "x" * 129, "idx_type": "HNSW"} + ) await adrop_index_if_exists(connection, "x" * 129) await adrop_table_purge(connection, "TB17") # 13. Index_name size 128 # Expectation:Index created - vs = await OracleVS.acreate(connection, model1, "TB18", DistanceStrategy.EUCLIDEAN_DISTANCE) - await acreate_index(connection, vs, params={"idx_name": "x" * 128, "idx_type": "HNSW"}) + vs = await OracleVS.acreate( + connection, model1, "TB18", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + await acreate_index( + connection, vs, params={"idx_name": "x" * 128, "idx_type": "HNSW"} + ) await adrop_index_if_exists(connection, "x" * 128) await adrop_table_purge(connection, "TB18") @@ -915,7 +973,9 @@ def test_index_exists_test() -> None: connection = oracledb.connect(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) # 1. Existing Index:(all capital letters) # Expectation:true vs = OracleVS(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) @@ -973,14 +1033,22 @@ def test_index_exists_test() -> None: @pytest.mark.asyncio async def test_index_exists_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) # 1. Existing Index:(all capital letters) # Expectation:true - vs = await OracleVS.acreate(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) - await acreate_index(connection, vs, params={"idx_name": "idx11", "idx_type": "HNSW"}) + vs = await OracleVS.acreate( + connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + await acreate_index( + connection, vs, params={"idx_name": "idx11", "idx_type": "HNSW"} + ) assert not await _aindex_exists(connection, _quote_indentifier("IDX11")) # 2. Existing Table:(all small letters) @@ -1122,8 +1190,12 @@ def test_add_texts_test() -> None: # 6. Add 2 different record concurrently # Expectation:Successful def add(val: str) -> None: - model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = OracleVS(connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) + model = HuggingFaceEmbeddings( + model_name="sentence-transformers/all-mpnet-base-v2" + ) + vs_obj = OracleVS( + connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts5 = [val] ids9 = texts5 vs_obj.add_texts(texts5, ids=ids9) @@ -1139,8 +1211,12 @@ def add(val: str) -> None: # 7. Add 2 same record concurrently # Expectation:Successful, For one of the insert,get primary key violation error def add1(val: str) -> None: - model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = OracleVS(connection, model, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE) + model = HuggingFaceEmbeddings( + model_name="sentence-transformers/all-mpnet-base-v2" + ) + vs_obj = OracleVS( + connection, model, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts = [val] ids10 = texts vs_obj.add_texts(texts, ids=ids10) @@ -1170,7 +1246,9 @@ def add1(val: str) -> None: @pytest.mark.asyncio async def test_add_texts_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) # 1. Add 2 records to table @@ -1181,7 +1259,9 @@ async def test_add_texts_test_async() -> None: {"id": "101", "link": "Document Example Test 2"}, ] model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate(connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await vs_obj.aadd_texts(texts, metadata) await adrop_table_purge(connection, "TB1") @@ -1189,7 +1269,9 @@ async def test_add_texts_test_async() -> None: # Expectation:An exception occurred :: Either specify an 'ids' list or # 'metadatas' with an 'id' attribute for each element. model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate(connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts2 = ["Sri Ram", "Krishna"] await vs_obj.aadd_texts(texts2) await adrop_table_purge(connection, "TB2") @@ -1205,17 +1287,23 @@ async def test_add_texts_test_async() -> None: # Successful # Successful - vs_obj = await OracleVS.acreate(connection, model, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE + ) ids3 = ["114", "124"] await vs_obj.aadd_texts(texts2, ids=ids3) await adrop_table_purge(connection, "TB4") - vs_obj = await OracleVS.acreate(connection, model, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE + ) ids4 = ["", "134"] await vs_obj.aadd_texts(texts2, ids=ids4) await adrop_table_purge(connection, "TB5") - vs_obj = await OracleVS.acreate(connection, model, "TB6", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB6", DistanceStrategy.EUCLIDEAN_DISTANCE + ) ids5 = [ """Good afternoon my friends""", @@ -1224,14 +1312,18 @@ async def test_add_texts_test_async() -> None: await vs_obj.aadd_texts(texts2, ids=ids5) await adrop_table_purge(connection, "TB6") - vs_obj = await OracleVS.acreate(connection, model, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE + ) ids6 = ['"Good afternoon"', '"India"'] await vs_obj.aadd_texts(texts2, ids=ids6) await adrop_table_purge(connection, "TB7") # 4. Add records with ids and metadatas # Expectation:Successful - vs_obj = await OracleVS.acreate(connection, model, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts3 = ["Sri Ram 6", "Krishna 6"] ids7 = ["1", "2"] metadata = [ @@ -1243,7 +1335,9 @@ async def test_add_texts_test_async() -> None: # 5. Add 10000 records # Expectation:Successful - vs_obj = await OracleVS.acreate(connection, model, "TB9", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB9", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts4 = ["Sri Ram{0}".format(i) for i in range(1, 10000)] ids8 = ["Hello{0}".format(i) for i in range(1, 10000)] await vs_obj.aadd_texts(texts4, ids=ids8) @@ -1252,8 +1346,12 @@ async def test_add_texts_test_async() -> None: # 6. Add 2 different record concurrently # Expectation:Successful async def add(val: str) -> None: - model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate(connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) + model = HuggingFaceEmbeddings( + model_name="sentence-transformers/all-mpnet-base-v2" + ) + vs_obj = await OracleVS.acreate( + connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts5 = [val] ids9 = texts5 await vs_obj.aadd_texts(texts5, ids=ids9) @@ -1267,8 +1365,12 @@ async def add(val: str) -> None: # 7. Add 2 same record concurrently # Expectation:Successful, For one of the insert,get primary key violation error async def add1(val: str) -> None: - model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate(connection, model, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE) + model = HuggingFaceEmbeddings( + model_name="sentence-transformers/all-mpnet-base-v2" + ) + vs_obj = await OracleVS.acreate( + connection, model, "TB11", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts = [val] ids10 = texts await vs_obj.aadd_texts(texts, ids=ids10) @@ -1283,7 +1385,9 @@ async def add1(val: str) -> None: # 8. create object with table name of type # Expectation:U1 does not exist with pytest.raises(RuntimeError): - vs_obj = await OracleVS.acreate(connection, model, "U1.TB14", DistanceStrategy.DOT_PRODUCT) + vs_obj = await OracleVS.acreate( + connection, model, "U1.TB14", DistanceStrategy.DOT_PRODUCT + ) for i in range(1, 10): texts7 = ["Yash{0}".format(i)] ids13 = ["1234{0}".format(i)] @@ -1313,13 +1417,17 @@ def test_embed_documents_test() -> None: @pytest.mark.asyncio async def test_embed_documents_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) # 1. String Example-'Sri Ram' # Expectation:Vector Printed model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate(connection, model, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE + ) # 4. List # Expectation:Vector Printed @@ -1350,13 +1458,17 @@ def test_embed_query_test() -> None: @pytest.mark.asyncio async def test_embed_query_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) # 1. String # Expectation:Vector printed model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate(connection, model, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB8", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await vs_obj._aembed_query("Sri Ram") await adrop_table_purge(connection, "TB8") @@ -1375,7 +1487,9 @@ def test_create_index_test() -> None: sys.exit(1) # 1. No optional parameters passed # Expectation:Successful - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) vs = OracleVS(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) create_index(connection, vs) drop_index_if_exists(connection, "HNSW") @@ -1398,14 +1512,18 @@ def test_create_index_test() -> None: # 4. ivf index with neighbour_part and accuracy passed as parameter # Expectation:Successful vs = OracleVS(connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE) - create_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "accuracy": 90}) + create_index( + connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "accuracy": 90} + ) drop_index_if_exists(connection, "IVF") drop_table_purge(connection, "TB4") # 5. ivf index with neighbour_part and parallel passed as parameter # Expectation:Successful vs = OracleVS(connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE) - create_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "parallel": 90}) + create_index( + connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "parallel": 90} + ) drop_index_if_exists(connection, "IVF") drop_table_purge(connection, "TB5") @@ -1435,48 +1553,68 @@ def test_create_index_test() -> None: @pytest.mark.asyncio async def test_create_index_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) # 1. No optional parameters passed # Expectation:Successful - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") - vs = await OracleVS.acreate(connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) + vs = await OracleVS.acreate( + connection, model1, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index(connection, vs) await adrop_index_if_exists(connection, "HNSW") await adrop_table_purge(connection, "TB1") # 2. ivf index # Expectation:Successful - vs = await OracleVS.acreate(connection, model1, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index(connection, vs, {"idx_type": "IVF", "idx_name": "IVF"}) await adrop_index_if_exists(connection, "IVF") await adrop_table_purge(connection, "TB2") # 3. ivf index with neighbour_part passed as parameter # Expectation:Successful - vs = await OracleVS.acreate(connection, model1, "TB3", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB3", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10}) await adrop_index_if_exists(connection, "IVF") await adrop_table_purge(connection, "TB3") # 4. ivf index with neighbour_part and accuracy passed as parameter # Expectation:Successful - vs = await OracleVS.acreate(connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE) - await acreate_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "accuracy": 90}) + vs = await OracleVS.acreate( + connection, model1, "TB4", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + await acreate_index( + connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "accuracy": 90} + ) await adrop_index_if_exists(connection, "IVF") await adrop_table_purge(connection, "TB4") # 5. ivf index with neighbour_part and parallel passed as parameter # Expectation:Successful - vs = await OracleVS.acreate(connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE) - await acreate_index(connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "parallel": 90}) + vs = await OracleVS.acreate( + connection, model1, "TB5", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + await acreate_index( + connection, vs, {"idx_type": "IVF", "neighbor_part": 10, "parallel": 90} + ) await adrop_index_if_exists(connection, "IVF") await adrop_table_purge(connection, "TB5") # 6. ivf index and then perform dml(insert) # Expectation:Successful - vs = await OracleVS.acreate(connection, model1, "TB6", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB6", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index(connection, vs, {"idx_type": "IVF", "idx_name": "IVF"}) texts = ["Sri Ram", "Krishna"] await vs.aadd_texts(texts) @@ -1487,7 +1625,9 @@ async def test_create_index_test_async() -> None: # 7. ivf index with neighbour_part,parallel and accuracy passed as parameter # Expectation:Successful - vs = await OracleVS.acreate(connection, model1, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB7", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await acreate_index( connection, vs, @@ -1505,7 +1645,9 @@ def test_perform_search_test() -> None: connection = oracledb.connect(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) vs_1 = OracleVS(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) vs_2 = OracleVS(connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT) vs_3 = OracleVS(connection, model1, "TB12", DistanceStrategy.COSINE) @@ -1562,7 +1704,9 @@ def test_perform_search_test() -> None: vs.max_marginal_relevance_search(query, 2, fetch_k=20, lambda_mult=0.5) # Max marginal relevance search with filter - vs.max_marginal_relevance_search(query, 2, fetch_k=20, lambda_mult=0.5, filter=db_filter) + vs.max_marginal_relevance_search( + query, 2, fetch_k=20, lambda_mult=0.5, filter=db_filter + ) drop_table_purge(connection, "TB10") drop_table_purge(connection, "TB11") @@ -1575,16 +1719,28 @@ def test_perform_search_test() -> None: @pytest.mark.asyncio async def test_perform_search_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) - vs_1 = await OracleVS.acreate(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) - vs_2 = await OracleVS.acreate(connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT) + vs_1 = await OracleVS.acreate( + connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + vs_2 = await OracleVS.acreate( + connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT + ) vs_3 = await OracleVS.acreate(connection, model1, "TB12", DistanceStrategy.COSINE) - vs_4 = await OracleVS.acreate(connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE) - vs_5 = await OracleVS.acreate(connection, model1, "TB14", DistanceStrategy.DOT_PRODUCT) + vs_4 = await OracleVS.acreate( + connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + vs_5 = await OracleVS.acreate( + connection, model1, "TB14", DistanceStrategy.DOT_PRODUCT + ) vs_6 = await OracleVS.acreate(connection, model1, "TB15", DistanceStrategy.COSINE) # vector store lists: @@ -1605,9 +1761,13 @@ async def test_perform_search_test_async() -> None: # create index if i == 1 or i == 2 or i == 3: - await acreate_index(connection, vs, {"idx_type": "HNSW", "idx_name": f"IDX1{i}"}) + await acreate_index( + connection, vs, {"idx_type": "HNSW", "idx_name": f"IDX1{i}"} + ) else: - await acreate_index(connection, vs, {"idx_type": "IVF", "idx_name": f"IDX1{i}"}) + await acreate_index( + connection, vs, {"idx_type": "IVF", "idx_name": f"IDX1{i}"} + ) # perform search query = "YashB" @@ -1636,7 +1796,9 @@ async def test_perform_search_test_async() -> None: await vs.amax_marginal_relevance_search(query, 2, fetch_k=20, lambda_mult=0.5) # Max marginal relevance search with filter - await vs.amax_marginal_relevance_search(query, 2, fetch_k=20, lambda_mult=0.5, filter=db_filter) + await vs.amax_marginal_relevance_search( + query, 2, fetch_k=20, lambda_mult=0.5, filter=db_filter + ) await adrop_table_purge(connection, "TB10") await adrop_table_purge(connection, "TB11") @@ -1667,7 +1829,9 @@ def test_db_filter_test() -> None: connection = oracledb.connect(user=username, password=password, dsn=dsn) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) drop_table_purge(connection, "TB10") drop_table_purge(connection, "TB11") drop_table_purge(connection, "TB12") @@ -1791,16 +1955,28 @@ def test_db_filter_test() -> None: @pytest.mark.asyncio async def test_db_filter_test_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) - model1 = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model1 = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) - vs_1 = await OracleVS.acreate(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) - vs_2 = await OracleVS.acreate(connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT) + vs_1 = await OracleVS.acreate( + connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + vs_2 = await OracleVS.acreate( + connection, model1, "TB11", DistanceStrategy.DOT_PRODUCT + ) vs_3 = await OracleVS.acreate(connection, model1, "TB12", DistanceStrategy.COSINE) - vs_4 = await OracleVS.acreate(connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE) - vs_5 = await OracleVS.acreate(connection, model1, "TB14", DistanceStrategy.DOT_PRODUCT) + vs_4 = await OracleVS.acreate( + connection, model1, "TB13", DistanceStrategy.EUCLIDEAN_DISTANCE + ) + vs_5 = await OracleVS.acreate( + connection, model1, "TB14", DistanceStrategy.DOT_PRODUCT + ) vs_6 = await OracleVS.acreate(connection, model1, "TB15", DistanceStrategy.COSINE) # vector store lists: @@ -1821,9 +1997,13 @@ async def test_db_filter_test_async() -> None: # create index if i == 1 or i == 2 or i == 3: - await acreate_index(connection, vs, {"idx_type": "HNSW", "idx_name": f"IDX1{i}"}) + await acreate_index( + connection, vs, {"idx_type": "HNSW", "idx_name": f"IDX1{i}"} + ) else: - await acreate_index(connection, vs, {"idx_type": "IVF", "idx_name": f"IDX1{i}"}) + await acreate_index( + connection, vs, {"idx_type": "IVF", "idx_name": f"IDX1{i}"} + ) # perform search query = "Strawberry" @@ -1920,15 +2100,21 @@ async def test_add_texts_pool_test() -> None: POOLS_MAX = 4 try: - connection = oracledb.create_pool(user=username, password=password, dsn=dsn, min=1, max=POOLS_MAX, increment=1) + connection = oracledb.create_pool( + user=username, password=password, dsn=dsn, min=1, max=POOLS_MAX, increment=1 + ) except Exception: sys.exit(1) # 1. Add different records concurrently # Expectation:Successful async def add(order: int) -> None: - model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = OracleVS(connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) + model = HuggingFaceEmbeddings( + model_name="sentence-transformers/all-mpnet-base-v2" + ) + vs_obj = OracleVS( + connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts = ["Sri Ram" + str(order)] ids = texts vs_obj.add_texts(texts, ids=ids) @@ -1960,15 +2146,21 @@ async def test_add_texts_pool_test_async() -> None: POOLS_MAX = 4 try: - connection = oracledb.create_pool_async(user=username, password=password, dsn=dsn, min=1, max=4, increment=1) + connection = oracledb.create_pool_async( + user=username, password=password, dsn=dsn, min=1, max=4, increment=1 + ) except Exception: sys.exit(1) # 1. Add different records concurrently # Expectation:Successful async def add(order: int) -> None: - model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - vs_obj = await OracleVS.acreate(connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) + model = HuggingFaceEmbeddings( + model_name="sentence-transformers/all-mpnet-base-v2" + ) + vs_obj = await OracleVS.acreate( + connection, model, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts = ["Sri Ram" + str(order)] ids = texts await vs_obj.aadd_texts(texts, ids=ids) @@ -2004,7 +2196,9 @@ def test_from_texts_lobs() -> None: except Exception: sys.exit(1) - model = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) texts = [ "If the answer to any preceding questions is yes, then the database stops \ @@ -2057,11 +2251,15 @@ def test_from_texts_lobs() -> None: @pytest.mark.asyncio async def test_from_texts_lobs_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) - model = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-mpnet-base-v2") + model = HuggingFaceEmbeddings( + model_name="sentence-transformers/paraphrase-mpnet-base-v2" + ) texts = [ "If the answer to any preceding questions is yes, then the database stops \ @@ -2148,25 +2346,37 @@ def test_index_table_case(caplog: pytest.LogCaptureFixture) -> None: assert 'Table "Tb1" created successfully...' in caplog.records[-1].message with caplog.at_level(logging.INFO): - vs_obj2 = OracleVS(connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj2 = OracleVS( + connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE + ) assert 'Table "TB2" created successfully...' in caplog.records[-1].message vs_obj.add_texts(texts, metadata) with caplog.at_level(logging.INFO): - create_index(connection, vs_obj, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) + create_index( + connection, vs_obj, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} + ) assert 'Index "hnsw_idx2" created successfully...' in caplog.records[-1].message with pytest.raises(RuntimeError, match="such column list already indexed"): - create_index(connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"}) + create_index( + connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"} + ) - with pytest.raises(RuntimeError, match="name is already used by an existing object"): - create_index(connection, vs_obj2, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) + with pytest.raises( + RuntimeError, match="name is already used by an existing object" + ): + create_index( + connection, vs_obj2, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} + ) with pytest.raises(RuntimeError, match="such column list already indexed"): - create_index(connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"}) + create_index( + connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"} + ) with caplog.at_level(logging.INFO): drop_index_if_exists(connection, "hnsw_idx2") @@ -2174,7 +2384,9 @@ def test_index_table_case(caplog: pytest.LogCaptureFixture) -> None: assert 'Index "hnsw_idx2" has been dropped.' in caplog.records[-1].message with caplog.at_level(logging.INFO): - create_index(connection, vs_obj, params={"idx_name": '"hnsw_idx2"', "idx_type": "HNSW"}) + create_index( + connection, vs_obj, params={"idx_name": '"hnsw_idx2"', "idx_type": "HNSW"} + ) assert 'Index "hnsw_idx2" created successfully...' in caplog.records[-1].message @@ -2186,7 +2398,9 @@ def test_index_table_case(caplog: pytest.LogCaptureFixture) -> None: @pytest.mark.asyncio async def test_index_table_case_async(caplog: pytest.LogCaptureFixture) -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) @@ -2204,40 +2418,58 @@ async def test_index_table_case_async(caplog: pytest.LogCaptureFixture) -> None: model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") with caplog.at_level(logging.INFO): - vs_obj = await OracleVS.acreate(connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE + ) assert 'Table "TB1" created successfully...' in caplog.records[-1].message with caplog.at_level(logging.INFO): - await OracleVS.acreate(connection, model, '"TB1"', DistanceStrategy.EUCLIDEAN_DISTANCE) + await OracleVS.acreate( + connection, model, '"TB1"', DistanceStrategy.EUCLIDEAN_DISTANCE + ) assert 'Table "TB1" already exists...' in caplog.records[-1].message with caplog.at_level(logging.INFO): - await OracleVS.acreate(connection, model, "Tb1", DistanceStrategy.EUCLIDEAN_DISTANCE) + await OracleVS.acreate( + connection, model, "Tb1", DistanceStrategy.EUCLIDEAN_DISTANCE + ) assert 'Table "Tb1" created successfully...' in caplog.records[-1].message with caplog.at_level(logging.INFO): - vs_obj2 = await OracleVS.acreate(connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj2 = await OracleVS.acreate( + connection, model, "TB2", DistanceStrategy.EUCLIDEAN_DISTANCE + ) assert 'Table "TB2" created successfully...' in caplog.records[-1].message await vs_obj.aadd_texts(texts, metadata) with caplog.at_level(logging.INFO): - await acreate_index(connection, vs_obj, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) + await acreate_index( + connection, vs_obj, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} + ) assert 'Index "hnsw_idx2" created successfully...' in caplog.records[-1].message with pytest.raises(RuntimeError, match="such column list already indexed"): - await acreate_index(connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"}) + await acreate_index( + connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"} + ) - with pytest.raises(RuntimeError, match="name is already used by an existing object"): - await acreate_index(connection, vs_obj2, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"}) + with pytest.raises( + RuntimeError, match="name is already used by an existing object" + ): + await acreate_index( + connection, vs_obj2, params={"idx_name": "hnsw_idx2", "idx_type": "HNSW"} + ) with pytest.raises(RuntimeError, match="such column list already indexed"): - await acreate_index(connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"}) + await acreate_index( + connection, vs_obj, params={"idx_name": "HNSW_idx2", "idx_type": "HNSW"} + ) with caplog.at_level(logging.INFO): await adrop_index_if_exists(connection, "hnsw_idx2") @@ -2245,7 +2477,9 @@ async def test_index_table_case_async(caplog: pytest.LogCaptureFixture) -> None: assert 'Index "hnsw_idx2" has been dropped.' in caplog.records[-1].message with caplog.at_level(logging.INFO): - await acreate_index(connection, vs_obj, params={"idx_name": '"hnsw_idx2"', "idx_type": "HNSW"}) + await acreate_index( + connection, vs_obj, params={"idx_name": '"hnsw_idx2"', "idx_type": "HNSW"} + ) assert 'Index "hnsw_idx2" created successfully...' in caplog.records[-1].message @@ -2293,7 +2527,9 @@ def test_oracle_embeddings() -> None: @pytest.mark.asyncio async def test_oracle_embeddings_async(caplog: pytest.LogCaptureFixture) -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) connection_sync = oracledb.connect(user=username, password=password, dsn=dsn) except Exception: @@ -2312,7 +2548,9 @@ async def test_oracle_embeddings_async(caplog: pytest.LogCaptureFixture) -> None # instance model = OracleEmbeddings(conn=connection_sync, params=embedder_params, proxy=proxy) - vs_obj = await OracleVS.acreate(connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs_obj = await OracleVS.acreate( + connection, model, "TB1", DistanceStrategy.EUCLIDEAN_DISTANCE + ) await vs_obj.aadd_texts(texts, metadata) res = await vs_obj.asimilarity_search("database", 1) @@ -2560,7 +2798,9 @@ def model1(_) -> list[float]: # type: ignore[no-untyped-def] async def test_filters_async() -> None: try: - connection = await oracledb.connect_async(user=username, password=password, dsn=dsn) + connection = await oracledb.connect_async( + user=username, password=password, dsn=dsn + ) except Exception: sys.exit(1) @@ -2571,7 +2811,9 @@ def model1(_) -> list[float]: # type: ignore[no-untyped-def] await adrop_table_purge(connection, "TB10") - vs = await OracleVS.acreate(connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE) + vs = await OracleVS.acreate( + connection, model1, "TB10", DistanceStrategy.EUCLIDEAN_DISTANCE + ) texts = ["Strawberry", "Banana", "Blueberry"] metadatas = [ diff --git a/libs/oracledb/tests/unit_tests/document_loaders/test_oracleadb.py b/libs/oracledb/tests/unit_tests/document_loaders/test_oracleadb.py index 2dd9642..586ebd8 100644 --- a/libs/oracledb/tests/unit_tests/document_loaders/test_oracleadb.py +++ b/libs/oracledb/tests/unit_tests/document_loaders/test_oracleadb.py @@ -27,21 +27,32 @@ def raw_docs() -> List[Dict]: def expected_documents() -> List[Document]: return [ Document( - page_content="{'FIELD1': '1', 'FIELD_JSON': {'INNER_FIELD1': '1', 'INNER_FIELD2': '1'}}", + page_content=( + "{'FIELD1': '1', 'FIELD_JSON': " + "{'INNER_FIELD1': '1', 'INNER_FIELD2': '1'}}" + ), metadata={"FIELD1": "1"}, ), Document( - page_content="{'FIELD1': '2', 'FIELD_JSON': {'INNER_FIELD1': '2', 'INNER_FIELD2': '2'}}", + page_content=( + "{'FIELD1': '2', 'FIELD_JSON': " + "{'INNER_FIELD1': '2', 'INNER_FIELD2': '2'}}" + ), metadata={"FIELD1": "2"}, ), Document( - page_content="{'FIELD1': '3', 'FIELD_JSON': {'INNER_FIELD1': '3', 'INNER_FIELD2': '3'}}", + page_content=( + "{'FIELD1': '3', 'FIELD_JSON': " + "{'INNER_FIELD1': '3', 'INNER_FIELD2': '3'}}" + ), metadata={"FIELD1": "3"}, ), ] -@patch("langchain_oracledb.document_loaders.oracleadb_loader.OracleAutonomousDatabaseLoader._run_query") +@patch( + "langchain_oracledb.document_loaders.oracleadb_loader.OracleAutonomousDatabaseLoader._run_query" +) def test_oracle_loader_load(mock_query: MagicMock) -> None: """Test oracleDB loader load function.""" From 36d9e69c0acd27687e7bd8ae517f04bf8e672c81 Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 18:02:45 -0800 Subject: [PATCH 12/16] Remove noqa: E501 comments and reformat long lines This commit removes unnecessary '# noqa: E501' comments throughout the codebase and reformats long lines for improved readability. Docstrings, function signatures, and code examples have been wrapped or split across lines where appropriate. No functional changes were made. --- .../chat_models/oci_data_science.py | 42 ++++++----- .../chat_models/oci_generative_ai.py | 74 +++++++++---------- ..._data_science_model_deployment_endpoint.py | 10 +-- .../embeddings/oci_generative_ai.py | 12 +-- ..._data_science_model_deployment_endpoint.py | 48 ++++++------ .../langchain_oci/llms/oci_generative_ai.py | 16 ++-- .../chat_models/test_tool_calling.py | 10 +-- .../chat_models/test_oci_data_science.py | 14 ++-- .../chat_models/test_oci_generative_ai.py | 6 +- .../test_oci_model_deployment_endpoint.py | 2 +- .../test_oci_model_deployment_endpoint.py | 16 ++-- .../document_loaders/oracleadb_loader.py | 4 +- 12 files changed, 133 insertions(+), 121 deletions(-) diff --git a/libs/oci/langchain_oci/chat_models/oci_data_science.py b/libs/oci/langchain_oci/chat_models/oci_data_science.py index cb000a6..b6c5eb1 100644 --- a/libs/oci/langchain_oci/chat_models/oci_data_science.py +++ b/libs/oci/langchain_oci/chat_models/oci_data_science.py @@ -110,7 +110,7 @@ class ChatOCIModelDeployment(BaseChatModel, BaseOCIModelDeployment): chat = ChatOCIModelDeployment( endpoint="https://modeldeployment..oci.customer-oci.com//predict", - model="odsc-llm", # this is the default model name if deployed with AQUA + model="odsc-llm", # default model name if deployed with AQUA streaming=True, max_retries=3, model_kwargs={ @@ -167,9 +167,10 @@ class ChatOCIModelDeployment(BaseChatModel, BaseOCIModelDeployment): content=' le' id='run-02c6-c43f-42de' content=' monde' id='run-02c6-c43f-42de' content='!' id='run-02c6-c43f-42de' - content='' response_metadata={'finish_reason': 'stop'} id='run-02c6-c43f-42de' + content='' response_metadata={'finish_reason': 'stop'} \ + id='run-02c6-c43f-42de' - Async: + Async: .. code-block:: python await chat.ainvoke(messages) @@ -199,7 +200,8 @@ class Joke(BaseModel): structured_llm = chat.with_structured_output(Joke, method="json_mode") structured_llm.invoke( - "Tell me a joke about cats, respond in JSON with `setup` and `punchline` keys" + "Tell me a joke about cats, respond in JSON with " + "`setup` and `punchline` keys" ) .. code-block:: python @@ -218,7 +220,9 @@ class Joke(BaseModel): .. code-block:: python class MyChatModel(ChatOCIModelDeployment): - def _process_stream_response(self, response_json: dict) -> ChatGenerationChunk: + def _process_stream_response( + self, response_json: dict + ) -> ChatGenerationChunk: print("My customized streaming result handler.") return GenerationChunk(...) @@ -259,7 +263,7 @@ def _construct_json_body(self, messages: list, params: dict) -> dict: "finish_reason": "stop", } - """ # noqa: E501 + """ model_kwargs: Dict[str, Any] = Field(default_factory=dict) """Keyword arguments to pass to the model.""" @@ -351,13 +355,14 @@ def _generate( messages = [ ( "system", - "You are a helpful assistant that translates English to French. Translate the user sentence.", + "You are a helpful assistant that translates English to " + "French. Translate the user sentence.", ), ("human", "Hello World!"), ] response = chat.invoke(messages) - """ # noqa: E501 + """ if self.streaming: stream_iter = self._stream( messages, stop=stop, run_manager=run_manager, **kwargs @@ -404,14 +409,15 @@ def _stream( messages = [ ( "system", - "You are a helpful assistant that translates English to French. Translate the user sentence.", + "You are a helpful assistant that translates English to " + "French. Translate the user sentence.", ), ("human", "Hello World!"), ] chunk_iter = chat.stream(messages) - """ # noqa: E501 + """ requests_kwargs = kwargs.pop("requests_kwargs", {}) self.streaming = True params = self._invocation_params(stop, **kwargs) @@ -460,14 +466,15 @@ async def _agenerate( messages = [ ( "system", - "You are a helpful assistant that translates English to French. Translate the user sentence.", + "You are a helpful assistant that translates English to " + "French. Translate the user sentence.", ), ("human", "I love programming."), ] resp = await chat.ainvoke(messages) - """ # noqa: E501 + """ if self.streaming: stream_iter = self._astream( messages, stop=stop, run_manager=run_manager, **kwargs @@ -517,14 +524,15 @@ async def _astream( messages = [ ( "system", - "You are a helpful assistant that translates English to French. Translate the user sentence.", + "You are a helpful assistant that translates English to " + "French. Translate the user sentence.", ), ("human", "I love programming."), ] chunk_iter = await chat.astream(messages) - """ # noqa: E501 + """ requests_kwargs = kwargs.pop("requests_kwargs", {}) self.streaming = True params = self._invocation_params(stop, **kwargs) @@ -583,7 +591,7 @@ def with_structured_output( If schema is a dict then _DictOrPydantic is a dict. - """ # noqa: E501 + """ if kwargs: raise ValueError(f"Received unsupported arguments {kwargs}") is_pydantic_schema = _is_pydantic_class(schema) @@ -792,7 +800,7 @@ class ChatOCIModelDeploymentVLLM(ChatOCIModelDeployment): # other model parameters... ) - """ # noqa: E501 + """ frequency_penalty: float = 0.0 """Penalizes repeated tokens according to frequency. Between 0 and 1.""" @@ -959,7 +967,7 @@ class ChatOCIModelDeploymentTGI(ChatOCIModelDeployment): # other model parameters... ) - """ # noqa: E501 + """ frequency_penalty: Optional[float] = None """Penalizes repeated tokens according to frequency. Between 0 and 1.""" diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index 0581b38..0514536 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -108,7 +108,7 @@ def convert_oci_tool_call_to_langchain(tool_call: Any) -> ToolCall: name=tool_call.name, args=parsed if "arguments" in tool_call.attribute_map - else tool_call.parameters, # noqa: E501 + else tool_call.parameters, id=tool_call.id if "id" in tool_call.attribute_map else uuid.uuid4().hex[:], ) @@ -180,7 +180,7 @@ def messages_to_oci_params(self, messages: Any, **kwargs: Any) -> Dict[str, Any] @abstractmethod def convert_to_oci_tool( self, tool: Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool] - ) -> Dict[str, Any]: # noqa: E501 + ) -> Dict[str, Any]: """Convert a tool definition into the provider-specific OCI tool format.""" ... @@ -189,7 +189,7 @@ def process_tool_choice( self, tool_choice: Optional[ Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], # noqa: E501 + ], ) -> Optional[Any]: """Process tool choice parameter for the provider.""" ... @@ -260,16 +260,16 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: if ( hasattr(response.data.chat_response, "usage") and response.data.chat_response.usage - ): # noqa: E501 + ): generation_info["total_tokens"] = ( response.data.chat_response.usage.total_tokens - ) # noqa: E501 + ) # Include tool calls if available if self.chat_tool_calls(response): generation_info["tool_calls"] = self.format_response_tool_calls( self.chat_tool_calls(response) - ) # noqa: E501 + ) return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -351,7 +351,7 @@ def get_role(self, message: BaseMessage) -> str: def messages_to_oci_params( self, messages: Sequence[ChatMessage], **kwargs: Any - ) -> Dict[str, Any]: # noqa: E501 + ) -> Dict[str, Any]: """ Convert LangChain messages to OCI parameters for Cohere. @@ -375,7 +375,7 @@ def messages_to_oci_params( [ self.oci_tool_call(name=tc["name"], parameters=tc["args"]) for tc in msg.tool_calls - ] # noqa: E501 + ] if msg.tool_calls else None ) @@ -384,7 +384,7 @@ def messages_to_oci_params( self.oci_chat_message[role]( message=msg_content, tool_calls=tool_calls ) - ) # noqa: E501 + ) elif isinstance(msg, ToolMessage): oci_chat_history.append( self.oci_chat_message[self.get_role(msg)]( @@ -404,14 +404,14 @@ def messages_to_oci_params( if isinstance(message, HumanMessage): if len(messages) > i and isinstance( messages[len(messages) - i - 2], ToolMessage - ): # noqa: E501 + ): # add dummy message REPEATING the tool_result to avoid # the error about ToolMessage needing to be followed # by an AI message oci_chat_history.append( self.oci_chat_message["CHATBOT"]( message=messages[len(messages) - i - 2].content - ) # noqa: E501 + ) ) break current_turn = list(reversed(current_turn)) @@ -423,7 +423,7 @@ def messages_to_oci_params( tool_msg = message previous_ai_msgs = [ m for m in current_turn if isinstance(m, AIMessage) and m.tool_calls - ] # noqa: E501 + ] if previous_ai_msgs: previous_ai_msg = previous_ai_msgs[-1] for lc_tool_call in previous_ai_msg.tool_calls: @@ -466,7 +466,7 @@ def convert_to_oci_tool( name=tool.name, description=OCIUtils.remove_signature_from_tool_description( tool.name, tool.description - ), # noqa: E501 + ), parameter_definitions={ p_name: self.oci_tool_param( description=p_def.get("description", ""), @@ -529,7 +529,7 @@ def process_tool_choice( self, tool_choice: Optional[ Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], # noqa: E501 + ], ) -> Optional[Any]: """Cohere does not support tool choices.""" if tool_choice is not None: @@ -540,7 +540,7 @@ def process_tool_choice( def process_stream_tool_calls( self, event_data: Dict, tool_call_ids: Set[str] - ) -> List[ToolCallChunk]: # noqa: E501 + ) -> List[ToolCallChunk]: """ Process Cohere stream tool calls and return them as ToolCallChunk objects. @@ -639,15 +639,15 @@ def chat_generation_info(self, response: Any) -> Dict[str, Any]: if ( hasattr(response.data.chat_response, "usage") and response.data.chat_response.usage - ): # noqa: E501 + ): generation_info["total_tokens"] = ( response.data.chat_response.usage.total_tokens - ) # noqa: E501 + ) if self.chat_tool_calls(response): generation_info["tool_calls"] = self.format_response_tool_calls( self.chat_tool_calls(response) - ) # noqa: E501 + ) return generation_info def chat_stream_generation_info(self, event_data: Dict) -> Dict[str, Any]: @@ -725,7 +725,7 @@ def get_role(self, message: BaseMessage) -> str: def messages_to_oci_params( self, messages: List[BaseMessage], **kwargs: Any - ) -> Dict[str, Any]: # noqa: E501 + ) -> Dict[str, Any]: """Convert LangChain messages to OCI chat parameters. Args: @@ -746,7 +746,7 @@ def messages_to_oci_params( # For tool messages, wrap the content in a text content object. tool_content = [ self.oci_chat_message_text_content(text=str(message.content)) - ] # noqa: E501 + ] if message.tool_call_id: oci_message = self.oci_chat_message[role]( content=tool_content, @@ -756,7 +756,7 @@ def messages_to_oci_params( oci_message = self.oci_chat_message[role](content=tool_content) elif isinstance(message, AIMessage) and ( message.tool_calls or message.additional_kwargs.get("tool_calls") - ): # noqa: E501 + ): # Process content and tool calls for assistant messages content = self._process_message_content(message.content) tool_calls = [] @@ -790,7 +790,7 @@ def messages_to_oci_params( def _should_allow_more_tool_calls( messages: List[BaseMessage], max_tool_calls: int - ) -> bool: # noqa: E501 + ) -> bool: """ Determine if the model should be allowed to call more tools. @@ -848,7 +848,7 @@ def _should_allow_more_tool_calls( def _process_message_content( self, content: Union[str, List[Union[str, Dict]]] - ) -> List[Any]: # noqa: E501 + ) -> List[Any]: """Process message content into OCI chat content format. Args: @@ -889,7 +889,7 @@ def _process_message_content( else: raise ValueError( f"Content items must be str or dict, got: {type(item)}" - ) # noqa: E501 + ) return processed_content def convert_to_oci_tool( @@ -929,7 +929,7 @@ def convert_to_oci_tool( name=tool.name, description=OCIUtils.remove_signature_from_tool_description( tool.name, tool.description - ), # noqa: E501 + ), parameters={ "type": "object", "properties": { @@ -943,7 +943,7 @@ def convert_to_oci_tool( p_name for p_name, p_def in tool.args.items() if "default" not in p_def - ], # noqa: E501 + ], }, ) raise ValueError( @@ -956,7 +956,7 @@ def process_tool_choice( self, tool_choice: Optional[ Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ], # noqa: E501 + ], ) -> Optional[Any]: """Process tool choice for Meta provider. @@ -1003,7 +1003,7 @@ def process_tool_choice( def process_stream_tool_calls( self, event_data: Dict, tool_call_ids: Set[str] - ) -> List[ToolCallChunk]: # noqa: E501 + ) -> List[ToolCallChunk]: """ Process Meta stream tool calls and convert them to ToolCallChunks. @@ -1169,7 +1169,7 @@ def _prepare_request( self.model_id and self.model_id.startswith("openai.") and "max_tokens" in _model_kwargs - ): # noqa: E501 + ): import warnings warnings.warn( @@ -1201,7 +1201,7 @@ def bind_tools( *, tool_choice: Optional[ Union[dict, str, Literal["auto", "none", "required", "any"], bool] - ] = None, # noqa: E501 + ] = None, **kwargs: Any, ) -> Runnable[LanguageModelInput, BaseMessage]: """Bind tool-like objects to this chat model. @@ -1239,7 +1239,7 @@ def with_structured_output( *, method: Literal[ "function_calling", "json_schema", "json_mode" - ] = "function_calling", # noqa: E501 + ] = "function_calling", include_raw: bool = False, **kwargs: Any, ) -> Runnable[LanguageModelInput, Union[Dict, BaseModel]]: @@ -1302,7 +1302,7 @@ def with_structured_output( else: output_parser = JsonOutputKeyToolsParser( key_name=tool_name, first_tool_only=True - ) # noqa: E501 + ) elif method == "json_mode": llm = self.bind(response_format={"type": "JSON_OBJECT"}) output_parser = ( @@ -1326,7 +1326,7 @@ def with_structured_output( response_format_obj = self._provider.oci_json_schema_response_format( json_schema=response_json_schema - ) # noqa: E501 + ) llm = self.bind(response_format=response_format_obj) if is_pydantic_schema: @@ -1346,7 +1346,7 @@ def with_structured_output( parser_none = RunnablePassthrough.assign(parsed=lambda _: None) parser_with_fallback = parser_assign.with_fallbacks( [parser_none], exception_key="parsing_error" - ) # noqa: E501 + ) return RunnableMap(raw=llm) | parser_with_fallback return llm | output_parser @@ -1380,7 +1380,7 @@ def _generate( if self.is_stream: stream_iter = self._stream( messages, stop=stop, run_manager=run_manager, **kwargs - ) # noqa: E501 + ) return generate_from_stream(stream_iter) request = self._prepare_request(messages, stop=stop, stream=False, **kwargs) @@ -1413,7 +1413,7 @@ def _generate( return ChatResult( generations=[ ChatGeneration(message=message, generation_info=generation_info) - ], # noqa: E501 + ], llm_output=llm_output, ) @@ -1441,7 +1441,7 @@ def _stream( delta = self._provider.chat_stream_to_text(event_data) tool_call_chunks = self._provider.process_stream_tool_calls( event_data, tool_call_ids - ) # noqa: E501 + ) chunk = ChatGenerationChunk( message=AIMessageChunk( diff --git a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py index 8bcb00c..c9db673 100644 --- a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py @@ -23,7 +23,7 @@ def _create_retry_decorator(llm) -> Callable[[Any], Any]: errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] decorator = create_base_retry_decorator( error_types=errors, max_retries=llm.max_retries - ) # noqa: E501 + ) return decorator @@ -39,7 +39,7 @@ class OCIModelDeploymentEndpointEmbeddings(BaseModel, Embeddings): embeddings = OCIModelDeploymentEndpointEmbeddings( endpoint="https://modeldeployment.us-ashburn-1.oci.customer-oci.com//predict", ) - """ # noqa: E501 + """ auth: dict = Field(default_factory=dict, exclude=True) """ADS auth dictionary for OCI authentication: @@ -108,7 +108,7 @@ def _completion_with_retry(**kwargs: Any) -> Any: else: raise ValueError( f"Server error: {str(http_err)}. Message: {response.text}" - ) from http_err # noqa: E501 + ) from http_err except Exception as e: raise ValueError(f"Error occurs by inference endpoint: {str(e)}") from e @@ -164,7 +164,7 @@ def _proceses_response(self, response: requests.Response) -> List[List[float]]: except Exception as e: raise ValueError( f"Error raised by inference API: {e}.\nResponse: {response.text}" - ) # noqa: E501 + ) return embeddings def embed_documents( @@ -186,7 +186,7 @@ def embed_documents( results = [] _chunk_size = ( len(texts) if (not chunk_size or chunk_size > len(texts)) else chunk_size - ) # noqa: E501 + ) for i in range(0, len(texts), _chunk_size): response = self._embedding(texts[i : i + _chunk_size]) results.extend(response) diff --git a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py index 22bb028..ba762c4 100644 --- a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py +++ b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py @@ -128,10 +128,10 @@ def validate_environment(cls, values: Dict) -> Dict: # pylint: disable=no-self- def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] pk = oci.signer.load_private_key_from_file( oci_config.get("key_file"), None - ) # noqa: E501 + ) with open( oci_config.get("security_token_file"), encoding="utf-8" - ) as f: # noqa: E501 + ) as f: st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -141,21 +141,21 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] ) client_kwargs["signer"] = make_security_token_signer( oci_config=client_kwargs["config"] - ) # noqa: E501 + ) elif values["auth_type"] == OCIAuthType(3).name: client_kwargs["signer"] = ( oci.auth.signers.InstancePrincipalsSecurityTokenSigner() - ) # noqa: E501 + ) elif values["auth_type"] == OCIAuthType(4).name: client_kwargs["signer"] = ( oci.auth.signers.get_resource_principals_signer() - ) # noqa: E501 + ) else: raise ValueError("Please provide valid value to auth_type") values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( **client_kwargs - ) # noqa: E501 + ) except ImportError as ex: raise ImportError( diff --git a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py index ff3d4ec..114a3f8 100644 --- a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py @@ -54,13 +54,13 @@ def _create_retry_decorator( *, run_manager: Optional[ Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun] - ] = None, # noqa: E501 + ] = None, ) -> Callable[[Any], Any]: """Create a retry decorator.""" errors = [requests.exceptions.ConnectTimeout, TokenExpiredError] decorator = create_base_retry_decorator( error_types=errors, max_retries=llm.max_retries, run_manager=run_manager - ) # noqa: E501 + ) return decorator @@ -112,7 +112,7 @@ def validate_environment(cls, values: Dict) -> Dict: def _headers( self, is_async: Optional[bool] = False, body: Optional[dict] = None - ) -> Dict: # noqa: E501 + ) -> Dict: """Construct and return the headers for a request. Args: @@ -158,7 +158,7 @@ def _headers( def completion_with_retry( self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any - ) -> Any: # noqa: E501 + ) -> Any: """Use tenacity to retry the completion call.""" retry_decorator = _create_retry_decorator(self, run_manager=run_manager) @@ -195,7 +195,7 @@ def _completion_with_retry(**kwargs: Any) -> Any: ) raise RuntimeError( f"Error occurs by inference endpoint: {str(err)}" - ) from err # noqa: E501 + ) from err return _completion_with_retry(**kwargs) @@ -251,7 +251,7 @@ async def _completion_with_retry(**kwargs: Any) -> Any: ) raise RuntimeError( f"Error occurs by inference endpoint: {str(err)}" - ) from err # noqa: E501 + ) from err return await _completion_with_retry(**kwargs) @@ -290,13 +290,13 @@ def _check_response(self, response: Any) -> None: response.status_code if hasattr(response, "status_code") else response.status - ) # noqa: E501 + ) if status_code == 401 and self._refresh_signer(): raise TokenExpiredError() from http_err raise ServerError( f"Server error: {str(http_err)}. \nMessage: {response.text}" - ) from http_err # noqa: E501 + ) from http_err def _parse_stream(self, lines: Iterator[bytes]) -> Iterator[str]: """Parse a stream of byte lines and yield parsed string lines. @@ -384,7 +384,7 @@ def _refresh_signer(self) -> bool: """ if self.auth.get("signer", None) and hasattr( self.auth["signer"], "refresh_security_token" - ): # noqa: E501 + ): self.auth["signer"].refresh_security_token() return True return False @@ -428,15 +428,18 @@ class OCIModelDeploymentLLM(BaseLLM, BaseOCIModelDeployment): Customized Usage: - User can inherit from our base class and overrwrite the `_process_response`, `_process_stream_response`, - `_construct_json_body` for satisfying customized needed. + User can inherit from our base class and overrwrite the `_process_response`, + `_process_stream_response`, `_construct_json_body` for satisfying customized + needed. .. code-block:: python from langchain_oci.llms import OCIModelDeploymentLLM class MyCutomizedModel(OCIModelDeploymentLLM): - def _process_stream_response(self, response_json:dict) -> GenerationChunk: + def _process_stream_response( + self, response_json:dict + ) -> GenerationChunk: print("My customized output stream handler.") return GenerationChunk() @@ -455,7 +458,7 @@ def _construct_json_body(self, prompt: str, param:dict) -> dict: llm.invoke("tell me a joke.") - """ # noqa: E501 + """ model: str = DEFAULT_MODEL_NAME """The name of the model.""" @@ -492,7 +495,7 @@ def _identifying_params(self) -> Dict[str, Any]: def _headers( self, is_async: Optional[bool] = False, body: Optional[dict] = None - ) -> Dict: # noqa: E501 + ) -> Dict: """Construct and return the headers for a request. Args: @@ -539,7 +542,7 @@ def _generate( generation = GenerationChunk(text="") for chunk in self._stream( prompt, stop=stop, run_manager=run_manager, **kwargs - ): # noqa: E501 + ): generation += chunk generations.append([generation]) else: @@ -558,7 +561,8 @@ async def _agenerate( run_manager: Optional[AsyncCallbackManagerForLLMRun] = None, **kwargs: Any, ) -> LLMResult: - """Call out to OCI Data Science Model Deployment endpoint async with k unique prompts. + """Call out to OCI Data Science Model Deployment endpoint async with k + unique prompts. Args: prompts: The prompts to pass into the service. @@ -572,7 +576,7 @@ async def _agenerate( response = await llm.ainvoke("Tell me a joke.") response = await llm.agenerate(["Tell me a joke."]) - """ # noqa: E501 + """ generations: List[List[Generation]] = [] params = self._invocation_params(stop, **kwargs) for prompt in prompts: @@ -581,7 +585,7 @@ async def _agenerate( generation = GenerationChunk(text="") async for chunk in self._astream( prompt, stop=stop, run_manager=run_manager, **kwargs - ): # noqa: E501 + ): generation += chunk generations.append([generation]) else: @@ -630,7 +634,7 @@ def _stream( response = self.completion_with_retry( data=body, run_manager=run_manager, stream=True, **requests_kwargs - ) # noqa: E501 + ) for line in self._parse_stream(response.iter_lines()): chunk = self._handle_sse_line(line) if run_manager: @@ -691,7 +695,7 @@ def _construct_json_body(self, prompt: str, params: dict) -> dict: def _invocation_params( self, stop: Optional[List[str]] = None, **kwargs: Any - ) -> dict: # noqa: E501 + ) -> dict: """Combines the invocation parameters with default parameters.""" params = self._default_params _model_kwargs = self.model_kwargs or {} @@ -866,7 +870,7 @@ def _default_params(self) -> Dict[str, Any]: "temperature": self.temperature, "top_k": ( self.k if self.k > 0 else None - ), # `top_k` must be strictly positive' # noqa: E501 + ), # `top_k` must be strictly positive' "top_p": self.p, "do_sample": self.do_sample, "return_full_text": self.return_full_text, @@ -908,7 +912,7 @@ def _process_response(self, response_json: dict) -> List[Generation]: except KeyError as e: raise ValueError( f"Error while formatting response payload.response_json={response_json}" - ) from e # noqa: E501 + ) from e return [Generation(text=text)] diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index 67b1145..6bd7444 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -122,7 +122,7 @@ class OCIGenAIBase(BaseModel, ABC): model_config = ConfigDict( extra="forbid", arbitrary_types_allowed=True, protected_namespaces=() - ) # noqa: E501 + ) @pre_init def validate_environment(cls, values: Dict) -> Dict: @@ -154,10 +154,10 @@ def validate_environment(cls, values: Dict) -> Dict: def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] pk = oci.signer.load_private_key_from_file( oci_config.get("key_file"), None - ) # noqa: E501 + ) with open( oci_config.get("security_token_file"), encoding="utf-8" - ) as f: # noqa: E501 + ) as f: st_string = f.read() return oci.auth.signers.SecurityTokenSigner(st_string, pk) @@ -167,15 +167,15 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] ) client_kwargs["signer"] = make_security_token_signer( oci_config=client_kwargs["config"] - ) # noqa: E501 + ) elif values["auth_type"] == OCIAuthType(3).name: client_kwargs["signer"] = ( oci.auth.signers.InstancePrincipalsSecurityTokenSigner() - ) # noqa: E501 + ) elif values["auth_type"] == OCIAuthType(4).name: client_kwargs["signer"] = ( oci.auth.signers.get_resource_principals_signer() - ) # noqa: E501 + ) else: raise ValueError( f"Please provide valid value to auth_type, {values['auth_type']} is not valid." # noqa: E501 @@ -183,7 +183,7 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( **client_kwargs - ) # noqa: E501 + ) except ImportError as ex: raise ModuleNotFoundError( @@ -301,7 +301,7 @@ def _prepare_invocation_object( if self.model_id is None: raise ValueError( "model_id is required to call the model, please provide the model_id." - ) # noqa: E501 + ) if self.model_id.startswith(CUSTOM_ENDPOINT_PREFIX): serving_mode = models.DedicatedServingMode(endpoint_id=self.model_id) diff --git a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py index 726ab16..7899436 100644 --- a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py +++ b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py @@ -189,7 +189,7 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo final_message = messages[-1] assert type(final_message).__name__ == "AIMessage", ( "Final message should be AIMessage" - ) # noqa: E501 + ) assert final_message.content, "Final message should have content" assert not (hasattr(final_message, "tool_calls") and final_message.tool_calls), ( "Final message should not have tool_calls (infinite loop prevention)" @@ -291,7 +291,7 @@ def get_events(resource: str) -> str: events_data = { "payment-service": ( "Events: [OOMKilled at 14:23, BackOff at 14:30, Started at 14:32]" - ), # noqa: E501 + ), "web-server": "Events: [Started at 10:00, Healthy]", } return events_data.get(resource, f"No events for {resource}") @@ -301,7 +301,7 @@ def get_metrics(resource: str) -> str: metrics_data = { "payment-service": ( "Memory trend: 70%→80%→90%→95% (gradual increase over 2h)" - ), # noqa: E501 + ), "web-server": "Memory trend: 55%→58%→60% (stable)", } return metrics_data.get(resource, f"No metrics for {resource}") @@ -384,7 +384,7 @@ def call_model(state: MessagesState): hasattr(response, "tool_calls") and response.tool_calls and len(response.tool_calls) > 1 - ): # noqa: E501 + ): # Some models try to call multiple tools in parallel # Restrict to first tool only to avoid OCI API error response.tool_calls = [response.tool_calls[0]] @@ -454,7 +454,7 @@ def should_continue(state: MessagesState): ] tool_result_messages = [ msg for msg in messages if type(msg).__name__ == "ToolMessage" - ] # noqa: E501 + ] # Verify multi-step orchestration worked msg = f"Should have made multiple tool calls (got {len(tool_call_messages)})" diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py index 5dbd936..0bb01c8 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_data_science.py @@ -52,7 +52,7 @@ for content in [ CONST_STREAM_TEMPLATE.replace("", delta).encode() for delta in CONST_STREAM_DELTAS - ] # noqa: E501 + ] + [b"data: [DONE]"] ) @@ -62,12 +62,12 @@ ) CONST_ASYNC_STREAM_RESPONSE = ( CONST_ASYNC_STREAM_TEMPLATE.replace("", delta).encode() - for delta in CONST_STREAM_DELTAS # noqa: E501 + for delta in CONST_STREAM_DELTAS ) pytestmark = pytest.mark.skipif( sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" -) # noqa: E501 +) class MockResponse: @@ -146,7 +146,7 @@ def test_stream_vllm(*args: Any) -> None: """Tests streaming with vLLM endpoint using OpenAI spec.""" llm = ChatOCIModelDeploymentVLLM( endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) # noqa: E501 + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = None count = 0 @@ -165,7 +165,7 @@ def test_stream_vllm(*args: Any) -> None: async def mocked_async_streaming_response( *args: Any, **kwargs: Any -) -> AsyncGenerator[bytes, None]: # noqa: E501 +) -> AsyncGenerator[bytes, None]: """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -176,7 +176,7 @@ async def mocked_async_streaming_response( @pytest.mark.requires("langchain_openai") @mock.patch( "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) -) # noqa: E501 +) @mock.patch( "langchain_oci.llms.oci_data_science_model_deployment_endpoint.BaseOCIModelDeployment._arequest", mock.MagicMock(), @@ -185,7 +185,7 @@ async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" llm = ChatOCIModelDeploymentVLLM( endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) # noqa: E501 + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py index 3ff9fec..e4e09dc 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py @@ -25,7 +25,7 @@ def __getattr__(self, val): # type: ignore[no-untyped-def] @pytest.mark.requires("oci") @pytest.mark.parametrize( "test_model_id", ["cohere.command-r-16k", "meta.llama-3.3-70b-instruct"] -) # noqa: E501 +) def test_llm_chat(monkeypatch: MonkeyPatch, test_model_id: str) -> None: """Test valid chat call to OCI Generative AI LLM service.""" oci_gen_ai_client = MagicMock() @@ -270,7 +270,7 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] { "content": [ MockResponseDict({"text": ""}) - ], # noqa: E501 + ], "tool_calls": [ MockResponseDict( { @@ -278,7 +278,7 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] "id": "call_escaped", "name": "get_weather", # Escaped JSON (the bug scenario) # noqa: E501 - "arguments": '"{\\"location\\": \\"San Francisco\\"}"', # noqa: E501 + "arguments": '"{{\\"location\\": \\"San Francisco\\"}}"}', # noqa: E501 "attribute_map": { "id": "id", "type": "type", diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py index 726e8cb..b670be6 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_model_deployment_endpoint.py @@ -87,7 +87,7 @@ def test_construct_json_body(mocker: MockerFixture) -> None: ] chat = ChatOCIModelDeployment( endpoint="test_endpoint", model_kwargs={"temperature": 0.2} - ) # noqa: E501 + ) payload = chat._construct_json_body(messages, chat._invocation_params(stop=None)) assert payload == { "messages": [{"content": "User message", "role": "user"}], diff --git a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py index 9dc275b..dc4bd78 100644 --- a/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py +++ b/libs/oci/tests/unit_tests/llms/test_oci_model_deployment_endpoint.py @@ -34,7 +34,7 @@ ) CONST_STREAM_RESPONSE = ( CONST_STREAM_TEMPLATE.replace("", " " + word).encode() - for word in CONST_COMPLETION.split(" ") # noqa: E501 + for word in CONST_COMPLETION.split(" ") ) CONST_ASYNC_STREAM_TEMPLATE = ( @@ -43,12 +43,12 @@ ) CONST_ASYNC_STREAM_RESPONSE = ( CONST_ASYNC_STREAM_TEMPLATE.replace("", " " + word).encode() - for word in CONST_COMPLETION.split(" ") # noqa: E501 + for word in CONST_COMPLETION.split(" ") ) pytestmark = pytest.mark.skipif( sys.version_info < (3, 9), reason="Requires Python 3.9 or higher" -) # noqa: E501 +) class MockResponse: @@ -101,7 +101,7 @@ def mocked_requests_post(url: str, **kwargs: Any) -> MockResponse: async def mocked_async_streaming_response( *args: Any, **kwargs: Any -) -> AsyncGenerator[bytes, None]: # noqa: E501 +) -> AsyncGenerator[bytes, None]: """Returns mocked response for async streaming.""" for item in CONST_ASYNC_STREAM_RESPONSE: yield item @@ -125,7 +125,7 @@ def test_stream_tgi(*args: Any) -> None: """Tests streaming with TGI endpoint using OpenAI spec.""" llm = OCIModelDeploymentTGI( endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) # noqa: E501 + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = "" count = 0 @@ -143,7 +143,7 @@ def test_generate_tgi(*args: Any) -> None: """Tests invoking TGI endpoint using TGI generate spec.""" llm = OCIModelDeploymentTGI( endpoint=CONST_ENDPOINT, api="/generate", model=CONST_MODEL_NAME - ) # noqa: E501 + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE output = llm.invoke(CONST_PROMPT) assert output == CONST_COMPLETION @@ -153,12 +153,12 @@ def test_generate_tgi(*args: Any) -> None: @pytest.mark.requires("ads") @mock.patch( "ads.common.auth.default_signer", return_value=dict(signer=mock.MagicMock()) -) # noqa: E501 +) async def test_stream_async(*args: Any) -> None: """Tests async streaming.""" llm = OCIModelDeploymentTGI( endpoint=CONST_ENDPOINT, model=CONST_MODEL_NAME, streaming=True - ) # noqa: E501 + ) assert llm._headers().get("route") == CONST_COMPLETION_ROUTE with mock.patch.object( llm, diff --git a/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py b/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py index 81afa2d..7181387 100644 --- a/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py +++ b/libs/oracledb/langchain_oracledb/document_loaders/oracleadb_loader.py @@ -49,11 +49,11 @@ def __init__( :param schema: schema to run in database :param dsn: data source name used to identify the oracle database to connect to :param config_dir: directory of config files(tnsname.ora, ewallet.pem) - :param wallet_location: location of ewallet.pem, not required for TLS connections + :param wallet_location: location of ewallet.pem, not required for TLS :param wallet_password: password of wallet, not required for TLS connections :param metadata: metadata used in document :param parameter: bind variable to use in query - """ # noqa: E501 + """ # Mandatory required arguments. self.query = query self.user = user From 3b88b835842b26dc902abb35018ecb352dcf11f7 Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 18:06:41 -0800 Subject: [PATCH 13/16] Fix typo in test JSON string for tool calling Corrects the closing quote in the 'arguments' field of the test_meta_tool_calling test to ensure the escaped JSON is properly formatted. --- libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py index e4e09dc..ccf8eb7 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py @@ -278,7 +278,7 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] "id": "call_escaped", "name": "get_weather", # Escaped JSON (the bug scenario) # noqa: E501 - "arguments": '"{{\\"location\\": \\"San Francisco\\"}}"}', # noqa: E501 + "arguments": '"{{\\"location\\": \\"San Francisco\\"}}"', # noqa: E501 "attribute_map": { "id": "id", "type": "type", From 55c9ecb43087514f31509ba31bfe9e8aa673e1ed Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 18:24:44 -0800 Subject: [PATCH 14/16] Fix escaped JSON string in test_oci_generative_ai.py Corrects the escaped JSON string in the 'arguments' field of the test_meta_tool_calling test to ensure proper formatting and accurate test coverage. --- .../tests/unit_tests/chat_models/test_oci_generative_ai.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py index ccf8eb7..c149ece 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py @@ -277,8 +277,8 @@ def mocked_response_escaped(*args, **kwargs): # type: ignore[no-untyped-def] "type": "FUNCTION", "id": "call_escaped", "name": "get_weather", - # Escaped JSON (the bug scenario) # noqa: E501 - "arguments": '"{{\\"location\\": \\"San Francisco\\"}}"', # noqa: E501 + # Escaped JSON (the bug scenario) # noqa: E501 + "arguments": '"{\\"location\\": \\"San Francisco\\"}"', # noqa: E501 "attribute_map": { "id": "id", "type": "type", From 47d4a8781edb228b0bf8aac4a8b85a80ca02dc3a Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Wed, 12 Nov 2025 22:22:05 -0800 Subject: [PATCH 15/16] Remove extra noqa:E501 and split long strings Split long error messages and test strings across multiple lines to improve readability and remove unnecessary noqa: E501 comments. Also reformatted SQL condition string construction in oraclevs.py for better clarity. --- .../chat_models/oci_generative_ai.py | 9 ++++--- ..._data_science_model_deployment_endpoint.py | 3 ++- .../embeddings/oci_generative_ai.py | 3 ++- ..._data_science_model_deployment_endpoint.py | 3 ++- .../langchain_oci/llms/oci_generative_ai.py | 6 +++-- .../chat_models/test_tool_calling.py | 14 +++++++---- .../chat_models/test_oci_generative_ai.py | 24 +++++++++---------- .../vectorstores/oraclevs.py | 13 ++++++---- 8 files changed, 45 insertions(+), 30 deletions(-) diff --git a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py index 0514536..bd38516 100644 --- a/libs/oci/langchain_oci/chat_models/oci_generative_ai.py +++ b/libs/oci/langchain_oci/chat_models/oci_generative_ai.py @@ -534,7 +534,8 @@ def process_tool_choice( """Cohere does not support tool choices.""" if tool_choice is not None: raise ValueError( - "Tool choice is not supported for Cohere models.Please remove the tool_choice parameter." # noqa: E501 + "Tool choice is not supported for Cohere models." + "Please remove the tool_choice parameter." ) return None @@ -998,7 +999,8 @@ def process_tool_choice( # For Meta, we use ToolChoiceAuto for tool selection return self.oci_tool_choice_auto() raise ValueError( - f"Unrecognized tool_choice type. Expected str, bool or dict. Received: {tool_choice}" # noqa: E501 + f"Unrecognized tool_choice type. Expected str, bool or dict. " + f"Received: {tool_choice}" ) def process_stream_tool_calls( @@ -1151,7 +1153,8 @@ def _prepare_request( except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. Please make sure you have the oci package installed." # noqa: E501 + "Could not import oci python package. " + "Please make sure you have the oci package installed." ) from ex oci_params = self._provider.messages_to_oci_params( diff --git a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py index c9db673..a81d3d1 100644 --- a/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/embeddings/oci_data_science_model_deployment_endpoint.py @@ -72,7 +72,8 @@ def validate_environment( # pylint: disable=no-self-argument except ImportError as ex: raise ImportError( - "Could not import ads python package. Please install it with `pip install oracle_ads`." # noqa: E501 + "Could not import ads python package. " + "Please install it with `pip install oracle_ads`." ) from ex if not values.get("auth", None): values["auth"] = ads.common.auth.default_signer() diff --git a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py index ba762c4..9bde3d5 100644 --- a/libs/oci/langchain_oci/embeddings/oci_generative_ai.py +++ b/libs/oci/langchain_oci/embeddings/oci_generative_ai.py @@ -159,7 +159,8 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] except ImportError as ex: raise ImportError( - "Could not import oci python package. Please make sure you have the oci package installed." # noqa: E501 + "Could not import oci python package. " + "Please make sure you have the oci package installed." ) from ex except Exception as e: raise ValueError( diff --git a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py index 114a3f8..1fba3d8 100644 --- a/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py +++ b/libs/oci/langchain_oci/llms/oci_data_science_model_deployment_endpoint.py @@ -97,7 +97,8 @@ def validate_environment(cls, values: Dict) -> Dict: except ImportError as ex: raise ImportError( - "Could not import ads python package. Please install it with `pip install oracle_ads`." # noqa: E501 + "Could not import ads python package. " + "Please install it with `pip install oracle_ads`." ) from ex if not values.get("auth", None): diff --git a/libs/oci/langchain_oci/llms/oci_generative_ai.py b/libs/oci/langchain_oci/llms/oci_generative_ai.py index 6bd7444..793a338 100644 --- a/libs/oci/langchain_oci/llms/oci_generative_ai.py +++ b/libs/oci/langchain_oci/llms/oci_generative_ai.py @@ -178,7 +178,8 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] ) else: raise ValueError( - f"Please provide valid value to auth_type, {values['auth_type']} is not valid." # noqa: E501 + "Please provide valid value to auth_type, " + f"{values['auth_type']} is not valid." ) values["client"] = oci.generative_ai_inference.GenerativeAiInferenceClient( @@ -187,7 +188,8 @@ def make_security_token_signer(oci_config): # type: ignore[no-untyped-def] except ImportError as ex: raise ModuleNotFoundError( - "Could not import oci python package. Please make sure you have the oci package installed." # noqa: E501 + "Could not import oci python package. " + "Please make sure you have the oci package installed." ) from ex except Exception as e: raise ValueError( diff --git a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py index 7899436..0936afe 100644 --- a/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py +++ b/libs/oci/tests/integration_tests/chat_models/test_tool_calling.py @@ -147,7 +147,10 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo agent = create_agent(model_id, weather_tool) # Invoke the agent - system_msg = "You are a helpful assistant. Use the available tools when needed to answer questions accurately." # noqa: E501 + system_msg = ( + "You are a helpful assistant. Use the available tools when " + "needed to answer questions accurately." + ) result = agent.invoke( { "messages": [ @@ -175,13 +178,13 @@ def test_tool_calling_no_infinite_loop(model_id: str, weather_tool: StructuredTo type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls - ) # noqa: E501 + ) ] # The model should call the tool, but after receiving results, # should not call again. Allow flexibility - some models might make # 1 call, others might need 2, but should stop error_msg = ( - f"Model made too many tool calls ({len(ai_tool_calls)}), possible infinite loop" # noqa: E501 + f"Model made too many tool calls ({len(ai_tool_calls)}), possible infinite loop" ) assert len(ai_tool_calls) <= 2, error_msg @@ -450,7 +453,7 @@ def should_continue(state: MessagesState): type(msg).__name__ == "AIMessage" and hasattr(msg, "tool_calls") and msg.tool_calls - ) # noqa: E501 + ) ] tool_result_messages = [ msg for msg in messages if type(msg).__name__ == "ToolMessage" @@ -464,7 +467,8 @@ def should_continue(state: MessagesState): # The agent should stop at or before the limit (8 tool calls) # This is the key protection against infinite loops assert len(tool_call_messages) <= 8, ( - f"Too many tool calls ({len(tool_call_messages)}), max_sequential_tool_calls limit not enforced" # noqa: E501 + f"Too many tool calls ({len(tool_call_messages)}), " + "max_sequential_tool_calls limit not enforced" ) # Verify tool results were received diff --git a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py index c149ece..aa50198 100644 --- a/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py +++ b/libs/oci/tests/unit_tests/chat_models/test_oci_generative_ai.py @@ -192,7 +192,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] { "type": "FUNCTION", "id": "call_456", - "name": "get_weather", # noqa: E501 + "name": "get_weather", "arguments": '{"location": "San Francisco"}', # noqa: E501 "attribute_map": { "id": "id", @@ -330,7 +330,7 @@ def get_weather(location: str) -> str: # Test that tool choice raises ValueError with pytest.raises( ValueError, match="Tool choice is not supported for Cohere models" - ): # noqa: E501 + ): llm.bind_tools( tools=[get_weather], tool_choice="auto", @@ -585,7 +585,7 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: with patch("oci.config.from_file") as mock_from_file: with patch( "oci.generative_ai_inference.generative_ai_inference_client.validate_config" - ): # noqa: E501 + ): with patch("oci.base_client.validate_config"): with patch("oci.signer.load_private_key"): custom_config_path = "/custom/path/config" @@ -595,7 +595,7 @@ def test_auth_file_location(monkeypatch: MonkeyPatch) -> None: ) mock_from_file.assert_called_once_with( file_location=custom_config_path, profile_name="DEFAULT" - ) # noqa: E501 + ) @pytest.mark.requires("oci") @@ -643,7 +643,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] # Test with include_raw=True structured_llm = llm.with_structured_output( WeatherResponse, method="json_schema", include_raw=True - ) # noqa: E501 + ) response = structured_llm.invoke(messages) assert isinstance(response, dict) assert "parsed" in response @@ -694,7 +694,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] { "text": ( "I'll help you." - ), # noqa: E501 + ), "type": "TEXT", } ) @@ -767,7 +767,7 @@ def mocked_response(*args, **kwargs): # type: ignore[no-untyped-def] { "text": ( "I'll help you." - ), # noqa: E501 + ), "type": "TEXT", } ) @@ -829,7 +829,7 @@ def test_get_provider(): @pytest.mark.requires("oci") -def test_tool_choice_none_after_tool_results() -> None: # noqa: E501 +def test_tool_choice_none_after_tool_results() -> None: """Test tool_choice='none' when max_sequential_tool_calls is exceeded. This prevents infinite loops with Meta Llama models by limiting the number @@ -865,28 +865,28 @@ def get_weather(city: str) -> str: tool_calls=[ {"id": "call_1", "name": "get_weather", "args": {"city": "Chicago"}} ], - ), # noqa: E501 + ), ToolMessage(content="Sunny, 65°F", tool_call_id="call_1"), AIMessage( content="", tool_calls=[ {"id": "call_2", "name": "get_weather", "args": {"city": "New York"}} ], - ), # noqa: E501 + ), ToolMessage(content="Rainy, 55°F", tool_call_id="call_2"), AIMessage( content="", tool_calls=[ {"id": "call_3", "name": "get_weather", "args": {"city": "Seattle"}} ], - ), # noqa: E501 + ), ToolMessage(content="Cloudy, 60°F", tool_call_id="call_3"), ] # Prepare the request - need to pass tools from the bound model kwargs request = llm_with_tools._prepare_request( messages, stop=None, stream=False, **llm_with_tools.kwargs - ) # noqa: E501 + ) # Verify that tool_choice is set to 'none' because limit was reached assert hasattr(request.chat_request, "tool_choice") diff --git a/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py b/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py index 9e926f9..7ca2f4c 100644 --- a/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py +++ b/libs/oracledb/langchain_oracledb/vectorstores/oraclevs.py @@ -279,8 +279,10 @@ def _generate_condition( bind_variables.append(json.dumps(v)) all_conditions.append( - f"JSON_EQUAL( JSON_QUERY(metadata, '$.{metadata_key}' ), " - f"JSON(:value{bind_l}))" + f"JSON_EQUAL(" + f" JSON_QUERY(metadata, '$.{metadata_key}' )," + f" JSON(:value{bind_l})" + ")" ) elif k == "$ne": @@ -288,9 +290,10 @@ def _generate_condition( bind_variables.append(json.dumps(v)) all_conditions.append( - f"NOT (JSON_EQUAL( " - f"JSON_QUERY(metadata, '$.{metadata_key}' ), " - f"JSON(:value{bind_l})))" + f"NOT (JSON_EQUAL(" + f" JSON_QUERY(metadata, '$.{metadata_key}' )," + f" JSON(:value{bind_l})" + "))" ) res = " AND ".join(all_conditions) From 43303c394c1ee7761d7def8e2f86089bb0bff19f Mon Sep 17 00:00:00 2001 From: paxiaatucsdedu Date: Thu, 13 Nov 2025 11:34:46 -0800 Subject: [PATCH 16/16] Remove redundant Poetry check command Eliminates the duplicate 'poetry check' command, leaving only 'poetry check --lock' to validate the Poetry configuration and lock file. --- .github/workflows/_lint.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index 60b0034..b2ba920 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -45,7 +45,6 @@ jobs: - name: Check Poetry configuration working-directory: ${{ inputs.working-directory }} run: | - poetry check poetry check --lock - name: Install dependencies