From d5d925e35d1a3a20be3e106ee55ec253d1599ebd Mon Sep 17 00:00:00 2001 From: Andrew Omondi Date: Tue, 14 Jan 2025 10:25:21 +0300 Subject: [PATCH] feat: drop support for python 3.8 and drops deprecated type aliases --- .github/workflows/build.yml | 2 +- README.md | 2 +- pyproject.toml | 3 +- requirements-dev.txt | 6 +-- src/msgraph_core/__init__.py | 2 +- .../azure_identity_authentication_provider.py | 12 ++--- .../base_graph_request_adapter.py | 1 + src/msgraph_core/graph_client_factory.py | 18 ++++---- .../options/graph_telemetry_handler_option.py | 2 +- src/msgraph_core/models/__init__.py | 2 +- .../models/large_file_upload_session.py | 19 +++++--- src/msgraph_core/models/page_result.py | 13 +++--- src/msgraph_core/models/upload_result.py | 17 ++++--- .../requests/batch_request_builder.py | 18 ++++---- .../requests/batch_request_content.py | 21 ++++----- .../batch_request_content_collection.py | 9 ++-- .../requests/batch_request_item.py | 46 +++++++++---------- .../requests/batch_response_content.py | 34 ++++++++------ .../batch_response_content_collection.py | 22 ++++----- .../requests/batch_response_item.py | 25 +++++----- src/msgraph_core/tasks/__init__.py | 2 +- src/msgraph_core/tasks/large_file_upload.py | 26 +++++------ src/msgraph_core/tasks/page_iterator.py | 17 +++---- 23 files changed, 165 insertions(+), 154 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8cdaf75d..2b32073d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: strategy: max-parallel: 5 matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python-version: ["3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index fa1b959f..adf23ac6 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The Microsoft Graph Core Python Client Library contains core classes used by [Mi ## Prerequisites - Python 3.8+ + Python 3.9+ This library doesn't support [older](https://devguide.python.org/versions/) versions of Python. diff --git a/pyproject.toml b/pyproject.toml index 7a4f74c7..7b12188d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,13 +16,12 @@ dependencies = [ "microsoft-kiota-http >=1.0.0,<2.0.0", "httpx[http2] >=0.23.0", ] -requires-python = ">=3.8" +requires-python = ">=3.9" license = {file = "LICENSE"} readme = "README.md" keywords = ["msgraph", "openAPI", "Microsoft", "Graph"] classifiers = [ "Development Status :: 5 - Production/Stable", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", diff --git a/requirements-dev.txt b/requirements-dev.txt index 49db8a95..5d570317 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -145,11 +145,11 @@ httpx[http2]==0.28.1 hyperframe==6.0.1 ; python_full_version >= '3.6.1' -microsoft-kiota-abstractions==1.6.8 +microsoft-kiota-abstractions==1.7.0 -microsoft-kiota-authentication-azure==1.6.8 +microsoft-kiota-authentication-azure==1.7.0 -microsoft-kiota-http==1.6.8 +microsoft-kiota-http==1.7.0 multidict==6.1.0 ; python_version >= '3.7' diff --git a/src/msgraph_core/__init__.py b/src/msgraph_core/__init__.py index fbf3ca5f..ffaac08d 100644 --- a/src/msgraph_core/__init__.py +++ b/src/msgraph_core/__init__.py @@ -13,7 +13,7 @@ from .authentication import AzureIdentityAuthenticationProvider from .base_graph_request_adapter import BaseGraphRequestAdapter from .graph_client_factory import GraphClientFactory -from .tasks import PageIterator from .models import PageResult +from .tasks import PageIterator __version__ = SDK_VERSION diff --git a/src/msgraph_core/authentication/azure_identity_authentication_provider.py b/src/msgraph_core/authentication/azure_identity_authentication_provider.py index 6f45233b..2c31634a 100644 --- a/src/msgraph_core/authentication/azure_identity_authentication_provider.py +++ b/src/msgraph_core/authentication/azure_identity_authentication_provider.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Dict, List, Optional, Union +from typing import TYPE_CHECKING, Optional, Union from kiota_authentication_azure.azure_identity_authentication_provider import ( AzureIdentityAuthenticationProvider as KiotaAzureIdentityAuthenticationProvider, @@ -17,9 +17,9 @@ class AzureIdentityAuthenticationProvider(KiotaAzureIdentityAuthenticationProvid def __init__( self, credentials: Union["TokenCredential", "AsyncTokenCredential"], - options: Optional[Dict] = {}, - scopes: List[str] = [], - allowed_hosts: List[str] = [nc.value for nc in NationalClouds] + options: Optional[dict] = {}, + scopes: list[str] = [], + allowed_hosts: list[str] = [nc.value for nc in NationalClouds] ) -> None: """[summary] @@ -27,9 +27,9 @@ def __init__( credentials (Union["TokenCredential", "AsyncTokenCredential"]): The tokenCredential implementation to use for authentication. options (Optional[dict]): The options to use for authentication. - scopes (List[str]): The scopes to use for authentication. + scopes (list[str]): The scopes to use for authentication. Defaults to 'https:///.default'. - allowed_hosts (Optional[List[str]]): The allowed hosts to use for + allowed_hosts (Optional[list[str]]): The allowed hosts to use for authentication. Defaults to Microsoft National Clouds. """ super().__init__(credentials, options, scopes, allowed_hosts) diff --git a/src/msgraph_core/base_graph_request_adapter.py b/src/msgraph_core/base_graph_request_adapter.py index 51834b6f..e74bb597 100644 --- a/src/msgraph_core/base_graph_request_adapter.py +++ b/src/msgraph_core/base_graph_request_adapter.py @@ -1,4 +1,5 @@ from typing import Optional + import httpx from kiota_abstractions.authentication import AuthenticationProvider from kiota_abstractions.serialization import ( diff --git a/src/msgraph_core/graph_client_factory.py b/src/msgraph_core/graph_client_factory.py index 5dfcee80..968b53fa 100644 --- a/src/msgraph_core/graph_client_factory.py +++ b/src/msgraph_core/graph_client_factory.py @@ -4,7 +4,7 @@ # ------------------------------------ from __future__ import annotations -from typing import Dict, List, Optional +from typing import Optional import httpx from kiota_abstractions.request_option import RequestOption @@ -27,7 +27,7 @@ def create_with_default_middleware( # type: ignore api_version: APIVersion = APIVersion.v1, client: Optional[httpx.AsyncClient] = None, host: NationalClouds = NationalClouds.Global, - options: Optional[Dict[str, RequestOption]] = None + options: Optional[dict[str, RequestOption]] = None ) -> httpx.AsyncClient: """Constructs native HTTP AsyncClient(httpx.AsyncClient) instances configured with a custom transport loaded with a default pipeline of middleware. @@ -39,8 +39,8 @@ def create_with_default_middleware( # type: ignore Defaults to KiotaClientFactory.get_default_client(). host (NationalClouds): The national clound endpoint to be used. Defaults to NationalClouds.Global. - options (Optional[Dict[str, RequestOption]]): The request options to use when - instantiating default middleware. Defaults to Dict[str, RequestOption]=None. + options (Optional[dict[str, RequestOption]]): The request options to use when + instantiating default middleware. Defaults to dict[str, RequestOption]=None. Returns: httpx.AsyncClient: An instance of the AsyncClient object @@ -56,7 +56,7 @@ def create_with_default_middleware( # type: ignore @staticmethod def create_with_custom_middleware( # type: ignore # Breaking change to remove Kiota client factory as base class - middleware: Optional[List[BaseMiddleware]], + middleware: Optional[list[BaseMiddleware]], api_version: APIVersion = APIVersion.v1, client: Optional[httpx.AsyncClient] = None, host: NationalClouds = NationalClouds.Global, @@ -64,7 +64,7 @@ def create_with_custom_middleware( # type: ignore """Applies a custom middleware chain to the HTTP Client Args: - middleware(List[BaseMiddleware]): Custom middleware list that will be used to create + middleware(list[BaseMiddleware]): Custom middleware list that will be used to create a middleware pipeline. The middleware should be arranged in the order in which they will modify the request. api_version (APIVersion): The Graph API version to be used. @@ -87,7 +87,7 @@ def _get_base_url(host: str, api_version: APIVersion) -> str: @staticmethod def _get_telemetry_handler( - options: Optional[Dict[str, RequestOption]] + options: Optional[dict[str, RequestOption]] ) -> GraphTelemetryHandler: """Helper method to get the graph telemetry handler instantiated with appropriate options""" @@ -102,7 +102,7 @@ def _get_telemetry_handler( @staticmethod def _load_middleware_to_client( - client: httpx.AsyncClient, middleware: Optional[List[BaseMiddleware]] + client: httpx.AsyncClient, middleware: Optional[list[BaseMiddleware]] ) -> httpx.AsyncClient: current_transport = client._transport client._transport = GraphClientFactory._replace_transport_with_custom_graph_transport( @@ -123,7 +123,7 @@ def _load_middleware_to_client( @staticmethod def _replace_transport_with_custom_graph_transport( - current_transport: httpx.AsyncBaseTransport, middleware: Optional[List[BaseMiddleware]] + current_transport: httpx.AsyncBaseTransport, middleware: Optional[list[BaseMiddleware]] ) -> AsyncGraphTransport: middleware_pipeline = KiotaClientFactory.create_middleware_pipeline( middleware, current_transport diff --git a/src/msgraph_core/middleware/options/graph_telemetry_handler_option.py b/src/msgraph_core/middleware/options/graph_telemetry_handler_option.py index 28c33004..73c8e17c 100644 --- a/src/msgraph_core/middleware/options/graph_telemetry_handler_option.py +++ b/src/msgraph_core/middleware/options/graph_telemetry_handler_option.py @@ -1,4 +1,4 @@ -from typing import List, Optional +from typing import Optional from kiota_abstractions.request_option import RequestOption diff --git a/src/msgraph_core/models/__init__.py b/src/msgraph_core/models/__init__.py index dae79993..fdefa204 100644 --- a/src/msgraph_core/models/__init__.py +++ b/src/msgraph_core/models/__init__.py @@ -1,5 +1,5 @@ -from .page_result import PageResult from .large_file_upload_session import LargeFileUploadSession +from .page_result import PageResult from .upload_result import UploadResult, UploadSessionDataHolder __all__ = ['PageResult', 'LargeFileUploadSession', 'UploadResult', 'UploadSessionDataHolder'] diff --git a/src/msgraph_core/models/large_file_upload_session.py b/src/msgraph_core/models/large_file_upload_session.py index 5faf30cd..a5c79b9a 100644 --- a/src/msgraph_core/models/large_file_upload_session.py +++ b/src/msgraph_core/models/large_file_upload_session.py @@ -1,19 +1,24 @@ from __future__ import annotations -from typing import Any, Callable, Dict, List, Optional + import datetime +from collections.abc import Callable from dataclasses import dataclass, field +from typing import Any, Optional from kiota_abstractions.serialization import ( - AdditionalDataHolder, Parsable, ParseNode, SerializationWriter + AdditionalDataHolder, + Parsable, + ParseNode, + SerializationWriter, ) @dataclass class LargeFileUploadSession(AdditionalDataHolder, Parsable): - additional_data: Dict[str, Any] = field(default_factory=dict) + additional_data: dict[str, Any] = field(default_factory=dict) expiration_date_time: Optional[datetime.datetime] = None - next_expected_ranges: Optional[List[str]] = None + next_expected_ranges: Optional[list[str]] = None is_cancelled: Optional[bool] = False odata_type: Optional[str] = None # The URL endpoint that accepts PUT requests for byte ranges of the file. @@ -33,12 +38,12 @@ def create_from_discriminator_value( raise TypeError("parse_node cannot be null.") return LargeFileUploadSession() - def get_field_deserializers(self, ) -> Dict[str, Callable[[ParseNode], None]]: + def get_field_deserializers(self, ) -> dict[str, Callable[[ParseNode], None]]: """ The deserialization information for the current model - Returns: Dict[str, Callable[[ParseNode], None]] + Returns: dict[str, Callable[[ParseNode], None]] """ - fields: Dict[str, Callable[[Any], None]] = { + fields: dict[str, Callable[[Any], None]] = { "expirationDateTime": lambda n: setattr(self, 'expiration_date_time', n.get_datetime_value()), "nextExpectedRanges": diff --git a/src/msgraph_core/models/page_result.py b/src/msgraph_core/models/page_result.py index 4d430201..b11bc965 100644 --- a/src/msgraph_core/models/page_result.py +++ b/src/msgraph_core/models/page_result.py @@ -10,13 +10,14 @@ PageResult: Represents a page of items in a paged response. """ from __future__ import annotations -from typing import List, Optional, Dict, Callable, TypeVar + +from collections.abc import Callable from dataclasses import dataclass +from typing import Optional, TypeVar from kiota_abstractions.serialization.parsable import Parsable -from kiota_abstractions.serialization.serialization_writer \ - import SerializationWriter from kiota_abstractions.serialization.parse_node import ParseNode +from kiota_abstractions.serialization.serialization_writer import SerializationWriter T = TypeVar('T') @@ -24,7 +25,7 @@ @dataclass class PageResult(Parsable): odata_next_link: Optional[str] = None - value: Optional[List[Parsable]] = None + value: Optional[list[Parsable]] = None @staticmethod def create_from_discriminator_value(parse_node: Optional[ParseNode] = None) -> PageResult: @@ -38,11 +39,11 @@ def create_from_discriminator_value(parse_node: Optional[ParseNode] = None) -> P raise TypeError("parse_node cannot be null") return PageResult() - def get_field_deserializers(self) -> Dict[str, Callable[[ParseNode], None]]: + def get_field_deserializers(self) -> dict[str, Callable[[ParseNode], None]]: """Gets the deserialization information for this object. Returns: - Dict[str, Callable[[ParseNode], None]]: The deserialization information for this + dict[str, Callable[[ParseNode], None]]: The deserialization information for this object where each entry is a property key with its deserialization callback. """ return { diff --git a/src/msgraph_core/models/upload_result.py b/src/msgraph_core/models/upload_result.py index 1adc8af4..4c3c720a 100644 --- a/src/msgraph_core/models/upload_result.py +++ b/src/msgraph_core/models/upload_result.py @@ -1,10 +1,13 @@ -from typing import Any, Callable, Dict, List, Optional, TypeVar, Generic - +from collections.abc import Callable from dataclasses import dataclass from datetime import datetime +from typing import Any, Generic, Optional, TypeVar from kiota_abstractions.serialization import ( - AdditionalDataHolder, Parsable, ParseNode, SerializationWriter + AdditionalDataHolder, + Parsable, + ParseNode, + SerializationWriter, ) T = TypeVar('T') @@ -13,16 +16,16 @@ @dataclass class UploadSessionDataHolder(AdditionalDataHolder, Parsable): expiration_date_time: Optional[datetime] = None - next_expected_ranges: Optional[List[str]] = None + next_expected_ranges: Optional[list[str]] = None upload_url: Optional[str] = None odata_type: Optional[str] = None - def get_field_deserializers(self, ) -> Dict[str, Callable[[ParseNode], None]]: + def get_field_deserializers(self, ) -> dict[str, Callable[[ParseNode], None]]: """ The deserialization information for the current model - Returns: Dict[str, Callable[[ParseNode], None]] + Returns: dict[str, Callable[[ParseNode], None]] """ - fields: Dict[str, Callable[[Any], None]] = { + fields: dict[str, Callable[[Any], None]] = { "expirationDateTime": lambda n: setattr(self, 'expiration_date_time', n.get_datetime_value()), "nextExpectedRanges": diff --git a/src/msgraph_core/requests/batch_request_builder.py b/src/msgraph_core/requests/batch_request_builder.py index 5462d0f5..ab544c7c 100644 --- a/src/msgraph_core/requests/batch_request_builder.py +++ b/src/msgraph_core/requests/batch_request_builder.py @@ -1,12 +1,12 @@ -from typing import TypeVar, Type, Dict, Optional, Union import logging +from typing import Optional, Type, TypeVar, Union +from kiota_abstractions.api_error import APIError +from kiota_abstractions.headers_collection import HeadersCollection +from kiota_abstractions.method import Method from kiota_abstractions.request_adapter import RequestAdapter from kiota_abstractions.request_information import RequestInformation -from kiota_abstractions.method import Method from kiota_abstractions.serialization import Parsable, ParsableFactory -from kiota_abstractions.headers_collection import HeadersCollection -from kiota_abstractions.api_error import APIError from .batch_request_content import BatchRequestContent from .batch_request_content_collection import BatchRequestContentCollection @@ -26,7 +26,7 @@ class BatchRequestBuilder: def __init__( self, request_adapter: RequestAdapter, - error_map: Optional[Dict[str, Type[ParsableFactory]]] = None + error_map: Optional[dict[str, Type[ParsableFactory]]] = None ): if request_adapter is None: raise ValueError("request_adapter cannot be Null.") @@ -37,7 +37,7 @@ def __init__( async def post( self, batch_request_content: Union[BatchRequestContent, BatchRequestContentCollection], - error_map: Optional[Dict[str, Type[ParsableFactory]]] = None, + error_map: Optional[dict[str, Type[ParsableFactory]]] = None, ) -> Union[BatchResponseContent, BatchResponseContentCollection]: """ Sends a batch request and returns the batch response content. @@ -45,7 +45,7 @@ async def post( Args: batch_request_content (Union[BatchRequestContent, BatchRequestContentCollection]): The batch request content. - Optional[Dict[str, Type[ParsableFactory]]] = None: + Optional[dict[str, Type[ParsableFactory]]] = None: Error mappings for response handling. Returns: @@ -81,7 +81,7 @@ async def post( async def _post_batch_collection( self, batch_request_content_collection: BatchRequestContentCollection, - error_map: Optional[Dict[str, Type[ParsableFactory]]] = None, + error_map: Optional[dict[str, Type[ParsableFactory]]] = None, ) -> BatchResponseContentCollection: """ Sends a collection of batch requests and returns a collection of batch response contents. @@ -89,7 +89,7 @@ async def _post_batch_collection( Args: batch_request_content_collection (BatchRequestContentCollection): The collection of batch request contents. - Optional[Dict[str, Type[ParsableFactory]]] = None: + Optional[dict[str, Type[ParsableFactory]]] = None: Error mappings for response handling. Returns: diff --git a/src/msgraph_core/requests/batch_request_content.py b/src/msgraph_core/requests/batch_request_content.py index 67d1fea3..0235df8a 100644 --- a/src/msgraph_core/requests/batch_request_content.py +++ b/src/msgraph_core/requests/batch_request_content.py @@ -1,10 +1,9 @@ import uuid -from typing import List, Dict, Union, Optional +from typing import Optional, Union from urllib.request import Request from kiota_abstractions.request_information import RequestInformation -from kiota_abstractions.serialization import Parsable, ParseNode -from kiota_abstractions.serialization import SerializationWriter +from kiota_abstractions.serialization import Parsable, ParseNode, SerializationWriter from .batch_request_item import BatchRequestItem @@ -16,13 +15,13 @@ class BatchRequestContent(Parsable): MAX_REQUESTS = 20 - def __init__(self, requests: Dict[str, Union[BatchRequestItem, RequestInformation]] = {}): + def __init__(self, requests: dict[str, Union[BatchRequestItem, RequestInformation]] = {}): """ Initializes a new instance of the BatchRequestContent class. Args: - Requests (Dict[str, Union[BatchRequestItem, RequestInformation]]): The requests to add. + Requests (dict[str, Union[BatchRequestItem, RequestInformation]]): The requests to add. """ - self._requests: Dict[str, BatchRequestItem] = {} + self._requests: dict[str, BatchRequestItem] = {} self.is_finalized = False for request_id, request in requests.items(): @@ -32,20 +31,20 @@ def __init__(self, requests: Dict[str, Union[BatchRequestItem, RequestInformatio self.add_request(request_id, request) @property - def requests(self) -> Dict[str, BatchRequestItem]: + def requests(self) -> dict[str, BatchRequestItem]: """ Gets the requests. Returns: - Dict[str, BatchRequestItem]: requests in the batch request content. + dict[str, BatchRequestItem]: requests in the batch request content. """ return self._requests @requests.setter - def requests(self, requests: List[BatchRequestItem]) -> None: + def requests(self, requests: list[BatchRequestItem]) -> None: """ Sets the requests. Args: - requests (List[BatchRequestItem]): The requests to set. + requests (list[BatchRequestItem]): The requests to set. """ if len(requests) >= BatchRequestContent.MAX_REQUESTS: raise ValueError(f"Maximum number of requests is {BatchRequestContent.MAX_REQUESTS}") @@ -148,7 +147,7 @@ def create_from_discriminator_value( raise ValueError("parse_node cannot be None") return BatchRequestContent() - def get_field_deserializers(self, ) -> Dict: + def get_field_deserializers(self, ) -> dict: """ The deserialization information for the current model """ diff --git a/src/msgraph_core/requests/batch_request_content_collection.py b/src/msgraph_core/requests/batch_request_content_collection.py index 1393035a..3f5cb511 100644 --- a/src/msgraph_core/requests/batch_request_content_collection.py +++ b/src/msgraph_core/requests/batch_request_content_collection.py @@ -1,6 +1,5 @@ -from typing import List, Optional +from typing import Optional -from kiota_abstractions.request_information import RequestInformation from kiota_abstractions.serialization import SerializationWriter from .batch_request_content import BatchRequestContent @@ -17,7 +16,7 @@ def __init__(self) -> None: """ self.max_requests_per_batch = BatchRequestContent.MAX_REQUESTS - self.batches: List[BatchRequestContent] = [] + self.batches: list[BatchRequestContent] = [] self.current_batch: BatchRequestContent = BatchRequestContent() def add_batch_request_item(self, request: BatchRequestItem) -> None: @@ -65,11 +64,11 @@ def new_batch_with_failed_requests(self) -> Optional[BatchRequestContent]: raise ValueError("batch_with_failed_responses is None") return batch_with_failed_responses - def get_batch_requests_for_execution(self) -> List[BatchRequestContent]: + def get_batch_requests_for_execution(self) -> list[BatchRequestContent]: """ Gets the batch requests for execution. Returns: - List[BatchRequestContent]: The batch requests for execution. + list[BatchRequestContent]: The batch requests for execution. """ return self.batches diff --git a/src/msgraph_core/requests/batch_request_item.py b/src/msgraph_core/requests/batch_request_item.py index 141f2cb5..bc39f0c6 100644 --- a/src/msgraph_core/requests/batch_request_item.py +++ b/src/msgraph_core/requests/batch_request_item.py @@ -1,19 +1,17 @@ -import re +import base64 import enum import json -from uuid import uuid4 -from typing import List, Optional, Dict, Union, Any -from io import BytesIO -import base64 +import re import urllib.request +from io import BytesIO +from typing import Any, Optional, Union from urllib.parse import urlparse +from uuid import uuid4 from kiota_abstractions.headers_collection import HeadersCollection as RequestHeaders from kiota_abstractions.method import Method from kiota_abstractions.request_information import RequestInformation -from kiota_abstractions.serialization import Parsable -from kiota_abstractions.serialization import SerializationWriter -from kiota_abstractions.serialization import ParseNode +from kiota_abstractions.serialization import Parsable, ParseNode, SerializationWriter class StreamInterface(BytesIO): @@ -28,14 +26,14 @@ def __init__( self, request_information: Optional[RequestInformation] = None, id: str = "", - depends_on: Optional[List[Union[str, 'BatchRequestItem']]] = [] + depends_on: Optional[list[Union[str, 'BatchRequestItem']]] = [] ): """ Initializes a new instance of the BatchRequestItem class. Args: request_information (RequestInformation): The request information. id (str, optional): The ID of the request item. Defaults to "". - depends_on (Optional[List[Union[str, BatchRequestItem]], optional): + depends_on (Optional[list[Union[str, BatchRequestItem]], optional): The IDs of the requests that this request depends on. Defaults to None. """ if request_information is None or not request_information.http_method: @@ -45,10 +43,10 @@ def __init__( self._method = request_information.http_method.name else: self._method = request_information.http_method - self._headers: Optional[Dict[str, str]] = request_information.request_headers + self._headers: Optional[dict[str, str]] = request_information.request_headers self._body = request_information.content self.url = request_information.url.replace('/users/me-token-to-replace', '/me', 1) - self._depends_on: Optional[List[str]] = [] + self._depends_on: Optional[list[str]] = [] if depends_on is not None: self.set_depends_on(depends_on) @@ -56,14 +54,14 @@ def __init__( def create_with_urllib_request( request: urllib.request.Request, id: str = "", - depends_on: Optional[List[str]] = None + depends_on: Optional[list[str]] = None ) -> 'BatchRequestItem': """ Creates a new instance of the BatchRequestItem class from a urllib request. Args: request (urllib.request.Request): The urllib request. id (str, optional): The ID of the request item. Defaults to "". - depends_on (Optional[List[str]], optional): The IDs of + depends_on (Optional[list[str]], optional): The IDs of the requests that this request depends on. Defaults to None. Returns: BatchRequestItem: A new instance of the BatchRequestItem class. @@ -85,11 +83,11 @@ def create_with_urllib_request( depends_on # type: ignore # union types not analysed correctly ) - def set_depends_on(self, requests: Optional[List[Union[str, 'BatchRequestItem']]]) -> None: + def set_depends_on(self, requests: Optional[list[Union[str, 'BatchRequestItem']]]) -> None: """ Sets the IDs of the requests that this request depends on. Args: - requests (Optional[List[Union[str, BatchRequestItem]]): The + requests (Optional[list[Union[str, BatchRequestItem]]): The IDs of the requests that this request depends on. """ if requests: @@ -145,20 +143,20 @@ def id(self, value: str) -> None: self._id = value @property - def headers(self) -> Optional[Dict[str, str]]: + def headers(self) -> Optional[dict[str, str]]: """ Gets the headers of the request item. Returns: - Optional[Dict[str, str]]: The headers of the request item. + Optional[dict[str, str]]: The headers of the request item. """ return self._headers @headers.setter - def headers(self, headers: Dict[str, Union[List[str], str]]) -> None: + def headers(self, headers: dict[str, Union[list[str], str]]) -> None: """ Sets the headers of the request item. Args: - headers (Dict[str, Union[List[str], str]]): The headers of the request item. + headers (dict[str, Union[list[str], str]]): The headers of the request item. """ if self._headers: self._headers.clear() @@ -209,11 +207,11 @@ def method(self, value: str) -> None: self._method = value @property - def depends_on(self) -> Optional[List[str]]: + def depends_on(self) -> Optional[list[str]]: """ Gets the IDs of the requests that this request depends on. Returns: - Optional[List[str]]: The IDs of the requests that this request depends on. + Optional[list[str]]: The IDs of the requests that this request depends on. """ return self._depends_on @@ -231,11 +229,11 @@ def create_from_discriminator_value( raise TypeError("parse_node cannot be null.") return BatchRequestItem() - def get_field_deserializers(self) -> Dict[str, Any]: + def get_field_deserializers(self) -> dict[str, Any]: """ Gets the deserialization information for this object. Returns: - Dict[str, Any]: The deserialization information for + dict[str, Any]: The deserialization information for this object where each entry is a property key with its deserialization callback. """ diff --git a/src/msgraph_core/requests/batch_response_content.py b/src/msgraph_core/requests/batch_response_content.py index 1faf7d8a..11edbbe8 100644 --- a/src/msgraph_core/requests/batch_response_content.py +++ b/src/msgraph_core/requests/batch_response_content.py @@ -1,11 +1,15 @@ -from typing import Optional, Dict, Type, TypeVar, Callable, Union -from io import BytesIO import base64 +from collections.abc import Callable +from io import BytesIO +from typing import Optional, Type, TypeVar, Union -from kiota_abstractions.serialization import Parsable, ParsableFactory -from kiota_abstractions.serialization import ParseNode -from kiota_abstractions.serialization import ParseNodeFactoryRegistry -from kiota_abstractions.serialization import SerializationWriter +from kiota_abstractions.serialization import ( + Parsable, + ParsableFactory, + ParseNode, + ParseNodeFactoryRegistry, + SerializationWriter, +) from .batch_response_item import BatchResponseItem @@ -20,23 +24,23 @@ def __init__(self) -> None: BatchResponseContent is a collection of BatchResponseItem items, each with a unique request ID. """ - self._responses: Optional[Dict[str, BatchResponseItem]] = {} + self._responses: Optional[dict[str, BatchResponseItem]] = {} @property - def responses(self) -> Optional[Dict[str, BatchResponseItem]]: + def responses(self) -> Optional[dict[str, BatchResponseItem]]: """ Get the responses in the collection :return: A dictionary of response IDs and their BatchResponseItem objects - :rtype: Optional[Dict[str, BatchResponseItem]] + :rtype: Optional[dict[str, BatchResponseItem]] """ return self._responses @responses.setter - def responses(self, responses: Optional[Dict[str, BatchResponseItem]]) -> None: + def responses(self, responses: Optional[dict[str, BatchResponseItem]]) -> None: """ Set the responses in the collection :param responses: The responses to set in the collection - :type responses: Optional[Dict[str, BatchResponseItem]] + :type responses: Optional[dict[str, BatchResponseItem]] """ self._responses = responses @@ -74,13 +78,13 @@ def get_response_stream_by_id(self, request_id: str) -> Optional[BytesIO]: return response_item.body return BytesIO(response_item.body) - def get_response_status_codes(self) -> Dict[str, int]: + def get_response_status_codes(self) -> dict[str, int]: """ Go through responses and for each, append {'request-id': status_code} to a dictionary. :return: A dictionary with request_id as keys and status_code as values. :rtype: dict """ - status_codes: Dict[str, int] = {} + status_codes: dict[str, int] = {} if self._responses is None: return status_codes @@ -135,11 +139,11 @@ def response_body(self, request_id: str, type: Type[T]) -> Optional[T]: f"Unable to deserialize batch response for request Id: {request_id} to {type}" ) - def get_field_deserializers(self) -> Dict[str, Callable[[ParseNode], None]]: + def get_field_deserializers(self) -> dict[str, Callable[[ParseNode], None]]: """ Gets the deserialization information for this object. :return: The deserialization information for this object - :rtype: Dict[str, Callable[[ParseNode], None]] + :rtype: dict[str, Callable[[ParseNode], None]] """ def set_responses(n: ParseNode): diff --git a/src/msgraph_core/requests/batch_response_content_collection.py b/src/msgraph_core/requests/batch_response_content_collection.py index 2e70707b..60984aa4 100644 --- a/src/msgraph_core/requests/batch_response_content_collection.py +++ b/src/msgraph_core/requests/batch_response_content_collection.py @@ -1,8 +1,6 @@ -from typing import Optional, Dict, Callable, List +from collections.abc import Callable -from kiota_abstractions.serialization import Parsable -from kiota_abstractions.serialization import ParseNode -from kiota_abstractions.serialization import SerializationWriter +from kiota_abstractions.serialization import Parsable, ParseNode, SerializationWriter from .batch_response_content import BatchResponseContent from .batch_response_item import BatchResponseItem @@ -15,12 +13,12 @@ def __init__(self) -> None: Initializes a new instance of the BatchResponseContentCollection class. BatchResponseContentCollection is a collection of BatchResponseContent items, each with a unique request ID. - headers: Optional[Dict[str, str]] = {} + headers: Optional[dict[str, str]] = {} status_code: Optional[int] = None body: Optional[StreamInterface] = None """ - self._responses: List[BatchResponseContent] = [] + self._responses: list[BatchResponseContent] = [] def add_response(self, response: BatchResponseContent) -> None: """ @@ -35,18 +33,18 @@ def get_responses(self): """ Gets the responses in the collection. Returns: - List[Tuple[str, BatchResponseContent]]: The responses in the collection. + list[Tuple[str, BatchResponseContent]]: The responses in the collection. """ return self._responses @property - async def responses_status_codes(self) -> Dict[str, int]: + async def responses_status_codes(self) -> dict[str, int]: """ Get the status codes of all responses in the collection :return: A dictionary of response IDs and their status codes - :rtype: Dict[str, int] + :rtype: dict[str, int] """ - status_codes: Dict[str, int] = {} + status_codes: dict[str, int] = {} for response in self._responses: if isinstance(response, BatchResponseItem): if response.id is not None: @@ -57,12 +55,12 @@ async def responses_status_codes(self) -> Dict[str, int]: raise TypeError("Invalid type: Collection must be of type BatchResponseContent") return status_codes - def get_field_deserializers(self) -> Dict[str, Callable[[ParseNode], None]]: + def get_field_deserializers(self) -> dict[str, Callable[[ParseNode], None]]: """ Gets the deserialization information for this object. :return: The deserialization information for this object where each entry is a property key with its deserialization callback. - :rtype: Dict[str, Callable[[ParseNode], None]] + :rtype: dict[str, Callable[[ParseNode], None]] """ return { 'responses': diff --git a/src/msgraph_core/requests/batch_response_item.py b/src/msgraph_core/requests/batch_response_item.py index e4e207f2..ff39825b 100644 --- a/src/msgraph_core/requests/batch_response_item.py +++ b/src/msgraph_core/requests/batch_response_item.py @@ -1,10 +1,13 @@ -from typing import Optional, Dict, Any, Callable from io import BytesIO -from deprecated import deprecated +from typing import Callable, Optional -from kiota_abstractions.serialization import Parsable, ParsableFactory -from kiota_abstractions.serialization import ParseNode -from kiota_abstractions.serialization import SerializationWriter +from deprecated import deprecated +from kiota_abstractions.serialization import ( + Parsable, + ParsableFactory, + ParseNode, + SerializationWriter, +) @deprecated("Use BytesIO type instead") @@ -21,7 +24,7 @@ def __init__(self) -> None: self._id: Optional[str] = None self._atomicity_group: Optional[str] = None self._status: Optional[int] = None - self._headers: Optional[Dict[str, str]] = {} + self._headers: Optional[dict[str, str]] = {} self._body: Optional[BytesIO] = None @property @@ -79,20 +82,20 @@ def status(self, status_code: Optional[int]) -> None: self._status = status_code @property - def headers(self) -> Optional[Dict[str, str]]: + def headers(self) -> Optional[dict[str, str]]: """ Get the headers of the response :return: The headers of the response - :rtype: Optional[Dict[str, str]] + :rtype: Optional[dict[str, str]] """ return self._headers @headers.setter - def headers(self, headers: Optional[Dict[str, str]]) -> None: + def headers(self, headers: Optional[dict[str, str]]) -> None: """ Set the headers of the response :param headers: The headers of the response - :type headers: Optional[Dict[str, str]] + :type headers: Optional[dict[str, str]] """ self._headers = headers @@ -140,7 +143,7 @@ def create_from_discriminator_value( raise TypeError("parse_node cannot be null") return BatchResponseItem() - def get_field_deserializers(self) -> Dict[str, Callable[[ParseNode], None]]: + def get_field_deserializers(self) -> dict[str, Callable[[ParseNode], None]]: """ Gets the deserialization information for this object. diff --git a/src/msgraph_core/tasks/__init__.py b/src/msgraph_core/tasks/__init__.py index 388e9cc4..0c7ee8b9 100644 --- a/src/msgraph_core/tasks/__init__.py +++ b/src/msgraph_core/tasks/__init__.py @@ -1,4 +1,4 @@ -from .page_iterator import PageIterator from .large_file_upload import LargeFileUploadTask +from .page_iterator import PageIterator __all__ = ['PageIterator', 'LargeFileUploadTask'] diff --git a/src/msgraph_core/tasks/large_file_upload.py b/src/msgraph_core/tasks/large_file_upload.py index 75793f74..250321a2 100644 --- a/src/msgraph_core/tasks/large_file_upload.py +++ b/src/msgraph_core/tasks/large_file_upload.py @@ -1,16 +1,16 @@ +import logging import os -from typing import Callable, Optional, List, Tuple, Any, Dict, TypeVar, Union, Type -from io import BytesIO from asyncio import Future +from collections.abc import Callable from datetime import datetime, timedelta, timezone -import logging +from io import BytesIO +from typing import Any, Optional, Tuple, TypeVar, Union -from kiota_abstractions.method import Method from kiota_abstractions.headers_collection import HeadersCollection -from kiota_abstractions.request_information import RequestInformation -from kiota_abstractions.serialization import Parsable, ParsableFactory, AdditionalDataHolder - +from kiota_abstractions.method import Method from kiota_abstractions.request_adapter import RequestAdapter +from kiota_abstractions.request_information import RequestInformation +from kiota_abstractions.serialization import AdditionalDataHolder, Parsable, ParsableFactory from msgraph_core.models import LargeFileUploadSession, UploadResult # check imports @@ -42,7 +42,7 @@ def __init__( ) self.next_range = cleaned_value[0] self._chunks = int((self.file_size / max_chunk_size) + 0.5) - self.on_chunk_upload_complete: Optional[Callable[[List[int]], None]] = None + self.on_chunk_upload_complete: Optional[Callable[[list[int]], None]] = None @property def upload_session(self): @@ -180,7 +180,7 @@ async def next_chunk( info.headers.try_add('Content-Length', str(len(chunk_data))) info.headers.try_add("Content-Type", "application/octet-stream") info.set_stream_content(bytes(chunk_data)) - error_map: Dict[str, int] = {} + error_map: dict[str, int] = {} return await self.request_adapter.send_async(info, LargeFileUploadSession, error_map) async def last_chunk( @@ -220,7 +220,7 @@ async def last_chunk( info.headers.try_add('Content-Length', str(len(chunk_data))) info.headers.try_add("Content-Type", "application/octet-stream") info.set_stream_content(bytes(chunk_data)) - error_map: Dict[str, int] = {} + error_map: dict[str, int] = {} factory = self.factory or parsable_factory if factory: return await self.request_adapter.send_async(info, factory, error_map) @@ -246,7 +246,7 @@ async def cancel(self) -> Parsable: return self.upload_session def additional_data_contains(self, parsable: Parsable, - property_candidates: List[str]) -> Tuple[bool, Any]: + property_candidates: list[str]) -> Tuple[bool, Any]: if not issubclass(type(parsable), AdditionalDataHolder): raise ValueError( 'The object passed does not contain property/properties ' @@ -262,7 +262,7 @@ def additional_data_contains(self, parsable: Parsable, return False, None def check_value_exists( - self, parsable: Parsable, attribute_name: str, property_names_in_additional_data: List[str] + self, parsable: Parsable, attribute_name: str, property_names_in_additional_data: list[str] ) -> Tuple[bool, Any]: checked_additional_data = self.additional_data_contains( parsable, property_names_in_additional_data @@ -288,7 +288,7 @@ async def resume(self) -> Future: 'The object passed does not contain a valid "nextExpectedRanges" property.' ) - next_ranges: List[str] = validated_value[1] + next_ranges: list[str] = validated_value[1] if len(next_ranges) == 0: raise RuntimeError('No more bytes expected.') diff --git a/src/msgraph_core/tasks/page_iterator.py b/src/msgraph_core/tasks/page_iterator.py index 5f32855f..dd56ca4c 100644 --- a/src/msgraph_core/tasks/page_iterator.py +++ b/src/msgraph_core/tasks/page_iterator.py @@ -17,18 +17,19 @@ and models modules. """ -from typing import Callable, Optional, Union, Dict, Type +from collections.abc import Callable +from typing import Optional, Type, TypeVar, Union -from typing import TypeVar -from requests.exceptions import InvalidURL - -from kiota_abstractions.request_adapter import RequestAdapter -from kiota_abstractions.method import Method from kiota_abstractions.headers_collection import HeadersCollection +from kiota_abstractions.method import Method +from kiota_abstractions.request_adapter import RequestAdapter from kiota_abstractions.request_information import RequestInformation from kiota_abstractions.serialization import Parsable, ParsableFactory +from requests.exceptions import InvalidURL -from msgraph_core.models.page_result import PageResult # pylint: disable=no-name-in-module, import-error +from msgraph_core.models.page_result import ( + PageResult, # pylint: disable=no-name-in-module, import-error +) T = TypeVar('T', bound=Parsable) @@ -60,7 +61,7 @@ def __init__( response: Union[T, list, object], request_adapter: RequestAdapter, constructor_callable: Optional[Callable] = None, - error_mapping: Optional[Dict[str, Type[ParsableFactory]]] = None, + error_mapping: Optional[dict[str, Type[ParsableFactory]]] = None, ): self.request_adapter = request_adapter