diracx-client 0.0.1a15__py3-none-any.whl → 0.0.1a17__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- diracx/client/__init__.py +1 -1
- diracx/client/_client.py +1 -1
- diracx/client/_configuration.py +1 -1
- diracx/client/_patch.py +24 -7
- diracx/client/_serialization.py +1 -1
- diracx/client/_vendor.py +1 -1
- diracx/client/aio/__init__.py +1 -1
- diracx/client/aio/_client.py +1 -1
- diracx/client/aio/_configuration.py +1 -1
- diracx/client/aio/_patch.py +13 -4
- diracx/client/aio/_vendor.py +1 -1
- diracx/client/aio/operations/__init__.py +1 -1
- diracx/client/aio/operations/_operations.py +124 -115
- diracx/client/models/__init__.py +3 -7
- diracx/client/models/_enums.py +13 -18
- diracx/client/models/_models.py +57 -42
- diracx/client/operations/__init__.py +1 -1
- diracx/client/operations/_operations.py +157 -148
- {diracx_client-0.0.1a15.dist-info → diracx_client-0.0.1a17.dist-info}/METADATA +1 -1
- diracx_client-0.0.1a17.dist-info/RECORD +26 -0
- diracx_client-0.0.1a15.dist-info/RECORD +0 -26
- {diracx_client-0.0.1a15.dist-info → diracx_client-0.0.1a17.dist-info}/WHEEL +0 -0
- {diracx_client-0.0.1a15.dist-info → diracx_client-0.0.1a17.dist-info}/top_level.txt +0 -0
    
        diracx/client/__init__.py
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # coding=utf-8
         | 
| 2 2 | 
             
            # --------------------------------------------------------------------------
         | 
| 3 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 3 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 4 4 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 5 5 | 
             
            # --------------------------------------------------------------------------
         | 
| 6 6 |  | 
    
        diracx/client/_client.py
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # coding=utf-8
         | 
| 2 2 | 
             
            # --------------------------------------------------------------------------
         | 
| 3 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 3 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 4 4 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 5 5 | 
             
            # --------------------------------------------------------------------------
         | 
| 6 6 |  | 
    
        diracx/client/_configuration.py
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # coding=utf-8
         | 
| 2 2 | 
             
            # --------------------------------------------------------------------------
         | 
| 3 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 3 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 4 4 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 5 5 | 
             
            # --------------------------------------------------------------------------
         | 
| 6 6 |  | 
    
        diracx/client/_patch.py
    CHANGED
    
    | @@ -8,12 +8,14 @@ Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python | |
