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