diff --git a/RELEASES.md b/RELEASES.md index b058e9ec..fd04035a 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -184,4 +184,14 @@ Based on: ### Generated - [python v0.9.1] . ### Releases -- [PyPI v0.9.1] https://pypi.org/project/unstructured-client/0.9.1 - . \ No newline at end of file +- [PyPI v0.9.1] https://pypi.org/project/unstructured-client/0.9.1 - . + +## 2023-10-18 00:18:19 +### Changes +Based on: +- OpenAPI Doc 0.0.1 +- Speakeasy CLI 1.101.0 (2.161.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.10.0] . +### Releases +- [PyPI v0.10.0] https://pypi.org/project/unstructured-client/0.10.0 - . \ No newline at end of file diff --git a/USAGE.md b/USAGE.md index f6f9d2eb..c1472078 100755 --- a/USAGE.md +++ b/USAGE.md @@ -15,7 +15,7 @@ req = shared.PartitionParameters( encoding='utf-8', files=shared.PartitionParametersFiles( content='+WmI5Q)|yy'.encode(), - files='um', + files='Washington', ), gz_uncompressed_content_type='application/pdf', hi_res_model_name='yolox', diff --git a/docs/models/errors/httpvalidationerror.md b/docs/models/errors/httpvalidationerror.md index 43929ad5..6a2cb9eb 100755 --- a/docs/models/errors/httpvalidationerror.md +++ b/docs/models/errors/httpvalidationerror.md @@ -5,4 +5,4 @@ | Field | Type | Required | Description | | ----------------------- | ----------------------- | ----------------------- | ----------------------- | -| `detail` | list[*ValidationError*] | :heavy_minus_sign: | N/A | \ No newline at end of file +| `detail` | List[*ValidationError*] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/errors/validationerror.md b/docs/models/errors/validationerror.md index 21fc0e5b..7b027e68 100755 --- a/docs/models/errors/validationerror.md +++ b/docs/models/errors/validationerror.md @@ -5,6 +5,6 @@ | Field | Type | Required | Description | | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | -| `loc` | list[[Union[str, int]](../../models/errors/validationerrorloc.md)] | :heavy_check_mark: | N/A | +| `loc` | List[[Union[str, int]](../../models/errors/validationerrorloc.md)] | :heavy_check_mark: | N/A | | `msg` | *str* | :heavy_check_mark: | N/A | | `type` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/operations/partitionresponse.md b/docs/models/operations/partitionresponse.md index 1cb7efcc..86eebbac 100755 --- a/docs/models/operations/partitionresponse.md +++ b/docs/models/operations/partitionresponse.md @@ -6,6 +6,6 @@ | Field | Type | Required | Description | | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | | `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | -| `elements` | list[*Any*] | :heavy_minus_sign: | Successful Response | +| `elements` | List[*Any*] | :heavy_minus_sign: | Successful Response | | `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | | `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/shared/partitionparameters.md b/docs/models/shared/partitionparameters.md index 99282027..a2b192f5 100755 --- a/docs/models/shared/partitionparameters.md +++ b/docs/models/shared/partitionparameters.md @@ -13,11 +13,11 @@ | `gz_uncompressed_content_type` | *Optional[str]* | :heavy_minus_sign: | If file is gzipped, use this content type after unzipping | application/pdf | | `hi_res_model_name` | *Optional[str]* | :heavy_minus_sign: | The name of the inference model used when strategy is hi_res | yolox | | `include_page_breaks` | *Optional[bool]* | :heavy_minus_sign: | If True, the output will include page breaks if the filetype supports it. Default: false | | -| `languages` | list[*str*] | :heavy_minus_sign: | The languages present in the document, for use in partitioning and/or OCR | [eng] | +| `languages` | List[*str*] | :heavy_minus_sign: | The languages present in the document, for use in partitioning and/or OCR | [eng] | | `multipage_sections` | *Optional[bool]* | :heavy_minus_sign: | If chunking strategy is set, determines if sections can span multiple sections. Default: true | | | `new_after_n_chars` | *Optional[int]* | :heavy_minus_sign: | If chunking strategy is set, cut off new sections after reaching a length of n chars. Default: 1500 | 1500 | | `output_format` | *Optional[str]* | :heavy_minus_sign: | The format of the response. Supported formats are application/json and text/csv. Default: application/json. | application/json | | `pdf_infer_table_structure` | *Optional[bool]* | :heavy_minus_sign: | If True and strategy=hi_res, any Table Elements extracted from a PDF will include an additional metadata field, 'text_as_html', where the value (string) is a just a transformation of the data into an HTML . | | -| `skip_infer_table_types` | list[*str*] | :heavy_minus_sign: | The document types that you want to skip table extraction with. Default: ['pdf', 'jpg', 'png'] | pdf | +| `skip_infer_table_types` | List[*str*] | :heavy_minus_sign: | The document types that you want to skip table extraction with. Default: ['pdf', 'jpg', 'png'] | pdf | | `strategy` | *Optional[str]* | :heavy_minus_sign: | The strategy to use for partitioning PDF/image. Options are fast, hi_res, auto. Default: auto | hi_res | | `xml_keep_tags` | *Optional[bool]* | :heavy_minus_sign: | If True, will retain the XML tags in the output. Otherwise it will simply extract the text from within the tags. Only applies to partition_xml. | | \ No newline at end of file diff --git a/docs/sdks/general/README.md b/docs/sdks/general/README.md index 58b23b84..249b26e1 100755 --- a/docs/sdks/general/README.md +++ b/docs/sdks/general/README.md @@ -25,7 +25,7 @@ req = shared.PartitionParameters( encoding='utf-8', files=shared.PartitionParametersFiles( content='+WmI5Q)|yy'.encode(), - files='um', + files='Washington', ), gz_uncompressed_content_type='application/pdf', hi_res_model_name='yolox', diff --git a/gen.yaml b/gen.yaml index 1ac63d24..a96655a6 100644 --- a/gen.yaml +++ b/gen.yaml @@ -2,8 +2,8 @@ configVersion: 1.0.0 management: docChecksum: 25324f1821b1070aa4a416ec8ddca590 docVersion: 0.0.1 - speakeasyVersion: 1.99.0 - generationVersion: 2.154.1 + speakeasyVersion: 1.101.0 + generationVersion: 2.161.0 generation: comments: disableComments: false @@ -14,16 +14,16 @@ generation: tagNamespacingDisabled: false features: python: - core: 2.88.6 + core: 3.0.2 downloadStreams: 0.0.1 - examples: 2.81.2 + examples: 2.81.3 globalSecurity: 2.82.0 globalServerURLs: 2.82.0 nameOverrides: 2.81.1 retries: 2.82.0 serverIDs: 2.81.1 python: - version: 0.9.1 + version: 0.10.0 author: Unstructured clientServerStatusCodesAsErrors: true description: Python Client SDK for Unstructured API diff --git a/pylintrc b/pylintrc index 0504e9e6..d5760436 100755 --- a/pylintrc +++ b/pylintrc @@ -88,7 +88,7 @@ persistent=yes # Minimum Python version to use for version dependent checks. Will default to # the version used to run pylint. -py-version=3.9 +py-version=3.8 # Discover python modules and packages in the file system subtree. recursive=no diff --git a/setup.py b/setup.py index a25d3696..8923375f 100755 --- a/setup.py +++ b/setup.py @@ -10,33 +10,31 @@ setuptools.setup( name="unstructured-client", - version="0.9.1", + version="0.10.0", author="Unstructured", description="Python Client SDK for Unstructured API", long_description=long_description, long_description_content_type="text/markdown", packages=setuptools.find_packages(where="src"), install_requires=[ - "certifi>=2022.12.7", - "charset-normalizer>=2.1.1", + "certifi>=2023.7.22", + "charset-normalizer>=3.2.0", "dataclasses-json>=0.6.1", - "idna>=3.3", + "idna>=3.4", "jsonpath-python>=1.0.6 ", - "marshmallow>=3.17.1", - "marshmallow-enum>=1.5.1", - "mypy-extensions>=0.4.3", - "packaging>=21.3", - "pyparsing>=3.0.9", + "marshmallow>=3.19.0", + "mypy-extensions>=1.0.0", + "packaging>=23.1", "python-dateutil>=2.8.2", - "requests>=2.28.1", + "requests>=2.31.0", "six>=1.16.0", - "typing-inspect>=0.8.0", - "typing_extensions>=4.3.0", - "urllib3>=1.26.12", + "typing-inspect>=0.9.0", + "typing_extensions>=4.7.1", + "urllib3>=2.0.4", ], extras_require={ "dev":["pylint==2.16.2"] }, package_dir={'': 'src'}, - python_requires='>=3.9' + python_requires='>=3.8' ) diff --git a/src/unstructured_client/general.py b/src/unstructured_client/general.py index 211e68bb..dca3af67 100755 --- a/src/unstructured_client/general.py +++ b/src/unstructured_client/general.py @@ -1,7 +1,7 @@ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" from .sdkconfiguration import SDKConfiguration -from typing import Any, Optional +from typing import Any, List, Optional from unstructured_client import utils from unstructured_client.models import errors, operations, shared @@ -46,7 +46,7 @@ def do_request(): if http_res.status_code == 200: if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[list[Any]]) + out = utils.unmarshal_json(http_res.text, Optional[List[Any]]) res.elements = out else: raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) diff --git a/src/unstructured_client/models/errors/httpvalidationerror.py b/src/unstructured_client/models/errors/httpvalidationerror.py index 48516327..ab470189 100755 --- a/src/unstructured_client/models/errors/httpvalidationerror.py +++ b/src/unstructured_client/models/errors/httpvalidationerror.py @@ -4,7 +4,7 @@ import dataclasses from ..errors import validationerror as errors_validationerror from dataclasses_json import Undefined, dataclass_json -from typing import Optional +from typing import List, Optional from unstructured_client import utils @@ -12,7 +12,7 @@ @dataclasses.dataclass class HTTPValidationError(Exception): - detail: Optional[list[errors_validationerror.ValidationError]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('detail'), 'exclude': lambda f: f is None }}) + detail: Optional[List[errors_validationerror.ValidationError]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('detail'), 'exclude': lambda f: f is None }}) def __str__(self) -> str: diff --git a/src/unstructured_client/models/errors/validationerror.py b/src/unstructured_client/models/errors/validationerror.py index 3da8d888..f697f6f2 100755 --- a/src/unstructured_client/models/errors/validationerror.py +++ b/src/unstructured_client/models/errors/validationerror.py @@ -3,11 +3,10 @@ from __future__ import annotations import dataclasses from dataclasses_json import Undefined, dataclass_json -from typing import Union +from typing import List, Union from unstructured_client import utils - @dataclasses.dataclass class ValidationErrorLoc: pass @@ -17,7 +16,7 @@ class ValidationErrorLoc: @dataclasses.dataclass class ValidationError(Exception): - loc: list[Union[str, int]] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('loc') }}) + loc: List[Union[str, int]] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('loc') }}) msg: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('msg') }}) type: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) diff --git a/src/unstructured_client/models/operations/partition.py b/src/unstructured_client/models/operations/partition.py index 628c3629..b5d7a2dd 100755 --- a/src/unstructured_client/models/operations/partition.py +++ b/src/unstructured_client/models/operations/partition.py @@ -3,8 +3,7 @@ from __future__ import annotations import dataclasses import requests as requests_http -from typing import Any, Optional - +from typing import Any, List, Optional @dataclasses.dataclass @@ -13,7 +12,7 @@ class PartitionResponse: r"""HTTP response content type for this operation""" status_code: int = dataclasses.field() r"""HTTP response status code for this operation""" - elements: Optional[list[Any]] = dataclasses.field(default=None) + elements: Optional[List[Any]] = dataclasses.field(default=None) r"""Successful Response""" raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) r"""Raw HTTP response; suitable for custom response parsing""" diff --git a/src/unstructured_client/models/shared/partition_parameters.py b/src/unstructured_client/models/shared/partition_parameters.py index 8f8f41f7..fa872f6f 100755 --- a/src/unstructured_client/models/shared/partition_parameters.py +++ b/src/unstructured_client/models/shared/partition_parameters.py @@ -2,8 +2,7 @@ from __future__ import annotations import dataclasses -from typing import Optional - +from typing import List, Optional @dataclasses.dataclass @@ -14,7 +13,6 @@ class PartitionParametersFiles: - @dataclasses.dataclass class PartitionParameters: chunking_strategy: Optional[str] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'chunking_strategy' }}) @@ -33,7 +31,7 @@ class PartitionParameters: r"""The name of the inference model used when strategy is hi_res""" include_page_breaks: Optional[bool] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'include_page_breaks' }}) r"""If True, the output will include page breaks if the filetype supports it. Default: false""" - languages: Optional[list[str]] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'languages' }}) + languages: Optional[List[str]] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'languages' }}) r"""The languages present in the document, for use in partitioning and/or OCR""" multipage_sections: Optional[bool] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'multipage_sections' }}) r"""If chunking strategy is set, determines if sections can span multiple sections. Default: true""" @@ -43,7 +41,7 @@ class PartitionParameters: r"""The format of the response. Supported formats are application/json and text/csv. Default: application/json.""" pdf_infer_table_structure: Optional[bool] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'pdf_infer_table_structure' }}) r"""If True and strategy=hi_res, any Table Elements extracted from a PDF will include an additional metadata field, 'text_as_html', where the value (string) is a just a transformation of the data into an HTML
.""" - skip_infer_table_types: Optional[list[str]] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'skip_infer_table_types' }}) + skip_infer_table_types: Optional[List[str]] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'skip_infer_table_types' }}) r"""The document types that you want to skip table extraction with. Default: ['pdf', 'jpg', 'png']""" strategy: Optional[str] = dataclasses.field(default=None, metadata={'multipart_form': { 'field_name': 'strategy' }}) r"""The strategy to use for partitioning PDF/image. Options are fast, hi_res, auto. Default: auto""" diff --git a/src/unstructured_client/models/shared/security.py b/src/unstructured_client/models/shared/security.py index 1a5bcb4e..57b7d7fd 100755 --- a/src/unstructured_client/models/shared/security.py +++ b/src/unstructured_client/models/shared/security.py @@ -4,7 +4,6 @@ import dataclasses - @dataclasses.dataclass class Security: api_key_auth: str = dataclasses.field(metadata={'security': { 'scheme': True, 'type': 'apiKey', 'sub_type': 'header', 'field_name': 'unstructured-api-key' }}) diff --git a/src/unstructured_client/sdk.py b/src/unstructured_client/sdk.py index 9c4a474c..3a4e8821 100755 --- a/src/unstructured_client/sdk.py +++ b/src/unstructured_client/sdk.py @@ -3,6 +3,7 @@ import requests as requests_http from .general import General from .sdkconfiguration import SDKConfiguration +from typing import Dict from unstructured_client import utils from unstructured_client.models import shared @@ -16,7 +17,7 @@ def __init__(self, api_key_auth: str, server: str = None, server_url: str = None, - url_params: dict[str, str] = None, + url_params: Dict[str, str] = None, client: requests_http.Session = None, retry_config: utils.RetryConfig = None ) -> None: @@ -29,7 +30,7 @@ def __init__(self, :param server_url: The server URL to use for all operations :type server_url: str :param url_params: Parameters to optionally template the server URL with - :type url_params: dict[str, str] + :type url_params: Dict[str, str] :param client: The requests.Session HTTP client to use for all operations :type client: requests_http.Session :param retry_config: The utils.RetryConfig to use globally diff --git a/src/unstructured_client/sdkconfiguration.py b/src/unstructured_client/sdkconfiguration.py index 5b2d9db6..2f708b15 100755 --- a/src/unstructured_client/sdkconfiguration.py +++ b/src/unstructured_client/sdkconfiguration.py @@ -2,8 +2,9 @@ import requests from dataclasses import dataclass - +from typing import Dict, Tuple from .utils.retries import RetryConfig +from .utils import utils SERVER_PROD = 'prod' @@ -25,14 +26,14 @@ class SDKConfiguration: server: str = '' language: str = 'python' openapi_doc_version: str = '0.0.1' - sdk_version: str = '0.9.1' - gen_version: str = '2.154.1' - user_agent: str = 'speakeasy-sdk/python 0.9.1 2.154.1 0.0.1 unstructured-client' + sdk_version: str = '0.10.0' + gen_version: str = '2.161.0' + user_agent: str = 'speakeasy-sdk/python 0.10.0 2.161.0 0.0.1 unstructured-client' retry_config: RetryConfig = None - def get_server_details(self) -> tuple[str, dict[str, str]]: + def get_server_details(self) -> Tuple[str, Dict[str, str]]: if self.server_url: - return self.server_url.removesuffix('/'), {} + return utils.remove_suffix(self.server_url, '/'), {} if not self.server: self.server = SERVER_PROD diff --git a/src/unstructured_client/utils/retries.py b/src/unstructured_client/utils/retries.py index 2138c1b5..25f49a1f 100755 --- a/src/unstructured_client/utils/retries.py +++ b/src/unstructured_client/utils/retries.py @@ -2,6 +2,7 @@ import random import time +from typing import List import requests @@ -32,9 +33,9 @@ def __init__(self, strategy: str, backoff: BackoffStrategy, retry_connection_err class Retries: config: RetryConfig - status_codes: list[str] + status_codes: List[str] - def __init__(self, config: RetryConfig, status_codes: list[str]): + def __init__(self, config: RetryConfig, status_codes: List[str]): self.config = config self.status_codes = status_codes diff --git a/src/unstructured_client/utils/utils.py b/src/unstructured_client/utils/utils.py index 4388f3b7..ccfad9f7 100755 --- a/src/unstructured_client/utils/utils.py +++ b/src/unstructured_client/utils/utils.py @@ -9,7 +9,8 @@ from decimal import Decimal from email.message import Message from enum import Enum -from typing import Any, Callable, Optional, Tuple, Union, get_args, get_origin +from typing import (Any, Callable, Dict, List, Optional, Tuple, Union, + get_args, get_origin) from xmlrpc.client import boolean import dateutil.parser @@ -19,14 +20,14 @@ class SecurityClient: client: requests.Session - query_params: dict[str, str] = {} + query_params: Dict[str, str] = {} def __init__(self, client: requests.Session): self.client = client def request(self, method, url, **kwargs): params = kwargs.get('params', {}) - kwargs["params"] = self.query_params | params + kwargs["params"] = {**self.query_params, **params} return self.client.request(method, url, **kwargs) @@ -69,7 +70,7 @@ def _parse_security_option(client: SecurityClient, option: dataclass): client, metadata, getattr(option, opt_field.name)) -def _parse_security_scheme(client: SecurityClient, scheme_metadata: dict, scheme: any): +def _parse_security_scheme(client: SecurityClient, scheme_metadata: Dict, scheme: any): scheme_type = scheme_metadata.get('type') sub_type = scheme_metadata.get('sub_type') @@ -93,7 +94,7 @@ def _parse_security_scheme(client: SecurityClient, scheme_metadata: dict, scheme client, scheme_metadata, scheme_metadata, scheme) -def _parse_security_scheme_value(client: SecurityClient, scheme_metadata: dict, security_metadata: dict, value: any): +def _parse_security_scheme_value(client: SecurityClient, scheme_metadata: Dict, security_metadata: Dict, value: any): scheme_type = scheme_metadata.get('type') sub_type = scheme_metadata.get('sub_type') @@ -145,7 +146,7 @@ def _parse_basic_auth_scheme(client: SecurityClient, scheme: dataclass): def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass, - gbls: dict[str, dict[str, dict[str, Any]]] = None) -> str: + gbls: Dict[str, Dict[str, Dict[str, Any]]] = None) -> str: path_param_fields: Tuple[Field, ...] = fields(clazz) for field in path_param_fields: request_metadata = field.metadata.get('request') @@ -174,16 +175,16 @@ def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass '{' + key + '}', value, 1) else: if param_metadata.get('style', 'simple') == 'simple': - if isinstance(param, list): - pp_vals: list[str] = [] + if isinstance(param, List): + pp_vals: List[str] = [] for pp_val in param: if pp_val is None: continue pp_vals.append(_val_to_string(pp_val)) path = path.replace( '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) - elif isinstance(param, dict): - pp_vals: list[str] = [] + elif isinstance(param, Dict): + pp_vals: List[str] = [] for pp_key in param: if param[pp_key] is None: continue @@ -196,7 +197,7 @@ def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass path = path.replace( '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) elif not isinstance(param, (str, int, float, complex, bool, Decimal)): - pp_vals: list[str] = [] + pp_vals: List[str] = [] param_fields: Tuple[Field, ...] = fields(param) for param_field in param_fields: param_value_metadata = param_field.metadata.get( @@ -222,14 +223,14 @@ def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass path = path.replace( '{' + param_metadata.get('field_name', field.name) + '}', _val_to_string(param), 1) - return server_url.removesuffix("/") + path + return remove_suffix(server_url, '/') + path def is_optional(field): return get_origin(field) is Union and type(None) in get_args(field) -def template_url(url_with_params: str, params: dict[str, str]) -> str: +def template_url(url_with_params: str, params: Dict[str, str]) -> str: for key, value in params.items(): url_with_params = url_with_params.replace( '{' + key + '}', value) @@ -237,9 +238,9 @@ def template_url(url_with_params: str, params: dict[str, str]) -> str: return url_with_params -def get_query_params(clazz: type, query_params: dataclass, gbls: dict[str, dict[str, dict[str, Any]]] = None) -> dict[ - str, list[str]]: - params: dict[str, list[str]] = {} +def get_query_params(clazz: type, query_params: dataclass, gbls: Dict[str, Dict[str, Dict[str, Any]]] = None) -> Dict[ + str, List[str]]: + params: Dict[str, List[str]] = {} param_fields: Tuple[Field, ...] = fields(clazz) for field in param_fields: @@ -269,24 +270,24 @@ def get_query_params(clazz: type, query_params: dataclass, gbls: dict[str, dict[ else: style = metadata.get('style', 'form') if style == 'deepObject': - params = params | _get_deep_object_query_params( - metadata, f_name, value) + params = {**params, **_get_deep_object_query_params( + metadata, f_name, value)} elif style == 'form': - params = params | _get_delimited_query_params( - metadata, f_name, value, ",") + params = {**params, **_get_delimited_query_params( + metadata, f_name, value, ",")} elif style == 'pipeDelimited': - params = params | _get_delimited_query_params( - metadata, f_name, value, "|") + params = {**params, **_get_delimited_query_params( + metadata, f_name, value, "|")} else: raise Exception('not yet implemented') return params -def get_headers(headers_params: dataclass) -> dict[str, str]: +def get_headers(headers_params: dataclass) -> Dict[str, str]: if headers_params is None: return {} - headers: dict[str, str] = {} + headers: Dict[str, str] = {} param_fields: Tuple[Field, ...] = fields(headers_params) for field in param_fields: @@ -303,8 +304,8 @@ def get_headers(headers_params: dataclass) -> dict[str, str]: return headers -def _get_serialized_params(metadata: dict, field_name: str, obj: any) -> dict[str, str]: - params: dict[str, str] = {} +def _get_serialized_params(metadata: Dict, field_name: str, obj: any) -> Dict[str, str]: + params: Dict[str, str] = {} serialization = metadata.get('serialization', '') if serialization == 'json': @@ -313,8 +314,8 @@ def _get_serialized_params(metadata: dict, field_name: str, obj: any) -> dict[st return params -def _get_deep_object_query_params(metadata: dict, field_name: str, obj: any) -> dict[str, list[str]]: - params: dict[str, list[str]] = {} +def _get_deep_object_query_params(metadata: Dict, field_name: str, obj: any) -> Dict[str, List[str]]: + params: Dict[str, List[str]] = {} if obj is None: return params @@ -330,7 +331,7 @@ def _get_deep_object_query_params(metadata: dict, field_name: str, obj: any) -> if obj_val is None: continue - if isinstance(obj_val, list): + if isinstance(obj_val, List): for val in obj_val: if val is None: continue @@ -348,12 +349,12 @@ def _get_deep_object_query_params(metadata: dict, field_name: str, obj: any) -> params[ f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'] = [ _val_to_string(obj_val)] - elif isinstance(obj, dict): + elif isinstance(obj, Dict): for key, value in obj.items(): if value is None: continue - if isinstance(value, list): + if isinstance(value, List): for val in value: if val is None: continue @@ -379,8 +380,8 @@ def _get_query_param_field_name(obj_field: Field) -> str: return obj_param_metadata.get("field_name", obj_field.name) -def _get_delimited_query_params(metadata: dict, field_name: str, obj: any, delimiter: str) -> dict[ - str, list[str]]: +def _get_delimited_query_params(metadata: Dict, field_name: str, obj: any, delimiter: str) -> Dict[ + str, List[str]]: return _populate_form(field_name, metadata.get("explode", True), obj, _get_query_param_field_name, delimiter) @@ -424,7 +425,7 @@ def serialize_request_body(request: dataclass, request_field_name: str, nullable request_val) -def serialize_content_type(field_name: str, media_type: str, request: dataclass, encoder=None) -> Tuple[str, any, list[list[any]]]: +def serialize_content_type(field_name: str, media_type: str, request: dataclass, encoder=None) -> Tuple[str, any, List[List[any]]]: if re.match(r'(application|text)\/.*?\+*json.*', media_type) is not None: return media_type, marshal_json(request, encoder), None if re.match(r'multipart\/.*', media_type) is not None: @@ -440,8 +441,8 @@ def serialize_content_type(field_name: str, media_type: str, request: dataclass, f"invalid request body type {type(request)} for mediaType {media_type}") -def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, any, list[list[any]]]: - form: list[list[any]] = [] +def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, any, List[List[any]]]: + form: List[List[any]] = [] request_fields = fields(request) for field in request_fields: @@ -482,7 +483,7 @@ def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, else: field_name = field_metadata.get( "field_name", field.name) - if isinstance(val, list): + if isinstance(val, List): for value in val: if value is None: continue @@ -493,8 +494,8 @@ def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, return media_type, None, form -def serialize_dict(original: dict, explode: bool, field_name, existing: Optional[dict[str, list[str]]]) -> dict[ - str, list[str]]: +def serialize_dict(original: Dict, explode: bool, field_name, existing: Optional[Dict[str, List[str]]]) -> Dict[ + str, List[str]]: if existing is None: existing = [] @@ -514,8 +515,8 @@ def serialize_dict(original: dict, explode: bool, field_name, existing: Optional return existing -def serialize_form_data(field_name: str, data: dataclass) -> dict[str, any]: - form: dict[str, list[str]] = {} +def serialize_form_data(field_name: str, data: dataclass) -> Dict[str, any]: + form: Dict[str, List[str]] = {} if is_dataclass(data): for field in fields(data): @@ -533,12 +534,12 @@ def serialize_form_data(field_name: str, data: dataclass) -> dict[str, any]: form[field_name] = [marshal_json(val)] else: if metadata.get('style', 'form') == 'form': - form = form | _populate_form( - field_name, metadata.get('explode', True), val, _get_form_field_name, ",") + form = {**form, **_populate_form( + field_name, metadata.get('explode', True), val, _get_form_field_name, ",")} else: raise Exception( f'Invalid form style for field {field.name}') - elif isinstance(data, dict): + elif isinstance(data, Dict): for key, value in data.items(): form[key] = [_val_to_string(value)] else: @@ -557,8 +558,8 @@ def _get_form_field_name(obj_field: Field) -> str: def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_func: Callable, delimiter: str) -> \ - dict[str, list[str]]: - params: dict[str, list[str]] = {} + Dict[str, List[str]]: + params: Dict[str, List[str]] = {} if obj is None: return params @@ -584,7 +585,7 @@ def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_f if len(items) > 0: params[field_name] = [delimiter.join(items)] - elif isinstance(obj, dict): + elif isinstance(obj, Dict): items = [] for key, value in obj.items(): if value is None: @@ -597,7 +598,7 @@ def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_f if len(items) > 0: params[field_name] = [delimiter.join(items)] - elif isinstance(obj, list): + elif isinstance(obj, List): items = [] for value in obj: @@ -651,7 +652,7 @@ def _serialize_header(explode: bool, obj: any) -> str: if len(items) > 0: return ','.join(items) - elif isinstance(obj, dict): + elif isinstance(obj, Dict): items = [] for key, value in obj.items(): @@ -666,7 +667,7 @@ def _serialize_header(explode: bool, obj: any) -> str: if len(items) > 0: return ','.join([str(item) for item in items]) - elif isinstance(obj, list): + elif isinstance(obj, List): items = [] for value in obj: @@ -779,7 +780,7 @@ def decimaldecoder(val): def map_encoder(optional: bool, value_encoder: Callable): - def map_encode(val: dict): + def map_encode(val: Dict): if optional and val is None: return None @@ -793,7 +794,7 @@ def map_encode(val: dict): def map_decoder(value_decoder: Callable): - def map_decode(val: dict): + def map_decode(val: Dict): decoded = {} for key, value in val.items(): decoded[key] = value_decoder(value) @@ -804,7 +805,7 @@ def map_decode(val: dict): def list_encoder(optional: bool, value_encoder: Callable): - def list_encode(val: list): + def list_encode(val: List): if optional and val is None: return None @@ -818,7 +819,7 @@ def list_encode(val: list): def list_decoder(value_decoder: Callable): - def list_decode(val: list): + def list_decode(val: List): decoded = [] for value in val: decoded.append(value_decoder(value)) @@ -846,7 +847,7 @@ def _val_to_string(val): return str(val) -def _populate_from_globals(param_name: str, value: any, param_type: str, gbls: dict[str, dict[str, dict[str, Any]]]): +def _populate_from_globals(param_name: str, value: any, param_type: str, gbls: Dict[str, Dict[str, Dict[str, Any]]]): if value is None and gbls is not None: if 'parameters' in gbls: if param_type in gbls['parameters']: @@ -863,3 +864,9 @@ def decode_fx(obj): kls = getattr(sys.modules['sdk.models.shared'], obj[field_name]) return unmarshal_json(json.dumps(obj), kls) return decode_fx + + +def remove_suffix(input_string, suffix): + if suffix and input_string.endswith(suffix): + return input_string[:-len(suffix)] + return input_string