| 8 8 | 
             
            """
         | 
| 9 9 | 
             
            from __future__ import annotations
         | 
| 10 10 |  | 
| 11 | 
            -
            from datetime import datetime
         | 
| 11 | 
            +
            from datetime import datetime, timezone
         | 
| 12 12 | 
             
            import json
         | 
| 13 | 
            +
            import jwt
         | 
| 13 14 | 
             
            import requests
         | 
| 14 15 |  | 
| 15 16 | 
             
            from pathlib import Path
         | 
| 16 17 | 
             
            from typing import Any, Dict, List, Optional, cast
         | 
| 18 | 
            +
            from urllib import parse
         | 
| 17 19 | 
             
            from azure.core.credentials import AccessToken
         | 
| 18 20 | 
             
            from azure.core.credentials import TokenCredential
         | 
| 19 21 | 
             
            from azure.core.pipeline import PipelineRequest
         | 
| @@ -113,9 +115,12 @@ class DiracBearerTokenCredentialPolicy(BearerTokenCredentialPolicy): | |
| 113 115 |  | 
| 114 116 | 
             
                    if not self._token:
         | 
| 115 117 | 
             
                        credentials = json.loads(self._credential.location.read_text())
         | 
| 116 | 
            -
                         | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 118 | 
            +
                        refresh_token = credentials["refresh_token"]
         | 
| 119 | 
            +
                        if not is_refresh_token_valid(refresh_token):
         | 
| 120 | 
            +
                            # If we are here, it means the refresh token is not valid anymore
         | 
| 121 | 
            +
                            # we suppose it is not needed to perform the request
         | 
| 122 | 
            +
                            return
         | 
| 123 | 
            +
                        self._token = self._credential.get_token("", refresh_token=refresh_token)
         | 
| 119 124 |  | 
| 120 125 | 
             
                    request.http_request.headers["Authorization"] = f"Bearer {self._token.token}"
         | 
| 121 126 |  | 
| @@ -134,7 +139,7 @@ class DiracClient(DiracGenerated): | |
| 134 139 | 
             
                    **kwargs: Any,
         | 
| 135 140 | 
             
                ) -> None:
         | 
| 136 141 | 
             
                    diracx_preferences = diracx_preferences or get_diracx_preferences()
         | 
| 137 | 
            -
                    self._endpoint = endpoint or diracx_preferences.url
         | 
| 142 | 
            +
                    self._endpoint = str(endpoint or diracx_preferences.url)
         | 
| 138 143 | 
             
                    if verify is True and diracx_preferences.ca_path:
         | 
| 139 144 | 
             
                        verify = str(diracx_preferences.ca_path)
         | 
| 140 145 | 
             
                    kwargs["connection_verify"] = verify
         | 
| @@ -211,7 +216,7 @@ def get_openid_configuration( | |
| 211 216 | 
             
            ) -> Dict[str, str]:
         | 
| 212 217 | 
             
                """Get the openid configuration from the .well-known endpoint"""
         | 
| 213 218 | 
             
                response = requests.get(
         | 
| 214 | 
            -
                    url= | 
| 219 | 
            +
                    url=parse.urljoin(endpoint, ".well-known/openid-configuration"),
         | 
| 215 220 | 
             
                    verify=verify,
         | 
| 216 221 | 
             
                )
         | 
| 217 222 | 
             
                if not response.ok:
         | 
| @@ -242,8 +247,20 @@ def get_token(location: Path, token: AccessToken | None) -> AccessToken | None: | |
| 242 247 | 
             
                return token
         | 
| 243 248 |  | 
| 244 249 |  | 
| 250 | 
            +
            def is_refresh_token_valid(refresh_token: str) -> bool:
         | 
| 251 | 
            +
                """Check if the refresh token is still valid."""
         | 
| 252 | 
            +
                # Decode the refresh token
         | 
| 253 | 
            +
                refresh_payload = jwt.decode(refresh_token, options={"verify_signature": False})
         | 
| 254 | 
            +
                if not refresh_payload or "exp" not in refresh_payload:
         | 
| 255 | 
            +
                    return False
         | 
| 256 | 
            +
             | 
| 257 | 
            +
                # Check the expiration time
         | 
| 258 | 
            +
                return refresh_payload["exp"] > datetime.now(tz=timezone.utc).timestamp()
         | 
| 259 | 
            +
             | 
| 260 | 
            +
             | 
| 245 261 | 
             
            def is_token_valid(token: AccessToken) -> bool:
         | 
| 246 262 | 
             
                """Condition to get a new token"""
         | 
| 247 263 | 
             
                return (
         | 
| 248 | 
            -
                    datetime. | 
| 264 | 
            +
                    datetime.fromtimestamp(token.expires_on, tz=timezone.utc)
         | 
| 265 | 
            +
                    - datetime.now(tz=timezone.utc)
         | 
| 249 266 | 
             
                ).total_seconds() > 300
         | 
    
        diracx/client/_serialization.py
    CHANGED
    
    | @@ -1525,7 +1525,7 @@ class Deserializer(object): | |
| 1525 1525 | 
             
                    elif isinstance(response, type) and issubclass(response, Enum):
         | 
| 1526 1526 | 
             
                        return self.deserialize_enum(data, response)
         | 
| 1527 1527 |  | 
| 1528 | 
            -
                    if data is None:
         | 
| 1528 | 
            +
                    if data is None or data is CoreNull:
         | 
| 1529 1529 | 
             
                        return data
         | 
| 1530 1530 | 
             
                    try:
         | 
| 1531 1531 | 
             
                        attributes = response._attribute_map  # type: ignore
         | 
    
        diracx/client/_vendor.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            # --------------------------------------------------------------------------
         | 
| 2 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 2 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 3 3 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 4 4 | 
             
            # --------------------------------------------------------------------------
         | 
| 5 5 |  | 
    
        diracx/client/aio/__init__.py
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # coding=utf-8
         | 
| 2 2 | 
             
            # --------------------------------------------------------------------------
         | 
| 3 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 3 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 4 4 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 5 5 | 
             
            # --------------------------------------------------------------------------
         | 
| 6 6 |  | 
    
        diracx/client/aio/_client.py
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # coding=utf-8
         | 
| 2 2 | 
             
            # --------------------------------------------------------------------------
         | 
| 3 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 3 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 4 4 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 5 5 | 
             
            # --------------------------------------------------------------------------
         | 
| 6 6 |  | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # coding=utf-8
         | 
| 2 2 | 
             
            # --------------------------------------------------------------------------
         | 
| 3 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 3 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 4 4 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 5 5 | 
             
            # --------------------------------------------------------------------------
         | 
| 6 6 |  | 
    
        diracx/client/aio/_patch.py
    CHANGED
    
    | @@ -18,7 +18,12 @@ from azure.core.pipeline.policies import AsyncBearerTokenCredentialPolicy | |
| 18 18 | 
             
            from diracx.core.preferences import get_diracx_preferences, DiracxPreferences
         | 
| 19 19 |  | 
| 20 20 | 
             
            from ._client import Dirac as DiracGenerated
         | 
| 21 | 
            -
            from .._patch import  | 
| 21 | 
            +
            from .._patch import (
         | 
| 22 | 
            +
                get_openid_configuration,
         | 
| 23 | 
            +
                get_token,
         | 
| 24 | 
            +
                refresh_token,
         | 
| 25 | 
            +
                is_refresh_token_valid,
         | 
| 26 | 
            +
            )
         | 
| 22 27 |  | 
| 23 28 | 
             
            __all__: List[str] = [
         | 
| 24 29 | 
             
                "DiracClient",
         | 
| @@ -114,7 +119,6 @@ class DiracBearerTokenCredentialPolicy(AsyncBearerTokenCredentialPolicy): | |
| 114 119 | 
             
                    self._token: AccessToken | None
         | 
| 115 120 | 
             
                    self._credential: DiracTokenCredential
         | 
| 116 121 | 
             
                    credentials: dict[str, Any]
         | 
| 117 | 
            -
             | 
| 118 122 | 
             
                    try:
         | 
| 119 123 | 
             
                        self._token = get_token(self._credential.location, self._token)
         | 
| 120 124 | 
             
                    except RuntimeError:
         | 
| @@ -124,8 +128,13 @@ class DiracBearerTokenCredentialPolicy(AsyncBearerTokenCredentialPolicy): | |
| 124 128 |  | 
| 125 129 | 
             
                    if not self._token:
         | 
| 126 130 | 
             
                        credentials = json.loads(self._credential.location.read_text())
         | 
| 131 | 
            +
                        refresh_token = credentials["refresh_token"]
         | 
| 132 | 
            +
                        if not is_refresh_token_valid(refresh_token):
         | 
| 133 | 
            +
                            # If we are here, it means the refresh token is not valid anymore
         | 
| 134 | 
            +
                            # we suppose it is not needed to perform the request
         | 
| 135 | 
            +
                            return
         | 
| 127 136 | 
             
                        self._token = await self._credential.get_token(
         | 
| 128 | 
            -
                            "", refresh_token= | 
| 137 | 
            +
                            "", refresh_token=refresh_token
         | 
| 129 138 | 
             
                        )
         | 
| 130 139 |  | 
| 131 140 | 
             
                    request.http_request.headers["Authorization"] = f"Bearer {self._token.token}"
         | 
| @@ -148,7 +157,7 @@ class DiracClient(DiracGenerated): | |
| 148 157 | 
             
                    if verify is True and diracx_preferences.ca_path:
         | 
| 149 158 | 
             
                        verify = str(diracx_preferences.ca_path)
         | 
| 150 159 | 
             
                    kwargs["connection_verify"] = verify
         | 
| 151 | 
            -
                    self._endpoint = endpoint or diracx_preferences.url
         | 
| 160 | 
            +
                    self._endpoint = str(endpoint or diracx_preferences.url)
         | 
| 152 161 | 
             
                    self._client_id = client_id or "myDIRACClientID"
         | 
| 153 162 |  | 
| 154 163 | 
             
                    # Get .well-known configuration
         | 
    
        diracx/client/aio/_vendor.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            # --------------------------------------------------------------------------
         | 
| 2 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 2 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 3 3 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 4 4 | 
             
            # --------------------------------------------------------------------------
         | 
| 5 5 |  | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # coding=utf-8
         | 
| 2 2 | 
             
            # --------------------------------------------------------------------------
         | 
| 3 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 3 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 4 4 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 5 5 | 
             
            # --------------------------------------------------------------------------
         | 
| 6 6 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            # pylint: disable=too-many-lines,too-many-statements
         | 
| 2 2 | 
             
            # coding=utf-8
         | 
| 3 3 | 
             
            # --------------------------------------------------------------------------
         | 
| 4 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 4 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 5 5 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 6 6 | 
             
            # --------------------------------------------------------------------------
         | 
| 7 7 | 
             
            from io import IOBase
         | 
| @@ -245,22 +245,25 @@ class AuthOperations:  # pylint: disable=abstract-class-instantiated | |
| 245 245 | 
             
                    )
         | 
| 246 246 |  | 
| 247 247 | 
             
                @distributed_trace_async
         | 
| 248 | 
            -
                async def  | 
| 249 | 
            -
                     | 
| 248 | 
            +
                async def initiate_device_flow(
         | 
| 249 | 
            +
                    self, *, client_id: str, scope: str, **kwargs: Any
         | 
| 250 | 
            +
                ) -> _models.InitiateDeviceFlowResponse:
         | 
| 251 | 
            +
                    """Initiate Device Flow.
         | 
| 250 252 |  | 
| 251 | 
            -
                     | 
| 252 | 
            -
                     | 
| 253 | 
            -
                     | 
| 253 | 
            +
                    Initiate the device flow against DIRAC authorization Server.
         | 
| 254 | 
            +
                    Scope must have exactly up to one ``group`` (otherwise default) and
         | 
| 255 | 
            +
                    one or more ``property`` scope.
         | 
| 256 | 
            +
                    If no property, then get default one
         | 
| 254 257 |  | 
| 255 | 
            -
                     | 
| 256 | 
            -
                     | 
| 257 | 
            -
                    device flow.
         | 
| 258 | 
            -
                    (note: it can't be put as parameter or in the URL).
         | 
| 258 | 
            +
                    Offers the user to go with the browser to
         | 
| 259 | 
            +
                    ``auth/<vo>/device?user_code=XYZ``.
         | 
| 259 260 |  | 
| 260 | 
            -
                    :keyword  | 
| 261 | 
            -
                    :paramtype  | 
| 262 | 
            -
                    : | 
| 263 | 
            -
                    : | 
| 261 | 
            +
                    :keyword client_id: Required.
         | 
| 262 | 
            +
                    :paramtype client_id: str
         | 
| 263 | 
            +
                    :keyword scope: Required.
         | 
| 264 | 
            +
                    :paramtype scope: str
         | 
| 265 | 
            +
                    :return: InitiateDeviceFlowResponse
         | 
| 266 | 
            +
                    :rtype: ~client.models.InitiateDeviceFlowResponse
         | 
| 264 267 | 
             
                    :raises ~azure.core.exceptions.HttpResponseError:
         | 
| 265 268 | 
             
                    """
         | 
| 266 269 | 
             
                    error_map: MutableMapping[int, Type[HttpResponseError]] = {
         | 
| @@ -274,10 +277,11 @@ class AuthOperations:  # pylint: disable=abstract-class-instantiated | |
| 274 277 | 
             
                    _headers = kwargs.pop("headers", {}) or {}
         | 
| 275 278 | 
             
                    _params = kwargs.pop("params", {}) or {}
         | 
| 276 279 |  | 
| 277 | 
            -
                    cls: ClsType[ | 
| 280 | 
            +
                    cls: ClsType[_models.InitiateDeviceFlowResponse] = kwargs.pop("cls", None)
         | 
| 278 281 |  | 
| 279 | 
            -
                    _request =  | 
| 280 | 
            -
                         | 
| 282 | 
            +
                    _request = build_auth_initiate_device_flow_request(
         | 
| 283 | 
            +
                        client_id=client_id,
         | 
| 284 | 
            +
                        scope=scope,
         | 
| 281 285 | 
             
                        headers=_headers,
         | 
| 282 286 | 
             
                        params=_params,
         | 
| 283 287 | 
             
                    )
         | 
| @@ -300,7 +304,9 @@ class AuthOperations:  # pylint: disable=abstract-class-instantiated | |
| 300 304 | 
             
                        )
         | 
| 301 305 | 
             
                        raise HttpResponseError(response=response)
         | 
| 302 306 |  | 
| 303 | 
            -
                    deserialized = self._deserialize( | 
| 307 | 
            +
                    deserialized = self._deserialize(
         | 
| 308 | 
            +
                        "InitiateDeviceFlowResponse", pipeline_response
         | 
| 309 | 
            +
                    )
         | 
| 304 310 |  | 
| 305 311 | 
             
                    if cls:
         | 
| 306 312 | 
             
                        return cls(pipeline_response, deserialized, {})  # type: ignore
         | 
| @@ -308,25 +314,22 @@ class AuthOperations:  # pylint: disable=abstract-class-instantiated | |
| 308 314 | 
             
                    return deserialized  # type: ignore
         | 
| 309 315 |  | 
| 310 316 | 
             
                @distributed_trace_async
         | 
| 311 | 
            -
                async def  | 
| 312 | 
            -
                     | 
| 313 | 
            -
                ) -> _models.InitiateDeviceFlowResponse:
         | 
| 314 | 
            -
                    """Initiate Device Flow.
         | 
| 317 | 
            +
                async def do_device_flow(self, *, user_code: str, **kwargs: Any) -> Any:
         | 
| 318 | 
            +
                    """Do Device Flow.
         | 
| 315 319 |  | 
| 316 | 
            -
                     | 
| 317 | 
            -
                     | 
| 318 | 
            -
                     | 
| 319 | 
            -
                    If no property, then get default one
         | 
| 320 | 
            +
                    This is called as the verification URI for the device flow.
         | 
| 321 | 
            +
                    It will redirect to the actual OpenID server (IAM, CheckIn) to
         | 
| 322 | 
            +
                    perform a authorization code flow.
         | 
| 320 323 |  | 
| 321 | 
            -
                     | 
| 322 | 
            -
                     | 
| 324 | 
            +
                    We set the user_code obtained from the device flow in a cookie
         | 
| 325 | 
            +
                    to be able to map the authorization flow with the corresponding
         | 
| 326 | 
            +
                    device flow.
         | 
| 327 | 
            +
                    (note: it can't be put as parameter or in the URL).
         | 
| 323 328 |  | 
| 324 | 
            -
                    :keyword  | 
| 325 | 
            -
                    :paramtype  | 
| 326 | 
            -
                    : | 
| 327 | 
            -
                    : | 
| 328 | 
            -
                    :return: InitiateDeviceFlowResponse
         | 
| 329 | 
            -
                    :rtype: ~client.models.InitiateDeviceFlowResponse
         | 
| 329 | 
            +
                    :keyword user_code: Required.
         | 
| 330 | 
            +
                    :paramtype user_code: str
         | 
| 331 | 
            +
                    :return: any
         | 
| 332 | 
            +
                    :rtype: any
         | 
| 330 333 | 
             
                    :raises ~azure.core.exceptions.HttpResponseError:
         | 
| 331 334 | 
             
                    """
         | 
| 332 335 | 
             
                    error_map: MutableMapping[int, Type[HttpResponseError]] = {
         | 
| @@ -340,11 +343,10 @@ class AuthOperations:  # pylint: disable=abstract-class-instantiated | |
| 340 343 | 
             
                    _headers = kwargs.pop("headers", {}) or {}
         | 
| 341 344 | 
             
                    _params = kwargs.pop("params", {}) or {}
         | 
| 342 345 |  | 
| 343 | 
            -
                    cls: ClsType[ | 
| 346 | 
            +
                    cls: ClsType[Any] = kwargs.pop("cls", None)
         | 
| 344 347 |  | 
| 345 | 
            -
                    _request =  | 
| 346 | 
            -
                         | 
| 347 | 
            -
                        scope=scope,
         | 
| 348 | 
            +
                    _request = build_auth_do_device_flow_request(
         | 
| 349 | 
            +
                        user_code=user_code,
         | 
| 348 350 | 
             
                        headers=_headers,
         | 
| 349 351 | 
             
                        params=_params,
         | 
| 350 352 | 
             
                    )
         | 
| @@ -367,9 +369,7 @@ class AuthOperations:  # pylint: disable=abstract-class-instantiated | |
| 367 369 | 
             
                        )
         | 
| 368 370 | 
             
                        raise HttpResponseError(response=response)
         | 
| 369 371 |  | 
| 370 | 
            -
                    deserialized = self._deserialize(
         | 
| 371 | 
            -
                        "InitiateDeviceFlowResponse", pipeline_response
         | 
| 372 | 
            -
                    )
         | 
| 372 | 
            +
                    deserialized = self._deserialize("object", pipeline_response)
         | 
| 373 373 |  | 
| 374 374 | 
             
                    if cls:
         | 
| 375 375 | 
             
                        return cls(pipeline_response, deserialized, {})  # type: ignore
         | 
| @@ -939,70 +939,6 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 939 939 | 
             
                        input_args.pop(0) if input_args else kwargs.pop("deserializer")
         | 
| 940 940 | 
             
                    )
         | 
| 941 941 |  | 
| 942 | 
            -
                @distributed_trace_async
         | 
| 943 | 
            -
                async def get_sandbox_file(
         | 
| 944 | 
            -
                    self, *, pfn: str, **kwargs: Any
         | 
| 945 | 
            -
                ) -> _models.SandboxDownloadResponse:
         | 
| 946 | 
            -
                    """Get Sandbox File.
         | 
| 947 | 
            -
             | 
| 948 | 
            -
                    Get a presigned URL to download a sandbox file
         | 
| 949 | 
            -
             | 
| 950 | 
            -
                    This route cannot use a redirect response most clients will also send the
         | 
| 951 | 
            -
                    authorization header when following a redirect. This is not desirable as
         | 
| 952 | 
            -
                    it would leak the authorization token to the storage backend. Additionally,
         | 
| 953 | 
            -
                    most storage backends return an error when they receive an authorization
         | 
| 954 | 
            -
                    header for a presigned URL.
         | 
| 955 | 
            -
             | 
| 956 | 
            -
                    :keyword pfn: Required.
         | 
| 957 | 
            -
                    :paramtype pfn: str
         | 
| 958 | 
            -
                    :return: SandboxDownloadResponse
         | 
| 959 | 
            -
                    :rtype: ~client.models.SandboxDownloadResponse
         | 
| 960 | 
            -
                    :raises ~azure.core.exceptions.HttpResponseError:
         | 
| 961 | 
            -
                    """
         | 
| 962 | 
            -
                    error_map: MutableMapping[int, Type[HttpResponseError]] = {
         | 
| 963 | 
            -
                        401: ClientAuthenticationError,
         | 
| 964 | 
            -
                        404: ResourceNotFoundError,
         | 
| 965 | 
            -
                        409: ResourceExistsError,
         | 
| 966 | 
            -
                        304: ResourceNotModifiedError,
         | 
| 967 | 
            -
                    }
         | 
| 968 | 
            -
                    error_map.update(kwargs.pop("error_map", {}) or {})
         | 
| 969 | 
            -
             | 
| 970 | 
            -
                    _headers = kwargs.pop("headers", {}) or {}
         | 
| 971 | 
            -
                    _params = kwargs.pop("params", {}) or {}
         | 
| 972 | 
            -
             | 
| 973 | 
            -
                    cls: ClsType[_models.SandboxDownloadResponse] = kwargs.pop("cls", None)
         | 
| 974 | 
            -
             | 
| 975 | 
            -
                    _request = build_jobs_get_sandbox_file_request(
         | 
| 976 | 
            -
                        pfn=pfn,
         | 
| 977 | 
            -
                        headers=_headers,
         | 
| 978 | 
            -
                        params=_params,
         | 
| 979 | 
            -
                    )
         | 
| 980 | 
            -
                    _request.url = self._client.format_url(_request.url)
         | 
| 981 | 
            -
             | 
| 982 | 
            -
                    _stream = False
         | 
| 983 | 
            -
                    pipeline_response: PipelineResponse = (
         | 
| 984 | 
            -
                        await self._client._pipeline.run(  # pylint: disable=protected-access
         | 
| 985 | 
            -
                            _request, stream=_stream, **kwargs
         | 
| 986 | 
            -
                        )
         | 
| 987 | 
            -
                    )
         | 
| 988 | 
            -
             | 
| 989 | 
            -
                    response = pipeline_response.http_response
         | 
| 990 | 
            -
             | 
| 991 | 
            -
                    if response.status_code not in [200]:
         | 
| 992 | 
            -
                        if _stream:
         | 
| 993 | 
            -
                            await response.read()  # Load the body in memory and close the socket
         | 
| 994 | 
            -
                        map_error(
         | 
| 995 | 
            -
                            status_code=response.status_code, response=response, error_map=error_map
         | 
| 996 | 
            -
                        )
         | 
| 997 | 
            -
                        raise HttpResponseError(response=response)
         | 
| 998 | 
            -
             | 
| 999 | 
            -
                    deserialized = self._deserialize("SandboxDownloadResponse", pipeline_response)
         | 
| 1000 | 
            -
             | 
| 1001 | 
            -
                    if cls:
         | 
| 1002 | 
            -
                        return cls(pipeline_response, deserialized, {})  # type: ignore
         | 
| 1003 | 
            -
             | 
| 1004 | 
            -
                    return deserialized  # type: ignore
         | 
| 1005 | 
            -
             | 
| 1006 942 | 
             
                @overload
         | 
| 1007 943 | 
             
                async def initiate_sandbox_upload(
         | 
| 1008 944 | 
             
                    self,
         | 
| @@ -1132,6 +1068,70 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 1132 1068 |  | 
| 1133 1069 | 
             
                    return deserialized  # type: ignore
         | 
| 1134 1070 |  | 
| 1071 | 
            +
                @distributed_trace_async
         | 
| 1072 | 
            +
                async def get_sandbox_file(
         | 
| 1073 | 
            +
                    self, *, pfn: str, **kwargs: Any
         | 
| 1074 | 
            +
                ) -> _models.SandboxDownloadResponse:
         | 
| 1075 | 
            +
                    """Get Sandbox File.
         | 
| 1076 | 
            +
             | 
| 1077 | 
            +
                    Get a presigned URL to download a sandbox file
         | 
| 1078 | 
            +
             | 
| 1079 | 
            +
                    This route cannot use a redirect response most clients will also send the
         | 
| 1080 | 
            +
                    authorization header when following a redirect. This is not desirable as
         | 
| 1081 | 
            +
                    it would leak the authorization token to the storage backend. Additionally,
         | 
| 1082 | 
            +
                    most storage backends return an error when they receive an authorization
         | 
| 1083 | 
            +
                    header for a presigned URL.
         | 
| 1084 | 
            +
             | 
| 1085 | 
            +
                    :keyword pfn: Required.
         | 
| 1086 | 
            +
                    :paramtype pfn: str
         | 
| 1087 | 
            +
                    :return: SandboxDownloadResponse
         | 
| 1088 | 
            +
                    :rtype: ~client.models.SandboxDownloadResponse
         | 
| 1089 | 
            +
                    :raises ~azure.core.exceptions.HttpResponseError:
         | 
| 1090 | 
            +
                    """
         | 
| 1091 | 
            +
                    error_map: MutableMapping[int, Type[HttpResponseError]] = {
         | 
| 1092 | 
            +
                        401: ClientAuthenticationError,
         | 
| 1093 | 
            +
                        404: ResourceNotFoundError,
         | 
| 1094 | 
            +
                        409: ResourceExistsError,
         | 
| 1095 | 
            +
                        304: ResourceNotModifiedError,
         | 
| 1096 | 
            +
                    }
         | 
| 1097 | 
            +
                    error_map.update(kwargs.pop("error_map", {}) or {})
         | 
| 1098 | 
            +
             | 
| 1099 | 
            +
                    _headers = kwargs.pop("headers", {}) or {}
         | 
| 1100 | 
            +
                    _params = kwargs.pop("params", {}) or {}
         | 
| 1101 | 
            +
             | 
| 1102 | 
            +
                    cls: ClsType[_models.SandboxDownloadResponse] = kwargs.pop("cls", None)
         | 
| 1103 | 
            +
             | 
| 1104 | 
            +
                    _request = build_jobs_get_sandbox_file_request(
         | 
| 1105 | 
            +
                        pfn=pfn,
         | 
| 1106 | 
            +
                        headers=_headers,
         | 
| 1107 | 
            +
                        params=_params,
         | 
| 1108 | 
            +
                    )
         | 
| 1109 | 
            +
                    _request.url = self._client.format_url(_request.url)
         | 
| 1110 | 
            +
             | 
| 1111 | 
            +
                    _stream = False
         | 
| 1112 | 
            +
                    pipeline_response: PipelineResponse = (
         | 
| 1113 | 
            +
                        await self._client._pipeline.run(  # pylint: disable=protected-access
         | 
| 1114 | 
            +
                            _request, stream=_stream, **kwargs
         | 
| 1115 | 
            +
                        )
         | 
| 1116 | 
            +
                    )
         | 
| 1117 | 
            +
             | 
| 1118 | 
            +
                    response = pipeline_response.http_response
         | 
| 1119 | 
            +
             | 
| 1120 | 
            +
                    if response.status_code not in [200]:
         | 
| 1121 | 
            +
                        if _stream:
         | 
| 1122 | 
            +
                            await response.read()  # Load the body in memory and close the socket
         | 
| 1123 | 
            +
                        map_error(
         | 
| 1124 | 
            +
                            status_code=response.status_code, response=response, error_map=error_map
         | 
| 1125 | 
            +
                        )
         | 
| 1126 | 
            +
                        raise HttpResponseError(response=response)
         | 
| 1127 | 
            +
             | 
| 1128 | 
            +
                    deserialized = self._deserialize("SandboxDownloadResponse", pipeline_response)
         | 
| 1129 | 
            +
             | 
| 1130 | 
            +
                    if cls:
         | 
| 1131 | 
            +
                        return cls(pipeline_response, deserialized, {})  # type: ignore
         | 
| 1132 | 
            +
             | 
| 1133 | 
            +
                    return deserialized  # type: ignore
         | 
| 1134 | 
            +
             | 
| 1135 1135 | 
             
                @distributed_trace_async
         | 
| 1136 1136 | 
             
                async def unassign_bulk_jobs_sandboxes(
         | 
| 1137 1137 | 
             
                    self, *, jobs_ids: List[int], **kwargs: Any
         | 
| @@ -1369,7 +1369,7 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 1369 1369 | 
             
                async def assign_sandbox_to_job(self, job_id: int, body: str, **kwargs: Any) -> Any:
         | 
| 1370 1370 | 
             
                    """Assign Sandbox To Job.
         | 
| 1371 1371 |  | 
| 1372 | 
            -
                     | 
| 1372 | 
            +
                    Map the pfn as output sandbox to job.
         | 
| 1373 1373 |  | 
| 1374 1374 | 
             
                    :param job_id: Required.
         | 
| 1375 1375 | 
             
                    :type job_id: int
         | 
| @@ -2072,7 +2072,7 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 2072 2072 | 
             
                    self,
         | 
| 2073 2073 | 
             
                    body: Optional[_models.JobSearchParams] = None,
         | 
| 2074 2074 | 
             
                    *,
         | 
| 2075 | 
            -
                    page: int =  | 
| 2075 | 
            +
                    page: int = 1,
         | 
| 2076 2076 | 
             
                    per_page: int = 100,
         | 
| 2077 2077 | 
             
                    content_type: str = "application/json",
         | 
| 2078 2078 | 
             
                    **kwargs: Any,
         | 
| @@ -2085,7 +2085,7 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 2085 2085 |  | 
| 2086 2086 | 
             
                    :param body: Default value is None.
         | 
| 2087 2087 | 
             
                    :type body: ~client.models.JobSearchParams
         | 
| 2088 | 
            -
                    :keyword page: Default value is  | 
| 2088 | 
            +
                    :keyword page: Default value is 1.
         | 
| 2089 2089 | 
             
                    :paramtype page: int
         | 
| 2090 2090 | 
             
                    :keyword per_page: Default value is 100.
         | 
| 2091 2091 | 
             
                    :paramtype per_page: int
         | 
| @@ -2102,7 +2102,7 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 2102 2102 | 
             
                    self,
         | 
| 2103 2103 | 
             
                    body: Optional[IO[bytes]] = None,
         | 
| 2104 2104 | 
             
                    *,
         | 
| 2105 | 
            -
                    page: int =  | 
| 2105 | 
            +
                    page: int = 1,
         | 
| 2106 2106 | 
             
                    per_page: int = 100,
         | 
| 2107 2107 | 
             
                    content_type: str = "application/json",
         | 
| 2108 2108 | 
             
                    **kwargs: Any,
         | 
| @@ -2115,7 +2115,7 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 2115 2115 |  | 
| 2116 2116 | 
             
                    :param body: Default value is None.
         | 
| 2117 2117 | 
             
                    :type body: IO[bytes]
         | 
| 2118 | 
            -
                    :keyword page: Default value is  | 
| 2118 | 
            +
                    :keyword page: Default value is 1.
         | 
| 2119 2119 | 
             
                    :paramtype page: int
         | 
| 2120 2120 | 
             
                    :keyword per_page: Default value is 100.
         | 
| 2121 2121 | 
             
                    :paramtype per_page: int
         | 
| @@ -2132,7 +2132,7 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 2132 2132 | 
             
                    self,
         | 
| 2133 2133 | 
             
                    body: Optional[Union[_models.JobSearchParams, IO[bytes]]] = None,
         | 
| 2134 2134 | 
             
                    *,
         | 
| 2135 | 
            -
                    page: int =  | 
| 2135 | 
            +
                    page: int = 1,
         | 
| 2136 2136 | 
             
                    per_page: int = 100,
         | 
| 2137 2137 | 
             
                    **kwargs: Any,
         | 
| 2138 2138 | 
             
                ) -> List[JSON]:
         | 
| @@ -2144,7 +2144,7 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 2144 2144 |  | 
| 2145 2145 | 
             
                    :param body: Is either a JobSearchParams type or a IO[bytes] type. Default value is None.
         | 
| 2146 2146 | 
             
                    :type body: ~client.models.JobSearchParams or IO[bytes]
         | 
| 2147 | 
            -
                    :keyword page: Default value is  | 
| 2147 | 
            +
                    :keyword page: Default value is 1.
         | 
| 2148 2148 | 
             
                    :paramtype page: int
         | 
| 2149 2149 | 
             
                    :keyword per_page: Default value is 100.
         | 
| 2150 2150 | 
             
                    :paramtype per_page: int
         | 
| @@ -2199,7 +2199,7 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 2199 2199 |  | 
| 2200 2200 | 
             
                    response = pipeline_response.http_response
         | 
| 2201 2201 |  | 
| 2202 | 
            -
                    if response.status_code not in [200]:
         | 
| 2202 | 
            +
                    if response.status_code not in [200, 206]:
         | 
| 2203 2203 | 
             
                        if _stream:
         | 
| 2204 2204 | 
             
                            await response.read()  # Load the body in memory and close the socket
         | 
| 2205 2205 | 
             
                        map_error(
         | 
| @@ -2207,10 +2207,19 @@ class JobsOperations:  # pylint: disable=too-many-public-methods | |
| 2207 2207 | 
             
                        )
         | 
| 2208 2208 | 
             
                        raise HttpResponseError(response=response)
         | 
| 2209 2209 |  | 
| 2210 | 
            -
                     | 
| 2210 | 
            +
                    response_headers = {}
         | 
| 2211 | 
            +
                    if response.status_code == 200:
         | 
| 2212 | 
            +
                        deserialized = self._deserialize("[object]", pipeline_response)
         | 
| 2213 | 
            +
             | 
| 2214 | 
            +
                    if response.status_code == 206:
         | 
| 2215 | 
            +
                        response_headers["Content-Range"] = self._deserialize(
         | 
| 2216 | 
            +
                            "str", response.headers.get("Content-Range")
         | 
| 2217 | 
            +
                        )
         | 
| 2218 | 
            +
             | 
| 2219 | 
            +
                        deserialized = self._deserialize("[object]", pipeline_response)
         | 
| 2211 2220 |  | 
| 2212 2221 | 
             
                    if cls:
         | 
| 2213 | 
            -
                        return cls(pipeline_response, deserialized,  | 
| 2222 | 
            +
                        return cls(pipeline_response, deserialized, response_headers)  # type: ignore
         | 
| 2214 2223 |  | 
| 2215 2224 | 
             
                    return deserialized  # type: ignore
         | 
| 2216 2225 |  | 
    
        diracx/client/models/__init__.py
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # coding=utf-8
         | 
| 2 2 | 
             
            # --------------------------------------------------------------------------
         | 
| 3 | 
            -
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13. | 
| 3 | 
            +
            # Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.19)
         | 
| 4 4 | 
             
            # Changes may cause incorrect behavior and will be lost if the code is regenerated.
         | 
| 5 5 | 
             
            # --------------------------------------------------------------------------
         | 
| 6 6 |  | 
| @@ -25,7 +25,6 @@ from ._models import ScalarSearchSpec | |
| 25 25 | 
             
            from ._models import ScalarSearchSpecValue
         | 
| 26 26 | 
             
            from ._models import SetJobStatusReturn
         | 
| 27 27 | 
             
            from ._models import SortSpec
         | 
| 28 | 
            -
            from ._models import SortSpecDirection
         | 
| 29 28 | 
             
            from ._models import SupportInfo
         | 
| 30 29 | 
             
            from ._models import TokenResponse
         | 
| 31 30 | 
             
            from ._models import UserInfoResponse
         | 
| @@ -38,8 +37,6 @@ from ._models import VectorSearchSpecValues | |
| 38 37 | 
             
            from ._enums import ChecksumAlgorithm
         | 
| 39 38 | 
             
            from ._enums import Enum0
         | 
| 40 39 | 
             
            from ._enums import Enum1
         | 
| 41 | 
            -
            from ._enums import Enum11
         | 
| 42 | 
            -
            from ._enums import Enum12
         | 
| 43 40 | 
             
            from ._enums import Enum2
         | 
| 44 41 | 
             
            from ._enums import Enum3
         | 
| 45 42 | 
             
            from ._enums import Enum4
         | 
| @@ -47,6 +44,7 @@ from ._enums import JobStatus | |
| 47 44 | 
             
            from ._enums import SandboxFormat
         | 
| 48 45 | 
             
            from ._enums import SandboxType
         | 
| 49 46 | 
             
            from ._enums import ScalarSearchOperator
         | 
| 47 | 
            +
            from ._enums import SortDirection
         | 
| 50 48 | 
             
            from ._enums import VectorSearchOperator
         | 
| 51 49 | 
             
            from ._patch import __all__ as _patch_all
         | 
| 52 50 | 
             
            from ._patch import *  # pylint: disable=unused-wildcard-import
         | 
| @@ -74,7 +72,6 @@ __all__ = [ | |
| 74 72 | 
             
                "ScalarSearchSpecValue",
         | 
| 75 73 | 
             
                "SetJobStatusReturn",
         | 
| 76 74 | 
             
                "SortSpec",
         | 
| 77 | 
            -
                "SortSpecDirection",
         | 
| 78 75 | 
             
                "SupportInfo",
         | 
| 79 76 | 
             
                "TokenResponse",
         | 
| 80 77 | 
             
                "UserInfoResponse",
         | 
| @@ -86,8 +83,6 @@ __all__ = [ | |
| 86 83 | 
             
                "ChecksumAlgorithm",
         | 
| 87 84 | 
             
                "Enum0",
         | 
| 88 85 | 
             
                "Enum1",
         | 
| 89 | 
            -
                "Enum11",
         | 
| 90 | 
            -
                "Enum12",
         | 
| 91 86 | 
             
                "Enum2",
         | 
| 92 87 | 
             
                "Enum3",
         | 
| 93 88 | 
             
                "Enum4",
         | 
| @@ -95,6 +90,7 @@ __all__ = [ | |
| 95 90 | 
             
                "SandboxFormat",
         | 
| 96 91 | 
             
                "SandboxType",
         | 
| 97 92 | 
             
                "ScalarSearchOperator",
         | 
| 93 | 
            +
                "SortDirection",
         | 
| 98 94 | 
             
                "VectorSearchOperator",
         | 
| 99 95 | 
             
            ]
         | 
| 100 96 | 
             
            __all__.extend([p for p in _patch_all if p not in __all__])
         |